[snappy-java] 05/51: Imported Upstream version 1.0.4.1

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Tue Nov 25 17:16:41 GMT 2014


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to branch master
in repository snappy-java.

commit 5a8fa58a1dec55edf7f99b3bedcc3023f0bd2549
Author: Charles Plessy <plessy at debian.org>
Date:   Sat Nov 5 15:22:31 2011 +0900

    Imported Upstream version 1.0.4.1
---
 .classpath                                         |     8 +
 .hgignore                                          |    11 +
 .hgsub                                             |     1 +
 .hgsubstate                                        |     1 +
 .hgtags                                            |    14 +
 .project                                           |    23 +
 .settings/org.eclipse.jdt.core.prefs               |     6 +
 .settings/org.eclipse.jdt.ui.prefs                 |     4 +
 .settings/org.maven.ide.eclipse.prefs              |     9 +
 INSTALL                                            |    78 +
 LICENSE                                            |   202 +
 Makefile                                           |    99 +
 Makefile.common                                    |   114 +
 Makefile.package                                   |    87 +
 NOTICE                                             |    14 +
 README                                             |   102 +
 pom.xml                                            |   297 +
 pom.xml.releaseBackup                              |   297 +
 release.properties                                 |    15 +
 src/assembly/project.xml                           |    20 +
 src/main/java/org/xerial/snappy/OSInfo.java        |    80 +
 src/main/java/org/xerial/snappy/Snappy.java        |   770 +
 .../org/xerial/snappy/SnappyBundleActivator.java   |    46 +
 src/main/java/org/xerial/snappy/SnappyCodec.java   |   104 +
 src/main/java/org/xerial/snappy/SnappyError.java   |    62 +
 .../java/org/xerial/snappy/SnappyErrorCode.java    |    60 +
 .../java/org/xerial/snappy/SnappyException.java    |    74 +
 .../java/org/xerial/snappy/SnappyInputStream.java  |   390 +
 src/main/java/org/xerial/snappy/SnappyLoader.java  |   484 +
 src/main/java/org/xerial/snappy/SnappyNative.cpp   |   237 +
 src/main/java/org/xerial/snappy/SnappyNative.h     |   101 +
 src/main/java/org/xerial/snappy/SnappyNative.java  |    81 +
 .../java/org/xerial/snappy/SnappyNativeAPI.java    |    76 +
 .../java/org/xerial/snappy/SnappyOutputStream.java |   315 +
 src/main/java/org/xerial/snappy/VERSION            |     2 +
 src/main/java/org/xerial/snappy/package-info.java  |    44 +
 .../org/xerial/snappy/SnappyNativeLoader.bytecode  |   Bin 0 -> 1179 bytes
 .../org/xerial/snappy/SnappyNativeLoader.java      |    59 +
 .../snappy/native/Linux/amd64/libsnappyjava.so     |   Bin 0 -> 991112 bytes
 .../snappy/native/Linux/i386/libsnappyjava.so      |   Bin 0 -> 814468 bytes
 .../snappy/native/Mac/i386/libsnappyjava.jnilib    |   Bin 0 -> 44036 bytes
 .../snappy/native/Mac/x86_64/libsnappyjava.jnilib  |   Bin 0 -> 49792 bytes
 src/main/resources/org/xerial/snappy/native/README |     1 +
 .../snappy/native/Windows/amd64/snappyjava.dll     |   Bin 0 -> 645632 bytes
 .../snappy/native/Windows/x86/snappyjava.dll       |   Bin 0 -> 600064 bytes
 src/test/java/org/xerial/snappy/CalgaryTest.java   |   118 +
 src/test/java/org/xerial/snappy/OSInfoTest.java    |   110 +
 .../org/xerial/snappy/SnappyInputStreamTest.java   |   112 +
 .../java/org/xerial/snappy/SnappyLoaderTest.java   |   128 +
 .../org/xerial/snappy/SnappyOutputStreamTest.java  |   188 +
 src/test/java/org/xerial/snappy/SnappyTest.java    |   304 +
 src/test/java/org/xerial/snappy/alice29.txt        |  3609 ++++
 src/test/java/org/xerial/snappy/load.code          |    14 +
 src/test/java/org/xerial/snappy/loadLibrary.code   |    13 +
 .../java/org/xerial/snappy/testdata/calgary/bib    |  6280 +++++++
 .../java/org/xerial/snappy/testdata/calgary/book1  | 16622 +++++++++++++++++++
 .../java/org/xerial/snappy/testdata/calgary/book2  | 15634 +++++++++++++++++
 .../java/org/xerial/snappy/testdata/calgary/geo    |   Bin 0 -> 102400 bytes
 .../java/org/xerial/snappy/testdata/calgary/news   | 10059 +++++++++++
 .../java/org/xerial/snappy/testdata/calgary/obj1   |   Bin 0 -> 21504 bytes
 .../java/org/xerial/snappy/testdata/calgary/obj2   |   Bin 0 -> 246814 bytes
 .../java/org/xerial/snappy/testdata/calgary/paper1 |  1250 ++
 .../java/org/xerial/snappy/testdata/calgary/paper2 |  1731 ++
 .../java/org/xerial/snappy/testdata/calgary/paper3 |  1100 ++
 .../java/org/xerial/snappy/testdata/calgary/paper4 |   294 +
 .../java/org/xerial/snappy/testdata/calgary/paper5 |   320 +
 .../java/org/xerial/snappy/testdata/calgary/paper6 |  1019 ++
 .../java/org/xerial/snappy/testdata/calgary/pic    |   Bin 0 -> 513216 bytes
 .../java/org/xerial/snappy/testdata/calgary/progc  |  1487 ++
 .../java/org/xerial/snappy/testdata/calgary/progl  |  2244 +++
 .../java/org/xerial/snappy/testdata/calgary/progp  |  1966 +++
 .../java/org/xerial/snappy/testdata/calgary/trans  |   Bin 0 -> 93695 bytes
 stylesheet.css                                     |    36 +
 wiki/Milestone.wiki                                |    55 +
 wiki/apidocs/allclasses-frame.html                 |    54 +
 wiki/apidocs/allclasses-noframe.html               |    54 +
 wiki/apidocs/constant-values.html                  |   233 +
 wiki/apidocs/deprecated-list.html                  |   160 +
 wiki/apidocs/help-doc.html                         |   216 +
 wiki/apidocs/index-all.html                        |   697 +
 wiki/apidocs/index.html                            |    37 +
 wiki/apidocs/org/xerial/snappy/OSInfo.html         |   354 +
 wiki/apidocs/org/xerial/snappy/Snappy.html         |  1472 ++
 .../org/xerial/snappy/SnappyBundleActivator.html   |   293 +
 wiki/apidocs/org/xerial/snappy/SnappyCodec.html    |   483 +
 wiki/apidocs/org/xerial/snappy/SnappyError.html    |   344 +
 .../apidocs/org/xerial/snappy/SnappyErrorCode.html |   467 +
 .../apidocs/org/xerial/snappy/SnappyException.html |   402 +
 .../org/xerial/snappy/SnappyInputStream.html       |   660 +
 wiki/apidocs/org/xerial/snappy/SnappyLoader.html   |   444 +
 wiki/apidocs/org/xerial/snappy/SnappyNative.html   |   597 +
 .../apidocs/org/xerial/snappy/SnappyNativeAPI.html |   511 +
 .../org/xerial/snappy/SnappyOutputStream.html      |   704 +
 .../org/xerial/snappy/class-use/OSInfo.html        |   143 +
 .../org/xerial/snappy/class-use/Snappy.html        |   143 +
 .../snappy/class-use/SnappyBundleActivator.html    |   143 +
 .../org/xerial/snappy/class-use/SnappyCodec.html   |   174 +
 .../org/xerial/snappy/class-use/SnappyError.html   |   143 +
 .../xerial/snappy/class-use/SnappyErrorCode.html   |   263 +
 .../xerial/snappy/class-use/SnappyException.html   |   166 +
 .../xerial/snappy/class-use/SnappyInputStream.html |   143 +
 .../org/xerial/snappy/class-use/SnappyLoader.html  |   143 +
 .../org/xerial/snappy/class-use/SnappyNative.html  |   143 +
 .../xerial/snappy/class-use/SnappyNativeAPI.html   |   167 +
 .../snappy/class-use/SnappyOutputStream.html       |   143 +
 wiki/apidocs/org/xerial/snappy/package-frame.html  |    91 +
 .../apidocs/org/xerial/snappy/package-summary.html |   284 +
 wiki/apidocs/org/xerial/snappy/package-tree.html   |   179 +
 wiki/apidocs/org/xerial/snappy/package-use.html    |   176 +
 wiki/apidocs/overview-tree.html                    |   181 +
 wiki/apidocs/package-list                          |     1 +
 wiki/apidocs/resources/inherit.gif                 |   Bin 0 -> 57 bytes
 wiki/apidocs/serialized-form.html                  |   211 +
 wiki/apidocs/stylesheet.css                        |    36 +
 114 files changed, 80336 insertions(+)

diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..cec251a
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/.hgignore b/.hgignore
new file mode 100644
index 0000000..32b3264
--- /dev/null
+++ b/.hgignore
@@ -0,0 +1,11 @@
+target
+.classpath
+.project
+Debug
+Release
+
+syntax: glob
+*~
+*.sdf
+*.ipch
+hs_err_pid*
diff --git a/.hgsub b/.hgsub
new file mode 100644
index 0000000..e25fec5
--- /dev/null
+++ b/.hgsub
@@ -0,0 +1 @@
+wiki = https://code.google.com/p/snappy-java.wiki/
diff --git a/.hgsubstate b/.hgsubstate
new file mode 100644
index 0000000..925b363
--- /dev/null
+++ b/.hgsubstate
@@ -0,0 +1 @@
+718e33e002735cb64943b4dfdb4a31e6a4d8de09 wiki
diff --git a/.hgtags b/.hgtags
new file mode 100644
index 0000000..439e961
--- /dev/null
+++ b/.hgtags
@@ -0,0 +1,14 @@
+c5e0b0e9ceb2f1b6a63d8579d3c7698d6d17d819 snappy-java-1.0.1-rc1
+d7e20d321261fa498b24ad9ede41c9b9a4501fdb snappy-java-1.0.1-rc2
+0b565eb88cea571c7bb0e1a59c948921bb1a08a5 snappy-java-1.0.1-rc3
+
+eca4814fd3218dff38439150df86d75c16525a94 snappy-java-1.0.1-rc4
+54ad804506068c5df875e5d2a3fa29503e2a2256 snappy-java-1.0.3-rc1
+7b7999b2de6a4756bf806d73b5ce5f4d17f12614 snappy-java-1.0.3-rc2
+0cab58fcb9c6f5736783c8e01eff7555061a75b6 snappy-java-1.0.3-rc3
+25d8cadcff5ab995564a240431f7ab6933534722 snappy-java-1.0.3-rc4
+56d1e0b47fa0ff96cac837f70292ea2dd5825eb6 snappy-java-1.0.3
+8e70beaed80675da6b8b3a69b28ff6f7ddd3656e snappy-java-1.0.3.1
+0c78d91c0816bb1ad92591d894fe676e177fa154 snappy-java-1.0.3.2
+fb6687d9159f01371edc9e366f882665cb30a8fd snappy-java-1.0.3.3
+af15fe6c7211b28d5ed66216e3109902c0c768d4 snappy-java-1.0.4
diff --git a/.project b/.project
new file mode 100644
index 0000000..24e16af
--- /dev/null
+++ b/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>snappy-java</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.maven.ide.eclipse.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..26e8589
--- /dev/null
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,6 @@
+#Tue Mar 29 16:49:37 JST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..dad45ba
--- /dev/null
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,4 @@
+#Wed Mar 30 14:56:03 JST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.ui.javadoc=false
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return Returns the ${bare_field_name}.\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Co [...]
diff --git a/.settings/org.maven.ide.eclipse.prefs b/.settings/org.maven.ide.eclipse.prefs
new file mode 100644
index 0000000..01a37d2
--- /dev/null
+++ b/.settings/org.maven.ide.eclipse.prefs
@@ -0,0 +1,9 @@
+#Tue Mar 29 16:49:37 JST 2011
+activeProfiles=
+eclipse.preferences.version=1
+fullBuildGoals=process-test-resources
+includeModules=false
+resolveWorkspaceProjects=true
+resourceFilterGoals=process-resources resources\:testResources
+skipCompilerPlugin=true
+version=1
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..21c6d8c
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,78 @@
+[Installation note of snappy-java]
+
+If your OS platform is one of the Windows/Linux/Mac OS X (32/64 bit Intel CPUs), the installation process described here is unnecessary. Simply put snappy-java-(version).jar to your Java classpath. If your OS is not listed above, create your own snappy-java-(version).jar file as follows. 
+
+
+= Required tools for building snappy-java =
+
+[For all platforms]
+
+* Java 6 (JDK1.6) http://java.sun.com/
+ - set JAVA_HOME environment variable to the Java installation folder (e.g. JAVA_HOME=C:/Program Files/Java/jdk1.6.0_24 in Windows)
+* Maven 3.x http://maven.apache.org/
+ - Check mvn command can be used from your command line.
+
+[Windows (32/64-bit)]
+* GNU make 
+* And also tar, curl, cp, rm, grep commands are needed. (I use Cygwin and MinGW for building snappy-java in Windows)
+
+[Windows (32-bit only)]
+* Install MinGW http://www.mingw.org/
+* Set PATH to the following command in MinGW package
+ - mingw32-g++
+ - strip
+
+To build x86 (32bit) dll under 64-bit Windows, use "make win32" target.
+
+[Windows (64-bit only)]
+* Download MinGW-w64 http://sourceforge.net/projects/mingw-w64/ 
+* Set PATH to the following commands in the downloaded archive: 
+ - x86_64-w64-mingw32-g++
+ - x86_64-w64-mingw32-strip
+
+NOTICE: Do not use the Cygwin version of MinGW-w64. It fails to build assemblies for 64bit environment.
+
+[Linux (32/64-bit)]
+* gcc-4.5.x or higher is necessary because snappy-java uses -static-libstdc++ option. It is possible to use gcc-4.3.x but a dependency to libstdc++ remains in the generated jar file; That means if another version of libstdc++ is used, snappy-java might not work correctly.
+* You can build 32-bit native library with 64-bit Linux machine (do make linux32)
+
+[Mac]
+* Install gcc, make, etc. included in Mac OS X install disk. (X Code)
+* Install mercurial using Mac Ports http://www.macports.org/
+
+= Building snappy-java =
+
+To build jar file of snappy-java, type:
+$ make 
+
+A native library for your machine environment and a jar package target/snappy-java-(version).jar are produced in the target folder.
+
+= Building only the native library = 
+$ make native
+
+= Rebuild the native library for your platform =
+$ make clean-native native
+
+
+= Using system installed libsnappyjava (or snappyjava.dll) = 
+
+Set org.xerial.snappy.use.systemlib system property to true:
+
+java -Djava.library.path=(path to the installed snappyjava lib) -Dorg.xerial.snappy.use.systemlib=true  ...
+
+With this setting snappy-java does not use bundled native libraries. Insted it tries to load native library installed at the path specified in java.library.path.
+
+
+= Configure snappy-java using property file =
+
+Prepare org-xerial-snappy.properties file (under the root path of your library) in Java's property file format.
+Here is a list of the available properties:
+
+ * org.xerial.snappy.lib.path   (directory containing a snappyjava's native library)
+ * org.xerial.snappy.lib.name   (library file name)
+ * org.xerial.snappy.tempdir    (temporary directory to extract a native library bundled in snappy-java)
+ * org.xerial.snappy.use.systemlib  (if this value is true, use system installed libsnappyjava.so looking the path specified by java.library.path) 
+
+
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..75b5248
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..7ad5cc6
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,99 @@
+
+include Makefile.common
+
+MVN:=mvn
+
+all: snappy
+
+SNAPPY_OUT:=$(TARGET)/$(snappy)-$(os_arch)
+SNAPPY_ARCHIVE:=$(TARGET)/snappy-$(VERSION).tar.gz 
+SNAPPY_CC:=snappy-sinksource.cc snappy-stubs-internal.cc snappy.cc
+SNAPPY_SRC_DIR:=$(TARGET)/snappy-$(VERSION)
+SNAPPY_SRC:=$(addprefix $(SNAPPY_SRC_DIR)/,$(SNAPPY_CC))
+SNAPPY_OBJ:=$(addprefix $(SNAPPY_OUT)/,$(patsubst %.cc,%.o,$(SNAPPY_CC)) SnappyNative.o)
+
+SNAPPY_UNPACKED:=$(TARGET)/snappy-extracted.log
+
+CXXFLAGS:=$(CXXFLAGS) -I$(SNAPPY_SRC_DIR)
+
+$(SNAPPY_ARCHIVE):
+	@mkdir -p $(@D)
+	curl -o$@ http://snappy.googlecode.com/files/snappy-$(VERSION).tar.gz
+
+$(SNAPPY_UNPACKED): $(SNAPPY_ARCHIVE)
+	tar xvfz $< -C $(TARGET)	
+	touch $@
+
+jni-header: $(SRC)/org/xerial/snappy/SnappyNative.h
+
+
+$(SRC)/org/xerial/snappy/SnappyNative.h: $(SRC)/org/xerial/snappy/SnappyNative.java
+	$(JAVAH) -classpath $(TARGET)/classes -o $@ org.xerial.snappy.SnappyNative
+
+bytecode: src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode
+
+src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode: src/main/resources/org/xerial/snappy/SnappyNativeLoader.java
+	@mkdir -p $(TARGET)/temp
+	$(JAVAC) -source 1.5 -target 1.5 -d $(TARGET)/temp $<
+	cp $(TARGET)/temp/org/xerial/snappy/SnappyNativeLoader.class $@
+
+$(SNAPPY_SRC): $(SNAPPY_UNPACKED)
+
+$(SNAPPY_OUT)/%.o : $(SNAPPY_SRC_DIR)/%.cc
+	@mkdir -p $(@D)
+	$(CXX) $(CXXFLAGS) -c $< -o $@ 
+
+$(SNAPPY_OUT)/SnappyNative.o : $(SRC)/org/xerial/snappy/SnappyNative.cpp $(SRC)/org/xerial/snappy/SnappyNative.h  
+	@mkdir -p $(@D)
+	$(CXX) $(CXXFLAGS) -c $< -o $@
+
+
+$(SNAPPY_OUT)/$(LIBNAME): $(SNAPPY_OBJ)
+	$(CXX) $(CXXFLAGS) -o $@ $+ $(LINKFLAGS) 
+	$(STRIP) $@
+
+clean-native: 
+	rm -rf $(SNAPPY_OUT)
+
+clean:
+	rm -rf $(TARGET)
+
+NATIVE_DIR:=src/main/resources/org/xerial/snappy/native/$(OS_NAME)/$(OS_ARCH)
+NATIVE_TARGET_DIR:=$(TARGET)/classes/org/xerial/snappy/native/$(OS_NAME)/$(OS_ARCH)
+NATIVE_DLL:=$(NATIVE_DIR)/$(LIBNAME)
+
+snappy-jar-version:=snappy-java-$(shell $(JAVA) -jar lib/silk-weaver.jar find 'project(artifactId, version)' pom.xml | grep snappy-java | awk '{ print $$2; }')
+
+native: $(SNAPPY_UNPACKED) $(NATIVE_DLL) 
+snappy: native $(TARGET)/$(snappy-jar-version).jar
+
+$(NATIVE_DLL): $(SNAPPY_OUT)/$(LIBNAME) 
+	@mkdir -p $(@D)
+	cp $< $@
+	@mkdir -p $(NATIVE_TARGET_DIR)
+	cp $< $(NATIVE_TARGET_DIR)/$(LIBNAME)
+
+
+$(TARGET)/$(snappy-jar-version).jar: native $(NATIVE_DLL)
+	$(MVN) package -Dmaven.test.skip=true
+
+test: $(NATIVE_DLL)
+	$(MVN) test
+
+win32: 
+	$(MAKE) native CXX=mingw32-g++ OS_NAME=Windows OS_ARCH=x86  
+
+mac32: 
+	$(MAKE) native OS_NAME=Mac OS_ARCH=i386
+
+linux32:
+	$(MAKE) native OS_NAME=Linux OS_ARCH=i386
+
+clean-native-linux32:
+	$(MAKE) clean-native OS_NAME=Linux OS_ARCH=i386
+
+clean-native-win32:
+	$(MAKE) clean-native OS_NAME=Windows OS_ARCH=x86
+
+javadoc:
+	$(MVN) javadoc:javadoc -DreportOutputDirectory=wiki/apidocs
diff --git a/Makefile.common b/Makefile.common
new file mode 100644
index 0000000..f4a3fdd
--- /dev/null
+++ b/Makefile.common
@@ -0,0 +1,114 @@
+TARGET:=target
+SRC:=src/main/java
+include $(SRC)/org/xerial/snappy/VERSION
+
+ifndef JAVA_HOME
+$(error Set JAVA_HOME environment variable)
+endif
+
+
+JAVA  := "$$JAVA_HOME/bin/java"
+JAVAC := "$$JAVA_HOME/bin/javac" 
+JAVAH := "$$JAVA_HOME/bin/javah"
+
+OSINFO_CLASS := org.xerial.snappy.OSInfo
+OSINFO_PROG := lib/org/xerial/snappy/OSInfo.class
+
+## building OSInfo.java 
+#$(info compiling OSInfo.java)
+#$(shell mkdir -p lib)
+#$(shell $(JAVAC) src/main/java/org/sqlite/OSInfo.java -d lib)
+
+OS_NAME := $(shell $(JAVA) -cp lib $(OSINFO_CLASS) --os)
+OS_ARCH := $(shell $(JAVA) -cp lib $(OSINFO_CLASS) --arch)
+LIB_FOLDER := $(shell $(JAVA) -cp lib $(OSINFO_CLASS))
+
+# Windows uses different path separators
+ifeq ($(OS_NAME),Windows)
+	sep := ;
+else
+	sep := :
+endif
+
+snappy := snappy-$(VERSION)
+
+
+jni_md := $(shell find -L "$(JAVA_HOME)" -name jni_md.h)
+ifneq ($(jni_md),)
+jni_include := $(shell dirname "$(jni_md)")
+endif
+
+
+# os=Default is meant to be generic unix/linux
+
+known_os_archs := Linux-i386 Linux-amd64 Mac-i386 Mac-x86_64 Windows-x86 Windows-amd64
+os_arch := $(OS_NAME)-$(OS_ARCH)
+
+ifeq (,$(findstring $(strip $(os_arch)),$(known_os_archs)))
+  os_arch := Default
+endif
+
+Default_CXX          := g++
+Default_STRIP        := strip
+Default_CXXFLAGS     := -I$(JAVA_HOME)/include -Ilib/inc_mac -O2 -fPIC -fvisibility=hidden
+Default_LINKFLAGS    := -shared -static
+Default_LIBNAME      := libsnappyjava.so
+Default_SNAPPY_FLAGS := 
+
+Linux-i386_CXX       := g++
+Linux-i386_STRIP     := strip
+Linux-i386_CXXFLAGS  := -Ilib/inc_linux -I$(JAVA_HOME)/include -Ilib/inc_mac -O2 -fPIC -fvisibility=hidden -m32
+Linux-i386_LINKFLAGS := -shared -static-libgcc -static-libstdc++ 
+Linux-i386_LIBNAME   := libsnappyjava.so
+Linux-i386_SNAPPY_FLAGS:= 
+
+Linux-amd64_CXX       := g++ 
+Linux-amd64_STRIP     := strip
+Linux-amd64_CXXFLAGS  := -Ilib/inc_linux -I$(JAVA_HOME)/include -Ilib/inc_mac -O2 -fPIC -fvisibility=hidden -m64 
+Linux-amd64_LINKFLAGS := -shared -static-libgcc -static-libstdc++ 
+Linux-amd64_LIBNAME   := libsnappyjava.so
+Linux-amd64_SNAPPY_FLAGS  := 
+
+Mac-i386_CXX       := g++ -arch $(OS_ARCH) 
+Mac-i386_STRIP     := strip -x
+Mac-i386_CXXFLAGS  := -I$(JAVA_HOME)/include -O2 -fPIC -mmacosx-version-min=10.4 -fvisibility=hidden
+Mac-i386_LINKFLAGS := -dynamiclib -static-libgcc
+Mac-i386_LIBNAME   := libsnappyjava.jnilib
+Mac-i386_SNAPPY_FLAGS  :=
+
+Mac-x86_64_CXX       := g++ -arch $(OS_ARCH) 
+Mac-x86_64_STRIP     := strip -x
+Mac-x86_64_CXXFLAGS  := -I$(JAVA_HOME)/include -O2 -fPIC -mmacosx-version-min=10.5 -fvisibility=hidden
+Mac-x86_64_LINKFLAGS := -dynamiclib -static-libgcc 
+Mac-x86_64_LIBNAME   := libsnappyjava.jnilib 
+Mac-x86_64_SNAPPY_FLAGS  := 
+
+Windows-x86_CXX          := mingw32-g++
+Windows-x86_STRIP        := strip
+Windows-x86_CXXFLAGS     := -Ilib/inc_win -O2 
+Windows-x86_LINKFLAGS    := -Wl,--kill-at -shared -static
+Windows-x86_LIBNAME      := snappyjava.dll
+Windows-x86_SNAPPY_FLAGS := 
+
+Windows-amd64_CXX          := x86_64-w64-mingw32-g++
+Windows-amd64_STRIP        := x86_64-w64-mingw32-strip
+Windows-amd64_CXXFLAGS     := -Ilib/inc_win -O2 
+Windows-amd64_LINKFLAGS    := -Wl,--kill-at -shared -static 
+Windows-amd64_LIBNAME      := snappyjava.dll
+Windows-amd64_SNAPPY_FLAGS := 
+
+
+CXX        := $($(os_arch)_CXX)
+STRIP     := $($(os_arch)_STRIP)
+CXXFLAGS    := $($(os_arch)_CXXFLAGS) 
+LINKFLAGS := $($(os_arch)_LINKFLAGS) 
+LIBNAME   := $($(os_arch)_LIBNAME)
+SNAPPY_FLAGS := $($(os_arch)_SNAPPY_FLAGS)
+
+
+
+CXXFLAGS := $(CXXFLAGS) -Ilib/include  
+ifneq ($(jni_include),)
+CXXFLAGS := $(CXXFLAGS) -I"$(jni_include)"
+endif
+
diff --git a/Makefile.package b/Makefile.package
new file mode 100644
index 0000000..8f4feb5
--- /dev/null
+++ b/Makefile.package
@@ -0,0 +1,87 @@
+# Makefile for building and collecting native libraries in Win/Mac/Linux (32/64bit). 
+
+include Makefile.common
+
+RESOURCE_DIR=src/main/resources
+NATIVE_DIR=$(RESOURCE_DIR)/native
+RSYNC=rsync -av -e ssh --exclude=".hg"
+
+WORK:=work/hg/snappy-java
+
+WIN64_SERVER=localhost
+MAC_SERVER=172.16.133.41
+MAC_TIGER_SERVER=172.16.133.171
+
+
+AMD_SERVER=hx02
+
+
+BUILD_CMD_PREFIX = hg pull -u && make clean-native && make 
+BUILD_CMD = $(BUILD_CMD_PREFIX) native
+TEST_CMD = hg pull -u && mvn test
+
+all: compile test
+
+.PHONY: compile test native clean
+
+DLL_DIR=src/main/resources/org/xerial/snappy/native
+
+DLL_WIN=$(DLL_DIR)/Windows/x86/snappyjava.dll
+DLL_WIN64=$(DLL_DIR)/Windows/amd64/snappyjava.dll
+DLL_MAC=$(DLL_DIR)/Mac/x86_64/libsnappyjava.jnilib
+DLL_TIGER_MAC=$(DLL_DIR)/Mac/i386/libsnappyjava.jnilib
+DLL_LINUX=$(DLL_DIR)/Linux/i386/libsnappyjava.so
+DLL_AMD64=$(DLL_DIR)/Linux/amd64/libsnappyjava.so
+
+version_file:=src/main/java/org/xerial/snappy/VERSION
+
+$(DLL_WIN):  $(version_file)
+	ssh $(WIN64_SERVER) "source .zprofile && cd $(WORK) && $(BUILD_CMD_PREFIX) win32"
+	mkdir -p $(dir $(DLL_WIN))
+	$(RSYNC)  $(WIN_SERVER):./$(WORK)/$(DLL_WIN) $(DLL_WIN)
+
+$(DLL_WIN64): $(version_file)
+	ssh $(WIN64_SERVER) "source .zprofile && cd $(WORK) && $(BUILD_CMD)"
+	mkdir -p $(dir $(DLL_WIN64))
+	$(RSYNC)  $(WIN64_SERVER):./$(WORK)/$(DLL_WIN64) $(DLL_WIN64)
+
+$(DLL_MAC): $(version_file)
+	ssh $(MAC_SERVER) "source .zprofile && cd $(WORK) && $(BUILD_CMD)"
+	mkdir -p $(dir $(DLL_MAC))
+	$(RSYNC)  $(MAC_SERVER):./$(WORK)/$(DLL_MAC) $(DLL_MAC)
+
+$(DLL_TIGER_MAC): $(version_file)
+	ssh $(MAC_TIGER_SERVER) "source .zprofile && cd $(WORK) && $(BUILD_CMD)"
+	mkdir -p $(dir $(DLL_TIGER_MAC))
+	$(RSYNC)  $(MAC_TIGER_SERVER):./$(WORK)/$(DLL_TIGER_MAC) $(DLL_TIGER_MAC)
+
+$(DLL_LINUX):$(version_file)
+	ssh $(AMD_SERVER) "source .zprofile && cd $(WORK) && $(BUILD_CMD_PREFIX) linux32"
+	mkdir -p $(dir $(DLL_LINUX))
+	$(RSYNC)  $(AMD_SERVER):./$(WORK)/$(DLL_LINUX) $(DLL_LINUX)
+
+$(DLL_AMD64):$(version_file)
+	ssh $(AMD_SERVER) "source .zprofile && cd $(WORK) && $(BUILD_CMD)"
+	mkdir -p $(dir $(DLL_AMD64))
+	$(RSYNC)  $(AMD_SERVER):./$(WORK)/$(DLL_AMD64) $(DLL_AMD64)
+
+
+native: $(DLL_WIN) $(DLL_WIN64) $(DLL_LINUX) $(DLL_AMD64) $(DLL_MAC) $(DLL_TIGER_MAC) 
+
+compile: native
+
+test:
+	ssh $(WIN64_SERVER) "source .zprofile && cd $(WORK) && $(TEST_CMD)"
+	ssh $(MAC_SERVER) "source .zprofile && cd $(WORK) && $(TEST_CMD)"
+	ssh $(MAC_TIGER_SERVER) "source .zprofile && cd $(WORK) && $(TEST_CMD)"
+	ssh $(AMD_SERVER) "source .zprofile && cd $(WORK) && $(TEST_CMD)"
+
+release:
+	mvn release:prepare
+	mvn release:perform
+
+release-xerial:
+	mvn release:perform -Dtag=snappy-java-$(VERSION)
+
+release-sourceforge:
+	mvn release:perform -Darguments="-P sourceforge" -Dtag=snappy-java-$(VERSION)
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..639ab66
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,14 @@
+This product includes software developed by Google
+ Snappy: http://code.google.com/p/snappy/ (New BSD License)
+
+
+This library containd statically linked libstdc++. This inclusion is allowed by 
+"GCC RUntime Library Exception" 
+http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html
+
+== Contributors ==
+  * Tatu Saloranta  
+    * Providing benchmark suite
+  * Alec Wysoker
+    * Performance and memory usage improvement
+
diff --git a/README b/README
new file mode 100644
index 0000000..d060d44
--- /dev/null
+++ b/README
@@ -0,0 +1,102 @@
+This document is a copy of http://code.google.com/p/snappy-java/
+
+---------------------------------------
+The snappy-java is a Java port of the snappy http://code.google.com/p/snappy/, a fast compresser/decompresser written in C++ developed by Google.
+
+== Features ==
+  * [http://www.apache.org/licenses/LICENSE-2.0 Apache Licence Version 2.0]. Free for both commercial and non-commercial use.
+  * Fast compression/decompression tailored to 64-bit CPU architecture. 
+  * JNI-based implementation to achieve comparable performance to the native C++ version.  
+     * Although snappy-java uses JNI, it can be used safely with multiple class loaders (e.g. Tomcat, etc.). 
+  * Portable across various operating systems; Snappy-java contains native libraries built for Window/Mac/Linux (32/64-bit). At runtime, snappy-java loads one of these libraries according to your machine environment (It looks system properties, `os.name` and `os.arch`). 
+  * Simple usage. Add the snappy-java-(version).jar file to your classpath. Then call compression/decompression methods in org.xerial.snappy.Snappy. 
+
+== Performance ==
+  * Snappy's main target is very high-speed compression/decompression with reasonable compression size. So the compression ratio of snappy-java is modest and about the same as `LZF` (ranging 20%-100% according to the dataset).
+
+  * Here are some [https://github.com/ning/jvm-compressor-benchmark/wiki benchmark results], comparing snappy-java and the other compressors `LZO-java`/`LZF`/`QuickLZ`/`Gzip`/`Bzip2`. Thanks [http://twitter.com/#!/cowtowncoder Tatu Saloranta @cowtowncoder] for providing the benchmark suite. 
+ * The benchmark result indicates snappy-java is the fastest compreesor/decompressor in Java:
+    * http://ning.github.com/jvm-compressor-benchmark/results/canterbury-roundtrip-2011-07-28/index.html
+ * The decompression speed is twice as fast as the others:
+    * http://ning.github.com/jvm-compressor-benchmark/results/canterbury-uncompress-2011-07-28/index.html
+
+
+
+== Download ==
+The current stable version 1.0.3.1 is available from here:
+  * Release version: http://maven.xerial.org/repository/artifact/org/xerial/snappy/snappy-java
+    * [Milestone] release plans
+  * Snapshot version (the latest beta version): http://maven.xerial.org/repository/snapshot/org/xerial/snappy/snappy-java/
+
+If you are a Maven user, see [#Using_with_Maven]
+
+== Usage == 
+First, import `org.xerial.snapy.Snappy` in your Java code:
+{{{
+import org.xerial.snappy.Snappy;
+}}}
+
+Then use `Snappy.compress(byte[])` and `Snappy.uncompress(byte[])`:
+{{{
+String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of "
++ "Snappy, a fast compresser/decompresser.";
+byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
+byte[] uncompressed = Snappy.uncompress(compressed);
+
+String result = new String(uncompressed, "UTF-8");
+System.out.println(result);
+}}}
+
+In addition, high-level methods (`Snappy.compress(String)`, `Snappy.compress(float[] ..)` etc. ) and low-level ones (e.g. `Snappy.rawCompress(.. )`,  `Snappy.rawUncompress(..)`, etc.), which minimize memory copies, can be used. See also 
+[http://code.google.com/p/snappy-java/source/browse/src/main/java/org/xerial/snappy/Snappy.java Snappy.java]
+
+===Stream-based API===
+Stream-based compressor/decompressor `SnappyOutputStream`/`SnappyInputStream` are also available for reading/writing large data sets.
+
+===Setting classpath==
+If you have snappy-java-(VERSION).jar in the current directory, use `-classpath` option as follows:
+{{{
+$ javac -classpath ".;snappy-java-(VERSION).jar" Sample.java  # in Windows
+or 
+$ javac -classpath ".:snappy-java-(VERSION).jar" Sample.java  # in Mac or Linux
+}}}
+
+===Using with Maven===
+  * Snappy-java is available from Maven's central repository:  http://repo1.maven.org/maven2/org/xerial/snappy/snappy-java 
+
+Add the following dependency to your pom.xml:
+{{{
+<dependency>
+  <groupId>org.xerial.snappy</groupId>
+  <artifactId>snappy-java</artifactId>
+  <version>(version)</version>
+  <type>jar</type>
+  <scope>compile</scope>
+</dependency>
+}}}
+
+==Public discussion group==
+Post bug reports or feature request to the Issue Tracker: http://code.google.com/p/snappy-java/issues/list
+
+Public discussion forum is here: [http://groups.google.com/group/xerial?hl=en Xerial Public Discussion Group]. 
+
+
+== Building from the source code ==
+See the [http://code.google.com/p/snappy-java/source/browse/INSTALL installation instruction]. Building from the source code is an option when your OS platform and CPU architecture is not supported. To build snappy-java, you need Mercurial(hg), JDK (1.6 or higher), Maven (3.x or higher is required), g++ compiler (mingw in Windows) etc.
+
+{{{
+$ hg clone https://snappy-java.googlecode.com/hg/ snappy-java 
+$ cd snappy-java
+$ make
+}}}
+
+A file `target/snappy-java-$(version).jar` is the product additionally containing the native library built for your platform.
+
+==Miscellaneous Notes==
+===Using snappy-java with Tomcat 6 (or higher) Web Server===
+
+Simply put the snappy-java's jar to WEB-INF/lib folder of your web application. Usual JNI-library specific problem no longer exists since snappy-java version 1.0.3 or higher can be loaded by multiple class loaders in the same JVM by using native code injection to the parent class loader (Issue 21). 
+
+
+----
+Snappy-java is developed by [http://www.xerial.org/leo Taro L. Saito]. Twitter  [http://twitter.com/#!/taroleo @taroleo]
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..9b561ff
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,297 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.xerial.snappy</groupId>
+  <artifactId>snappy-java</artifactId>
+  <version>1.0.4.1</version>
+  <name>Snappy for Java</name>
+  <description>snappy-java: A fast compression/decompression library</description>
+  <packaging>bundle</packaging>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <developers>
+    <developer>
+      <id>leo</id>
+      <name>Taro L. Saito</name>
+      <email>leo at xerial.org</email>
+      <organization>Xerial Project</organization>
+      <roles>
+        <role>Architect</role>
+        <role>Project Manager</role>
+        <role>Chief Developer</role>
+      </roles>
+      <timezone>+9</timezone>
+    </developer>
+  </developers>
+
+  <organization>
+  	<name>xerial.org</name>
+  	<url>http://www.xerial.org/</url>
+  </organization>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/java</directory>
+        <includes>
+          <include>org/xerial/snappy/VERSION</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+        <includes>
+          <include>org/xerial/snappy/*.bytecode</include>
+          <include>org/xerial/snappy/native/**</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>${basedir}</directory>
+        <targetPath>META-INF/maven/${project.groupId}/${project.artifactId}</targetPath>
+        <includes>
+          <include>LICENSE*</include>
+        </includes>
+      </resource>
+    </resources>
+    <testResources>
+      <testResource>
+        <directory>src/test/java</directory>
+        <excludes>
+          <exclude>**/*.java</exclude>
+        </excludes>
+      </testResource>
+      <testResource>
+        <directory>src/test/resources</directory>
+      </testResource>
+    </testResources>
+
+
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.5</version>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.0.2</version>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-release-plugin</artifactId>
+        <version>2.1</version>
+        <configuration>
+          <!-- do not run site-deploy goal, included in the default settings -->
+          <goals>deploy</goals>
+          <connectionUrl>scm:hg:https://snappy-java.googlecode.com/hg/</connectionUrl>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <version>2.8</version>
+        <configuration>
+          <charset>UTF-8</charset>
+          <locale>en_US</locale>
+          <show>public</show>
+          <stylesheetfile>stylesheet.css</stylesheetfile>
+        </configuration>
+        <executions>
+          <execution>
+            <id>attach-javadocs</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-source-plugin</artifactId>
+        <version>2.1.2</version>
+        <configuration>
+          <excludeResources>true</excludeResources>
+        </configuration>
+        <executions>
+          <execution>
+            <id>attach-sources</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>2.3.4</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+            <Bundle-Name>${pproject.name}</Bundle-Name>
+            <Bundle-Version>${project.version}</Bundle-Version>
+            <Bundle-Activator>org.xerial.snappy.SnappyBundleActivator</Bundle-Activator>
+            <Export-Package>org.xerial.snappy</Export-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2.1</version>
+        <configuration>
+          <descriptors>
+            <descriptor>src/assembly/project.xml</descriptor>
+          </descriptors>
+          <appendAssemblyId>false</appendAssemblyId>
+          <attach>false</attach>
+        </configuration>
+        <executions>
+          <execution>
+            <id>make-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+
+    <extensions>
+      <extension>
+        <groupId>org.apache.maven.wagon</groupId>
+        <artifactId>wagon-ssh-external</artifactId>
+        <version>1.0-beta-7</version>
+      </extension>
+    </extensions>
+
+  </build>
+
+
+  <url>http://code.google.com/p/snappy-java/</url>
+  <issueManagement>
+  	<system>Google Code</system>
+  	<url>http://code.google.com/p/snappy-java/issues/list</url>
+  </issueManagement>
+  <inceptionYear>2011</inceptionYear>
+  <scm>
+    <connection>scm:hg:https://snappy-java.googlecode.com/hg/</connection>
+    <developerConnection>scm:hg:default</developerConnection>
+    <url>scm:hg:https://snappy-java.googlecode.com/hg/</url>
+  </scm>
+
+  <distributionManagement>
+    <!-- for development releases -->
+    <site>
+      <id>xerial.scp</id>
+      <url>scpexe://www.xerial.org/home/web/maven.xerial.org/repository/site</url>
+    </site>
+    <repository>
+      <id>xerial.scp</id>
+      <name>Xerial Maven Repository</name>
+      <url>scpexe://www.xerial.org/home/web/maven.xerial.org/repository/artifact</url>
+    </repository>
+    <snapshotRepository>
+      <id>xerial.scp</id>
+      <name>Xerial Maven Snapshot Repository</name>
+      <url>scpexe://www.xerial.org/home/web/maven.xerial.org/repository/snapshot</url>
+      <uniqueVersion>false</uniqueVersion>
+    </snapshotRepository>
+  </distributionManagement>
+
+  <profiles>
+    <!-- for directly sending artifacts to sourceforge.net repository -->
+    <profile>
+      <id>sourceforge</id>
+      <distributionManagement>
+        <repository>
+          <id>xerial.sourceforge</id>
+          <name>Xerial maven repository at sourceforge.jp</name>
+          <url>scpexe://shell.sourceforge.jp/home/groups/x/xe/xerial/htdocs/maven/release</url>
+        </repository>
+      </distributionManagement>
+    </profile>
+
+    <!-- for local updates -->
+    <profile>
+      <id>xerial.local</id>
+      <distributionManagement>
+        <repository>
+          <id>xerial.local</id>
+          <name>Xerial Maven Repository</name>
+          <url>file:///home/web/maven.xerial.org/repository/artifact</url>
+        </repository>
+        <snapshotRepository>
+          <id>xerial.local</id>
+          <name>Xerial Maven Snapshot Repository</name>
+          <url>file:///home/web/maven.xerial.org/repository/snapshot</url>
+          <uniqueVersion>false</uniqueVersion>
+        </snapshotRepository>
+        <site>
+          <id>xerial.local</id>
+          <url>file:///home/web/maven.xerial.org/repository/site</url>
+        </site>
+      </distributionManagement>
+    </profile>
+  </profiles>
+
+
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.2</version>
+      <type>jar</type>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-classworlds</artifactId>
+      <version>2.4</version>
+      <type>jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>core</artifactId>
+      <version>4.3.0</version>
+      <type>jar</type>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.xerial</groupId>
+      <artifactId>xerial-core</artifactId>
+      <version>1.0.21</version>
+      <type>jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/pom.xml.releaseBackup b/pom.xml.releaseBackup
new file mode 100644
index 0000000..af61c9d
--- /dev/null
+++ b/pom.xml.releaseBackup
@@ -0,0 +1,297 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.xerial.snappy</groupId>
+  <artifactId>snappy-java</artifactId>
+  <version>1.0.4.1-SNAPSHOT</version>
+  <name>Snappy for Java</name>
+  <description>snappy-java: A fast compression/decompression library</description>
+  <packaging>bundle</packaging>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <licenses>
+    <license>
+      <name>The Apache Software License, Version 2.0</name>
+      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+
+  <developers>
+    <developer>
+      <id>leo</id>
+      <name>Taro L. Saito</name>
+      <email>leo at xerial.org</email>
+      <organization>Xerial Project</organization>
+      <roles>
+        <role>Architect</role>
+        <role>Project Manager</role>
+        <role>Chief Developer</role>
+      </roles>
+      <timezone>+9</timezone>
+    </developer>
+  </developers>
+
+  <organization>
+  	<name>xerial.org</name>
+  	<url>http://www.xerial.org/</url>
+  </organization>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/java</directory>
+        <includes>
+          <include>org/xerial/snappy/VERSION</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>src/main/resources</directory>
+        <includes>
+          <include>org/xerial/snappy/*.bytecode</include>
+          <include>org/xerial/snappy/native/**</include>
+        </includes>
+      </resource>
+      <resource>
+        <directory>${basedir}</directory>
+        <targetPath>META-INF/maven/${project.groupId}/${project.artifactId}</targetPath>
+        <includes>
+          <include>LICENSE*</include>
+        </includes>
+      </resource>
+    </resources>
+    <testResources>
+      <testResource>
+        <directory>src/test/java</directory>
+        <excludes>
+          <exclude>**/*.java</exclude>
+        </excludes>
+      </testResource>
+      <testResource>
+        <directory>src/test/resources</directory>
+      </testResource>
+    </testResources>
+
+
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.5</version>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.0.2</version>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-release-plugin</artifactId>
+        <version>2.1</version>
+        <configuration>
+          <!-- do not run site-deploy goal, included in the default settings -->
+          <goals>deploy</goals>
+          <connectionUrl>scm:hg:https://snappy-java.googlecode.com/hg/</connectionUrl>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <version>2.8</version>
+        <configuration>
+          <charset>UTF-8</charset>
+          <locale>en_US</locale>
+          <show>public</show>
+          <stylesheetfile>stylesheet.css</stylesheetfile>
+        </configuration>
+        <executions>
+          <execution>
+            <id>attach-javadocs</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-source-plugin</artifactId>
+        <version>2.1.2</version>
+        <configuration>
+          <excludeResources>true</excludeResources>
+        </configuration>
+        <executions>
+          <execution>
+            <id>attach-sources</id>
+            <phase>verify</phase>
+            <goals>
+              <goal>jar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <version>2.3.4</version>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+            <Bundle-Name>${pproject.name}</Bundle-Name>
+            <Bundle-Version>${project.version}</Bundle-Version>
+            <Bundle-Activator>org.xerial.snappy.SnappyBundleActivator</Bundle-Activator>
+            <Export-Package>org.xerial.snappy</Export-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-assembly-plugin</artifactId>
+        <version>2.2.1</version>
+        <configuration>
+          <descriptors>
+            <descriptor>src/assembly/project.xml</descriptor>
+          </descriptors>
+          <appendAssemblyId>false</appendAssemblyId>
+          <attach>false</attach>
+        </configuration>
+        <executions>
+          <execution>
+            <id>make-assembly</id>
+            <phase>package</phase>
+            <goals>
+              <goal>single</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+
+    <extensions>
+      <extension>
+        <groupId>org.apache.maven.wagon</groupId>
+        <artifactId>wagon-ssh-external</artifactId>
+        <version>1.0-beta-7</version>
+      </extension>
+    </extensions>
+
+  </build>
+
+
+  <url>http://code.google.com/p/snappy-java/</url>
+  <issueManagement>
+  	<system>Google Code</system>
+  	<url>http://code.google.com/p/snappy-java/issues/list</url>
+  </issueManagement>
+  <inceptionYear>2011</inceptionYear>
+  <scm>
+    <connection>scm:hg:https://snappy-java.googlecode.com/hg/</connection>
+    <developerConnection>scm:hg:default</developerConnection>
+    <url>scm:hg:https://snappy-java.googlecode.com/hg/</url>
+  </scm>
+
+  <distributionManagement>
+    <!-- for development releases -->
+    <site>
+      <id>xerial.scp</id>
+      <url>scpexe://www.xerial.org/home/web/maven.xerial.org/repository/site</url>
+    </site>
+    <repository>
+      <id>xerial.scp</id>
+      <name>Xerial Maven Repository</name>
+      <url>scpexe://www.xerial.org/home/web/maven.xerial.org/repository/artifact</url>
+    </repository>
+    <snapshotRepository>
+      <id>xerial.scp</id>
+      <name>Xerial Maven Snapshot Repository</name>
+      <url>scpexe://www.xerial.org/home/web/maven.xerial.org/repository/snapshot</url>
+      <uniqueVersion>false</uniqueVersion>
+    </snapshotRepository>
+  </distributionManagement>
+
+  <profiles>
+    <!-- for directly sending artifacts to sourceforge.net repository -->
+    <profile>
+      <id>sourceforge</id>
+      <distributionManagement>
+        <repository>
+          <id>xerial.sourceforge</id>
+          <name>Xerial maven repository at sourceforge.jp</name>
+          <url>scpexe://shell.sourceforge.jp/home/groups/x/xe/xerial/htdocs/maven/release</url>
+        </repository>
+      </distributionManagement>
+    </profile>
+
+    <!-- for local updates -->
+    <profile>
+      <id>xerial.local</id>
+      <distributionManagement>
+        <repository>
+          <id>xerial.local</id>
+          <name>Xerial Maven Repository</name>
+          <url>file:///home/web/maven.xerial.org/repository/artifact</url>
+        </repository>
+        <snapshotRepository>
+          <id>xerial.local</id>
+          <name>Xerial Maven Snapshot Repository</name>
+          <url>file:///home/web/maven.xerial.org/repository/snapshot</url>
+          <uniqueVersion>false</uniqueVersion>
+        </snapshotRepository>
+        <site>
+          <id>xerial.local</id>
+          <url>file:///home/web/maven.xerial.org/repository/site</url>
+        </site>
+      </distributionManagement>
+    </profile>
+  </profiles>
+
+
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.8.2</version>
+      <type>jar</type>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-classworlds</artifactId>
+      <version>2.4</version>
+      <type>jar</type>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>core</artifactId>
+      <version>4.3.0</version>
+      <type>jar</type>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.xerial</groupId>
+      <artifactId>xerial-core</artifactId>
+      <version>1.0.21</version>
+      <type>jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/release.properties b/release.properties
new file mode 100644
index 0000000..2cb202d
--- /dev/null
+++ b/release.properties
@@ -0,0 +1,15 @@
+#release configuration
+#Wed Oct 05 10:29:25 JST 2011
+project.scm.org.xerial.snappy\:snappy-java.tag=HEAD
+project.scm.org.xerial.snappy\:snappy-java.url=scm\:hg\:https\://snappy-java.googlecode.com/hg/
+project.dev.org.xerial.snappy\:snappy-java=1.0.4.2-SNAPSHOT
+scm.tag=snappy-java-1.0.4.1
+scm.url=scm\:hg\:default
+pushChanges=true
+preparationGoals=clean verify
+remoteTagging=true
+scm.commentPrefix=[maven-release-plugin] 
+project.scm.org.xerial.snappy\:snappy-java.developerConnection=scm\:hg\:default
+project.scm.org.xerial.snappy\:snappy-java.connection=scm\:hg\:https\://snappy-java.googlecode.com/hg/
+project.rel.org.xerial.snappy\:snappy-java=1.0.4.1
+completedPhase=generate-release-poms
diff --git a/src/assembly/project.xml b/src/assembly/project.xml
new file mode 100644
index 0000000..ab14e3f
--- /dev/null
+++ b/src/assembly/project.xml
@@ -0,0 +1,20 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+  <id>project</id>
+  <formats>
+    <format>tar.gz</format>
+  </formats>
+  <fileSets>
+    <fileSet>
+      <directory>${project.basedir}</directory>
+      <outputDirectory>/</outputDirectory>
+      <useDefaultExcludes>true</useDefaultExcludes>
+      <excludes>
+        <exclude>**/*.log</exclude>
+	<exclude>**/*.settings</exclude>
+	<exclude>**/${project.build.directory}/**</exclude>
+      </excludes>
+    </fileSet>
+  </fileSets>
+</assembly>
diff --git a/src/main/java/org/xerial/snappy/OSInfo.java b/src/main/java/org/xerial/snappy/OSInfo.java
new file mode 100644
index 0000000..81f17c8
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/OSInfo.java
@@ -0,0 +1,80 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2008 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// snappy-java Project
+//
+// OSInfo.java
+// Since: May 20, 2008
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+/**
+ * Provides OS name and architecture name.
+ * 
+ * @author leo
+ * 
+ */
+public class OSInfo
+{
+    public static void main(String[] args) {
+        if (args.length >= 1) {
+            if ("--os".equals(args[0])) {
+                System.out.print(getOSName());
+                return;
+            }
+            else if ("--arch".equals(args[0])) {
+                System.out.print(getArchName());
+                return;
+            }
+        }
+
+        System.out.print(getNativeLibFolderPathForCurrentOS());
+    }
+
+    public static String getNativeLibFolderPathForCurrentOS() {
+        return getOSName() + "/" + getArchName();
+    }
+
+    public static String getOSName() {
+        return translateOSNameToFolderName(System.getProperty("os.name"));
+    }
+
+    public static String getArchName() {
+        return translateArchNameToFolderName(System.getProperty("os.arch"));
+    }
+
+    public static String translateOSNameToFolderName(String osName) {
+        if (osName.contains("Windows")) {
+            return "Windows";
+        }
+        else if (osName.contains("Mac")) {
+            return "Mac";
+        }
+        else if (osName.contains("Linux")) {
+            return "Linux";
+        }
+        else {
+            return osName.replaceAll("\\W", "");
+        }
+    }
+
+    public static String translateArchNameToFolderName(String archName) {
+        return archName.replaceAll("\\W", "");
+    }
+}
diff --git a/src/main/java/org/xerial/snappy/Snappy.java b/src/main/java/org/xerial/snappy/Snappy.java
new file mode 100644
index 0000000..dac227f
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/Snappy.java
@@ -0,0 +1,770 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// snappy-java Project
+//
+// Snappy.java
+// Since: 2011/03/29
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.util.Properties;
+
+/**
+ * Snappy API for data compression/decompression
+ * 
+ * @author leo
+ * 
+ */
+public class Snappy
+{
+    static {
+        try {
+            impl = SnappyLoader.load();
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * An instance of SnappyNativeAPI
+     */
+    private static Object impl;
+
+    /**
+     * Copy bytes from source to destination
+     * 
+     * @param src
+     *            pointer to the source array
+     * @param offset
+     *            byte offset in the source array
+     * @param byteLength
+     *            the number of bytes to copy
+     * @param dest
+     *            pointer to the destination array
+     * @param dest_offset
+     *            byte offset in the destination array
+     * @throws IOException
+     */
+    public static void arrayCopy(Object src, int offset, int byteLength, Object dest, int dest_offset)
+            throws IOException {
+        ((SnappyNativeAPI) impl).arrayCopy(src, offset, byteLength, dest, dest_offset);
+    }
+
+    /**
+     * High-level API for compressing the input byte array. This method performs
+     * array copy to generate the result. If you want to reduce the memory copy
+     * cost, use {@link #compress(byte[], int, int, byte[], int)} or
+     * {@link #compress(ByteBuffer, ByteBuffer)}.
+     * 
+     * @param input
+     *            the input data
+     * @return the compressed byte array
+     * @throws IOException
+     */
+    public static byte[] compress(byte[] input) throws IOException {
+        return rawCompress(input, input.length);
+    }
+
+    /**
+     * Compress the input buffer content in [inputOffset,
+     * ...inputOffset+inputLength) then output to the specified output buffer.
+     * 
+     * @param input
+     * @param inputOffset
+     * @param inputLength
+     * @param output
+     * @param outputOffset
+     * @return byte size of the compressed data
+     * @throws IOException
+     *             when failed to access the input/output buffer
+     */
+    public static int compress(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset)
+            throws IOException {
+        return rawCompress(input, inputOffset, inputLength, output, outputOffset);
+    }
+
+    /**
+     * Compress the content in the given input buffer. After the compression,
+     * you can retrieve the compressed data from the output buffer [pos() ...
+     * limit()) (compressed data size = limit() - pos() = remaining())
+     * 
+     * @param uncompressed
+     *            buffer[pos() ... limit()) containing the input data
+     * @param compressed
+     *            output of the compressed data. Uses range [pos()..].
+     * @return byte size of the compressed data.
+     * 
+     * @throws SnappyError
+     *             when the input is not a direct buffer
+     */
+    public static int compress(ByteBuffer uncompressed, ByteBuffer compressed) throws IOException {
+
+        if (!uncompressed.isDirect())
+            throw new SnappyError(SnappyErrorCode.NOT_A_DIRECT_BUFFER, "input is not a direct buffer");
+        if (!compressed.isDirect())
+            throw new SnappyError(SnappyErrorCode.NOT_A_DIRECT_BUFFER, "destination is not a direct buffer");
+
+        // input: uncompressed[pos(), limit())
+        // output: compressed
+        int uPos = uncompressed.position();
+        int uLen = uncompressed.remaining();
+        int compressedSize = ((SnappyNativeAPI) impl).rawCompress(uncompressed, uPos, uLen, compressed,
+                compressed.position());
+
+        //         pos  limit
+        // [ ......BBBBBBB.........]
+        compressed.limit(compressed.position() + compressedSize);
+
+        return compressedSize;
+    }
+
+    /**
+     * Compress the input char array
+     * 
+     * @param input
+     * @return the compressed data
+     */
+    public static byte[] compress(char[] input) {
+        return rawCompress(input, input.length * 2); // char uses 2 bytes
+    }
+
+    /**
+     * Compress the input double array
+     * 
+     * @param input
+     * @return the compressed data
+     */
+    public static byte[] compress(double[] input) {
+        return rawCompress(input, input.length * 8); // double uses 8 bytes
+    }
+
+    /**
+     * Compress the input float array
+     * 
+     * @param input
+     * @return the compressed data
+     */
+    public static byte[] compress(float[] input) {
+        return rawCompress(input, input.length * 4); // float uses 4 bytes
+    }
+
+    /**
+     * Compress the input int array
+     * 
+     * @param input
+     * @return the compressed data
+     */
+    public static byte[] compress(int[] input) {
+        return rawCompress(input, input.length * 4); // int uses 4 bytes
+    }
+
+    /**
+     * Compress the input long array
+     * 
+     * @param input
+     * @return the compressed data
+     */
+    public static byte[] compress(long[] input) {
+        return rawCompress(input, input.length * 8); // long uses 8 bytes
+    }
+
+    /**
+     * Compress the input short array
+     * 
+     * @param input
+     * @return the compressed data
+     */
+    public static byte[] compress(short[] input) {
+        return rawCompress(input, input.length * 2); // short uses 2 bytes
+    }
+
+    /**
+     * Compress the input String
+     * 
+     * @param s
+     * @return the compressed data
+     * @throws IOException
+     */
+    public static byte[] compress(String s) throws IOException {
+        try {
+            return compress(s, "UTF-8");
+        }
+        catch (UnsupportedEncodingException e) {
+            throw new IllegalStateException("UTF-8 encoder is not found");
+        }
+    }
+
+    /**
+     * Compress the input string using the given encoding
+     * 
+     * @param s
+     * @param encoding
+     * @return the compressed data
+     * @throws UnsupportedEncodingException
+     * @throws IOException
+     */
+    public static byte[] compress(String s, String encoding) throws UnsupportedEncodingException, IOException {
+        byte[] data = s.getBytes(encoding);
+        return compress(data);
+    }
+
+    /**
+     * Compress the input string using the given encoding
+     * 
+     * @param s
+     * @param encoding
+     * @return the compressed data
+     * @throws UnsupportedEncodingException
+     * @throws IOException
+     */
+    public static byte[] compress(String s, Charset encoding) throws IOException {
+        byte[] data = s.getBytes(encoding);
+        return compress(data);
+    }
+
+    /**
+     * Get the native library version of the snappy
+     * 
+     * @return native library version
+     */
+    public static String getNativeLibraryVersion() {
+
+        URL versionFile = SnappyLoader.class.getResource("/org/xerial/snappy/VERSION");
+
+        String version = "unknown";
+        try {
+            if (versionFile != null) {
+                Properties versionData = new Properties();
+                versionData.load(versionFile.openStream());
+                version = versionData.getProperty("version", version);
+                if (version.equals("unknown"))
+                    version = versionData.getProperty("VERSION", version);
+                version = version.trim().replaceAll("[^0-9\\.]", "");
+            }
+        }
+        catch (IOException e) {
+            e.printStackTrace();
+        }
+        return version;
+    }
+
+    /**
+     * Returns true iff the contents of compressed buffer [offset,
+     * offset+length) can be uncompressed successfully. Does not return the
+     * uncompressed data. Takes time proportional to the input length, but is
+     * usually at least a factor of four faster than actual decompression.
+     */
+    public static boolean isValidCompressedBuffer(byte[] input, int offset, int length) throws IOException {
+        if (input == null)
+            throw new NullPointerException("input is null");
+        return ((SnappyNativeAPI) impl).isValidCompressedBuffer(input, offset, length);
+    }
+
+    /**
+     * Returns true iff the contents of compressed buffer [offset,
+     * offset+length) can be uncompressed successfully. Does not return the
+     * uncompressed data. Takes time proportional to the input length, but is
+     * usually at least a factor of four faster than actual decompression.
+     */
+    public static boolean isValidCompressedBuffer(byte[] input) throws IOException {
+        return isValidCompressedBuffer(input, 0, input.length);
+    }
+
+    /**
+     * Returns true iff the contents of compressed buffer [pos() ... limit())
+     * can be uncompressed successfully. Does not return the uncompressed data.
+     * Takes time proportional to the input length, but is usually at least a
+     * factor of four faster than actual decompression.
+     */
+    public static boolean isValidCompressedBuffer(ByteBuffer compressed) throws IOException {
+        return ((SnappyNativeAPI) impl).isValidCompressedBuffer(compressed, compressed.position(),
+                compressed.remaining());
+    }
+
+    /**
+     * Get the maximum byte size needed for compressing data of the given byte
+     * size.
+     * 
+     * @param byteSize
+     *            byte size of the data to compress
+     * @return maximum byte size of the compressed data
+     */
+    public static int maxCompressedLength(int byteSize) {
+        return ((SnappyNativeAPI) impl).maxCompressedLength(byteSize);
+    }
+
+    /**
+     * Compress the input data and produce a byte array of the uncompressed data
+     * 
+     * @param data
+     *            input array. The input MUST be an array type
+     * @param byteSize
+     *            the input byte size
+     * @return compressed data
+     */
+    public static byte[] rawCompress(Object data, int byteSize) {
+        byte[] buf = new byte[Snappy.maxCompressedLength(byteSize)];
+        int compressedByteSize = ((SnappyNativeAPI) impl).rawCompress(data, 0, byteSize, buf, 0);
+        byte[] result = new byte[compressedByteSize];
+        System.arraycopy(buf, 0, result, 0, compressedByteSize);
+        return result;
+    }
+
+    /**
+     * Compress the input buffer [offset,... ,offset+length) contents, then
+     * write the compressed data to the output buffer[offset, ...)
+     * 
+     * @param input
+     *            input array. This MUST be a primitive array type
+     * @param inputOffset
+     *            byte offset at the output array
+     * @param inputLength
+     *            byte length of the input data
+     * @param output
+     *            output array. This MUST be a primitive array type
+     * @param outputOffset
+     *            byte offset at the output array
+     * @return byte size of the compressed data
+     * @throws IOException
+     */
+    public static int rawCompress(Object input, int inputOffset, int inputLength, byte[] output, int outputOffset)
+            throws IOException {
+        if (input == null || output == null)
+            throw new NullPointerException("input or output is null");
+
+        int compressedSize = ((SnappyNativeAPI) impl)
+                .rawCompress(input, inputOffset, inputLength, output, outputOffset);
+        return compressedSize;
+    }
+
+    /**
+     * Uncompress the content in the input buffer. The uncompressed data is
+     * written to the output buffer.
+     * 
+     * Note that if you pass the wrong data or the range [inputOffset,
+     * inputOffset + inputLength) that cannot be uncompressed, your JVM might
+     * crash due to the access violation exception issued in the native code
+     * written in C++. To avoid this type of crash, use
+     * {@link #isValidCompressedBuffer(byte[], int, int)} first.
+     * 
+     * @param input
+     *            input byte array
+     * @param inputOffset
+     *            byte offset in the input byte array
+     * @param inputLength
+     *            byte length of the input data
+     * @param output
+     *            output buffer, MUST be a primitive type array
+     * @param outputOffset
+     *            byte offset in the output buffer
+     * @return the byte size of the uncompressed data
+     * @throws IOException
+     *             when failed to uncompress the input data
+     */
+    public static int rawUncompress(byte[] input, int inputOffset, int inputLength, Object output, int outputOffset)
+            throws IOException {
+        if (input == null || output == null)
+            throw new NullPointerException("input or output is null");
+        return ((SnappyNativeAPI) impl).rawUncompress(input, inputOffset, inputLength, output, outputOffset);
+    }
+
+    /**
+     * High-level API for uncompressing the input byte array.
+     * 
+     * @param input
+     * @return the uncompressed byte array
+     * @throws IOException
+     */
+    public static byte[] uncompress(byte[] input) throws IOException {
+        byte[] result = new byte[Snappy.uncompressedLength(input)];
+        int byteSize = Snappy.uncompress(input, 0, input.length, result, 0);
+        return result;
+    }
+
+    /**
+     * Uncompress the content in the input buffer. The uncompressed data is
+     * written to the output buffer.
+     * 
+     * Note that if you pass the wrong data or the range [inputOffset,
+     * inputOffset + inputLength) that cannot be uncompressed, your JVM might
+     * crash due to the access violation exception issued in the native code
+     * written in C++. To avoid this type of crash, use
+     * {@link #isValidCompressedBuffer(byte[], int, int)} first.
+     * 
+     * @param input
+     * @param inputOffset
+     * @param inputLength
+     * @param output
+     * @param outputOffset
+     * @return the byte size of the uncompressed data
+     * @throws IOException
+     */
+    public static int uncompress(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset)
+            throws IOException {
+        return rawUncompress(input, inputOffset, inputLength, output, outputOffset);
+    }
+
+    /**
+     * Uncompress the content in the input buffer. The result is dumped to the
+     * specified output buffer.
+     * 
+     * Note that if you pass the wrong data or the range [pos(), limit()) that
+     * cannot be uncompressed, your JVM might crash due to the access violation
+     * exception issued in the native code written in C++. To avoid this type of
+     * crash, use {@link #isValidCompressedBuffer(ByteBuffer)} first.
+     * 
+     * 
+     * @param compressed
+     *            buffer[pos() ... limit()) containing the input data
+     * @param uncompressed
+     *            output of the the uncompressed data. It uses buffer[pos()..]
+     * @return uncompressed data size
+     * 
+     * @throws IOException
+     *             when failed to uncompress the given input
+     * @throws SnappyError
+     *             when the input is not a direct buffer
+     */
+    public static int uncompress(ByteBuffer compressed, ByteBuffer uncompressed) throws IOException {
+
+        if (!compressed.isDirect())
+            throw new SnappyError(SnappyErrorCode.NOT_A_DIRECT_BUFFER, "input is not a direct buffer");
+        if (!uncompressed.isDirect())
+            throw new SnappyError(SnappyErrorCode.NOT_A_DIRECT_BUFFER, "destination is not a direct buffer");
+
+        int cPos = compressed.position();
+        int cLen = compressed.remaining();
+
+        //         pos  limit
+        // [ ......UUUUUU.........]
+        int decompressedSize = ((SnappyNativeAPI) impl).rawUncompress(compressed, cPos, cLen, uncompressed,
+                uncompressed.position());
+        uncompressed.limit(uncompressed.position() + decompressedSize);
+
+        return decompressedSize;
+    }
+
+    /**
+     * Uncompress the input data as char array
+     * 
+     * @param input
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static char[] uncompressCharArray(byte[] input) throws IOException {
+        return uncompressCharArray(input, 0, input.length);
+    }
+
+    /**
+     * Uncompress the input[offset, .., offset+length) as a char array
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static char[] uncompressCharArray(byte[] input, int offset, int length) throws IOException {
+        int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
+        char[] result = new char[uncompressedLength / 2];
+        int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
+        return result;
+    }
+
+    /**
+     * Uncompress the input as a double array
+     * 
+     * @param input
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static double[] uncompressDoubleArray(byte[] input) throws IOException {
+        int uncompressedLength = Snappy.uncompressedLength(input, 0, input.length);
+        double[] result = new double[uncompressedLength / 8];
+        int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, 0, input.length, result, 0);
+        return result;
+    }
+
+    /**
+     * Get the uncompressed byte size of the given compressed input. This
+     * operation takes O(1) time.
+     * 
+     * @param input
+     * @return uncompressed byte size of the the given input data
+     * @throws IOException
+     *             when failed to uncompress the given input. The error code is
+     *             {@link SnappyErrorCode#PARSING_ERROR}
+     */
+    public static int uncompressedLength(byte[] input) throws IOException {
+        return ((SnappyNativeAPI) impl).uncompressedLength(input, 0, input.length);
+    }
+
+    /**
+     * Get the uncompressed byte size of the given compressed input. This
+     * operation takes O(1) time.
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @return uncompressed byte size of the the given input data
+     * @throws IOException
+     *             when failed to uncompress the given input. The error code is
+     *             {@link SnappyErrorCode#PARSING_ERROR}
+     */
+    public static int uncompressedLength(byte[] input, int offset, int length) throws IOException {
+        if (input == null)
+            throw new NullPointerException("input is null");
+
+        return ((SnappyNativeAPI) impl).uncompressedLength(input, offset, length);
+    }
+
+    /**
+     * Get the uncompressed byte size of the given compressed input. This
+     * operation taks O(1) time.
+     * 
+     * @param compressed
+     *            input data [pos() ... limit())
+     * @return uncompressed byte length of the given input
+     * @throws IOException
+     *             when failed to uncompress the given input. The error code is
+     *             {@link SnappyErrorCode#PARSING_ERROR}
+     * @throws SnappyError
+     *             when the input is not a direct buffer
+     */
+    public static int uncompressedLength(ByteBuffer compressed) throws IOException {
+        if (!compressed.isDirect())
+            throw new SnappyError(SnappyErrorCode.NOT_A_DIRECT_BUFFER, "input is not a direct buffer");
+
+        return ((SnappyNativeAPI) impl).uncompressedLength(compressed, compressed.position(), compressed.remaining());
+    }
+
+    /**
+     * Uncompress the input as a float array
+     * 
+     * @param input
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static float[] uncompressFloatArray(byte[] input) throws IOException {
+        return uncompressFloatArray(input, 0, input.length);
+    }
+
+    /**
+     * Uncompress the input[offset, offset+length) as a float array
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static float[] uncompressFloatArray(byte[] input, int offset, int length) throws IOException {
+        int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
+        float[] result = new float[uncompressedLength / 4];
+        int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
+        return result;
+    }
+
+    /**
+     * Uncompress the input data as an int array
+     * 
+     * @param input
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static int[] uncompressIntArray(byte[] input) throws IOException {
+        return uncompressIntArray(input, 0, input.length);
+    }
+
+    /**
+     * Uncompress the input[offset, offset+length) as an int array
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static int[] uncompressIntArray(byte[] input, int offset, int length) throws IOException {
+        int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
+        int[] result = new int[uncompressedLength / 4];
+        int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
+        return result;
+    }
+
+    /**
+     * Uncompress the input data as a long array
+     * 
+     * @param input
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static long[] uncompressLongArray(byte[] input) throws IOException {
+        return uncompressLongArray(input, 0, input.length);
+    }
+
+    /**
+     * Uncompress the input[offset, offset+length) as a long array
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static long[] uncompressLongArray(byte[] input, int offset, int length) throws IOException {
+        int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
+        long[] result = new long[uncompressedLength / 8];
+        int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
+        return result;
+    }
+
+    /**
+     * Uncompress the input as a short array
+     * 
+     * @param input
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static short[] uncompressShortArray(byte[] input) throws IOException {
+        return uncompressShortArray(input, 0, input.length);
+    }
+
+    /**
+     * Uncompress the input[offset, offset+length) as a short array
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static short[] uncompressShortArray(byte[] input, int offset, int length) throws IOException {
+        int uncompressedLength = Snappy.uncompressedLength(input, offset, length);
+        short[] result = new short[uncompressedLength / 2];
+        int byteSize = ((SnappyNativeAPI) impl).rawUncompress(input, offset, length, result, 0);
+        return result;
+    }
+
+    /**
+     * Uncompress the input as a String
+     * 
+     * @param input
+     * @return the uncompressed dasta
+     * @throws IOException
+     */
+    public static String uncompressString(byte[] input) throws IOException {
+        try {
+            return uncompressString(input, "UTF-8");
+        }
+        catch (UnsupportedEncodingException e) {
+            throw new IllegalStateException("UTF-8 decoder is not found");
+        }
+    }
+
+    /**
+     * Uncompress the input[offset, offset+length) as a String
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static String uncompressString(byte[] input, int offset, int length) throws IOException {
+        try {
+            return uncompressString(input, offset, length, "UTF-8");
+        }
+        catch (UnsupportedEncodingException e) {
+            throw new IllegalStateException("UTF-8 decoder is not found");
+        }
+    }
+
+    /**
+     * Uncompress the input[offset, offset+length) as a String of the given
+     * encoding
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @param encoding
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static String uncompressString(byte[] input, int offset, int length, String encoding) throws IOException,
+            UnsupportedEncodingException {
+        byte[] uncompressed = new byte[uncompressedLength(input, offset, length)];
+        int compressedSize = uncompress(input, offset, length, uncompressed, 0);
+        return new String(uncompressed, encoding);
+    }
+
+    /**
+     * Uncompress the input[offset, offset+length) as a String of the given
+     * encoding
+     * 
+     * @param input
+     * @param offset
+     * @param length
+     * @param encoding
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static String uncompressString(byte[] input, int offset, int length, Charset encoding) throws IOException,
+            UnsupportedEncodingException {
+        byte[] uncompressed = new byte[uncompressedLength(input, offset, length)];
+        int compressedSize = uncompress(input, offset, length, uncompressed, 0);
+        return new String(uncompressed, encoding);
+    }
+
+    /**
+     * Uncompress the input as a String of the given encoding
+     * 
+     * @param input
+     * @param encoding
+     * @return the uncompressed data
+     * @throws IOException
+     * @throws UnsupportedEncodingException
+     */
+    public static String uncompressString(byte[] input, String encoding) throws IOException,
+            UnsupportedEncodingException {
+        byte[] uncompressed = uncompress(input);
+        return new String(uncompressed, encoding);
+    }
+
+    /**
+     * Uncompress the input as a String of the given encoding
+     * 
+     * @param input
+     * @param encoding
+     * @return the uncompressed data
+     * @throws IOException
+     */
+    public static String uncompressString(byte[] input, Charset encoding) throws IOException,
+            UnsupportedEncodingException {
+        byte[] uncompressed = uncompress(input);
+        return new String(uncompressed, encoding);
+    }
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyBundleActivator.java b/src/main/java/org/xerial/snappy/SnappyBundleActivator.java
new file mode 100644
index 0000000..5495160
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyBundleActivator.java
@@ -0,0 +1,46 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyBundleActivator.java
+// Since: 2011/06/22 10:01:46
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+/**
+ * OSGi bundle entry point
+ * 
+ * @author leo
+ * 
+ */
+public class SnappyBundleActivator implements BundleActivator
+{
+    public void start(BundleContext context) throws Exception {
+
+    }
+
+    public void stop(BundleContext context) throws Exception {
+
+    }
+
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyCodec.java b/src/main/java/org/xerial/snappy/SnappyCodec.java
new file mode 100644
index 0000000..18014bd
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyCodec.java
@@ -0,0 +1,104 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyCodec.java
+// Since: 2011/04/03 14:50:20
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+
+/**
+ * Preamble header for {@link SnappyOutputStream}.
+ * 
+ * <p>
+ * The magic header is the following 8 bytes data:
+ * 
+ * <pre>
+ * -126, 'S', 'N', 'A', 'P', 'P', 'Y', 0
+ * </pre>
+ * 
+ * </p>
+ * 
+ * @author leo
+ * 
+ */
+public class SnappyCodec
+{
+    public static final byte[] MAGIC_HEADER               = new byte[] { -126, 'S', 'N', 'A', 'P', 'P', 'Y', 0 };
+    public static final int    MAGIC_LEN                  = 8;
+
+    public static final int    DEFAULT_VERSION            = 1;
+    public static final int    MINIMUM_COMPATIBLE_VERSION = 1;
+
+    public final byte[]        magic;
+    public final int           version;
+    public final int           compatibleVersion;
+
+    private SnappyCodec(byte[] magic, int version, int compatibleVersion) {
+        this.magic = magic;
+        this.version = version;
+        this.compatibleVersion = compatibleVersion;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("version:%d, compatible version:%d", version, compatibleVersion);
+    }
+
+    public static int headerSize() {
+        return MAGIC_LEN + 4 * 2;
+    }
+
+    public void writeHeader(OutputStream out) throws IOException {
+        ByteArrayOutputStream header = new ByteArrayOutputStream();
+        DataOutputStream d = new DataOutputStream(header);
+        d.write(magic, 0, MAGIC_LEN);
+        d.writeInt(version);
+        d.writeInt(compatibleVersion);
+        d.close();
+        out.write(header.toByteArray(), 0, header.size());
+    }
+
+    public boolean isValidMagicHeader() {
+        return Arrays.equals(MAGIC_HEADER, magic);
+    }
+
+    public static SnappyCodec readHeader(InputStream in) throws IOException {
+        DataInputStream d = new DataInputStream(in);
+        byte[] magic = new byte[MAGIC_LEN];
+        d.read(magic, 0, MAGIC_LEN);
+        int version = d.readInt();
+        int compatibleVersion = d.readInt();
+        return new SnappyCodec(magic, version, compatibleVersion);
+    }
+
+    public static SnappyCodec currentHeader() {
+        return new SnappyCodec(MAGIC_HEADER, DEFAULT_VERSION, MINIMUM_COMPATIBLE_VERSION);
+    }
+
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyError.java b/src/main/java/org/xerial/snappy/SnappyError.java
new file mode 100644
index 0000000..0a3ab18
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyError.java
@@ -0,0 +1,62 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyError.java
+// Since: 2011/03/30 15:22:43
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+/**
+ * Used when serious errors (unchecked exception) are observed.
+ * 
+ * @author leo
+ * 
+ */
+public class SnappyError extends Error
+{
+    /**
+     * 
+     */
+    private static final long    serialVersionUID = 1L;
+
+    public final SnappyErrorCode errorCode;
+
+    public SnappyError(SnappyErrorCode code) {
+        super();
+        this.errorCode = code;
+    }
+
+    public SnappyError(SnappyErrorCode code, Error e) {
+        super(e);
+        this.errorCode = code;
+    }
+
+    public SnappyError(SnappyErrorCode code, String message) {
+        super(message);
+        this.errorCode = code;
+    }
+
+    @Override
+    public String getMessage() {
+        return String.format("[%s] %s", errorCode.name(), super.getMessage());
+    }
+
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyErrorCode.java b/src/main/java/org/xerial/snappy/SnappyErrorCode.java
new file mode 100644
index 0000000..e3e520a
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyErrorCode.java
@@ -0,0 +1,60 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyErrorCode.java
+// Since: 2011/03/30 14:56:50
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+/**
+ * Error codes of snappy-java
+ * 
+ * @author leo
+ * 
+ */
+public enum SnappyErrorCode {
+
+    // DO NOT change these error code IDs because these numbers are used inside SnappyNative.cpp
+    UNKNOWN(0),
+    FAILED_TO_LOAD_NATIVE_LIBRARY(1),
+    PARSING_ERROR(2),
+    NOT_A_DIRECT_BUFFER(3),
+    OUT_OF_MEMORY(4),
+    FAILED_TO_UNCOMPRESS(5);
+
+    public final int id;
+
+    private SnappyErrorCode(int id) {
+        this.id = id;
+    }
+
+    public static SnappyErrorCode getErrorCode(int id) {
+        for (SnappyErrorCode code : SnappyErrorCode.values()) {
+            if (code.id == id)
+                return code;
+        }
+        return UNKNOWN;
+    }
+
+    public static String getErrorMessage(int id) {
+        return getErrorCode(id).name();
+    }
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyException.java b/src/main/java/org/xerial/snappy/SnappyException.java
new file mode 100644
index 0000000..81c08a5
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyException.java
@@ -0,0 +1,74 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyException.java
+// Since: 2011/03/30 14:56:14
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.IOException;
+
+/**
+ * Exception in snappy-java
+ * 
+ * @deprecated Snappy-java now uses {@link IOException}
+ * @author leo
+ * 
+ */
+ at Deprecated
+public class SnappyException extends Exception
+{
+    private static final long    serialVersionUID = 1L;
+
+    public final SnappyErrorCode errorCode;
+
+    public SnappyException(int code) {
+        this(SnappyErrorCode.getErrorCode(code));
+    }
+
+    public SnappyException(SnappyErrorCode errorCode) {
+        super();
+        this.errorCode = errorCode;
+    }
+
+    public SnappyException(SnappyErrorCode errorCode, Exception e) {
+        super(e);
+        this.errorCode = errorCode;
+    }
+
+    public SnappyException(SnappyErrorCode errorCode, String message) {
+        super(message);
+        this.errorCode = errorCode;
+    }
+
+    public SnappyErrorCode getErrorCode() {
+        return errorCode;
+    }
+
+    public static void throwException(int errorCode) throws SnappyException {
+        throw new SnappyException(errorCode);
+    }
+
+    @Override
+    public String getMessage() {
+        return String.format("[%s] %s", errorCode.name(), super.getMessage());
+    }
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyInputStream.java b/src/main/java/org/xerial/snappy/SnappyInputStream.java
new file mode 100644
index 0000000..3546838
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyInputStream.java
@@ -0,0 +1,390 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyInputStream.java
+// Since: 2011/03/31 20:14:56
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * A stream filter for reading data compressed by {@link SnappyOutputStream}.
+ * 
+ * 
+ * @author leo
+ * 
+ */
+public class SnappyInputStream extends InputStream
+{
+    private boolean             finishedReading    = false;
+    protected final InputStream in;
+
+    private byte[]              compressed;
+    private byte[]              uncompressed;
+    private int                 uncompressedCursor = 0;
+    private int                 uncompressedLimit  = 0;
+
+    private byte[]              chunkSizeBuf       = new byte[4];
+
+    /**
+     * Create a filter for reading compressed data as a uncompressed stream
+     * 
+     * @param input
+     * @throws IOException
+     */
+    public SnappyInputStream(InputStream input) throws IOException {
+        this.in = input;
+        readHeader();
+    }
+
+    /**
+     * Close the stream
+     */
+    /* (non-Javadoc)
+     * @see java.io.InputStream#close()
+     */
+    @Override
+    public void close() throws IOException {
+        compressed = null;
+        uncompressed = null;
+        if (in != null)
+            in.close();
+    }
+
+    protected void readHeader() throws IOException {
+        byte[] header = new byte[SnappyCodec.headerSize()];
+        int readBytes = 0;
+        while (readBytes < header.length) {
+            int ret = in.read(header, readBytes, header.length - readBytes);
+            if (ret == -1)
+                break;
+            readBytes += ret;
+        }
+
+        // Quick test of the header 
+        if (readBytes < header.length || header[0] != SnappyCodec.MAGIC_HEADER[0]) {
+            // do the default uncompression
+            readFully(header, readBytes);
+            return;
+        }
+
+        SnappyCodec codec = SnappyCodec.readHeader(new ByteArrayInputStream(header));
+        if (codec.isValidMagicHeader()) {
+            // The input data is compressed by SnappyOutputStream
+            if (codec.version < SnappyCodec.MINIMUM_COMPATIBLE_VERSION) {
+                throw new IOException(String.format(
+                        "compressed with imcompatible codec version %d. At least version %d is required",
+                        codec.version, SnappyCodec.MINIMUM_COMPATIBLE_VERSION));
+            }
+        }
+        else {
+            // (probably) compressed by Snappy.compress(byte[])
+            readFully(header, readBytes);
+            return;
+        }
+    }
+
+    protected void readFully(byte[] fragment, int fragmentLength) throws IOException {
+        // read the entire input data to the buffer 
+        compressed = new byte[Math.max(8 * 1024, fragmentLength)]; // 8K
+        System.arraycopy(fragment, 0, compressed, 0, fragmentLength);
+        int cursor = fragmentLength;
+        for (int readBytes = 0; (readBytes = in.read(compressed, cursor, compressed.length - cursor)) != -1;) {
+            cursor += readBytes;
+            if (cursor >= compressed.length) {
+                byte[] newBuf = new byte[(compressed.length * 2)];
+                System.arraycopy(compressed, 0, newBuf, 0, compressed.length);
+                compressed = newBuf;
+            }
+        }
+
+        finishedReading = true;
+
+        // Uncompress
+        int uncompressedLength = Snappy.uncompressedLength(compressed, 0, cursor);
+        uncompressed = new byte[uncompressedLength];
+        Snappy.uncompress(compressed, 0, cursor, uncompressed, 0);
+        this.uncompressedCursor = 0;
+        this.uncompressedLimit = uncompressedLength;
+
+    }
+
+    /**
+     * Reads up to len bytes of data from the input stream into an array of
+     * bytes.
+     */
+    /* (non-Javadoc)
+     * @see java.io.InputStream#read(byte[], int, int)
+     */
+    @Override
+    public int read(byte[] b, int off, int len) throws IOException {
+        return rawRead(b, off, len);
+    }
+
+    /**
+     * Read uncompressed data into the specified array
+     * 
+     * @param array
+     * @param byteOffset
+     * @param byteLength
+     * @return written bytes
+     * @throws IOException
+     */
+    public int rawRead(Object array, int byteOffset, int byteLength) throws IOException {
+        int writtenBytes = 0;
+        for (; writtenBytes < byteLength;) {
+            if (uncompressedCursor >= uncompressedLimit) {
+                if (hasNextChunk())
+                    continue;
+                else {
+                    return writtenBytes == 0 ? -1 : writtenBytes;
+                }
+            }
+            int bytesToWrite = Math.min(uncompressedLimit - uncompressedCursor, byteLength - writtenBytes);
+            Snappy.arrayCopy(uncompressed, uncompressedCursor, bytesToWrite, array, byteOffset + writtenBytes);
+            writtenBytes += bytesToWrite;
+            uncompressedCursor += bytesToWrite;
+        }
+
+        return writtenBytes;
+    }
+
+    /**
+     * Read long array from the stream
+     * 
+     * @param d
+     *            input
+     * @param off
+     *            offset
+     * @param len
+     *            the number of long elements to read
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(long[] d, int off, int len) throws IOException {
+        return rawRead(d, off * 8, len * 8);
+    }
+
+    /**
+     * Read long array from the stream
+     * 
+     * @param d
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(long[] d) throws IOException {
+        return read(d, 0, d.length);
+    }
+
+    /**
+     * Read double array from the stream
+     * 
+     * @param d
+     *            input
+     * @param off
+     *            offset
+     * @param len
+     *            the number of double elements to read
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(double[] d, int off, int len) throws IOException {
+        return rawRead(d, off * 8, len * 8);
+    }
+
+    /**
+     * Read double array from the stream
+     * 
+     * @param d
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(double[] d) throws IOException {
+        return read(d, 0, d.length);
+    }
+
+    /**
+     * Read int array from the stream
+     * 
+     * @param d
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(int[] d) throws IOException {
+        return read(d, 0, d.length);
+    }
+
+    /**
+     * Read int array from the stream
+     * 
+     * @param d
+     *            input
+     * @param off
+     *            offset
+     * @param len
+     *            the number of int elements to read
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(int[] d, int off, int len) throws IOException {
+        return rawRead(d, off * 4, len * 4);
+    }
+
+    /**
+     * Read float array from the stream
+     * 
+     * @param d
+     *            input
+     * @param off
+     *            offset
+     * @param len
+     *            the number of float elements to read
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(float[] d, int off, int len) throws IOException {
+        return rawRead(d, off * 4, len * 4);
+    }
+
+    /**
+     * Read float array from the stream
+     * 
+     * @param d
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(float[] d) throws IOException {
+        return read(d, 0, d.length);
+    }
+
+    /**
+     * Read short array from the stream
+     * 
+     * @param d
+     *            input
+     * @param off
+     *            offset
+     * @param len
+     *            the number of short elements to read
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(short[] d, int off, int len) throws IOException {
+        return rawRead(d, off * 2, len * 2);
+    }
+
+    /**
+     * Read short array from the stream
+     * 
+     * @param d
+     * @return the total number of bytes read into the buffer, or -1 if there is
+     *         no more data because the end of the stream has been reached.
+     * @throws IOException
+     */
+    public int read(short[] d) throws IOException {
+        return read(d, 0, d.length);
+    }
+
+    protected boolean hasNextChunk() throws IOException {
+        if (finishedReading)
+            return false;
+
+        uncompressedCursor = 0;
+        uncompressedLimit = 0;
+
+        int readBytes = 0;
+        while (readBytes < 4) {
+            int ret = in.read(chunkSizeBuf, readBytes, 4 - readBytes);
+            if (ret == -1) {
+                finishedReading = true;
+                return false;
+            }
+            readBytes += ret;
+        }
+        int chunkSize = SnappyOutputStream.readInt(chunkSizeBuf, 0);
+        // extend the compressed data buffer size
+        if (compressed == null || chunkSize > compressed.length) {
+            compressed = new byte[chunkSize];
+        }
+        readBytes = 0;
+        while (readBytes < chunkSize) {
+            int ret = in.read(compressed, readBytes, chunkSize - readBytes);
+            if (ret == -1)
+                break;
+            readBytes += ret;
+        }
+        if (readBytes < chunkSize) {
+            throw new IOException("failed to read chunk");
+        }
+        try {
+            int uncompressedLength = Snappy.uncompressedLength(compressed, 0, chunkSize);
+            if (uncompressed == null || uncompressedLength > uncompressed.length) {
+                uncompressed = new byte[uncompressedLength];
+            }
+            int actualUncompressedLength = Snappy.uncompress(compressed, 0, chunkSize, uncompressed, 0);
+            if (uncompressedLength != actualUncompressedLength) {
+                throw new IOException("invalid uncompressed byte size");
+            }
+            uncompressedLimit = actualUncompressedLength;
+        }
+        catch (IOException e) {
+            throw new IOException("failed to uncompress the chunk: " + e.getMessage());
+        }
+
+        return true;
+    }
+
+    /**
+     * Reads the next byte of uncompressed data from the input stream. The value
+     * byte is returned as an int in the range 0 to 255. If no byte is available
+     * because the end of the stream has been reached, the value -1 is returned.
+     * This method blocks until input data is available, the end of the stream
+     * is detected, or an exception is thrown.
+     */
+    /* (non-Javadoc)
+     * @see java.io.InputStream#read()
+     */
+    @Override
+    public int read() throws IOException {
+        if (uncompressedCursor < uncompressedLimit) {
+            return uncompressed[uncompressedCursor++] & 0xFF;
+        }
+        else {
+            if (hasNextChunk())
+                return read();
+            else
+                return -1;
+        }
+    }
+
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyLoader.java b/src/main/java/org/xerial/snappy/SnappyLoader.java
new file mode 100644
index 0000000..4a33396
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyLoader.java
@@ -0,0 +1,484 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// snappy-java Project
+//
+// SnappyLoader.java
+// Since: 2011/03/29
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.security.DigestInputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * <b>Internal only - Do not use this class.</b> This class loads a native
+ * library of snappy-java (snappyjava.dll, libsnappy.so, etc.) according to the
+ * user platform (<i>os.name</i> and <i>os.arch</i>). The natively compiled
+ * libraries bundled to snappy-java contain the codes of the original snappy and
+ * JNI programs to access Snappy.
+ * 
+ * In default, no configuration is required to use snappy-java, but you can load
+ * your own native library created by 'make native' command.
+ * 
+ * This SnappyLoader searches for native libraries (snappyjava.dll,
+ * libsnappy.so, etc.) in the following order:
+ * <ol>
+ * <li>If system property <i>org.xerial.snappy.use.systemlib</i> is set to true,
+ * lookup folders specified by <i>java.lib.path</i> system property (This is the
+ * default path that JVM searches for native libraries)
+ * <li>(System property: <i>org.xerial.snappy.lib.path</i>)/(System property:
+ * <i>org.xerial.lib.name</i>)
+ * <li>One of the libraries embedded in snappy-java-(version).jar extracted into
+ * (System property: <i>java.io.tempdir</i>). If
+ * <i>org.xerial.snappy.tempdir</i> is set, use this folder instead of
+ * <i>java.io.tempdir</i>.
+ * </ol>
+ * 
+ * <p>
+ * If you do not want to use folder <i>java.io.tempdir</i>, set the System
+ * property <i>org.xerial.snappy.tempdir</i>. For example, to use
+ * <i>/tmp/leo</i> as a temporary folder to copy native libraries, use -D option
+ * of JVM:
+ * 
+ * <pre>
+ * <code>
+ * java -Dorg.xerial.snappy.tempdir="/tmp/leo" ...
+ * </code>
+ * </pre>
+ * 
+ * </p>
+ * 
+ * @author leo
+ * 
+ */
+public class SnappyLoader
+{
+    public static final String SNAPPY_SYSTEM_PROPERTIES_FILE   = "org-xerial-snappy.properties";
+    public static final String KEY_SNAPPY_LIB_PATH             = "org.xerial.snappy.lib.path";
+    public static final String KEY_SNAPPY_LIB_NAME             = "org.xerial.snappy.lib.name";
+    public static final String KEY_SNAPPY_TEMPDIR              = "org.xerial.snappy.tempdir";
+    public static final String KEY_SNAPPY_USE_SYSTEMLIB        = "org.xerial.snappy.use.systemlib";
+    public static final String KEY_SNAPPY_DISABLE_BUNDLED_LIBS = "org.xerial.snappy.disable.bundled.libs"; // Depreciated, but preserved for backward compatibility
+
+    private static boolean     isLoaded                        = false;
+    private static Object      api                             = null;
+
+    /**
+     * load system properties when configuration file of the name
+     * {@link #SNAPPY_SYSTEM_PROPERTIES_FILE} is found
+     */
+    private static void loadSnappySystemProperties() {
+        try {
+            InputStream is = Thread.currentThread().getContextClassLoader()
+                    .getResourceAsStream(SNAPPY_SYSTEM_PROPERTIES_FILE);
+
+            if (is == null)
+                return; // no configuration file is found 
+
+            // Load property file
+            Properties props = new Properties();
+            props.load(is);
+            is.close();
+            Enumeration< ? > names = props.propertyNames();
+            while (names.hasMoreElements()) {
+                String name = (String) names.nextElement();
+                if (name.startsWith("org.xerial.snappy.")) {
+                    if (System.getProperty(name) == null) {
+                        System.setProperty(name, props.getProperty(name));
+                    }
+                }
+            }
+        }
+        catch (Throwable ex) {
+            System.err.println("Could not load '" + SNAPPY_SYSTEM_PROPERTIES_FILE + "' from classpath: "
+                    + ex.toString());
+        }
+    }
+
+    static {
+        loadSnappySystemProperties();
+    }
+
+    private static ClassLoader getRootClassLoader() {
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        while (cl.getParent() != null) {
+            cl = cl.getParent();
+        }
+        return cl;
+    }
+
+    private static byte[] getByteCode(String resourcePath) throws IOException {
+
+        InputStream in = SnappyLoader.class.getResourceAsStream(resourcePath);
+        if (in == null)
+            throw new IOException(resourcePath + " is not found");
+        byte[] buf = new byte[1024];
+        ByteArrayOutputStream byteCodeBuf = new ByteArrayOutputStream();
+        for (int readLength; (readLength = in.read(buf)) != -1;) {
+            byteCodeBuf.write(buf, 0, readLength);
+        }
+        in.close();
+
+        return byteCodeBuf.toByteArray();
+    }
+
+    public static boolean isNativeLibraryLoaded() {
+        return isLoaded;
+    }
+
+    private static boolean hasInjectedNativeLoader() {
+        try {
+            final String nativeLoaderClassName = "org.xerial.snappy.SnappyNativeLoader";
+            Class< ? > c = Class.forName(nativeLoaderClassName);
+            // If this native loader class is already defined, it means that another class loader already loaded the native library of snappy
+            return true;
+        }
+        catch (ClassNotFoundException e) {
+            // do loading
+            return false;
+        }
+    }
+
+    /**
+     * Load SnappyNative and its JNI native implementation using the root class
+     * loader. This hack is for avoiding the JNI multi-loading issue when the
+     * same JNI library is loaded by different class loaders.
+     * 
+     * In order to load native code in the root class loader, this method first
+     * inject SnappyNativeLoader class into the root class loader, because
+     * {@link System#load(String)} method uses the class loader of the caller
+     * class when loading native libraries.
+     * 
+     * <pre>
+     * (root class loader) -> [SnappyNativeLoader (load JNI code), SnappyNative (has native methods), SnappyNativeAPI, SnappyErrorCode]  (injected by this method)
+     *    |
+     *    |
+     * (child class loader) -> Sees the above classes loaded by the root class loader.
+     *   Then creates SnappyNativeAPI implementation by instantiating SnappyNaitive class.
+     * </pre>
+     * 
+     * 
+     * <pre>
+     * (root class loader) -> [SnappyNativeLoader, SnappyNative ...]  -> native code is loaded by once in this class loader 
+     *   |   \
+     *   |    (child2 class loader)      
+     * (child1 class loader)
+     * 
+     * child1 and child2 share the same SnappyNative code loaded by the root class loader.
+     * </pre>
+     * 
+     * Note that Java's class loader first delegates the class lookup to its
+     * parent class loader. So once SnappyNativeLoader is loaded by the root
+     * class loader, no child class loader initialize SnappyNativeLoader again.
+     * 
+     * @return
+     */
+    static synchronized Object load() {
+
+        if (api != null)
+            return api;
+
+        try {
+            if (!hasInjectedNativeLoader()) {
+                // Inject SnappyNativeLoader (src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode) to the root class loader  
+                Class< ? > nativeLoader = injectSnappyNativeLoader();
+                // Load the JNI code using the injected loader
+                loadNativeLibrary(nativeLoader);
+            }
+
+            isLoaded = true;
+            // Look up SnappyNative, injected to the root classloder, using reflection in order to avoid the initialization of SnappyNative class in this context class loader.
+            Object nativeCode = Class.forName("org.xerial.snappy.SnappyNative").newInstance();
+            api = nativeCode;
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+            throw new SnappyError(SnappyErrorCode.FAILED_TO_LOAD_NATIVE_LIBRARY, e.getMessage());
+        }
+
+        return api;
+    }
+
+    /**
+     * Inject SnappyNativeLoader class to the root class loader
+     * 
+     * @return native code loader class initialized in the root class loader
+     */
+    private static Class< ? > injectSnappyNativeLoader() {
+
+        try {
+            // Use parent class loader to load SnappyNative, since Tomcat, which uses different class loaders for each webapps, cannot load JNI interface twice
+
+            final String nativeLoaderClassName = "org.xerial.snappy.SnappyNativeLoader";
+            ClassLoader rootClassLoader = getRootClassLoader();
+            // Load a byte code 
+            byte[] byteCode = getByteCode("/org/xerial/snappy/SnappyNativeLoader.bytecode");
+            // In addition, we need to load the other dependent classes (e.g., SnappyNative and SnappyException) using the system class loader
+            final String[] classesToPreload = new String[] { "org.xerial.snappy.SnappyNativeAPI",
+                    "org.xerial.snappy.SnappyNative", "org.xerial.snappy.SnappyErrorCode" };
+            List<byte[]> preloadClassByteCode = new ArrayList<byte[]>(classesToPreload.length);
+            for (String each : classesToPreload) {
+                preloadClassByteCode.add(getByteCode(String.format("/%s.class", each.replaceAll("\\.", "/"))));
+            }
+
+            // Create SnappyNativeLoader class from a byte code
+            Class< ? > classLoader = Class.forName("java.lang.ClassLoader");
+            Method defineClass = classLoader.getDeclaredMethod("defineClass", new Class[] { String.class, byte[].class,
+                    int.class, int.class, ProtectionDomain.class });
+
+            ProtectionDomain pd = System.class.getProtectionDomain();
+
+            // ClassLoader.defineClass is a protected method, so we have to make it accessible
+            defineClass.setAccessible(true);
+            try {
+                // Create a new class using a ClassLoader#defineClass
+                defineClass.invoke(rootClassLoader, nativeLoaderClassName, byteCode, 0, byteCode.length, pd);
+
+                // And also define dependent classes in the root class loader
+                for (int i = 0; i < classesToPreload.length; ++i) {
+                    byte[] b = preloadClassByteCode.get(i);
+                    defineClass.invoke(rootClassLoader, classesToPreload[i], b, 0, b.length, pd);
+                }
+            }
+            finally {
+                // Reset the accessibility to defineClass method
+                defineClass.setAccessible(false);
+            }
+
+            // Load the SnappyNativeLoader class
+            return rootClassLoader.loadClass(nativeLoaderClassName);
+
+        }
+        catch (Exception e) {
+            e.printStackTrace(System.err);
+            throw new SnappyError(SnappyErrorCode.FAILED_TO_LOAD_NATIVE_LIBRARY, e.getMessage());
+        }
+
+    }
+
+    /**
+     * Load snappy-java's native code using load method of the
+     * SnappyNativeLoader class injected to the root class loader.
+     * 
+     * @param loaderClass
+     * @throws SecurityException
+     * @throws NoSuchMethodException
+     * @throws IllegalArgumentException
+     * @throws IllegalAccessException
+     * @throws InvocationTargetException
+     */
+    private static void loadNativeLibrary(Class< ? > loaderClass) throws SecurityException, NoSuchMethodException,
+            IllegalArgumentException, IllegalAccessException, InvocationTargetException {
+        if (loaderClass == null)
+            throw new SnappyError(SnappyErrorCode.FAILED_TO_LOAD_NATIVE_LIBRARY, "missing snappy native loader class");
+
+        File nativeLib = findNativeLibrary();
+        if (nativeLib != null) {
+            // Load extracted or specified snappyjava native library. 
+            Method loadMethod = loaderClass.getDeclaredMethod("load", new Class[] { String.class });
+            loadMethod.invoke(null, nativeLib.getAbsolutePath());
+        }
+        else {
+            // Load preinstalled snappyjava (in the path -Djava.library.path) 
+            Method loadMethod = loaderClass.getDeclaredMethod("loadLibrary", new Class[] { String.class });
+            loadMethod.invoke(null, "snappyjava");
+        }
+    }
+
+    /**
+     * Computes the MD5 value of the input stream
+     * 
+     * @param input
+     * @return
+     * @throws IOException
+     * @throws NoSuchAlgorithmException
+     */
+    static String md5sum(InputStream input) throws IOException {
+        BufferedInputStream in = new BufferedInputStream(input);
+        try {
+            MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
+            DigestInputStream digestInputStream = new DigestInputStream(in, digest);
+            for (; digestInputStream.read() >= 0;) {
+
+            }
+            ByteArrayOutputStream md5out = new ByteArrayOutputStream();
+            md5out.write(digest.digest());
+            return md5out.toString();
+        }
+        catch (NoSuchAlgorithmException e) {
+            throw new IllegalStateException("MD5 algorithm is not available: " + e);
+        }
+        finally {
+            in.close();
+        }
+    }
+
+    /**
+     * Extract the specified library file to the target folder
+     * 
+     * @param libFolderForCurrentOS
+     * @param libraryFileName
+     * @param targetFolder
+     * @return
+     */
+    private static File extractLibraryFile(String libFolderForCurrentOS, String libraryFileName, String targetFolder) {
+        String nativeLibraryFilePath = libFolderForCurrentOS + "/" + libraryFileName;
+        final String prefix = "snappy-" + getVersion() + "-";
+        String extractedLibFileName = prefix + libraryFileName;
+        File extractedLibFile = new File(targetFolder, extractedLibFileName);
+
+        try {
+            if (extractedLibFile.exists()) {
+                // test md5sum value
+                String md5sum1 = md5sum(SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath));
+                String md5sum2 = md5sum(new FileInputStream(extractedLibFile));
+
+                if (md5sum1.equals(md5sum2)) {
+                    return new File(targetFolder, extractedLibFileName);
+                }
+                else {
+                    // remove old native library file
+                    boolean deletionSucceeded = extractedLibFile.delete();
+                    if (!deletionSucceeded) {
+                        throw new IOException("failed to remove existing native library file: "
+                                + extractedLibFile.getAbsolutePath());
+                    }
+                }
+            }
+
+            // Extract a native library file into the target directory
+            InputStream reader = SnappyLoader.class.getResourceAsStream(nativeLibraryFilePath);
+            FileOutputStream writer = new FileOutputStream(extractedLibFile);
+            byte[] buffer = new byte[8192];
+            int bytesRead = 0;
+            while ((bytesRead = reader.read(buffer)) != -1) {
+                writer.write(buffer, 0, bytesRead);
+            }
+
+            writer.close();
+            reader.close();
+
+            // Set executable (x) flag to enable Java to load the native library
+            if (!System.getProperty("os.name").contains("Windows")) {
+                try {
+                    Runtime.getRuntime().exec(new String[] { "chmod", "755", extractedLibFile.getAbsolutePath() })
+                            .waitFor();
+                }
+                catch (Throwable e) {}
+            }
+
+            return new File(targetFolder, extractedLibFileName);
+        }
+        catch (IOException e) {
+            e.printStackTrace(System.err);
+            return null;
+        }
+    }
+
+    static File findNativeLibrary() {
+
+        boolean useSystemLib = Boolean.parseBoolean(System.getProperty(KEY_SNAPPY_USE_SYSTEMLIB, "false"));
+        if (useSystemLib)
+            return null;
+
+        boolean disabledBundledLibs = Boolean
+                .parseBoolean(System.getProperty(KEY_SNAPPY_DISABLE_BUNDLED_LIBS, "false"));
+        if (disabledBundledLibs)
+            return null;
+
+        // Try to load the library in org.xerial.snappy.lib.path  */
+        String snappyNativeLibraryPath = System.getProperty(KEY_SNAPPY_LIB_PATH);
+        String snappyNativeLibraryName = System.getProperty(KEY_SNAPPY_LIB_NAME);
+
+        // Resolve the library file name with a suffix (e.g., dll, .so, etc.) 
+        if (snappyNativeLibraryName == null)
+            snappyNativeLibraryName = System.mapLibraryName("snappyjava");
+
+        if (snappyNativeLibraryPath != null) {
+            File nativeLib = new File(snappyNativeLibraryPath, snappyNativeLibraryName);
+            if (nativeLib.exists())
+                return nativeLib;
+        }
+
+        {
+            // Load an OS-dependent native library inside a jar file
+            snappyNativeLibraryPath = "/org/xerial/snappy/native/" + OSInfo.getNativeLibFolderPathForCurrentOS();
+
+            if (SnappyLoader.class.getResource(snappyNativeLibraryPath + "/" + snappyNativeLibraryName) != null) {
+                // Temporary library folder. Use the value of org.xerial.snappy.tempdir or java.io.tmpdir
+                String tempFolder = new File(System.getProperty(KEY_SNAPPY_TEMPDIR,
+                        System.getProperty("java.io.tmpdir"))).getAbsolutePath();
+
+                // Extract and load a native library inside the jar file
+                return extractLibraryFile(snappyNativeLibraryPath, snappyNativeLibraryName, tempFolder);
+            }
+        }
+
+        return null; // Use a pre-installed libsnappyjava
+    }
+
+    /**
+     * Get the snappy-java version by reading pom.properties embedded in jar.
+     * This version data is used as a suffix of a dll file extracted from the
+     * jar.
+     * 
+     * @return the version string
+     */
+    public static String getVersion() {
+
+        URL versionFile = SnappyLoader.class
+                .getResource("/META-INF/maven/org.xerial.snappy/snappy-java/pom.properties");
+        if (versionFile == null)
+            versionFile = SnappyLoader.class.getResource("/org/xerial/snappy/VERSION");
+
+        String version = "unknown";
+        try {
+            if (versionFile != null) {
+                Properties versionData = new Properties();
+                versionData.load(versionFile.openStream());
+                version = versionData.getProperty("version", version);
+                if (version.equals("unknown"))
+                    version = versionData.getProperty("VERSION", version);
+                version = version.trim().replaceAll("[^0-9\\.]", "");
+            }
+        }
+        catch (IOException e) {
+            System.err.println(e);
+        }
+        return version;
+    }
+
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyNative.cpp b/src/main/java/org/xerial/snappy/SnappyNative.cpp
new file mode 100644
index 0000000..c4b9b4a
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyNative.cpp
@@ -0,0 +1,237 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+#include <string>
+#include <cstring>
+#include <snappy.h>
+#include "SnappyNative.h"
+
+void throw_exception(JNIEnv *env, jobject self, int errorCode)
+{
+	jclass c = env->FindClass("Lorg/xerial/snappy/SnappyNative;");
+	if(c==0)
+		return;
+    jmethodID mth_throwex = env->GetMethodID(c, "throw_error", "(I)V");
+    if(mth_throwex == 0)
+    	return;
+    env->CallVoidMethod(self, mth_throwex, (jint) errorCode);
+}
+
+
+JNIEXPORT jstring JNICALL Java_org_xerial_snappy_SnappyNative_nativeLibraryVersion
+  (JNIEnv * env, jobject self)
+{
+	return env->NewStringUTF("1.0.4");
+}
+
+/*
+ * Class:     org_xerial_snappy_Snappy
+ * Method:    compress
+ * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)J
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress__Ljava_nio_ByteBuffer_2IILjava_nio_ByteBuffer_2I
+  (JNIEnv* env, jobject self, jobject uncompressed, jint upos, jint ulen, jobject compressed, jint cpos)
+{
+	char* uncompressedBuffer = (char*) env->GetDirectBufferAddress(uncompressed);
+	char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed);
+	if(uncompressedBuffer == 0 || compressedBuffer == 0) {
+		throw_exception(env, self, 3);
+		return (jint) 0;
+	}
+
+	size_t compressedLength;
+	snappy::RawCompress(uncompressedBuffer + upos, (size_t) ulen, compressedBuffer + cpos, &compressedLength);
+	return (jint) compressedLength;
+}
+
+
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress__Ljava_lang_Object_2IILjava_lang_Object_2I
+  (JNIEnv * env, jobject self, jobject input, jint inputOffset, jint inputLen, jobject output, jint outputOffset)
+{
+	char* in = (char*) env->GetPrimitiveArrayCritical((jarray) input, 0);
+	char* out = (char*) env->GetPrimitiveArrayCritical((jarray) output, 0);
+	if(in == 0 || out == 0) {
+		// out of memory
+		throw_exception(env, self, 4);
+		return 0;
+	}
+
+	size_t compressedLength;
+	snappy::RawCompress(in + inputOffset, (size_t) inputLen, out + outputOffset, &compressedLength);
+
+	env->ReleasePrimitiveArrayCritical((jarray) input, in, 0);
+	env->ReleasePrimitiveArrayCritical((jarray) output, out, 0);
+
+	return (jint) compressedLength;
+}
+
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawUncompress__Ljava_lang_Object_2IILjava_lang_Object_2I
+(JNIEnv * env, jobject self, jobject input, jint inputOffset, jint inputLength, jobject output, jint outputOffset)
+{
+	char* in = (char*) env->GetPrimitiveArrayCritical((jarray) input, 0);
+	char* out = (char*) env->GetPrimitiveArrayCritical((jarray) output, 0);
+	if(in == 0 || out == 0) {
+		// out of memory
+		throw_exception(env, self, 4);
+		return 0;
+	}
+
+	size_t uncompressedLength;
+	snappy::GetUncompressedLength(in + inputOffset, (size_t) inputLength, &uncompressedLength);
+	bool ret = snappy::RawUncompress(in + inputOffset, (size_t) inputLength, out + outputOffset);
+
+	env->ReleasePrimitiveArrayCritical((jarray) input, in, 0);
+	env->ReleasePrimitiveArrayCritical((jarray) output, out, 0);
+
+	if(!ret) {
+		throw_exception(env, self, 5);
+		return 0;
+	}
+
+	return (jint) uncompressedLength;
+}
+
+
+/*
+ * Class:     org_xerial_snappy_Snappy
+ * Method:    uncompress
+ * Signature: (Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawUncompress__Ljava_nio_ByteBuffer_2IILjava_nio_ByteBuffer_2I
+  (JNIEnv * env, jobject self, jobject compressed, jint cpos, jint clen, jobject decompressed, jint dpos)
+{
+	char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed);
+	char* decompressedBuffer = (char*) env->GetDirectBufferAddress(decompressed);
+	if(compressedBuffer == 0 || decompressedBuffer == 0) {
+		throw_exception(env, self, 3);
+		return (jint) 0;
+	}
+
+	size_t decompressedLength;
+	snappy::GetUncompressedLength(compressedBuffer + cpos, (size_t) clen, &decompressedLength);
+	bool ret = snappy::RawUncompress(compressedBuffer + cpos, (size_t) clen, decompressedBuffer + dpos);
+	if(!ret) {
+		throw_exception(env, self, 5);
+		return 0;
+	}
+
+	return (jint) decompressedLength;
+}
+
+
+
+/*
+ * Class:     org_xerial_snappy_Snappy
+ * Method:    maxCompressedLength
+ * Signature: (J)J
+ */
+
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_maxCompressedLength
+  (JNIEnv *, jobject, jint size)
+{
+	size_t l = snappy::MaxCompressedLength((size_t) size);
+	return (jint) l;
+}
+
+/*
+ * Class:     org_xerial_snappy_Snappy
+ * Method:    getUncompressedLength
+ * Signature: (Ljava/nio/ByteBuffer;)J
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_uncompressedLength__Ljava_nio_ByteBuffer_2II
+  (JNIEnv * env, jobject self, jobject compressed, jint cpos, jint clen)
+{
+	char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed);
+	if(compressedBuffer == 0) {
+		throw_exception(env, self, 3);
+		return (jint) 0;
+	}
+
+	size_t result;
+	bool ret = snappy::GetUncompressedLength(compressedBuffer + cpos, (size_t) clen, &result);
+	if(!ret) {
+		throw_exception(env, self, 2);
+		return 0;
+	}
+	return (jint) result;
+}
+
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_uncompressedLength__Ljava_lang_Object_2II
+  (JNIEnv * env, jobject self, jobject input, jint offset, jint length)
+{
+	char* in = (char*) env->GetPrimitiveArrayCritical((jarray) input, 0);
+	if(in == 0) {
+		// out of memory
+		throw_exception(env, self, 4);
+		return 0;
+	}
+
+	size_t result;
+	bool ret = snappy::GetUncompressedLength(in + offset, (size_t) length, &result);
+	env->ReleasePrimitiveArrayCritical((jarray) input, in, 0);
+
+	if(!ret) {
+		throw_exception(env, self, 2);
+		return 0;
+	}
+
+	return (jint) result;
+}
+
+JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressedBuffer__Ljava_nio_ByteBuffer_2II
+  (JNIEnv * env, jobject self, jobject compressed, jint cpos, jint clen)
+{
+	char* compressedBuffer = (char*) env->GetDirectBufferAddress(compressed);
+	if(compressedBuffer == 0) {
+		throw_exception(env, self, 3);
+		return (jint) 0;
+	}
+	bool ret = snappy::IsValidCompressedBuffer(compressedBuffer + cpos, (size_t) clen);
+	return ret;
+}
+
+
+JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressedBuffer__Ljava_lang_Object_2II
+  (JNIEnv * env, jobject self, jobject input, jint offset, jint length)
+{
+	char* in = (char*) env->GetPrimitiveArrayCritical((jarray) input, 0);
+	if(in == 0) {
+		// out of memory
+		throw_exception(env, self, 4);
+		return 0;
+	}
+	bool ret = snappy::IsValidCompressedBuffer(in + offset, (size_t) length);
+	env->ReleasePrimitiveArrayCritical((jarray) input, in, 0);
+	return ret;
+}
+
+JNIEXPORT void JNICALL Java_org_xerial_snappy_SnappyNative_arrayCopy
+  (JNIEnv * env, jobject self, jobject input, jint offset, jint length, jobject output, jint output_offset)
+{
+	char* src = (char*) env->GetPrimitiveArrayCritical((jarray) input, 0);
+	char* dest = (char*) env->GetPrimitiveArrayCritical((jarray) output, 0);
+	if(src == 0 || dest == 0) {
+		// out of memory
+		throw_exception(env, self, 4);
+		return;
+	}
+
+	memcpy(dest+output_offset, src+offset, (size_t) length);
+
+	env->ReleasePrimitiveArrayCritical((jarray) input, src, 0);
+	env->ReleasePrimitiveArrayCritical((jarray) output, dest, 0);
+}
+
+
diff --git a/src/main/java/org/xerial/snappy/SnappyNative.h b/src/main/java/org/xerial/snappy/SnappyNative.h
new file mode 100644
index 0000000..53c91c2
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyNative.h
@@ -0,0 +1,101 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class org_xerial_snappy_SnappyNative */
+
+#ifndef _Included_org_xerial_snappy_SnappyNative
+#define _Included_org_xerial_snappy_SnappyNative
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    nativeLibraryVersion
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_org_xerial_snappy_SnappyNative_nativeLibraryVersion
+  (JNIEnv *, jobject);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    rawCompress
+ * Signature: (Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress__Ljava_nio_ByteBuffer_2IILjava_nio_ByteBuffer_2I
+  (JNIEnv *, jobject, jobject, jint, jint, jobject, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    rawCompress
+ * Signature: (Ljava/lang/Object;IILjava/lang/Object;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawCompress__Ljava_lang_Object_2IILjava_lang_Object_2I
+  (JNIEnv *, jobject, jobject, jint, jint, jobject, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    rawUncompress
+ * Signature: (Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawUncompress__Ljava_nio_ByteBuffer_2IILjava_nio_ByteBuffer_2I
+  (JNIEnv *, jobject, jobject, jint, jint, jobject, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    rawUncompress
+ * Signature: (Ljava/lang/Object;IILjava/lang/Object;I)I
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_rawUncompress__Ljava_lang_Object_2IILjava_lang_Object_2I
+  (JNIEnv *, jobject, jobject, jint, jint, jobject, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    maxCompressedLength
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_maxCompressedLength
+  (JNIEnv *, jobject, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    uncompressedLength
+ * Signature: (Ljava/nio/ByteBuffer;II)I
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_uncompressedLength__Ljava_nio_ByteBuffer_2II
+  (JNIEnv *, jobject, jobject, jint, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    uncompressedLength
+ * Signature: (Ljava/lang/Object;II)I
+ */
+JNIEXPORT jint JNICALL Java_org_xerial_snappy_SnappyNative_uncompressedLength__Ljava_lang_Object_2II
+  (JNIEnv *, jobject, jobject, jint, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    isValidCompressedBuffer
+ * Signature: (Ljava/nio/ByteBuffer;II)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressedBuffer__Ljava_nio_ByteBuffer_2II
+  (JNIEnv *, jobject, jobject, jint, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    isValidCompressedBuffer
+ * Signature: (Ljava/lang/Object;II)Z
+ */
+JNIEXPORT jboolean JNICALL Java_org_xerial_snappy_SnappyNative_isValidCompressedBuffer__Ljava_lang_Object_2II
+  (JNIEnv *, jobject, jobject, jint, jint);
+
+/*
+ * Class:     org_xerial_snappy_SnappyNative
+ * Method:    arrayCopy
+ * Signature: (Ljava/lang/Object;IILjava/lang/Object;I)V
+ */
+JNIEXPORT void JNICALL Java_org_xerial_snappy_SnappyNative_arrayCopy
+  (JNIEnv *, jobject, jobject, jint, jint, jobject, jint);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/main/java/org/xerial/snappy/SnappyNative.java b/src/main/java/org/xerial/snappy/SnappyNative.java
new file mode 100644
index 0000000..9b42064
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyNative.java
@@ -0,0 +1,81 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// snappy-java Project
+//
+// SnappyNative.java
+// Since: 2011/03/30
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * <b>Internal only - Do not use this class.</b> JNI interface of the
+ * {@link SnappyNativeAPI} implementation. The native method in this class is
+ * defined in SnappyNative.h (genereted by javah) and SnappyNative.cpp
+ * 
+ * <p>
+ * <b> DO NOT USE THIS CLASS since the direct use of this class might break the
+ * native library code loading in {@link SnappyLoader}. </b>
+ * </p>
+ * 
+ * @author leo
+ * 
+ */
+public class SnappyNative implements SnappyNativeAPI
+{
+
+    public native String nativeLibraryVersion();
+
+    // ------------------------------------------------------------------------
+    // Generic compression/decompression routines.
+    // ------------------------------------------------------------------------
+    public native int rawCompress(ByteBuffer input, int inputOffset, int inputLength, ByteBuffer compressed,
+            int outputOffset) throws IOException;
+
+    public native int rawCompress(Object input, int inputOffset, int inputByteLength, Object output, int outputOffset);
+
+    public native int rawUncompress(ByteBuffer compressed, int inputOffset, int inputLength, ByteBuffer uncompressed,
+            int outputOffset) throws IOException;
+
+    public native int rawUncompress(Object input, int inputOffset, int inputLength, Object output, int outputOffset)
+            throws IOException;
+
+    // Returns the maximal size of the compressed representation of
+    // input data that is "source_bytes" bytes in length;
+    public native int maxCompressedLength(int source_bytes);
+
+    // This operation takes O(1) time.
+    public native int uncompressedLength(ByteBuffer compressed, int offset, int len) throws IOException;
+
+    public native int uncompressedLength(Object input, int offset, int len) throws IOException;
+
+    public native boolean isValidCompressedBuffer(ByteBuffer compressed, int offset, int len) throws IOException;
+
+    public native boolean isValidCompressedBuffer(Object input, int offset, int len) throws IOException;
+
+    public native void arrayCopy(Object src, int offset, int byteLength, Object dest, int dOffset) throws IOException;
+
+    public void throw_error(int errorCode) throws IOException {
+        throw new IOException(String.format("%s(%d)", SnappyErrorCode.getErrorMessage(errorCode), errorCode));
+    }
+
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyNativeAPI.java b/src/main/java/org/xerial/snappy/SnappyNativeAPI.java
new file mode 100644
index 0000000..6bf9fcc
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyNativeAPI.java
@@ -0,0 +1,76 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// snappy-java Project
+//
+// SnappyNative.java
+// Since: 2011/03/30
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * <b>Internal only - Do not use this class.</b>
+ * 
+ * Interface to access the native code of Snappy. Although this class members
+ * are public, do not use them directly. Use {@link Snappy} API instead.
+ * 
+ * 
+ * @author leo
+ * 
+ */
+public interface SnappyNativeAPI
+{
+
+    public String nativeLibraryVersion();
+
+    // ------------------------------------------------------------------------
+    // Generic compression/decompression routines.
+    // ------------------------------------------------------------------------
+    public int rawCompress(ByteBuffer input, int inputOffset, int inputLength, ByteBuffer compressed, int outputOffset)
+            throws IOException;
+
+    public int rawCompress(Object input, int inputOffset, int inputByteLength, Object output, int outputOffset);
+
+    public int rawUncompress(ByteBuffer compressed, int inputOffset, int inputLength, ByteBuffer uncompressed,
+            int outputOffset) throws IOException;
+
+    public int rawUncompress(Object input, int inputOffset, int inputLength, Object output, int outputOffset)
+            throws IOException;
+
+    // Returns the maximal size of the compressed representation of
+    // input data that is "source_bytes" bytes in length;
+    public int maxCompressedLength(int source_bytes);
+
+    // This operation takes O(1) time.
+    public int uncompressedLength(ByteBuffer compressed, int offset, int len) throws IOException;
+
+    public int uncompressedLength(Object input, int offset, int len) throws IOException;
+
+    public boolean isValidCompressedBuffer(ByteBuffer compressed, int offset, int len) throws IOException;
+
+    public boolean isValidCompressedBuffer(Object input, int offset, int len) throws IOException;
+
+    public void arrayCopy(Object src, int offset, int byteLength, Object dest, int dOffset) throws IOException;
+
+    public void throw_error(int errorCode) throws IOException;
+
+}
diff --git a/src/main/java/org/xerial/snappy/SnappyOutputStream.java b/src/main/java/org/xerial/snappy/SnappyOutputStream.java
new file mode 100644
index 0000000..d523a95
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/SnappyOutputStream.java
@@ -0,0 +1,315 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyOutputStream.java
+// Since: 2011/03/31 17:44:10
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * This class implements a stream filter for writing compressed data using
+ * Snappy.
+ * 
+ * The input data is blocked into 32kb size (in default), and each block is
+ * compressed and then passed to the given {@link OutputStream}.
+ * 
+ * The output data format is:
+ * <ol>
+ * <li>snappy codec header defined in {@link SnappyCodec} (8 bytes)
+ * <li>compressed block 1 : a pair of (compressed data size [4 byte integer.
+ * Big-endian], compressed data...)
+ * <li>compressed block 2
+ * <li>...
+ * </ol>
+ * 
+ * Note that the compressed data created by {@link SnappyOutputStream} cannot be
+ * uncompressed by {@link Snappy#uncompress(byte[])} since the output formats of
+ * {@link Snappy#compress(byte[])} and {@link SnappyOutputStream} are different.
+ * Use {@link SnappyInputStream} for uncompress the data generated by
+ * {@link SnappyOutputStream}.
+ * 
+ * @author leo
+ * 
+ */
+public class SnappyOutputStream extends OutputStream
+{
+    static final int             DEFAULT_BLOCK_SIZE = 32 * 1024; // Use 32kb for the default block size
+
+    protected final OutputStream out;
+    private final int            blockSize;
+    private int                  cursor             = 0;
+    protected byte[]             uncompressed;
+    protected byte[]             compressed;
+
+    public SnappyOutputStream(OutputStream out) throws IOException {
+        this(out, DEFAULT_BLOCK_SIZE);
+    }
+
+    /**
+     * @param out
+     * @param blockSize
+     *            byte size of the internal buffer size
+     * @throws IOException
+     */
+    public SnappyOutputStream(OutputStream out, int blockSize) throws IOException {
+        this.out = out;
+        this.blockSize = blockSize;
+        uncompressed = new byte[blockSize];
+        compressed = new byte[Snappy.maxCompressedLength(blockSize)];
+        writeHeader();
+    }
+
+    protected void writeHeader() throws IOException {
+        SnappyCodec.currentHeader().writeHeader(out);
+    }
+
+    /**
+     * Writes len bytes from the specified byte array starting at offset off to
+     * this output stream. The general contract for write(b, off, len) is that
+     * some of the bytes in the array b are written to the output stream in
+     * order; element b[off] is the first byte written and b[off+len-1] is the
+     * last byte written by this operation.
+     */
+    /* (non-Javadoc)
+     * @see java.io.OutputStream#write(byte[], int, int)
+     */
+    @Override
+    public void write(byte[] b, int off, int len) throws IOException {
+        rawWrite(b, off, len);
+    }
+
+    /**
+     * Compress the input long array data
+     * 
+     * @param d
+     *            input array
+     * @param off
+     *            offset in the array
+     * @param len
+     *            the number of elements in the array to copy
+     * @throws IOException
+     */
+    public void write(long[] d, int off, int len) throws IOException {
+        rawWrite(d, off * 8, len * 8);
+    }
+
+    /**
+     * Compress the input double array data
+     * 
+     * @param f
+     *            input array
+     * @param off
+     *            offset in the array
+     * @param len
+     *            the number of elements in the array to copy
+     * @throws IOException
+     */
+    public void write(double[] f, int off, int len) throws IOException {
+        rawWrite(f, off * 8, len * 8);
+    }
+
+    /**
+     * Compress the input float array data
+     * 
+     * @param f
+     *            input array
+     * @param off
+     *            offset in the array
+     * @param len
+     *            the number of elements in the array to copy
+     * @throws IOException
+     */
+    public void write(float[] f, int off, int len) throws IOException {
+        rawWrite(f, off * 4, len * 4);
+    }
+
+    /**
+     * Compress the input int array data
+     * 
+     * @param f
+     *            input array
+     * @param off
+     *            offset in the array
+     * @param len
+     *            the number of elements in the array to copy
+     * @throws IOException
+     */
+    public void write(int[] f, int off, int len) throws IOException {
+        rawWrite(f, off * 4, len * 4);
+    }
+
+    /**
+     * Compress the input short array data
+     * 
+     * @param f
+     *            input array
+     * @param off
+     *            offset in the array
+     * @param len
+     *            the number of elements in the array to copy
+     * @throws IOException
+     */
+    public void write(short[] f, int off, int len) throws IOException {
+        rawWrite(f, off * 2, len * 2);
+    }
+
+    /**
+     * Compress the input array data
+     * 
+     * @param d
+     * @throws IOException
+     */
+    public void write(long[] d) throws IOException {
+        write(d, 0, d.length);
+    }
+
+    /**
+     * Compress the input array data
+     * 
+     * @param f
+     * @throws IOException
+     */
+    public void write(double[] f) throws IOException {
+        write(f, 0, f.length);
+    }
+
+    /**
+     * Compress the input array data
+     * 
+     * @param f
+     * @throws IOException
+     */
+    public void write(float[] f) throws IOException {
+        write(f, 0, f.length);
+    }
+
+    /**
+     * Compress the input array data
+     * 
+     * @param f
+     * @throws IOException
+     */
+    public void write(int[] f) throws IOException {
+        write(f, 0, f.length);
+    }
+
+    /**
+     * Compress the input array data
+     * 
+     * @param f
+     * @throws IOException
+     */
+    public void write(short[] f) throws IOException {
+        write(f, 0, f.length);
+    }
+
+    /**
+     * Compress the raw byte array data.
+     * 
+     * @param array
+     *            array data of any type (e.g., byte[], float[], long[], ...)
+     * @param byteOffset
+     * @param byteLength
+     * @throws IOException
+     */
+    public void rawWrite(Object array, int byteOffset, int byteLength) throws IOException {
+        for (int readBytes = 0; readBytes < byteLength;) {
+            int copyLen = Math.min(uncompressed.length - cursor, byteLength - readBytes);
+            Snappy.arrayCopy(array, byteOffset + readBytes, copyLen, uncompressed, cursor);
+            readBytes += copyLen;
+            cursor += copyLen;
+
+            if (cursor >= uncompressed.length) {
+                dump();
+            }
+        }
+    }
+
+    /**
+     * Writes the specified byte to this output stream. The general contract for
+     * write is that one byte is written to the output stream. The byte to be
+     * written is the eight low-order bits of the argument b. The 24 high-order
+     * bits of b are ignored.
+     */
+    /* (non-Javadoc)
+     * @see java.io.OutputStream#write(int)
+     */
+    @Override
+    public void write(int b) throws IOException {
+        if (cursor >= uncompressed.length) {
+            dump();
+        }
+        uncompressed[cursor++] = (byte) b;
+    }
+
+    /* (non-Javadoc)
+     * @see java.io.OutputStream#flush()
+     */
+    @Override
+    public void flush() throws IOException {
+        dump();
+        out.flush();
+    }
+
+    static void writeInt(OutputStream out, int value) throws IOException {
+        out.write((value >> 24) & 0xFF);
+        out.write((value >> 16) & 0xFF);
+        out.write((value >> 8) & 0xFF);
+        out.write((value >> 0) & 0xFF);
+    }
+
+    static int readInt(byte[] buffer, int pos) {
+        int b1 = (buffer[pos] & 0xFF) << 24;
+        int b2 = (buffer[pos + 1] & 0xFF) << 16;
+        int b3 = (buffer[pos + 2] & 0xFF) << 8;
+        int b4 = buffer[pos + 3] & 0xFF;
+        return b1 | b2 | b3 | b4;
+    }
+
+    protected void dump() throws IOException {
+        if (cursor <= 0)
+            return; // no need to dump
+
+        // Compress and dump the buffer content
+        int compressedSize = Snappy.compress(uncompressed, 0, cursor, compressed, 0);
+        writeInt(out, compressedSize);
+        out.write(compressed, 0, compressedSize);
+        cursor = 0;
+    }
+
+    /**
+     * close the stream
+     */
+    /* (non-Javadoc)
+     * @see java.io.OutputStream#close()
+     */
+    @Override
+    public void close() throws IOException {
+        flush();
+
+        super.close();
+        out.close();
+    }
+
+}
diff --git a/src/main/java/org/xerial/snappy/VERSION b/src/main/java/org/xerial/snappy/VERSION
new file mode 100644
index 0000000..4d31fda
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/VERSION
@@ -0,0 +1,2 @@
+VERSION=1.0.4
+
diff --git a/src/main/java/org/xerial/snappy/package-info.java b/src/main/java/org/xerial/snappy/package-info.java
new file mode 100644
index 0000000..98f4d95
--- /dev/null
+++ b/src/main/java/org/xerial/snappy/package-info.java
@@ -0,0 +1,44 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+
+/**
+ * Snappy API for compressing/decompressing data.
+ * 
+ * Usage
+ * First, import {@link org.xerial.snappy.Snappy} in your Java code:
+ * <code>
+ * <pre>
+ * import org.xerial.snappy.Snappy;
+ * </pre>
+ * </code>
+ * Then use {@link org.xerial.snappy.Snappy#compress(byte[])} and {@link org.xerial.snappy.Snappy#uncompress(byte[])}:
+ * <code>
+ * <pre>
+ * String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of Snappy, a fast compresser/decompresser.";
+ * byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
+ * byte[] uncompressed = Snappy.uncompress(compressed);
+ * String result = new String(uncompressed, "UTF-8");
+ * System.out.println(result);
+ * </pre>
+ * </code>
+ * 
+ * <p>In addition, high-level methods (Snappy.compress(String), Snappy.compress(float[] ..) etc. ) and low-level ones (e.g. Snappy.rawCompress(.. ), Snappy.rawUncompress(..), etc.), which minimize memory copies, can be used. </p>
+ * 
+ * <h3>Stream-based API</h3>
+ * Stream-based compressor/decompressor SnappyOutputStream, SnappyInputStream are also available for reading/writing large data sets.
+ */
+package org.xerial.snappy;
+
diff --git a/src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode b/src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode
new file mode 100644
index 0000000..64c0fe8
Binary files /dev/null and b/src/main/resources/org/xerial/snappy/SnappyNativeLoader.bytecode differ
diff --git a/src/main/resources/org/xerial/snappy/SnappyNativeLoader.java b/src/main/resources/org/xerial/snappy/SnappyNativeLoader.java
new file mode 100644
index 0000000..967912c
--- /dev/null
+++ b/src/main/resources/org/xerial/snappy/SnappyNativeLoader.java
@@ -0,0 +1,59 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyNativeLoader.java
+// Since: 2011/07/04 12:10:28
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import java.util.HashMap;
+
+public class SnappyNativeLoader
+{
+    private static HashMap<String, Boolean> loadedLibFiles = new HashMap<String, Boolean>();
+    private static HashMap<String, Boolean> loadedLib      = new HashMap<String, Boolean>();
+
+    public static synchronized void load(String lib) {
+        if (loadedLibFiles.containsKey(lib) && loadedLibFiles.get(lib) == true)
+            return;
+
+        try {
+            System.load(lib);
+            loadedLibFiles.put(lib, true);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static synchronized void loadLibrary(String libname) {
+        if (loadedLib.containsKey(libname) && loadedLib.get(libname) == true)
+            return;
+
+        try {
+            System.loadLibrary(libname);
+            loadedLib.put(libname, true);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/src/main/resources/org/xerial/snappy/native/Linux/amd64/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/amd64/libsnappyjava.so
new file mode 100644
index 0000000..5ae0264
Binary files /dev/null and b/src/main/resources/org/xerial/snappy/native/Linux/amd64/libsnappyjava.so differ
diff --git a/src/main/resources/org/xerial/snappy/native/Linux/i386/libsnappyjava.so b/src/main/resources/org/xerial/snappy/native/Linux/i386/libsnappyjava.so
new file mode 100644
index 0000000..6832684
Binary files /dev/null and b/src/main/resources/org/xerial/snappy/native/Linux/i386/libsnappyjava.so differ
diff --git a/src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib b/src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib
new file mode 100644
index 0000000..ee0d183
Binary files /dev/null and b/src/main/resources/org/xerial/snappy/native/Mac/i386/libsnappyjava.jnilib differ
diff --git a/src/main/resources/org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib b/src/main/resources/org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib
new file mode 100644
index 0000000..aecf382
Binary files /dev/null and b/src/main/resources/org/xerial/snappy/native/Mac/x86_64/libsnappyjava.jnilib differ
diff --git a/src/main/resources/org/xerial/snappy/native/README b/src/main/resources/org/xerial/snappy/native/README
new file mode 100644
index 0000000..a9d2a55
--- /dev/null
+++ b/src/main/resources/org/xerial/snappy/native/README
@@ -0,0 +1 @@
+This folder contains the native libraries built for various platforms. 
\ No newline at end of file
diff --git a/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappyjava.dll b/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappyjava.dll
new file mode 100644
index 0000000..66104eb
Binary files /dev/null and b/src/main/resources/org/xerial/snappy/native/Windows/amd64/snappyjava.dll differ
diff --git a/src/main/resources/org/xerial/snappy/native/Windows/x86/snappyjava.dll b/src/main/resources/org/xerial/snappy/native/Windows/x86/snappyjava.dll
new file mode 100644
index 0000000..5751719
Binary files /dev/null and b/src/main/resources/org/xerial/snappy/native/Windows/x86/snappyjava.dll differ
diff --git a/src/test/java/org/xerial/snappy/CalgaryTest.java b/src/test/java/org/xerial/snappy/CalgaryTest.java
new file mode 100644
index 0000000..1f98af2
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/CalgaryTest.java
@@ -0,0 +1,118 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// CalgaryTest.java
+// Since: 2011/04/04 12:10:36
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.junit.Test;
+import org.xerial.util.FileResource;
+import org.xerial.util.log.Logger;
+
+/**
+ * Benchmark using Calgary data set
+ * 
+ * @author leo
+ * 
+ */
+public class CalgaryTest
+{
+    private static Logger _logger = Logger.getLogger(CalgaryTest.class);
+
+    static byte[] readFile(String file) throws IOException {
+        InputStream in = FileResource.find(CalgaryTest.class, file).openStream();
+        if (in == null)
+            throw new IOException("file " + file + " is not found");
+        try {
+            return SnappyInputStreamTest.readFully(in);
+        }
+        finally {
+            if (in != null)
+                in.close();
+        }
+    }
+
+    public static final String[] files = { "bib", "book1", "book2", "geo", "news", "obj1", "obj2", "paper1", "paper2",
+            "paper3", "paper4", "paper5", "paper6", "pic", "progc", "progl", "progp", "trans" };
+
+    @Test
+    public void block() throws Exception {
+        for (String f : files) {
+            byte[] orig = readFile("testdata/calgary/" + f);
+
+            byte[] compressed = Snappy.compress(orig);
+            byte[] uncompressed = Snappy.uncompress(compressed);
+
+            assertArrayEquals(orig, uncompressed);
+        }
+    }
+
+    @Test
+    public void stream() throws Exception {
+        for (String f : files) {
+            byte[] orig = readFile("testdata/calgary/" + f);
+
+            ByteArrayOutputStream compressedBuf = new ByteArrayOutputStream();
+            SnappyOutputStream out = new SnappyOutputStream(compressedBuf);
+            out.write(orig);
+            out.close();
+
+            SnappyInputStream in = new SnappyInputStream(new ByteArrayInputStream(compressedBuf.toByteArray()));
+            byte[] uncompressed = new byte[orig.length];
+            int readBytes = in.read(uncompressed);
+            assertEquals(orig.length, readBytes);
+            assertArrayEquals(orig, uncompressed);
+        }
+    }
+
+    @Test
+    public void byteWiseRead() throws Exception {
+        for (String f : files) {
+            byte[] orig = readFile("testdata/calgary/" + f);
+
+            ByteArrayOutputStream compressedBuf = new ByteArrayOutputStream();
+            SnappyOutputStream out = new SnappyOutputStream(compressedBuf);
+            out.write(orig);
+            out.close();
+
+            SnappyInputStream in = new SnappyInputStream(new ByteArrayInputStream(compressedBuf.toByteArray()));
+            byte[] uncompressed = new byte[orig.length];
+            int cursor = 0;
+            for (;;) {
+                int b = in.read();
+                if (b == -1)
+                    break;
+                uncompressed[cursor++] = (byte) b;
+            }
+            assertEquals(orig.length, cursor);
+            assertArrayEquals(orig, uncompressed);
+        }
+    }
+
+}
diff --git a/src/test/java/org/xerial/snappy/OSInfoTest.java b/src/test/java/org/xerial/snappy/OSInfoTest.java
new file mode 100644
index 0000000..64c9827
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/OSInfoTest.java
@@ -0,0 +1,110 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// snappy-java Project
+//
+// OSInfoTest.java
+// Since: May 20, 2008
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+
+import org.junit.Test;
+
+public class OSInfoTest
+{
+    @Test
+    public void osName() {
+        assertEquals("Windows", OSInfo.translateOSNameToFolderName("Windows XP"));
+        assertEquals("Windows", OSInfo.translateOSNameToFolderName("Windows 2000"));
+        assertEquals("Windows", OSInfo.translateOSNameToFolderName("Windows Vista"));
+        assertEquals("Windows", OSInfo.translateOSNameToFolderName("Windows 98"));
+        assertEquals("Windows", OSInfo.translateOSNameToFolderName("Windows 95"));
+
+        assertEquals("Mac", OSInfo.translateOSNameToFolderName("Mac OS"));
+        assertEquals("Mac", OSInfo.translateOSNameToFolderName("Mac OS X"));
+
+        assertEquals("AIX", OSInfo.translateOSNameToFolderName("AIX"));
+
+        assertEquals("Linux", OSInfo.translateOSNameToFolderName("Linux"));
+        assertEquals("OS2", OSInfo.translateOSNameToFolderName("OS2"));
+
+        assertEquals("HPUX", OSInfo.translateOSNameToFolderName("HP UX"));
+    }
+
+    @Test
+    public void archName() {
+        assertEquals("i386", OSInfo.translateArchNameToFolderName("i386"));
+        assertEquals("x86", OSInfo.translateArchNameToFolderName("x86"));
+        assertEquals("ppc", OSInfo.translateArchNameToFolderName("ppc"));
+        assertEquals("amd64", OSInfo.translateArchNameToFolderName("amd64"));
+    }
+
+    @Test
+    public void folderPath() {
+        String[] component = OSInfo.getNativeLibFolderPathForCurrentOS().split("/");
+        assertEquals(2, component.length);
+        assertEquals(OSInfo.getOSName(), component[0]);
+        assertEquals(OSInfo.getArchName(), component[1]);
+    }
+
+    @Test
+    public void testMainForOSName() throws Exception {
+
+        // preserve the current System.out
+        PrintStream out = System.out;
+        try {
+            // switch STDOUT
+            ByteArrayOutputStream buf = new ByteArrayOutputStream();
+            PrintStream tmpOut = new PrintStream(buf);
+            System.setOut(tmpOut);
+            OSInfo.main(new String[] { "--os" });
+            assertEquals(OSInfo.getOSName(), buf.toString());
+        }
+        finally {
+            // reset STDOUT
+            System.setOut(out);
+        }
+
+    }
+
+    @Test
+    public void testMainForArchName() throws Exception {
+
+        // preserver the current System.out
+        PrintStream out = System.out;
+        try {
+            // switch STDOUT
+            ByteArrayOutputStream buf = new ByteArrayOutputStream();
+            PrintStream tmpOut = new PrintStream(buf);
+            System.setOut(tmpOut);
+            OSInfo.main(new String[] { "--arch" });
+            assertEquals(OSInfo.getArchName(), buf.toString());
+        }
+        finally {
+            // reset STDOUT
+            System.setOut(out);
+        }
+    }
+
+}
diff --git a/src/test/java/org/xerial/snappy/SnappyInputStreamTest.java b/src/test/java/org/xerial/snappy/SnappyInputStreamTest.java
new file mode 100644
index 0000000..303f9fb
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/SnappyInputStreamTest.java
@@ -0,0 +1,112 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyInputStreamTest.java
+// Since: 2011/03/31 22:31:51
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import static org.junit.Assert.*;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.junit.Test;
+import org.xerial.util.FileResource;
+import org.xerial.util.log.Logger;
+
+public class SnappyInputStreamTest
+{
+    private static Logger _logger = Logger.getLogger(SnappyInputStreamTest.class);
+
+    public static byte[] readResourceFile(String fileName) throws IOException {
+        BufferedInputStream input = new BufferedInputStream(FileResource.find(SnappyOutputStreamTest.class, fileName)
+                .openStream());
+        assertNotNull(input);
+        return readFully(input);
+    }
+
+    public static byte[] readFully(InputStream input) throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        byte[] buf = new byte[4096];
+        for (int readBytes = 0; (readBytes = input.read(buf)) != -1;) {
+            out.write(buf, 0, readBytes);
+        }
+        out.flush();
+        return out.toByteArray();
+    }
+
+    public static byte[] biteWiseReadFully(InputStream input) throws IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        byte[] buf = new byte[4096];
+        for (int readData = 0; (readData = input.read()) != -1;) {
+            out.write(readData);
+        }
+        out.flush();
+        return out.toByteArray();
+    }
+
+    @Test
+    public void read() throws Exception {
+        ByteArrayOutputStream compressedBuf = new ByteArrayOutputStream();
+        SnappyOutputStream snappyOut = new SnappyOutputStream(compressedBuf);
+        byte[] orig = readResourceFile("alice29.txt");
+        snappyOut.write(orig);
+        snappyOut.close();
+        byte[] compressed = compressedBuf.toByteArray();
+        _logger.debug("compressed size: " + compressed.length);
+
+        SnappyInputStream in = new SnappyInputStream(new ByteArrayInputStream(compressed));
+        byte[] uncompressed = readFully(in);
+
+        assertEquals(orig.length, uncompressed.length);
+        assertArrayEquals(orig, uncompressed);
+
+    }
+
+    @Test
+    public void readBlockCompressedData() throws Exception {
+        byte[] orig = readResourceFile("alice29.txt");
+        byte[] compressed = Snappy.compress(orig);
+
+        SnappyInputStream in = new SnappyInputStream(new ByteArrayInputStream(compressed));
+        byte[] uncompressed = readFully(in);
+
+        assertEquals(orig.length, uncompressed.length);
+        assertArrayEquals(orig, uncompressed);
+    }
+
+    @Test
+    public void biteWiseRead() throws Exception {
+        byte[] orig = readResourceFile("testdata/calgary/paper6");
+        byte[] compressed = Snappy.compress(orig);
+
+        SnappyInputStream in = new SnappyInputStream(new ByteArrayInputStream(compressed));
+        byte[] uncompressed = biteWiseReadFully(in);
+
+        assertEquals(orig.length, uncompressed.length);
+        assertArrayEquals(orig, uncompressed);
+    }
+
+}
diff --git a/src/test/java/org/xerial/snappy/SnappyLoaderTest.java b/src/test/java/org/xerial/snappy/SnappyLoaderTest.java
new file mode 100644
index 0000000..81ecd53
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/SnappyLoaderTest.java
@@ -0,0 +1,128 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyLoaderTest.java
+// Since: 2011/06/22 23:59:47
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import static org.junit.Assert.*;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLClassLoader;
+
+import org.codehaus.plexus.classworlds.ClassWorld;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.junit.Test;
+import org.xerial.util.FileResource;
+import org.xerial.util.log.Logger;
+
+public class SnappyLoaderTest
+{
+    private static Logger _logger = Logger.getLogger(SnappyLoaderTest.class);
+
+    public static BufferedInputStream openByteStream(Class< ? > referenceClass, String resourceFileName)
+            throws IOException {
+        URL url = FileResource.find(referenceClass, resourceFileName);
+        if (url != null) {
+            return new BufferedInputStream(url.openStream());
+        }
+        else
+            return null;
+    }
+
+    public static <T> String loadIntoString(Class<T> referenceClass, String path) throws IOException {
+        BufferedInputStream in = openByteStream(referenceClass, path);
+        if (in == null)
+            throw new FileNotFoundException(
+                    String.format("reference class:%s, path:%s", referenceClass.getName(), path));
+
+        ByteArrayOutputStream buf = new ByteArrayOutputStream();
+        try {
+            byte[] tmp = new byte[4028];
+            for (int readBytes = 0; (readBytes = in.read(tmp)) != -1;) {
+                buf.write(tmp, 0, readBytes);
+            }
+            buf.flush();
+            return buf.toString();
+        }
+        finally {
+            in.close();
+        }
+    }
+
+    @Test
+    public void loadSnappyByDiffentClassloadersInTheSameJVM() throws Exception {
+
+        // Parent class loader cannot see Snappy.class
+        ClassLoader parent = this.getClass().getClassLoader().getParent();
+        ClassWorld cw = new ClassWorld();
+        ClassRealm P = cw.newRealm("P", parent);
+        try {
+            P.loadClass("org.xerial.snappy.Snappy");
+            fail("org.xerial.snappy.Snappy is found in the parent");
+        }
+        catch (ClassNotFoundException e) {
+            // OK
+        }
+
+        // Prepare the child class loaders which can load Snappy.class
+        URL classPath = new File("target/classes").toURI().toURL();
+        ClassRealm L1 = cw.newRealm("l1", URLClassLoader.newInstance(new URL[] { classPath }, parent));
+        ClassRealm L2 = cw.newRealm("l2", URLClassLoader.newInstance(new URL[] { classPath }, parent));
+
+        // Actually load Snappy.class in a child class loader
+
+        Class< ? > S1 = L1.loadClass("org.xerial.snappy.Snappy");
+        Method m = S1.getMethod("compress", String.class);
+        byte[] v = (byte[]) m.invoke(null, "hello world");
+
+        // Load Snappy.class from another child class loader
+        Class< ? > S2 = L2.loadClass("org.xerial.snappy.Snappy");
+        Method m2 = S2.getMethod("compress", String.class);
+        byte[] v2 = (byte[]) m2.invoke(null, "hello world");
+
+        assertArrayEquals(v, v2);
+    }
+
+    @Test
+    public void load() throws Exception {
+        SnappyLoader.load();
+        _logger.debug(Snappy.maxCompressedLength(1024));
+    }
+
+    @Test
+    public void autoLoad() throws Exception {
+        _logger.debug(Snappy.maxCompressedLength(1024));
+    }
+
+    public static void main(String[] args) {
+        // Test for loading native library specified in -Djava.library.path
+        System.setProperty(SnappyLoader.KEY_SNAPPY_USE_SYSTEMLIB, "true");
+        _logger.debug(Snappy.maxCompressedLength(1024));
+    }
+}
diff --git a/src/test/java/org/xerial/snappy/SnappyOutputStreamTest.java b/src/test/java/org/xerial/snappy/SnappyOutputStreamTest.java
new file mode 100644
index 0000000..84152f4
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/SnappyOutputStreamTest.java
@@ -0,0 +1,188 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// XerialJ
+//
+// SnappyOutputStreamTest.java
+// Since: 2011/03/31 18:26:31
+//
+// $URL$
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import static org.junit.Assert.*;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import org.junit.Test;
+import org.xerial.util.FileResource;
+import org.xerial.util.log.Logger;
+
+public class SnappyOutputStreamTest
+{
+    private static Logger _logger = Logger.getLogger(SnappyOutputStreamTest.class);
+
+    @Test
+    public void test() throws Exception {
+        ByteArrayOutputStream buf = new ByteArrayOutputStream();
+        SnappyOutputStream sout = new SnappyOutputStream(buf);
+
+        BufferedInputStream input = new BufferedInputStream(FileResource.find(SnappyOutputStreamTest.class,
+                "alice29.txt").openStream());
+        assertNotNull(input);
+
+        ByteArrayOutputStream orig = new ByteArrayOutputStream();
+        byte[] tmp = new byte[1024];
+        for (int readBytes = 0; (readBytes = input.read(tmp)) != -1;) {
+            sout.write(tmp, 0, readBytes);
+            orig.write(tmp, 0, readBytes); // preserve the original data
+        }
+        input.close();
+        sout.flush();
+        orig.flush();
+
+        int compressedSize = buf.size();
+        _logger.debug("compressed size: " + compressedSize);
+
+        ByteArrayOutputStream decompressed = new ByteArrayOutputStream();
+        byte[] compressed = buf.toByteArray();
+        // decompress
+        for (int cursor = SnappyCodec.headerSize(); cursor < compressed.length;) {
+            int chunkSize = SnappyOutputStream.readInt(compressed, cursor);
+            cursor += 4;
+            byte[] tmpOut = new byte[Snappy.uncompressedLength(compressed, cursor, chunkSize)];
+            int decompressedSize = Snappy.uncompress(compressed, cursor, chunkSize, tmpOut, 0);
+            cursor += chunkSize;
+
+            decompressed.write(tmpOut);
+        }
+        decompressed.flush();
+        assertEquals(orig.size(), decompressed.size());
+        assertArrayEquals(orig.toByteArray(), decompressed.toByteArray());
+    }
+
+    @Test
+    public void bufferSize() throws Exception {
+        ByteArrayOutputStream b = new ByteArrayOutputStream();
+        SnappyOutputStream os = new SnappyOutputStream(b, 500);
+        final int bytesToWrite = 5000;
+        byte[] orig = new byte[bytesToWrite];
+        for (int i = 0; i < 5000; ++i) {
+            byte v = (byte) (i % 128);
+            orig[i] = v;
+            os.write(v);
+        }
+        os.close();
+        SnappyInputStream is = new SnappyInputStream(new ByteArrayInputStream(b.toByteArray()));
+        byte[] buf = new byte[bytesToWrite / 101];
+        while (is.read(buf) != -1) {}
+        is.close();
+    }
+
+    @Test
+    public void longArrayCompress() throws Exception {
+        long[] l = new long[10];
+        for (int i = 0; i < l.length; ++i) {
+            l[i] = i % 3 + i * 11;
+        }
+
+        ByteArrayOutputStream b = new ByteArrayOutputStream();
+        SnappyOutputStream os = new SnappyOutputStream(b);
+
+        os.write(l);
+        os.close();
+        SnappyInputStream is = new SnappyInputStream(new ByteArrayInputStream(b.toByteArray()));
+        long[] l2 = new long[10];
+        int readBytes = is.read(l2);
+        is.close();
+
+        assertEquals(10 * 8, readBytes);
+        assertArrayEquals(l, l2);
+
+    }
+
+    @Test
+    public void writeDoubleArray() throws Exception {
+        ByteArrayOutputStream b = new ByteArrayOutputStream();
+        SnappyOutputStream os = new SnappyOutputStream(b);
+
+        double[] orig = new double[] { 1.0, 2.0, 1.4, 0.00343430014, -4.4, 4e-20 };
+        os.write(orig);
+        os.close();
+
+        SnappyInputStream is = new SnappyInputStream(new ByteArrayInputStream(b.toByteArray()));
+        double[] uncompressed = new double[orig.length];
+        is.read(uncompressed);
+        is.close();
+
+        assertArrayEquals(orig, uncompressed, 0.0);
+    }
+
+    @Test
+    public void writeFloatArray() throws Exception {
+        ByteArrayOutputStream b = new ByteArrayOutputStream();
+        SnappyOutputStream os = new SnappyOutputStream(b);
+
+        float[] orig = new float[] { 1.0f, 2.0f, 1.4f, 0.00343430014f, -4.4f, 4e-20f };
+        os.write(orig);
+        os.close();
+
+        SnappyInputStream is = new SnappyInputStream(new ByteArrayInputStream(b.toByteArray()));
+        float[] uncompressed = new float[orig.length];
+        is.read(uncompressed);
+        is.close();
+
+        assertArrayEquals(orig, uncompressed, 0.0f);
+    }
+
+    @Test
+    public void writeIntArray() throws Exception {
+        ByteArrayOutputStream b = new ByteArrayOutputStream();
+        SnappyOutputStream os = new SnappyOutputStream(b);
+
+        int[] orig = new int[] { 0, -1, -34, 43, 234, 34324, -234 };
+        os.write(orig);
+        os.close();
+
+        SnappyInputStream is = new SnappyInputStream(new ByteArrayInputStream(b.toByteArray()));
+        int[] uncompressed = new int[orig.length];
+        is.read(uncompressed);
+        is.close();
+
+        assertArrayEquals(orig, uncompressed);
+    }
+
+    @Test
+    public void writeShortArray() throws Exception {
+        ByteArrayOutputStream b = new ByteArrayOutputStream();
+        SnappyOutputStream os = new SnappyOutputStream(b);
+
+        short[] orig = new short[] { 0, -1, -34, 43, 234, 324, -234 };
+        os.write(orig);
+        os.close();
+
+        SnappyInputStream is = new SnappyInputStream(new ByteArrayInputStream(b.toByteArray()));
+        short[] uncompressed = new short[orig.length];
+        is.read(uncompressed);
+        is.close();
+
+        assertArrayEquals(orig, uncompressed);
+    }
+
+}
diff --git a/src/test/java/org/xerial/snappy/SnappyTest.java b/src/test/java/org/xerial/snappy/SnappyTest.java
new file mode 100644
index 0000000..db667f5
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/SnappyTest.java
@@ -0,0 +1,304 @@
+/*--------------------------------------------------------------------------
+ *  Copyright 2011 Taro L. Saito
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *--------------------------------------------------------------------------*/
+//--------------------------------------
+// snappy-java Project
+//
+// SnappyTest.java
+// Since: 2011/03/30
+//
+// $URL$ 
+// $Author$
+//--------------------------------------
+package org.xerial.snappy;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.xerial.util.log.Logger;
+
+public class SnappyTest
+{
+    private static Logger _logger = Logger.getLogger(SnappyTest.class);
+
+    @Test
+    public void getVersion() throws Exception {
+        String version = Snappy.getNativeLibraryVersion();
+        _logger.debug("version: " + version);
+    }
+
+    @Test
+    public void directBufferCheck() throws Exception {
+
+        try {
+            ByteBuffer src = ByteBuffer.allocate(1024);
+            src.put("hello world".getBytes());
+            src.flip();
+            ByteBuffer dest = ByteBuffer.allocate(1024);
+            int maxCompressedLen = Snappy.compress(src, dest);
+        }
+        catch (SnappyError e) {
+            Assert.assertTrue(e.errorCode == SnappyErrorCode.NOT_A_DIRECT_BUFFER);
+            return;
+        }
+
+        fail("shouldn't reach here");
+
+    }
+
+    @Test
+    public void directBuffer() throws Exception {
+
+        StringBuilder s = new StringBuilder();
+        for (int i = 0; i < 20; ++i) {
+            s.append("Hello world!");
+        }
+        String origStr = s.toString();
+        byte[] orig = origStr.getBytes();
+        int BUFFER_SIZE = orig.length;
+        ByteBuffer src = ByteBuffer.allocateDirect(orig.length);
+        src.put(orig);
+        src.flip();
+        _logger.debug("input size: " + src.remaining());
+        int maxCompressedLen = Snappy.maxCompressedLength(src.remaining());
+        _logger.debug("max compressed length:" + maxCompressedLen);
+
+        ByteBuffer compressed = ByteBuffer.allocateDirect(maxCompressedLen);
+        int compressedSize = Snappy.compress(src, compressed);
+        _logger.debug("compressed length: " + compressedSize);
+
+        assertTrue(Snappy.isValidCompressedBuffer(compressed));
+
+        assertEquals(0, src.position());
+        assertEquals(orig.length, src.remaining());
+        assertEquals(orig.length, src.limit());
+
+        assertEquals(0, compressed.position());
+        assertEquals(compressedSize, compressed.limit());
+        assertEquals(compressedSize, compressed.remaining());
+
+        int uncompressedLen = Snappy.uncompressedLength(compressed);
+        _logger.debug("uncompressed length: " + uncompressedLen);
+        ByteBuffer extract = ByteBuffer.allocateDirect(uncompressedLen);
+        int uncompressedLen2 = Snappy.uncompress(compressed, extract);
+        assertEquals(uncompressedLen, uncompressedLen2);
+        assertEquals(uncompressedLen, extract.remaining());
+
+        byte[] b = new byte[uncompressedLen];
+        extract.get(b);
+        String decompressed = new String(b);
+        _logger.debug(decompressed);
+
+        assertEquals(origStr, decompressed);
+    }
+
+    @Test
+    public void bufferOffset() throws Exception {
+
+        String m = "ACCAGGGGGGGGGGGGGGGGGGGGATAGATATTTCCCGAGATATTTTATATAAAAAAA";
+        byte[] orig = m.getBytes();
+        final int offset = 100;
+        ByteBuffer input = ByteBuffer.allocateDirect(orig.length + offset);
+        input.position(offset);
+        input.put(orig);
+        input.flip();
+        input.position(offset);
+
+        // compress
+        int maxCompressedLength = Snappy.maxCompressedLength(input.remaining());
+        final int offset2 = 40;
+        ByteBuffer compressed = ByteBuffer.allocateDirect(maxCompressedLength + offset2);
+        compressed.position(offset2);
+        Snappy.compress(input, compressed);
+        assertTrue(Snappy.isValidCompressedBuffer(compressed));
+
+        // uncompress
+        final int offset3 = 80;
+        int uncompressedLength = Snappy.uncompressedLength(compressed);
+        ByteBuffer uncompressed = ByteBuffer.allocateDirect(uncompressedLength + offset3);
+        uncompressed.position(offset3);
+        Snappy.uncompress(compressed, uncompressed);
+        assertEquals(offset3, uncompressed.position());
+        assertEquals(offset3 + uncompressedLength, uncompressed.limit());
+        assertEquals(uncompressedLength, uncompressed.remaining());
+
+        // extract string
+        byte[] recovered = new byte[uncompressedLength];
+        uncompressed.get(recovered);
+        String m2 = new String(recovered);
+
+        assertEquals(m, m2);
+    }
+
+    @Test
+    public void byteArrayCompress() throws Exception {
+
+        String m = "ACCAGGGGGGGGGGGGGGGGGGGGATAGATATTTCCCGAGATATTTTATATAAAAAAA";
+        byte[] input = m.getBytes();
+        byte[] output = new byte[Snappy.maxCompressedLength(input.length)];
+        int compressedSize = Snappy.compress(input, 0, input.length, output, 0);
+        byte[] uncompressed = new byte[input.length];
+
+        assertTrue(Snappy.isValidCompressedBuffer(output, 0, compressedSize));
+        int uncompressedSize = Snappy.uncompress(output, 0, compressedSize, uncompressed, 0);
+        String m2 = new String(uncompressed);
+        assertEquals(m, m2);
+
+    }
+
+    @Test
+    public void rangeCheck() throws Exception {
+        String m = "ACCAGGGGGGGGGGGGGGGGGGGGATAGATATTTCCCGAGATATTTTATATAAAAAAA";
+        byte[] input = m.getBytes();
+        byte[] output = new byte[Snappy.maxCompressedLength(input.length)];
+        int compressedSize = Snappy.compress(input, 0, input.length, output, 0);
+
+        assertTrue(Snappy.isValidCompressedBuffer(output, 0, compressedSize));
+        // Intentionally set an invalid range
+        assertFalse(Snappy.isValidCompressedBuffer(output, 0, compressedSize + 1));
+        assertFalse(Snappy.isValidCompressedBuffer(output, 1, compressedSize));
+
+        // Test the ByteBuffer API
+        ByteBuffer bin = ByteBuffer.allocateDirect(input.length);
+        bin.put(input);
+        bin.flip();
+        ByteBuffer bout = ByteBuffer.allocateDirect(Snappy.maxCompressedLength(bin.remaining()));
+        int compressedSize2 = Snappy.compress(bin, bout);
+        assertEquals(compressedSize, compressedSize2);
+
+        assertTrue(Snappy.isValidCompressedBuffer(bout));
+        // Intentionally set an invalid range
+        bout.limit(bout.limit() + 1);
+        assertFalse(Snappy.isValidCompressedBuffer(bout));
+        bout.limit(bout.limit() - 1);
+        bout.position(1);
+        assertFalse(Snappy.isValidCompressedBuffer(bout));
+
+    }
+
+    @Test
+    public void highLevelAPI() throws Exception {
+
+        String m = "Hello! 01234 ACGDSFSDFJ World. FDSDF02394234 fdsfda03924";
+        byte[] input = m.getBytes();
+        byte[] output = Snappy.compress(input);
+
+        byte[] uncompressed = Snappy.uncompress(output);
+        String m2 = new String(uncompressed);
+        assertEquals(m, m2);
+    }
+
+    @Test
+    public void lowLevelAPI() throws Exception {
+
+        String m = "Hello! 01234 ACGDSFSDFJ World. FDSDF02394234 fdsfda03924";
+        byte[] input = m.getBytes();
+        byte[] output = Snappy.rawCompress(input, input.length);
+
+        byte[] uncompressed = Snappy.uncompress(output);
+        String m2 = new String(uncompressed);
+        assertEquals(m, m2);
+    }
+
+    @Test
+    public void simpleUsage() throws Exception {
+
+        String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper"
+                + " for using Snappy from Google (written in C++), a fast compresser/decompresser.";
+        byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
+        byte[] uncompressed = Snappy.uncompress(compressed);
+        String result = new String(uncompressed, "UTF-8");
+        _logger.debug(result);
+
+    }
+
+    @Test
+    public void floatArray() throws Exception {
+        float[] data = new float[] { 1.0f, -0.3f, 1.3f, 234.4f, 34 };
+        byte[] compressed = Snappy.compress(data);
+        float[] result = Snappy.uncompressFloatArray(compressed);
+        assertArrayEquals(data, result, 0.0f);
+    }
+
+    @Test
+    public void doubleArray() throws Exception {
+        double[] data = new double[] { 1.0, -0.3, 1.3, 234.4, 34 };
+        byte[] compressed = Snappy.compress(data);
+        double[] result = Snappy.uncompressDoubleArray(compressed);
+        assertArrayEquals(data, result, 0.0f);
+    }
+
+    @Test
+    public void longArray() throws Exception {
+        long[] data = new long[] { 2, 3, 15, 4234, 43251531412342342L, 23423422342L };
+        byte[] compressed = Snappy.compress(data);
+        long[] result = Snappy.uncompressLongArray(compressed);
+        assertArrayEquals(data, result);
+    }
+
+    @Test
+    public void shortArray() throws Exception {
+        short[] data = new short[] { 432, -32267, 1, 3, 34, 43, 34, Short.MAX_VALUE, -1 };
+        byte[] compressed = Snappy.compress(data);
+        short[] result = Snappy.uncompressShortArray(compressed);
+        assertArrayEquals(data, result);
+    }
+
+    @Test
+    public void intArray() throws Exception {
+        int[] data = new int[] { 432, -32267, 1, 3, 34, 43, 34, Short.MAX_VALUE, -1, Integer.MAX_VALUE, 3424, 43 };
+        byte[] compressed = Snappy.compress(data);
+        int[] result = Snappy.uncompressIntArray(compressed);
+        assertArrayEquals(data, result);
+    }
+
+    @Test
+    public void charArray() throws Exception {
+        char[] data = new char[] { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' };
+        byte[] compressed = Snappy.compress(data);
+        char[] result = Snappy.uncompressCharArray(compressed);
+        assertArrayEquals(data, result);
+    }
+
+    @Test
+    public void string() throws Exception {
+        String s = "Hello Snappy! Snappy! Snappy!";
+        byte[] compressed = Snappy.compress(s);
+        String uncompressedString = Snappy.uncompressString(compressed);
+        assertEquals(s, uncompressedString);
+    }
+
+    @Test
+    public void isValidCompressedData() throws Exception {
+
+        byte[] b = new byte[] { (byte) 91, (byte) 34, (byte) 80, (byte) 73, (byte) 34, (byte) 93 };
+
+        assertFalse(Snappy.isValidCompressedBuffer(b));
+
+        try {
+            byte[] uncompressed = Snappy.uncompress(b);
+            fail("cannot reach here since the input is invalid data");
+        }
+        catch (IOException e) {
+            _logger.debug(e);
+        }
+
+    }
+
+}
diff --git a/src/test/java/org/xerial/snappy/alice29.txt b/src/test/java/org/xerial/snappy/alice29.txt
new file mode 100644
index 0000000..7033655
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/alice29.txt
@@ -0,0 +1,3609 @@
+
+
+
+
+                ALICE'S ADVENTURES IN WONDERLAND
+
+                          Lewis Carroll
+
+               THE MILLENNIUM FULCRUM EDITION 2.9
+
+
+
+
+                            CHAPTER I
+
+                      Down the Rabbit-Hole
+
+
+  Alice was beginning to get very tired of sitting by her sister
+on the bank, and of having nothing to do:  once or twice she had
+peeped into the book her sister was reading, but it had no
+pictures or conversations in it, `and what is the use of a book,'
+thought Alice `without pictures or conversation?'
+
+  So she was considering in her own mind (as well as she could,
+for the hot day made her feel very sleepy and stupid), whether
+the pleasure of making a daisy-chain would be worth the trouble
+of getting up and picking the daisies, when suddenly a White
+Rabbit with pink eyes ran close by her.
+
+  There was nothing so VERY remarkable in that; nor did Alice
+think it so VERY much out of the way to hear the Rabbit say to
+itself, `Oh dear!  Oh dear!  I shall be late!'  (when she thought
+it over afterwards, it occurred to her that she ought to have
+wondered at this, but at the time it all seemed quite natural);
+but when the Rabbit actually TOOK A WATCH OUT OF ITS WAISTCOAT-
+POCKET, and looked at it, and then hurried on, Alice started to
+her feet, for it flashed across her mind that she had never
+before seen a rabbit with either a waistcoat-pocket, or a watch to
+take out of it, and burning with curiosity, she ran across the
+field after it, and fortunately was just in time to see it pop
+down a large rabbit-hole under the hedge.
+
+  In another moment down went Alice after it, never once
+considering how in the world she was to get out again.
+
+  The rabbit-hole went straight on like a tunnel for some way,
+and then dipped suddenly down, so suddenly that Alice had not a
+moment to think about stopping herself before she found herself
+falling down a very deep well.
+
+  Either the well was very deep, or she fell very slowly, for she
+had plenty of time as she went down to look about her and to
+wonder what was going to happen next.  First, she tried to look
+down and make out what she was coming to, but it was too dark to
+see anything; then she looked at the sides of the well, and
+noticed that they were filled with cupboards and book-shelves;
+here and there she saw maps and pictures hung upon pegs.  She
+took down a jar from one of the shelves as she passed; it was
+labelled `ORANGE MARMALADE', but to her great disappointment it
+was empty:  she did not like to drop the jar for fear of killing
+somebody, so managed to put it into one of the cupboards as she
+fell past it.
+
+  `Well!' thought Alice to herself, `after such a fall as this, I
+shall think nothing of tumbling down stairs!  How brave they'll
+all think me at home!  Why, I wouldn't say anything about it,
+even if I fell off the top of the house!' (Which was very likely
+true.)
+
+  Down, down, down.  Would the fall NEVER come to an end!  `I
+wonder how many miles I've fallen by this time?' she said aloud.
+`I must be getting somewhere near the centre of the earth.  Let
+me see:  that would be four thousand miles down, I think--' (for,
+you see, Alice had learnt several things of this sort in her
+lessons in the schoolroom, and though this was not a VERY good
+opportunity for showing off her knowledge, as there was no one to
+listen to her, still it was good practice to say it over) `--yes,
+that's about the right distance--but then I wonder what Latitude
+or Longitude I've got to?'  (Alice had no idea what Latitude was,
+or Longitude either, but thought they were nice grand words to
+say.)
+
+  Presently she began again.  `I wonder if I shall fall right
+THROUGH the earth!  How funny it'll seem to come out among the
+people that walk with their heads downward!  The Antipathies, I
+think--' (she was rather glad there WAS no one listening, this
+time, as it didn't sound at all the right word) `--but I shall
+have to ask them what the name of the country is, you know.
+Please, Ma'am, is this New Zealand or Australia?' (and she tried
+to curtsey as she spoke--fancy CURTSEYING as you're falling
+through the air!  Do you think you could manage it?)  `And what
+an ignorant little girl she'll think me for asking!  No, it'll
+never do to ask:  perhaps I shall see it written up somewhere.'
+
+  Down, down, down.  There was nothing else to do, so Alice soon
+began talking again.  `Dinah'll miss me very much to-night, I
+should think!'  (Dinah was the cat.)  `I hope they'll remember
+her saucer of milk at tea-time.  Dinah my dear!  I wish you were
+down here with me!  There are no mice in the air, I'm afraid, but
+you might catch a bat, and that's very like a mouse, you know.
+But do cats eat bats, I wonder?'  And here Alice began to get
+rather sleepy, and went on saying to herself, in a dreamy sort of
+way, `Do cats eat bats?  Do cats eat bats?' and sometimes, `Do
+bats eat cats?' for, you see, as she couldn't answer either
+question, it didn't much matter which way she put it.  She felt
+that she was dozing off, and had just begun to dream that she
+was walking hand in hand with Dinah, and saying to her very
+earnestly, `Now, Dinah, tell me the truth:  did you ever eat a
+bat?' when suddenly, thump! thump! down she came upon a heap of
+sticks and dry leaves, and the fall was over.
+
+  Alice was not a bit hurt, and she jumped up on to her feet in a
+moment:  she looked up, but it was all dark overhead; before her
+was another long passage, and the White Rabbit was still in
+sight, hurrying down it.  There was not a moment to be lost:
+away went Alice like the wind, and was just in time to hear it
+say, as it turned a corner, `Oh my ears and whiskers, how late
+it's getting!'  She was close behind it when she turned the
+corner, but the Rabbit was no longer to be seen:  she found
+herself in a long, low hall, which was lit up by a row of lamps
+hanging from the roof.
+
+  There were doors all round the hall, but they were all locked;
+and when Alice had been all the way down one side and up the
+other, trying every door, she walked sadly down the middle,
+wondering how she was ever to get out again.
+
+  Suddenly she came upon a little three-legged table, all made of
+solid glass; there was nothing on it except a tiny golden key,
+and Alice's first thought was that it might belong to one of the
+doors of the hall; but, alas! either the locks were too large, or
+the key was too small, but at any rate it would not open any of
+them.  However, on the second time round, she came upon a low
+curtain she had not noticed before, and behind it was a little
+door about fifteen inches high:  she tried the little golden key
+in the lock, and to her great delight it fitted!
+
+  Alice opened the door and found that it led into a small
+passage, not much larger than a rat-hole:  she knelt down and
+looked along the passage into the loveliest garden you ever saw.
+How she longed to get out of that dark hall, and wander about
+among those beds of bright flowers and those cool fountains, but
+she could not even get her head though the doorway; `and even if
+my head would go through,' thought poor Alice, `it would be of
+very little use without my shoulders.  Oh, how I wish
+I could shut up like a telescope!  I think I could, if I only
+know how to begin.'  For, you see, so many out-of-the-way things
+had happened lately, that Alice had begun to think that very few
+things indeed were really impossible.
+
+  There seemed to be no use in waiting by the little door, so she
+went back to the table, half hoping she might find another key on
+it, or at any rate a book of rules for shutting people up like
+telescopes:  this time she found a little bottle on it, (`which
+certainly was not here before,' said Alice,) and round the neck
+of the bottle was a paper label, with the words `DRINK ME'
+beautifully printed on it in large letters.
+
+  It was all very well to say `Drink me,' but the wise little
+Alice was not going to do THAT in a hurry.  `No, I'll look
+first,' she said, `and see whether it's marked "poison" or not';
+for she had read several nice little histories about children who
+had got burnt, and eaten up by wild beasts and other unpleasant
+things, all because they WOULD not remember the simple rules
+their friends had taught them:  such as, that a red-hot poker
+will burn you if you hold it too long; and that if you cut your
+finger VERY deeply with a knife, it usually bleeds; and she had
+never forgotten that, if you drink much from a bottle marked
+`poison,' it is almost certain to disagree with you, sooner or
+later.
+
+  However, this bottle was NOT marked `poison,' so Alice ventured
+to taste it, and finding it very nice, (it had, in fact, a sort
+of mixed flavour of cherry-tart, custard, pine-apple, roast
+turkey, toffee, and hot buttered toast,) she very soon finished
+it off.
+
+     *       *       *       *       *       *       *
+
+         *       *       *       *       *       *
+
+     *       *       *       *       *       *       *
+
+  `What a curious feeling!' said Alice; `I must be shutting up
+like a telescope.'
+
+  And so it was indeed:  she was now only ten inches high, and
+her face brightened up at the thought that she was now the right
+size for going though the little door into that lovely garden.
+First, however, she waited for a few minutes to see if she was
+going to shrink any further:  she felt a little nervous about
+this; `for it might end, you know,' said Alice to herself, `in my
+going out altogether, like a candle.  I wonder what I should be
+like then?'  And she tried to fancy what the flame of a candle is
+like after the candle is blown out, for she could not remember
+ever having seen such a thing.
+
+  After a while, finding that nothing more happened, she decided
+on going into the garden at once; but, alas for poor Alice! when
+she got to the door, she found he had forgotten the little golden
+key, and when she went back to the table for it, she found she
+could not possibly reach it:  she could see it quite plainly
+through the glass, and she tried her best to climb up one of the
+legs of the table, but it was too slippery; and when she had
+tired herself out with trying, the poor little thing sat down and
+cried.
+
+  `Come, there's no use in crying like that!' said Alice to
+herself, rather sharply; `I advise you to leave off this minute!'
+She generally gave herself very good advice, (though she very
+seldom followed it), and sometimes she scolded herself so
+severely as to bring tears into her eyes; and once she remembered
+trying to box her own ears for having cheated herself in a game
+of croquet she was playing against herself, for this curious
+child was very fond of pretending to be two people.  `But it's no
+use now,' thought poor Alice, `to pretend to be two people!  Why,
+there's hardly enough of me left to make ONE respectable
+person!'
+
+  Soon her eye fell on a little glass box that was lying under
+the table:  she opened it, and found in it a very small cake, on
+which the words `EAT ME' were beautifully marked in currants.
+`Well, I'll eat it,' said Alice, `and if it makes me grow larger,
+I can reach the key; and if it makes me grow smaller, I can creep
+under the door; so either way I'll get into the garden, and I
+don't care which happens!'
+
+  She ate a little bit, and said anxiously to herself, `Which
+way?  Which way?', holding her hand on the top of her head to
+feel which way it was growing, and she was quite surprised to
+find that she remained the same size:  to be sure, this generally
+happens when one eats cake, but Alice had got so much into the
+way of expecting nothing but out-of-the-way things to happen,
+that it seemed quite dull and stupid for life to go on in the
+common way.
+
+  So she set to work, and very soon finished off the cake.
+
+     *       *       *       *       *       *       *
+
+         *       *       *       *       *       *
+
+     *       *       *       *       *       *       *
+
+
+
+
+                           CHAPTER II
+
+                        The Pool of Tears
+
+
+  `Curiouser and curiouser!' cried Alice (she was so much
+surprised, that for the moment she quite forgot how to speak good
+English); `now I'm opening out like the largest telescope that
+ever was!  Good-bye, feet!' (for when she looked down at her
+feet, they seemed to be almost out of sight, they were getting so
+far off).  `Oh, my poor little feet, I wonder who will put on
+your shoes and stockings for you now, dears?  I'm sure _I_ shan't
+be able!  I shall be a great deal too far off to trouble myself
+about you:  you must manage the best way you can; --but I must be
+kind to them,' thought Alice, `or perhaps they won't walk the
+way I want to go!  Let me see:  I'll give them a new pair of
+boots every Christmas.'
+
+  And she went on planning to herself how she would manage it.
+`They must go by the carrier,' she thought; `and how funny it'll
+seem, sending presents to one's own feet!  And how odd the
+directions will look!
+
+            ALICE'S RIGHT FOOT, ESQ.
+                HEARTHRUG,
+                    NEAR THE FENDER,
+                        (WITH ALICE'S LOVE).
+
+Oh dear, what nonsense I'm talking!'
+
+  Just then her head struck against the roof of the hall:  in
+fact she was now more than nine feet high, and she at once took
+up the little golden key and hurried off to the garden door.
+
+  Poor Alice!  It was as much as she could do, lying down on one
+side, to look through into the garden with one eye; but to get
+through was more hopeless than ever:  she sat down and began to
+cry again.
+
+  `You ought to be ashamed of yourself,' said Alice, `a great
+girl like you,' (she might well say this), `to go on crying in
+this way!  Stop this moment, I tell you!'  But she went on all
+the same, shedding gallons of tears, until there was a large pool
+all round her, about four inches deep and reaching half down the
+hall.
+
+  After a time she heard a little pattering of feet in the
+distance, and she hastily dried her eyes to see what was coming.
+It was the White Rabbit returning, splendidly dressed, with a
+pair of white kid gloves in one hand and a large fan in the
+other:  he came trotting along in a great hurry, muttering to
+himself as he came, `Oh! the Duchess, the Duchess! Oh! won't she
+be savage if I've kept her waiting!'  Alice felt so desperate
+that she was ready to ask help of any one; so, when the Rabbit
+came near her, she began, in a low, timid voice, `If you please,
+sir--'  The Rabbit started violently, dropped the white kid
+gloves and the fan, and skurried away into the darkness as hard
+as he could go.
+
+  Alice took up the fan and gloves, and, as the hall was very
+hot, she kept fanning herself all the time she went on talking:
+`Dear, dear!  How queer everything is to-day!  And yesterday
+things went on just as usual.  I wonder if I've been changed in
+the night?  Let me think:  was I the same when I got up this
+morning?  I almost think I can remember feeling a little
+different.  But if I'm not the same, the next question is, Who in
+the world am I?  Ah, THAT'S the great puzzle!'  And she began
+thinking over all the children she knew that were of the same age
+as herself, to see if she could have been changed for any of
+them.
+
+  `I'm sure I'm not Ada,' she said, `for her hair goes in such
+long ringlets, and mine doesn't go in ringlets at all; and I'm
+sure I can't be Mabel, for I know all sorts of things, and she,
+oh! she knows such a very little!  Besides, SHE'S she, and I'm I,
+and--oh dear, how puzzling it all is!  I'll try if I know all the
+things I used to know.  Let me see:  four times five is twelve,
+and four times six is thirteen, and four times seven is--oh dear!
+I shall never get to twenty at that rate!  However, the
+Multiplication Table doesn't signify:  let's try Geography.
+London is the capital of Paris, and Paris is the capital of Rome,
+and Rome--no, THAT'S all wrong, I'm certain!  I must have been
+changed for Mabel!  I'll try and say "How doth the little--"'
+and she crossed her hands on her lap as if she were saying lessons,
+and began to repeat it, but her voice sounded hoarse and
+strange, and the words did not come the same as they used to do:--
+
+            `How doth the little crocodile
+              Improve his shining tail,
+            And pour the waters of the Nile
+              On every golden scale!
+
+            `How cheerfully he seems to grin,
+              How neatly spread his claws,
+            And welcome little fishes in
+              With gently smiling jaws!'
+
+  `I'm sure those are not the right words,' said poor Alice, and
+her eyes filled with tears again as she went on, `I must be Mabel
+after all, and I shall have to go and live in that poky little
+house, and have next to no toys to play with, and oh! ever so
+many lessons to learn!  No, I've made up my mind about it; if I'm
+Mabel, I'll stay down here!  It'll be no use their putting their
+heads down and saying "Come up again, dear!"  I shall only look
+up and say "Who am I then?  Tell me that first, and then, if I
+like being that person, I'll come up:  if not, I'll stay down
+here till I'm somebody else"--but, oh dear!' cried Alice, with a
+sudden burst of tears, `I do wish they WOULD put their heads
+down!  I am so VERY tired of being all alone here!'
+
+  As she said this she looked down at her hands, and was
+surprised to see that she had put on one of the Rabbit's little
+white kid gloves while she was talking.  `How CAN I have done
+that?' she thought.  `I must be growing small again.'  She got up
+and went to the table to measure herself by it, and found that,
+as nearly as she could guess, she was now about two feet high,
+and was going on shrinking rapidly:  she soon found out that the
+cause of this was the fan she was holding, and she dropped it
+hastily, just in time to avoid shrinking away altogether.
+
+`That WAS a narrow escape!' said Alice, a good deal frightened at
+the sudden change, but very glad to find herself still in
+existence; `and now for the garden!' and she ran with all speed
+back to the little door:  but, alas! the little door was shut
+again, and the little golden key was lying on the glass table as
+before, `and things are worse than ever,' thought the poor child,
+`for I never was so small as this before, never!  And I declare
+it's too bad, that it is!'
+
+  As she said these words her foot slipped, and in another
+moment, splash! she was up to her chin in salt water.  He first
+idea was that she had somehow fallen into the sea, `and in that
+case I can go back by railway,' she said to herself.  (Alice had
+been to the seaside once in her life, and had come to the general
+conclusion, that wherever you go to on the English coast you find
+a number of bathing machines in the sea, some children digging in
+the sand with wooden spades, then a row of lodging houses, and
+behind them a railway station.)  However, she soon made out that
+she was in the pool of tears which she had wept when she was nine
+feet high.
+
+  `I wish I hadn't cried so much!' said Alice, as she swam about,
+trying to find her way out.  `I shall be punished for it now, I
+suppose, by being drowned in my own tears!  That WILL be a queer
+thing, to be sure!  However, everything is queer to-day.'
+
+  Just then she heard something splashing about in the pool a
+little way off, and she swam nearer to make out what it was:  at
+first she thought it must be a walrus or hippopotamus, but then
+she remembered how small she was now, and she soon made out that
+it was only a mouse that had slipped in like herself.
+
+  `Would it be of any use, now,' thought Alice, `to speak to this
+mouse?  Everything is so out-of-the-way down here, that I should
+think very likely it can talk:  at any rate, there's no harm in
+trying.'  So she began:  `O Mouse, do you know the way out of
+this pool?  I am very tired of swimming about here, O Mouse!'
+(Alice thought this must be the right way of speaking to a mouse:
+she had never done such a thing before, but she remembered having
+seen in her brother's Latin Grammar, `A mouse--of a mouse--to a
+mouse--a mouse--O mouse!'  The Mouse looked at her rather
+inquisitively, and seemed to her to wink with one of its little
+eyes, but it said nothing.
+
+  `Perhaps it doesn't understand English,' thought Alice; `I
+daresay it's a French mouse, come over with William the
+Conqueror.'  (For, with all her knowledge of history, Alice had
+no very clear notion how long ago anything had happened.)  So she
+began again:  `Ou est ma chatte?' which was the first sentence in
+her French lesson-book.  The Mouse gave a sudden leap out of the
+water, and seemed to quiver all over with fright.  `Oh, I beg
+your pardon!' cried Alice hastily, afraid that she had hurt the
+poor animal's feelings.  `I quite forgot you didn't like cats.'
+
+  `Not like cats!' cried the Mouse, in a shrill, passionate
+voice.  `Would YOU like cats if you were me?'
+
+  `Well, perhaps not,' said Alice in a soothing tone:  `don't be
+angry about it.  And yet I wish I could show you our cat Dinah:
+I think you'd take a fancy to cats if you could only see her.
+She is such a dear quiet thing,' Alice went on, half to herself,
+as she swam lazily about in the pool, `and she sits purring so
+nicely by the fire, licking her paws and washing her face--and
+she is such a nice soft thing to nurse--and she's such a capital
+one for catching mice--oh, I beg your pardon!' cried Alice again,
+for this time the Mouse was bristling all over, and she felt
+certain it must be really offended.  `We won't talk about her any
+more if you'd rather not.'
+
+  `We indeed!' cried the Mouse, who was trembling down to the end
+of his tail.  `As if I would talk on such a subject!  Our family
+always HATED cats:  nasty, low, vulgar things!  Don't let me hear
+the name again!'
+
+  `I won't indeed!' said Alice, in a great hurry to change the
+subject of conversation.  `Are you--are you fond--of--of dogs?'
+The Mouse did not answer, so Alice went on eagerly:  `There is
+such a nice little dog near our house I should like to show you!
+A little bright-eyed terrier, you know, with oh, such long curly
+brown hair!  And it'll fetch things when you throw them, and
+it'll sit up and beg for its dinner, and all sorts of things--I
+can't remember half of them--and it belongs to a farmer, you
+know, and he says it's so useful, it's worth a hundred pounds!
+He says it kills all the rats and--oh dear!' cried Alice in a
+sorrowful tone, `I'm afraid I've offended it again!'  For the
+Mouse was swimming away from her as hard as it could go, and
+making quite a commotion in the pool as it went.
+
+  So she called softly after it, `Mouse dear!  Do come back
+again, and we won't talk about cats or dogs either, if you don't
+like them!'  When the Mouse heard this, it turned round and swam
+slowly back to her:  its face was quite pale (with passion, Alice
+thought), and it said in a low trembling voice, `Let us get to
+the shore, and then I'll tell you my history, and you'll
+understand why it is I hate cats and dogs.'
+
+  It was high time to go, for the pool was getting quite crowded
+with the birds and animals that had fallen into it:  there were a
+Duck and a Dodo, a Lory and an Eaglet, and several other curious
+creatures.  Alice led the way, and the whole party swam to the
+shore.
+
+
+
+                           CHAPTER III
+
+                  A Caucus-Race and a Long Tale
+
+
+  They were indeed a queer-looking party that assembled on the
+bank--the birds with draggled feathers, the animals with their
+fur clinging close to them, and all dripping wet, cross, and
+uncomfortable.
+
+  The first question of course was, how to get dry again:  they
+had a consultation about this, and after a few minutes it seemed
+quite natural to Alice to find herself talking familiarly with
+them, as if she had known them all her life.  Indeed, she had
+quite a long argument with the Lory, who at last turned sulky,
+and would only say, `I am older than you, and must know better';
+and this Alice would not allow without knowing how old it was,
+and, as the Lory positively refused to tell its age, there was no
+more to be said.
+
+  At last the Mouse, who seemed to be a person of authority among
+them, called out, `Sit down, all of you, and listen to me!  I'LL
+soon make you dry enough!'  They all sat down at once, in a large
+ring, with the Mouse in the middle.  Alice kept her eyes
+anxiously fixed on it, for she felt sure she would catch a bad
+cold if she did not get dry very soon.
+
+  `Ahem!' said the Mouse with an important air, `are you all ready?
+This is the driest thing I know.  Silence all round, if you please!
+"William the Conqueror, whose cause was favoured by the pope, was
+soon submitted to by the English, who wanted leaders, and had been
+of late much accustomed to usurpation and conquest.  Edwin and
+Morcar, the earls of Mercia and Northumbria--"'
+
+  `Ugh!' said the Lory, with a shiver.
+
+  `I beg your pardon!' said the Mouse, frowning, but very
+politely:  `Did you speak?'
+
+  `Not I!' said the Lory hastily.
+
+  `I thought you did,' said the Mouse.  `--I proceed.  "Edwin and
+Morcar, the earls of Mercia and Northumbria, declared for him:
+and even Stigand, the patriotic archbishop of Canterbury, found
+it advisable--"'
+
+  `Found WHAT?' said the Duck.
+
+  `Found IT,' the Mouse replied rather crossly:  `of course you
+know what "it" means.'
+
+  `I know what "it" means well enough, when I find a thing,' said
+the Duck:  `it's generally a frog or a worm.  The question is,
+what did the archbishop find?'
+
+  The Mouse did not notice this question, but hurriedly went on,
+`"--found it advisable to go with Edgar Atheling to meet William
+and offer him the crown.  William's conduct at first was
+moderate.  But the insolence of his Normans--"  How are you
+getting on now, my dear?' it continued, turning to Alice as it
+spoke.
+
+  `As wet as ever,' said Alice in a melancholy tone:  `it doesn't
+seem to dry me at all.'
+
+  `In that case,' said the Dodo solemnly, rising to its feet, `I
+move that the meeting adjourn, for the immediate adoption of more
+energetic remedies--'
+
+  `Speak English!' said the Eaglet.  `I don't know the meaning of
+half those long words, and, what's more, I don't believe you do
+either!'  And the Eaglet bent down its head to hide a smile:
+some of the other birds tittered audibly.
+
+  `What I was going to say,' said the Dodo in an offended tone,
+`was, that the best thing to get us dry would be a Caucus-race.'
+
+  `What IS a Caucus-race?' said Alice; not that she wanted much
+to know, but the Dodo had paused as if it thought that SOMEBODY
+ought to speak, and no one else seemed inclined to say anything.
+
+  `Why,' said the Dodo, `the best way to explain it is to do it.'
+(And, as you might like to try the thing yourself, some winter
+day, I will tell you how the Dodo managed it.)
+
+  First it marked out a race-course, in a sort of circle, (`the
+exact shape doesn't matter,' it said,) and then all the party
+were placed along the course, here and there.  There was no `One,
+two, three, and away,' but they began running when they liked,
+and left off when they liked, so that it was not easy to know
+when the race was over.  However, when they had been running half
+an hour or so, and were quite dry again, the Dodo suddenly called
+out `The race is over!' and they all crowded round it, panting,
+and asking, `But who has won?'
+
+  This question the Dodo could not answer without a great deal of
+thought, and it sat for a long time with one finger pressed upon
+its forehead (the position in which you usually see Shakespeare,
+in the pictures of him), while the rest waited in silence.  At
+last the Dodo said, `EVERYBODY has won, and all must have
+prizes.'
+
+  `But who is to give the prizes?' quite a chorus of voices
+asked.
+
+  `Why, SHE, of course,' said the Dodo, pointing to Alice with
+one finger; and the whole party at once crowded round her,
+calling out in a confused way, `Prizes! Prizes!'
+
+  Alice had no idea what to do, and in despair she put her hand
+in her pocket, and pulled out a box of comfits, (luckily the salt
+water had not got into it), and handed them round as prizes.
+There was exactly one a-piece all round.
+
+  `But she must have a prize herself, you know,' said the Mouse.
+
+  `Of course,' the Dodo replied very gravely.  `What else have
+you got in your pocket?' he went on, turning to Alice.
+
+  `Only a thimble,' said Alice sadly.
+
+  `Hand it over here,' said the Dodo.
+
+  Then they all crowded round her once more, while the Dodo
+solemnly presented the thimble, saying `We beg your acceptance of
+this elegant thimble'; and, when it had finished this short
+speech, they all cheered.
+
+  Alice thought the whole thing very absurd, but they all looked
+so grave that she did not dare to laugh; and, as she could not
+think of anything to say, she simply bowed, and took the thimble,
+looking as solemn as she could.
+
+  The next thing was to eat the comfits:  this caused some noise
+and confusion, as the large birds complained that they could not
+taste theirs, and the small ones choked and had to be patted on
+the back.  However, it was over at last, and they sat down again
+in a ring, and begged the Mouse to tell them something more.
+
+  `You promised to tell me your history, you know,' said Alice,
+`and why it is you hate--C and D,' she added in a whisper, half
+afraid that it would be offended again.
+
+  `Mine is a long and a sad tale!' said the Mouse, turning to
+Alice, and sighing.
+
+  `It IS a long tail, certainly,' said Alice, looking down with
+wonder at the Mouse's tail; `but why do you call it sad?'  And
+she kept on puzzling about it while the Mouse was speaking, so
+that her idea of the tale was something like this:--
+
+                    `Fury said to a
+                   mouse, That he
+                 met in the
+               house,
+            "Let us
+              both go to
+                law:  I will
+                  prosecute
+                    YOU.  --Come,
+                       I'll take no
+                        denial; We
+                     must have a
+                 trial:  For
+              really this
+           morning I've
+          nothing
+         to do."
+           Said the
+             mouse to the
+               cur, "Such
+                 a trial,
+                   dear Sir,
+                         With
+                     no jury
+                  or judge,
+                would be
+              wasting
+             our
+              breath."
+               "I'll be
+                 judge, I'll
+                   be jury,"
+                         Said
+                    cunning
+                      old Fury:
+                     "I'll
+                      try the
+                         whole
+                          cause,
+                             and
+                        condemn
+                       you
+                      to
+                       death."'
+
+
+  `You are not attending!' said the Mouse to Alice severely.
+`What are you thinking of?'
+
+  `I beg your pardon,' said Alice very humbly:  `you had got to
+the fifth bend, I think?'
+
+  `I had NOT!' cried the Mouse, sharply and very angrily.
+
+  `A knot!' said Alice, always ready to make herself useful, and
+looking anxiously about her.  `Oh, do let me help to undo it!'
+
+  `I shall do nothing of the sort,' said the Mouse, getting up
+and walking away.  `You insult me by talking such nonsense!'
+
+  `I didn't mean it!' pleaded poor Alice.  `But you're so easily
+offended, you know!'
+
+  The Mouse only growled in reply.
+
+  `Please come back and finish your story!' Alice called after
+it; and the others all joined in chorus, `Yes, please do!' but
+the Mouse only shook its head impatiently, and walked a little
+quicker.
+
+  `What a pity it wouldn't stay!' sighed the Lory, as soon as it
+was quite out of sight; and an old Crab took the opportunity of
+saying to her daughter `Ah, my dear!  Let this be a lesson to you
+never to lose YOUR temper!'  `Hold your tongue, Ma!' said the
+young Crab, a little snappishly.  `You're enough to try the
+patience of an oyster!'
+
+  `I wish I had our Dinah here, I know I do!' said Alice aloud,
+addressing nobody in particular.  `She'd soon fetch it back!'
+
+  `And who is Dinah, if I might venture to ask the question?'
+said the Lory.
+
+  Alice replied eagerly, for she was always ready to talk about
+her pet:  `Dinah's our cat.  And she's such a capital one for
+catching mice you can't think!  And oh, I wish you could see her
+after the birds!  Why, she'll eat a little bird as soon as look
+at it!'
+
+  This speech caused a remarkable sensation among the party.
+Some of the birds hurried off at once:  one the old Magpie began
+wrapping itself up very carefully, remarking, `I really must be
+getting home; the night-air doesn't suit my throat!' and a Canary
+called out in a trembling voice to its children, `Come away, my
+dears!  It's high time you were all in bed!'  On various pretexts
+they all moved off, and Alice was soon left alone.
+
+  `I wish I hadn't mentioned Dinah!' she said to herself in a
+melancholy tone.  `Nobody seems to like her, down here, and I'm
+sure she's the best cat in the world!  Oh, my dear Dinah!  I
+wonder if I shall ever see you any more!'  And here poor Alice
+began to cry again, for she felt very lonely and low-spirited.
+In a little while, however, she again heard a little pattering of
+footsteps in the distance, and she looked up eagerly, half hoping
+that the Mouse had changed his mind, and was coming back to
+finish his story.
+
+
+
+                           CHAPTER IV
+
+                The Rabbit Sends in a Little Bill
+
+
+  It was the White Rabbit, trotting slowly back again, and
+looking anxiously about as it went, as if it had lost something;
+and she heard it muttering to itself `The Duchess!  The Duchess!
+Oh my dear paws!  Oh my fur and whiskers!  She'll get me
+executed, as sure as ferrets are ferrets!  Where CAN I have
+dropped them, I wonder?'  Alice guessed in a moment that it was
+looking for the fan and the pair of white kid gloves, and she
+very good-naturedly began hunting about for them, but they were
+nowhere to be seen--everything seemed to have changed since her
+swim in the pool, and the great hall, with the glass table and
+the little door, had vanished completely.
+
+  Very soon the Rabbit noticed Alice, as she went hunting about,
+and called out to her in an angry tone, `Why, Mary Ann, what ARE
+you doing out here?  Run home this moment, and fetch me a pair of
+gloves and a fan!  Quick, now!'  And Alice was so much frightened
+that she ran off at once in the direction it pointed to, without
+trying to explain the mistake it had made.
+
+  `He took me for his housemaid,' she said to herself as she ran.
+`How surprised he'll be when he finds out who I am!  But I'd
+better take him his fan and gloves--that is, if I can find them.'
+As she said this, she came upon a neat little house, on the door
+of which was a bright brass plate with the name `W. RABBIT'
+engraved upon it.  She went in without knocking, and hurried
+upstairs, in great fear lest she should meet the real Mary Ann,
+and be turned out of the house before she had found the fan and
+gloves.
+
+  `How queer it seems,' Alice said to herself, `to be going
+messages for a rabbit!  I suppose Dinah'll be sending me on
+messages next!'  And she began fancying the sort of thing that
+would happen:  `"Miss Alice!  Come here directly, and get ready
+for your walk!" "Coming in a minute, nurse!  But I've got to see
+that the mouse doesn't get out."  Only I don't think,' Alice went
+on, `that they'd let Dinah stop in the house if it began ordering
+people about like that!'
+
+  By this time she had found her way into a tidy little room with
+a table in the window, and on it (as she had hoped) a fan and two
+or three pairs of tiny white kid gloves:  she took up the fan and
+a pair of the gloves, and was just going to leave the room, when
+her eye fell upon a little bottle that stood near the looking-
+glass.  There was no label this time with the words `DRINK ME,'
+but nevertheless she uncorked it and put it to her lips.  `I know
+SOMETHING interesting is sure to happen,' she said to herself,
+`whenever I eat or drink anything; so I'll just see what this
+bottle does.  I do hope it'll make me grow large again, for
+really I'm quite tired of being such a tiny little thing!'
+
+  It did so indeed, and much sooner than she had expected:
+before she had drunk half the bottle, she found her head pressing
+against the ceiling, and had to stoop to save her neck from being
+broken.  She hastily put down the bottle, saying to herself
+`That's quite enough--I hope I shan't grow any more--As it is, I
+can't get out at the door--I do wish I hadn't drunk quite so
+much!'
+
+  Alas! it was too late to wish that!  She went on growing, and
+growing, and very soon had to kneel down on the floor:  in
+another minute there was not even room for this, and she tried
+the effect of lying down with one elbow against the door, and the
+other arm curled round her head.  Still she went on growing, and,
+as a last resource, she put one arm out of the window, and one
+foot up the chimney, and said to herself `Now I can do no more,
+whatever happens.  What WILL become of me?'
+
+  Luckily for Alice, the little magic bottle had now had its full
+effect, and she grew no larger:  still it was very uncomfortable,
+and, as there seemed to be no sort of chance of her ever getting
+out of the room again, no wonder she felt unhappy.
+
+  `It was much pleasanter at home,' thought poor Alice, `when one
+wasn't always growing larger and smaller, and being ordered about
+by mice and rabbits.  I almost wish I hadn't gone down that
+rabbit-hole--and yet--and yet--it's rather curious, you know,
+this sort of life!  I do wonder what CAN have happened to me!
+When I used to read fairy-tales, I fancied that kind of thing
+never happened, and now here I am in the middle of one!  There
+ought to be a book written about me, that there ought!  And when
+I grow up, I'll write one--but I'm grown up now,' she added in a
+sorrowful tone; `at least there's no room to grow up any more
+HERE.'
+
+  `But then,' thought Alice, `shall I NEVER get any older than I
+am now?  That'll be a comfort, one way--never to be an old woman-
+-but then--always to have lessons to learn!  Oh, I shouldn't like
+THAT!'
+
+  `Oh, you foolish Alice!' she answered herself.  `How can you
+learn lessons in here?  Why, there's hardly room for YOU, and no
+room at all for any lesson-books!'
+
+  And so she went on, taking first one side and then the other,
+and making quite a conversation of it altogether; but after a few
+minutes she heard a voice outside, and stopped to listen.
+
+  `Mary Ann!  Mary Ann!' said the voice.  `Fetch me my gloves
+this moment!'  Then came a little pattering of feet on the
+stairs.  Alice knew it was the Rabbit coming to look for her, and
+she trembled till she shook the house, quite forgetting that she
+was now about a thousand times as large as the Rabbit, and had no
+reason to be afraid of it.
+
+  Presently the Rabbit came up to the door, and tried to open it;
+but, as the door opened inwards, and Alice's elbow was pressed
+hard against it, that attempt proved a failure.  Alice heard it
+say to itself `Then I'll go round and get in at the window.'
+
+  `THAT you won't' thought Alice, and, after waiting till she
+fancied she heard the Rabbit just under the window, she suddenly
+spread out her hand, and made a snatch in the air.  She did not
+get hold of anything, but she heard a little shriek and a fall,
+and a crash of broken glass, from which she concluded that it was
+just possible it had fallen into a cucumber-frame, or something
+of the sort.
+
+  Next came an angry voice--the Rabbit's--`Pat! Pat!  Where are
+you?'  And then a voice she had never heard before, `Sure then
+I'm here!  Digging for apples, yer honour!'
+
+  `Digging for apples, indeed!' said the Rabbit angrily.  `Here!
+Come and help me out of THIS!'  (Sounds of more broken glass.)
+
+  `Now tell me, Pat, what's that in the window?'
+
+  `Sure, it's an arm, yer honour!'  (He pronounced it `arrum.')
+
+  `An arm, you goose!   Who ever saw one that size?  Why, it
+fills the whole window!'
+
+  `Sure, it does, yer honour:  but it's an arm for all that.'
+
+  `Well, it's got no business there, at any rate:  go and take it
+away!'
+
+  There was a long silence after this, and Alice could only hear
+whispers now and then; such as, `Sure, I don't like it, yer
+honour, at all, at all!'  `Do as I tell you, you coward!' and at
+last she spread out her hand again, and made another snatch in
+the air.  This time there were TWO little shrieks, and more
+sounds of broken glass.  `What a number of cucumber-frames there
+must be!' thought Alice.  `I wonder what they'll do next!  As for
+pulling me out of the window, I only wish they COULD!  I'm sure I
+don't want to stay in here any longer!'
+
+  She waited for some time without hearing anything more:  at
+last came a rumbling of little cartwheels, and the sound of a
+good many voice all talking together:  she made out the words:
+`Where's the other ladder?--Why, I hadn't to bring but one;
+Bill's got the other--Bill! fetch it here, lad!--Here, put 'em up
+at this corner--No, tie 'em together first--they don't reach half
+high enough yet--Oh! they'll do well enough; don't be particular-
+-Here, Bill! catch hold of this rope--Will the roof bear?--Mind
+that loose slate--Oh, it's coming down!  Heads below!' (a loud
+crash)--`Now, who did that?--It was Bill, I fancy--Who's to go
+down the chimney?--Nay, I shan't! YOU do it!--That I won't,
+then!--Bill's to go down--Here, Bill! the master says you're to
+go down the chimney!'
+
+  `Oh! So Bill's got to come down the chimney, has he?' said
+Alice to herself.  `Shy, they seem to put everything upon Bill!
+I wouldn't be in Bill's place for a good deal:  this fireplace is
+narrow, to be sure; but I THINK I can kick a little!'
+
+  She drew her foot as far down the chimney as she could, and
+waited till she heard a little animal (she couldn't guess of what
+sort it was) scratching and scrambling about in the chimney close
+above her:  then, saying to herself `This is Bill,' she gave one
+sharp kick, and waited to see what would happen next.
+
+  The first thing she heard was a general chorus of `There goes
+Bill!' then the Rabbit's voice along--`Catch him, you by the
+hedge!' then silence, and then another confusion of voices--`Hold
+up his head--Brandy now--Don't choke him--How was it, old fellow?
+What happened to you?  Tell us all about it!'
+
+  Last came a little feeble, squeaking voice, (`That's Bill,'
+thought Alice,) `Well, I hardly know--No more, thank ye; I'm
+better now--but I'm a deal too flustered to tell you--all I know
+is, something comes at me like a Jack-in-the-box, and up I goes
+like a sky-rocket!'
+
+  `So you did, old fellow!' said the others.
+
+  `We must burn the house down!' said the Rabbit's voice; and
+Alice called out as loud as she could, `If you do.  I'll set
+Dinah at you!'
+
+  There was a dead silence instantly, and Alice thought to
+herself, `I wonder what they WILL do next!  If they had any
+sense, they'd take the roof off.'  After a minute or two, they
+began moving about again, and Alice heard the Rabbit say, `A
+barrowful will do, to begin with.'
+
+  `A barrowful of WHAT?' thought Alice; but she had not long to
+doubt, for the next moment a shower of little pebbles came
+rattling in at the window, and some of them hit her in the face.
+`I'll put a stop to this,' she said to herself, and shouted out,
+`You'd better not do that again!' which produced another dead
+silence.
+
+  Alice noticed with some surprise that the pebbles were all
+turning into little cakes as they lay on the floor, and a bright
+idea came into her head.  `If I eat one of these cakes,' she
+thought, `it's sure to make SOME change in my size; and as it
+can't possibly make me larger, it must make me smaller, I
+suppose.'
+
+  So she swallowed one of the cakes, and was delighted to find
+that she began shrinking directly.  As soon as she was small
+enough to get through the door, she ran out of the house, and
+found quite a crowd of little animals and birds waiting outside.
+The poor little Lizard, Bill, was in the middle, being held up by
+two guinea-pigs, who were giving it something out of a bottle.
+They all made a rush at Alice the moment she appeared; but she
+ran off as hard as she could, and soon found herself safe in a
+thick wood.
+
+  `The first thing I've got to do,' said Alice to herself, as she
+wandered about in the wood, `is to grow to my right size again;
+and the second thing is to find my way into that lovely garden.
+I think that will be the best plan.'
+
+  It sounded an excellent plan, no doubt, and very neatly and
+simply arranged; the only difficulty was, that she had not the
+smallest idea how to set about it; and while she was peering
+about anxiously among the trees, a little sharp bark just over
+her head made her look up in a great hurry.
+
+  An enormous puppy was looking down at her with large round
+eyes, and feebly stretching out one paw, trying to touch her.
+`Poor little thing!' said Alice, in a coaxing tone, and she tried
+hard to whistle to it; but she was terribly frightened all the
+time at the thought that it might be hungry, in which case it
+would be very likely to eat her up in spite of all her coaxing.
+
+  Hardly knowing what she did, she picked up a little bit of
+stick, and held it out to the puppy; whereupon the puppy jumped
+into the air off all its feet at once, with a yelp of delight,
+and rushed at the stick, and made believe to worry it; then Alice
+dodged behind a great thistle, to keep herself from being run
+over; and the moment she appeared on the other side, the puppy
+made another rush at the stick, and tumbled head over heels in
+its hurry to get hold of it; then Alice, thinking it was very
+like having a game of play with a cart-horse, and expecting every
+moment to be trampled under its feet, ran round the thistle
+again; then the puppy began a series of short charges at the
+stick, running a very little way forwards each time and a long
+way back, and barking hoarsely all the while, till at last it sat
+down a good way off, panting, with its tongue hanging out of its
+mouth, and its great eyes half shut.
+
+  This seemed to Alice a good opportunity for making her escape;
+so she set off at once, and ran till she was quite tired and out
+of breath, and till the puppy's bark sounded quite faint in the
+distance.
+
+  `And yet what a dear little puppy it was!' said Alice, as she
+leant against a buttercup to rest herself, and fanned herself
+with one of the leaves:  `I should have liked teaching it tricks
+very much, if--if I'd only been the right size to do it!  Oh
+dear!  I'd nearly forgotten that I've got to grow up again!  Let
+me see--how IS it to be managed?  I suppose I ought to eat or
+drink something or other; but the great question is, what?'
+
+  The great question certainly was, what?  Alice looked all round
+her at the flowers and the blades of grass, but she did not see
+anything that looked like the right thing to eat or drink under
+the circumstances.  There was a large mushroom growing near her,
+about the same height as herself; and when she had looked under
+it, and on both sides of it, and behind it, it occurred to her
+that she might as well look and see what was on the top of it.
+
+  She stretched herself up on tiptoe, and peeped over the edge of
+the mushroom, and her eyes immediately met those of a large
+caterpillar, that was sitting on the top with its arms folded,
+quietly smoking a long hookah, and taking not the smallest notice
+of her or of anything else.
+
+
+
+                            CHAPTER V
+
+                    Advice from a Caterpillar
+
+
+  The Caterpillar and Alice looked at each other for some time in
+silence:  at last the Caterpillar took the hookah out of its
+mouth, and addressed her in a languid, sleepy voice.
+
+  `Who are YOU?' said the Caterpillar.
+
+  This was not an encouraging opening for a conversation.  Alice
+replied, rather shyly, `I--I hardly know, sir, just at present--
+at least I know who I WAS when I got up this morning, but I think
+I must have been changed several times since then.'
+
+  `What do you mean by that?' said the Caterpillar sternly.
+`Explain yourself!'
+
+  `I can't explain MYSELF, I'm afraid, sir' said Alice, `because
+I'm not myself, you see.'
+
+  `I don't see,' said the Caterpillar.
+
+  `I'm afraid I can't put it more clearly,' Alice replied very
+politely, `for I can't understand it myself to begin with; and
+being so many different sizes in a day is very confusing.'
+
+  `It isn't,' said the Caterpillar.
+
+  `Well, perhaps you haven't found it so yet,' said Alice; `but
+when you have to turn into a chrysalis--you will some day, you
+know--and then after that into a butterfly, I should think you'll
+feel it a little queer, won't you?'
+
+  `Not a bit,' said the Caterpillar.
+
+  `Well, perhaps your feelings may be different,' said Alice;
+`all I know is, it would feel very queer to ME.'
+
+  `You!' said the Caterpillar contemptuously.  `Who are YOU?'
+
+  Which brought them back again to the beginning of the
+conversation.  Alice felt a little irritated at the Caterpillar's
+making such VERY short remarks, and she drew herself up and said,
+very gravely, `I think, you ought to tell me who YOU are, first.'
+
+  `Why?' said the Caterpillar.
+
+  Here was another puzzling question; and as Alice could not
+think of any good reason, and as the Caterpillar seemed to be in
+a VERY unpleasant state of mind, she turned away.
+
+  `Come back!' the Caterpillar called after her.  `I've something
+important to say!'
+
+  This sounded promising, certainly:  Alice turned and came back
+again.
+
+  `Keep your temper,' said the Caterpillar.
+
+  `Is that all?' said Alice, swallowing down her anger as well as
+she could.
+
+  `No,' said the Caterpillar.
+
+  Alice thought she might as well wait, as she had nothing else
+to do, and perhaps after all it might tell her something worth
+hearing.  For some minutes it puffed away without speaking, but
+at last it unfolded its arms, took the hookah out of its mouth
+again, and said, `So you think you're changed, do you?'
+
+  `I'm afraid I am, sir,' said Alice; `I can't remember things as
+I used--and I don't keep the same size for ten minutes together!'
+
+  `Can't remember WHAT things?' said the Caterpillar.
+
+  `Well, I've tried to say "HOW DOTH THE LITTLE BUSY BEE," but it
+all came different!' Alice replied in a very melancholy voice.
+
+  `Repeat, "YOU ARE OLD, FATHER WILLIAM,"' said the Caterpillar.
+
+  Alice folded her hands, and began:--
+
+    `You are old, Father William,' the young man said,
+      `And your hair has become very white;
+    And yet you incessantly stand on your head--
+      Do you think, at your age, it is right?'
+
+    `In my youth,' Father William replied to his son,
+      `I feared it might injure the brain;
+    But, now that I'm perfectly sure I have none,
+      Why, I do it again and again.'
+
+    `You are old,' said the youth, `as I mentioned before,
+      And have grown most uncommonly fat;
+    Yet you turned a back-somersault in at the door--
+      Pray, what is the reason of that?'
+
+    `In my youth,' said the sage, as he shook his grey locks,
+      `I kept all my limbs very supple
+    By the use of this ointment--one shilling the box--
+      Allow me to sell you a couple?'
+
+    `You are old,' said the youth, `and your jaws are too weak
+      For anything tougher than suet;
+    Yet you finished the goose, with the bones and the beak--
+      Pray how did you manage to do it?'
+
+    `In my youth,' said his father, `I took to the law,
+      And argued each case with my wife;
+    And the muscular strength, which it gave to my jaw,
+      Has lasted the rest of my life.'
+
+    `You are old,' said the youth, `one would hardly suppose
+      That your eye was as steady as ever;
+    Yet you balanced an eel on the end of your nose--
+      What made you so awfully clever?'
+
+    `I have answered three questions, and that is enough,'
+      Said his father; `don't give yourself airs!
+    Do you think I can listen all day to such stuff?
+      Be off, or I'll kick you down stairs!'
+
+
+  `That is not said right,' said the Caterpillar.
+
+  `Not QUITE right, I'm afraid,' said Alice, timidly; `some of the
+words have got altered.'
+
+  `It is wrong from beginning to end,' said the Caterpillar
+decidedly, and there was silence for some minutes.
+
+  The Caterpillar was the first to speak.
+
+  `What size do you want to be?' it asked.
+
+  `Oh, I'm not particular as to size,' Alice hastily replied;
+`only one doesn't like changing so often, you know.'
+
+  `I DON'T know,' said the Caterpillar.
+
+  Alice said nothing:  she had never been so much contradicted in
+her life before, and she felt that she was losing her temper.
+
+  `Are you content now?' said the Caterpillar.
+
+  `Well, I should like to be a LITTLE larger, sir, if you
+wouldn't mind,' said Alice:  `three inches is such a wretched
+height to be.'
+
+  `It is a very good height indeed!' said the Caterpillar
+angrily, rearing itself upright as it spoke (it was exactly three
+inches high).
+
+  `But I'm not used to it!' pleaded poor Alice in a piteous tone.
+And she thought of herself, `I wish the creatures wouldn't be so
+easily offended!'
+
+  `You'll get used to it in time,' said the Caterpillar; and it
+put the hookah into its mouth and began smoking again.
+
+  This time Alice waited patiently until it chose to speak again.
+In a minute or two the Caterpillar took the hookah out of its
+mouth and yawned once or twice, and shook itself.  Then it got
+down off the mushroom, and crawled away in the grass, merely
+remarking as it went, `One side will make you grow taller, and
+the other side will make you grow shorter.'
+
+  `One side of WHAT?  The other side of WHAT?' thought Alice to
+herself.
+
+  `Of the mushroom,' said the Caterpillar, just as if she had
+asked it aloud; and in another moment it was out of sight.
+
+  Alice remained looking thoughtfully at the mushroom for a
+minute, trying to make out which were the two sides of it; and as
+it was perfectly round, she found this a very difficult question.
+However, at last she stretched her arms round it as far as they
+would go, and broke off a bit of the edge with each hand.
+
+  `And now which is which?' she said to herself, and nibbled a
+little of the right-hand bit to try the effect:  the next moment
+she felt a violent blow underneath her chin:  it had struck her
+foot!
+
+  She was a good deal frightened by this very sudden change, but
+she felt that there was no time to be lost, as she was shrinking
+rapidly; so she set to work at once to eat some of the other bit.
+Her chin was pressed so closely against her foot, that there was
+hardly room to open her mouth; but she did it at last, and
+managed to swallow a morsel of the lefthand bit.
+
+
+     *       *       *       *       *       *       *
+
+         *       *       *       *       *       *
+
+     *       *       *       *       *       *       *
+
+  `Come, my head's free at last!' said Alice in a tone of
+delight, which changed into alarm in another moment, when she
+found that her shoulders were nowhere to be found:  all she could
+see, when she looked down, was an immense length of neck, which
+seemed to rise like a stalk out of a sea of green leaves that lay
+far below her.
+
+  `What CAN all that green stuff be?' said Alice.  `And where
+HAVE my shoulders got to?  And oh, my poor hands, how is it I
+can't see you?'  She was moving them about as she spoke, but no
+result seemed to follow, except a little shaking among the
+distant green leaves.
+
+  As there seemed to be no chance of getting her hands up to her
+head, she tried to get her head down to them, and was delighted
+to find that her neck would bend about easily in any direction,
+like a serpent.  She had just succeeded in curving it down into a
+graceful zigzag, and was going to dive in among the leaves, which
+she found to be nothing but the tops of the trees under which she
+had been wandering, when a sharp hiss made her draw back in a
+hurry:  a large pigeon had flown into her face, and was beating
+her violently with its wings.
+
+  `Serpent!' screamed the Pigeon.
+
+  `I'm NOT a serpent!' said Alice indignantly.  `Let me alone!'
+
+  `Serpent, I say again!' repeated the Pigeon, but in a more
+subdued tone, and added with a kind of sob, `I've tried every
+way, and nothing seems to suit them!'
+
+  `I haven't the least idea what you're talking about,' said
+Alice.
+
+  `I've tried the roots of trees, and I've tried banks, and I've
+tried hedges,' the Pigeon went on, without attending to her; `but
+those serpents!  There's no pleasing them!'
+
+  Alice was more and more puzzled, but she thought there was no
+use in saying anything more till the Pigeon had finished.
+
+  `As if it wasn't trouble enough hatching the eggs,' said the
+Pigeon; `but I must be on the look-out for serpents night and
+day!  Why, I haven't had a wink of sleep these three weeks!'
+
+  `I'm very sorry you've been annoyed,' said Alice, who was
+beginning to see its meaning.
+
+  `And just as I'd taken the highest tree in the wood,' continued
+the Pigeon, raising its voice to a shriek, `and just as I was
+thinking I should be free of them at last, they must needs come
+wriggling down from the sky!  Ugh, Serpent!'
+
+  `But I'm NOT a serpent, I tell you!' said Alice.  `I'm a--I'm
+a--'
+
+  `Well!  WHAT are you?' said the Pigeon.  `I can see you're
+trying to invent something!'
+
+  `I--I'm a little girl,' said Alice, rather doubtfully, as she
+remembered the number of changes she had gone through that day.
+
+  `A likely story indeed!' said the Pigeon in a tone of the
+deepest contempt.  `I've seen a good many little girls in my
+time, but never ONE with such a neck as that!  No, no!  You're a
+serpent; and there's no use denying it.  I suppose you'll be
+telling me next that you never tasted an egg!'
+
+  `I HAVE tasted eggs, certainly,' said Alice, who was a very
+truthful child; `but little girls eat eggs quite as much as
+serpents do, you know.'
+
+  `I don't believe it,' said the Pigeon; `but if they do, why
+then they're a kind of serpent, that's all I can say.'
+
+  This was such a new idea to Alice, that she was quite silent
+for a minute or two, which gave the Pigeon the opportunity of
+adding, `You're looking for eggs, I know THAT well enough; and
+what does it matter to me whether you're a little girl or a
+serpent?'
+
+  `It matters a good deal to ME,' said Alice hastily; `but I'm
+not looking for eggs, as it happens; and if I was, I shouldn't
+want YOURS:  I don't like them raw.'
+
+  `Well, be off, then!' said the Pigeon in a sulky tone, as it
+settled down again into its nest.  Alice crouched down among the
+trees as well as she could, for her neck kept getting entangled
+among the branches, and every now and then she had to stop and
+untwist it.  After a while she remembered that she still held the
+pieces of mushroom in her hands, and she set to work very
+carefully, nibbling first at one and then at the other, and
+growing sometimes taller and sometimes shorter, until she had
+succeeded in bringing herself down to her usual height.
+
+  It was so long since she had been anything near the right size,
+that it felt quite strange at first; but she got used to it in a
+few minutes, and began talking to herself, as usual.  `Come,
+there's half my plan done now!  How puzzling all these changes
+are!  I'm never sure what I'm going to be, from one minute to
+another!  However, I've got back to my right size:  the next
+thing is, to get into that beautiful garden--how IS that to be
+done, I wonder?'  As she said this, she came suddenly upon an
+open place, with a little house in it about four feet high.
+`Whoever lives there,' thought Alice, `it'll never do to come
+upon them THIS size:  why, I should frighten them out of their
+wits!'  So she began nibbling at the righthand bit again, and did
+not venture to go near the house till she had brought herself
+down to nine inches high.
+
+
+
+                           CHAPTER VI
+
+                         Pig and Pepper
+
+
+  For a minute or two she stood looking at the house, and
+wondering what to do next, when suddenly a footman in livery came
+running out of the wood--(she considered him to be a footman
+because he was in livery:  otherwise, judging by his face only,
+she would have called him a fish)--and rapped loudly at the door
+with his knuckles.  It was opened by another footman in livery,
+with a round face, and large eyes like a frog; and both footmen,
+Alice noticed, had powdered hair that curled all over their
+heads.  She felt very curious to know what it was all about, and
+crept a little way out of the wood to listen.
+
+  The Fish-Footman began by producing from under his arm a great
+letter, nearly as large as himself, and this he handed over to
+the other, saying, in a solemn tone, `For the Duchess.  An
+invitation from the Queen to play croquet.'  The Frog-Footman
+repeated, in the same solemn tone, only changing the order of the
+words a little, `From the Queen.  An invitation for the Duchess
+to play croquet.'
+
+  Then they both bowed low, and their curls got entangled
+together.
+
+  Alice laughed so much at this, that she had to run back into
+the wood for fear of their hearing her; and when she next peeped
+out the Fish-Footman was gone, and the other was sitting on the
+ground near the door, staring stupidly up into the sky.
+
+  Alice went timidly up to the door, and knocked.
+
+  `There's no sort of use in knocking,' said the Footman, `and
+that for two reasons.  First, because I'm on the same side of the
+door as you are; secondly, because they're making such a noise
+inside, no one could possibly hear you.'  And certainly there was
+a most extraordinary noise going on within--a constant howling
+and sneezing, and every now and then a great crash, as if a dish
+or kettle had been broken to pieces.
+
+  `Please, then,' said Alice, `how am I to get in?'
+
+  `There might be some sense in your knocking,' the Footman went
+on without attending to her, `if we had the door between us.  For
+instance, if you were INSIDE, you might knock, and I could let
+you out, you know.'  He was looking up into the sky all the time
+he was speaking, and this Alice thought decidedly uncivil.  `But
+perhaps he can't help it,' she said to herself; `his eyes are so
+VERY nearly at the top of his head.  But at any rate he might
+answer questions.--How am I to get in?' she repeated, aloud.
+
+  `I shall sit here,' the Footman remarked, `till tomorrow--'
+
+  At this moment the door of the house opened, and a large plate
+came skimming out, straight at the Footman's head:  it just
+grazed his nose, and broke to pieces against one of the trees
+behind him.
+
+  `--or next day, maybe,' the Footman continued in the same tone,
+exactly as if nothing had happened.
+
+  `How am I to get in?' asked Alice again, in a louder tone.
+
+  `ARE you to get in at all?' said the Footman.  `That's the
+first question, you know.'
+
+  It was, no doubt:  only Alice did not like to be told so.
+`It's really dreadful,' she muttered to herself, `the way all the
+creatures argue.  It's enough to drive one crazy!'
+
+  The Footman seemed to think this a good opportunity for
+repeating his remark, with variations.  `I shall sit here,' he
+said, `on and off, for days and days.'
+
+  `But what am I to do?' said Alice.
+
+  `Anything you like,' said the Footman, and began whistling.
+
+  `Oh, there's no use in talking to him,' said Alice desperately:
+`he's perfectly idiotic!'  And she opened the door and went in.
+
+  The door led right into a large kitchen, which was full of
+smoke from one end to the other:  the Duchess was sitting on a
+three-legged stool in the middle, nursing a baby; the cook was
+leaning over the fire, stirring a large cauldron which seemed to
+be full of soup.
+
+  `There's certainly too much pepper in that soup!' Alice said to
+herself, as well as she could for sneezing.
+
+  There was certainly too much of it in the air.  Even the
+Duchess sneezed occasionally; and as for the baby, it was
+sneezing and howling alternately without a moment's pause.  The
+only things in the kitchen that did not sneeze, were the cook,
+and a large cat which was sitting on the hearth and grinning from
+ear to ear.
+
+  `Please would you tell me,' said Alice, a little timidly, for
+she was not quite sure whether it was good manners for her to
+speak first, `why your cat grins like that?'
+
+  `It's a Cheshire cat,' said the Duchess, `and that's why.
+Pig!'
+
+  She said the last word with such sudden violence that Alice
+quite jumped; but she saw in another moment that it was addressed
+to the baby, and not to her, so she took courage, and went on
+again:--
+
+  `I didn't know that Cheshire cats always grinned; in fact, I
+didn't know that cats COULD grin.'
+
+  `They all can,' said the Duchess; `and most of 'em do.'
+
+  `I don't know of any that do,' Alice said very politely,
+feeling quite pleased to have got into a conversation.
+
+  `You don't know much,' said the Duchess; `and that's a fact.'
+
+  Alice did not at all like the tone of this remark, and thought
+it would be as well to introduce some other subject of
+conversation.  While she was trying to fix on one, the cook took
+the cauldron of soup off the fire, and at once set to work
+throwing everything within her reach at the Duchess and the baby
+--the fire-irons came first; then followed a shower of saucepans,
+plates, and dishes.  The Duchess took no notice of them even when
+they hit her; and the baby was howling so much already, that it
+was quite impossible to say whether the blows hurt it or not.
+
+  `Oh, PLEASE mind what you're doing!' cried Alice, jumping up
+and down in an agony of terror.  `Oh, there goes his PRECIOUS
+nose'; as an unusually large saucepan flew close by it, and very
+nearly carried it off.
+
+  `If everybody minded their own business,' the Duchess said in a
+hoarse growl, `the world would go round a deal faster than it
+does.'
+
+  `Which would NOT be an advantage,' said Alice, who felt very
+glad to get an opportunity of showing off a little of her
+knowledge.  `Just think of what work it would make with the day
+and night!  You see the earth takes twenty-four hours to turn
+round on its axis--'
+
+  `Talking of axes,' said the Duchess, `chop off her head!'
+
+  Alice glanced rather anxiously at the cook, to see if she meant
+to take the hint; but the cook was busily stirring the soup, and
+seemed not to be listening, so she went on again:  `Twenty-four
+hours, I THINK; or is it twelve?  I--'
+
+  `Oh, don't bother ME,' said the Duchess; `I never could abide
+figures!'  And with that she began nursing her child again,
+singing a sort of lullaby to it as she did so, and giving it a
+violent shake at the end of every line:
+
+        `Speak roughly to your little boy,
+          And beat him when he sneezes:
+        He only does it to annoy,
+          Because he knows it teases.'
+
+                    CHORUS.
+
+    (In which the cook and the baby joined):--
+
+                `Wow! wow! wow!'
+
+  While the Duchess sang the second verse of the song, she kept
+tossing the baby violently up and down, and the poor little thing
+howled so, that Alice could hardly hear the words:--
+
+        `I speak severely to my boy,
+          I beat him when he sneezes;
+        For he can thoroughly enjoy
+          The pepper when he pleases!'
+
+                    CHORUS.
+
+                `Wow! wow! wow!'
+
+  `Here! you may nurse it a bit, if you like!' the Duchess said
+to Alice, flinging the baby at her as she spoke.  `I must go and
+get ready to play croquet with the Queen,' and she hurried out of
+the room.  The cook threw a frying-pan after her as she went out,
+but it just missed her.
+
+  Alice caught the baby with some difficulty, as it was a queer-
+shaped little creature, and held out its arms and legs in all
+directions, `just like a star-fish,' thought Alice.  The poor
+little thing was snorting like a steam-engine when she caught it,
+and kept doubling itself up and straightening itself out again,
+so that altogether, for the first minute or two, it was as much
+as she could do to hold it.
+
+  As soon as she had made out the proper way of nursing it,
+(which was to twist it up into a sort of knot, and then keep
+tight hold of its right ear and left foot, so as to prevent its
+undoing itself,) she carried it out into the open air.  `IF I
+don't take this child away with me,' thought Alice, `they're sure
+to kill it in a day or two:  wouldn't it be murder to leave it
+behind?'  She said the last words out loud, and the little thing
+grunted in reply (it had left off sneezing by this time).  `Don't
+grunt,' said Alice; `that's not at all a proper way of expressing
+yourself.'
+
+  The baby grunted again, and Alice looked very anxiously into
+its face to see what was the matter with it.  There could be no
+doubt that it had a VERY turn-up nose, much more like a snout
+than a real nose; also its eyes were getting extremely small for
+a baby:  altogether Alice did not like the look of the thing at
+all.  `But perhaps it was only sobbing,' she thought, and looked
+into its eyes again, to see if there were any tears.
+
+  No, there were no tears.  `If you're going to turn into a pig,
+my dear,' said Alice, seriously, `I'll have nothing more to do
+with you.  Mind now!'  The poor little thing sobbed again (or
+grunted, it was impossible to say which), and they went on for
+some while in silence.
+
+  Alice was just beginning to think to herself, `Now, what am I
+to do with this creature when I get it home?' when it grunted
+again, so violently, that she looked down into its face in some
+alarm.  This time there could be NO mistake about it:  it was
+neither more nor less than a pig, and she felt that it would be
+quite absurd for her to carry it further.
+
+  So she set the little creature down, and felt quite relieved to
+see it trot away quietly into the wood.  `If it had grown up,'
+she said to herself, `it would have made a dreadfully ugly child:
+but it makes rather a handsome pig, I think.'  And she began
+thinking over other children she knew, who might do very well as
+pigs, and was just saying to herself, `if one only knew the right
+way to change them--' when she was a little startled by seeing
+the Cheshire Cat sitting on a bough of a tree a few yards off.
+
+  The Cat only grinned when it saw Alice.  It looked good-
+natured, she thought:  still it had VERY long claws and a great
+many teeth, so she felt that it ought to be treated with respect.
+
+  `Cheshire Puss,' she began, rather timidly, as she did not at
+all know whether it would like the name:  however, it only
+grinned a little wider.  `Come, it's pleased so far,' thought
+Alice, and she went on.  `Would you tell me, please, which way I
+ought to go from here?'
+
+  `That depends a good deal on where you want to get to,' said
+the Cat.
+
+  `I don't much care where--' said Alice.
+
+  `Then it doesn't matter which way you go,' said the Cat.
+
+  `--so long as I get SOMEWHERE,' Alice added as an explanation.
+
+  `Oh, you're sure to do that,' said the Cat, `if you only walk
+long enough.'
+
+  Alice felt that this could not be denied, so she tried another
+question.  `What sort of people live about here?'
+
+  `In THAT direction,' the Cat said, waving its right paw round,
+`lives a Hatter:  and in THAT direction,' waving the other paw,
+`lives a March Hare.  Visit either you like:  they're both mad.'
+
+  `But I don't want to go among mad people,' Alice remarked.
+
+  `Oh, you can't help that,' said the Cat:  `we're all mad here.
+I'm mad.  You're mad.'
+
+  `How do you know I'm mad?' said Alice.
+
+  `You must be,' said the Cat, `or you wouldn't have come here.'
+
+  Alice didn't think that proved it at all; however, she went on
+`And how do you know that you're mad?'
+
+  `To begin with,' said the Cat, `a dog's not mad.  You grant
+that?'
+
+  `I suppose so,' said Alice.
+
+  `Well, then,' the Cat went on, `you see, a dog growls when it's
+angry, and wags its tail when it's pleased.  Now I growl when I'm
+pleased, and wag my tail when I'm angry.  Therefore I'm mad.'
+
+  `I call it purring, not growling,' said Alice.
+
+  `Call it what you like,' said the Cat.  `Do you play croquet
+with the Queen to-day?'
+
+  `I should like it very much,' said Alice, `but I haven't been
+invited yet.'
+
+  `You'll see me there,' said the Cat, and vanished.
+
+  Alice was not much surprised at this, she was getting so used
+to queer things happening.  While she was looking at the place
+where it had been, it suddenly appeared again.
+
+  `By-the-bye, what became of the baby?' said the Cat.  `I'd
+nearly forgotten to ask.'
+
+  `It turned into a pig,' Alice quietly said, just as if it had
+come back in a natural way.
+
+  `I thought it would,' said the Cat, and vanished again.
+
+  Alice waited a little, half expecting to see it again, but it
+did not appear, and after a minute or two she walked on in the
+direction in which the March Hare was said to live.  `I've seen
+hatters before,' she said to herself; `the March Hare will be
+much the most interesting, and perhaps as this is May it won't be
+raving mad--at least not so mad as it was in March.'  As she said
+this, she looked up, and there was the Cat again, sitting on a
+branch of a tree.
+
+  `Did you say pig, or fig?' said the Cat.
+
+  `I said pig,' replied Alice; `and I wish you wouldn't keep
+appearing and vanishing so suddenly:  you make one quite giddy.'
+
+  `All right,' said the Cat; and this time it vanished quite
+slowly, beginning with the end of the tail, and ending with the
+grin, which remained some time after the rest of it had gone.
+
+  `Well!  I've often seen a cat without a grin,' thought Alice;
+`but a grin without a cat!  It's the most curious thing I ever
+say in my life!'
+
+  She had not gone much farther before she came in sight of the
+house of the March Hare:  she thought it must be the right house,
+because the chimneys were shaped like ears and the roof was
+thatched with fur.  It was so large a house, that she did not
+like to go nearer till she had nibbled some more of the lefthand
+bit of mushroom, and raised herself to about two feet high:  even
+then she walked up towards it rather timidly, saying to herself
+`Suppose it should be raving mad after all!  I almost wish I'd
+gone to see the Hatter instead!'
+
+
+
+                           CHAPTER VII
+
+                         A Mad Tea-Party
+
+
+  There was a table set out under a tree in front of the house,
+and the March Hare and the Hatter were having tea at it:  a
+Dormouse was sitting between them, fast asleep, and the other two
+were using it as a cushion, resting their elbows on it, and the
+talking over its head.  `Very uncomfortable for the Dormouse,'
+thought Alice; `only, as it's asleep, I suppose it doesn't mind.'
+
+  The table was a large one, but the three were all crowded
+together at one corner of it:  `No room!  No room!' they cried
+out when they saw Alice coming.  `There's PLENTY of room!' said
+Alice indignantly, and she sat down in a large arm-chair at one
+end of the table.
+
+  `Have some wine,' the March Hare said in an encouraging tone.
+
+  Alice looked all round the table, but there was nothing on it
+but tea.  `I don't see any wine,' she remarked.
+
+  `There isn't any,' said the March Hare.
+
+  `Then it wasn't very civil of you to offer it,' said Alice
+angrily.
+
+  `It wasn't very civil of you to sit down without being
+invited,' said the March Hare.
+
+  `I didn't know it was YOUR table,' said Alice; `it's laid for a
+great many more than three.'
+
+  `Your hair wants cutting,' said the Hatter.  He had been
+looking at Alice for some time with great curiosity, and this was
+his first speech.
+
+  `You should learn not to make personal remarks,' Alice said
+with some severity; `it's very rude.'
+
+  The Hatter opened his eyes very wide on hearing this; but all
+he SAID was, `Why is a raven like a writing-desk?'
+
+  `Come, we shall have some fun now!' thought Alice.  `I'm glad
+they've begun asking riddles.--I believe I can guess that,' she
+added aloud.
+
+  `Do you mean that you think you can find out the answer to it?'
+said the March Hare.
+
+  `Exactly so,' said Alice.
+
+  `Then you should say what you mean,' the March Hare went on.
+
+  `I do,' Alice hastily replied; `at least--at least I mean what
+I say--that's the same thing, you know.'
+
+  `Not the same thing a bit!' said the Hatter.  `You might just
+as well say that "I see what I eat" is the same thing as "I eat
+what I see"!'
+
+  `You might just as well say,' added the March Hare, `that "I
+like what I get" is the same thing as "I get what I like"!'
+
+  `You might just as well say,' added the Dormouse, who seemed to
+be talking in his sleep, `that "I breathe when I sleep" is the
+same thing as "I sleep when I breathe"!'
+
+  `It IS the same thing with you,' said the Hatter, and here the
+conversation dropped, and the party sat silent for a minute,
+while Alice thought over all she could remember about ravens and
+writing-desks, which wasn't much.
+
+  The Hatter was the first to break the silence.  `What day of
+the month is it?' he said, turning to Alice:  he had taken his
+watch out of his pocket, and was looking at it uneasily, shaking
+it every now and then, and holding it to his ear.
+
+  Alice considered a little, and then said `The fourth.'
+
+  `Two days wrong!' sighed the Hatter.  `I told you butter
+wouldn't suit the works!' he added looking angrily at the March
+Hare.
+
+  `It was the BEST butter,' the March Hare meekly replied.
+
+  `Yes, but some crumbs must have got in as well,' the Hatter
+grumbled:  `you shouldn't have put it in with the bread-knife.'
+
+  The March Hare took the watch and looked at it gloomily:  then
+he dipped it into his cup of tea, and looked at it again:  but he
+could think of nothing better to say than his first remark, `It
+was the BEST butter, you know.'
+
+  Alice had been looking over his shoulder with some curiosity.
+`What a funny watch!' she remarked.  `It tells the day of the
+month, and doesn't tell what o'clock it is!'
+
+  `Why should it?' muttered the Hatter.  `Does YOUR watch tell
+you what year it is?'
+
+  `Of course not,' Alice replied very readily:  `but that's
+because it stays the same year for such a long time together.'
+
+  `Which is just the case with MINE,' said the Hatter.
+
+  Alice felt dreadfully puzzled.  The Hatter's remark seemed to
+have no sort of meaning in it, and yet it was certainly English.
+`I don't quite understand you,' she said, as politely as she
+could.
+
+  `The Dormouse is asleep again,' said the Hatter, and he poured
+a little hot tea upon its nose.
+
+  The Dormouse shook its head impatiently, and said, without
+opening its eyes, `Of course, of course; just what I was going to
+remark myself.'
+
+  `Have you guessed the riddle yet?' the Hatter said, turning to
+Alice again.
+
+  `No, I give it up,' Alice replied:  `what's the answer?'
+
+  `I haven't the slightest idea,' said the Hatter.
+
+  `Nor I,' said the March Hare.
+
+  Alice sighed wearily.  `I think you might do something better
+with the time,' she said, `than waste it in asking riddles that
+have no answers.'
+
+  `If you knew Time as well as I do,' said the Hatter, `you
+wouldn't talk about wasting IT.  It's HIM.'
+
+  `I don't know what you mean,' said Alice.
+
+  `Of course you don't!' the Hatter said, tossing his head
+contemptuously.  `I dare say you never even spoke to Time!'
+
+  `Perhaps not,' Alice cautiously replied:  `but I know I have to
+beat time when I learn music.'
+
+  `Ah! that accounts for it,' said the Hatter.  `He won't stand
+beating.  Now, if you only kept on good terms with him, he'd do
+almost anything you liked with the clock.  For instance, suppose
+it were nine o'clock in the morning, just time to begin lessons:
+you'd only have to whisper a hint to Time, and round goes the
+clock in a twinkling!  Half-past one, time for dinner!'
+
+  (`I only wish it was,' the March Hare said to itself in a
+whisper.)
+
+  `That would be grand, certainly,' said Alice thoughtfully:
+`but then--I shouldn't be hungry for it, you know.'
+
+  `Not at first, perhaps,' said the Hatter:  `but you could keep
+it to half-past one as long as you liked.'
+
+  `Is that the way YOU manage?' Alice asked.
+
+  The Hatter shook his head mournfully.  `Not I!' he replied.
+`We quarrelled last March--just before HE went mad, you know--'
+(pointing with his tea spoon at the March Hare,) `--it was at the
+great concert given by the Queen of Hearts, and I had to sing
+
+            "Twinkle, twinkle, little bat!
+            How I wonder what you're at!"
+
+You know the song, perhaps?'
+
+  `I've heard something like it,' said Alice.
+
+  `It goes on, you know,' the Hatter continued, `in this way:--
+
+            "Up above the world you fly,
+            Like a tea-tray in the sky.
+                    Twinkle, twinkle--"'
+
+Here the Dormouse shook itself, and began singing in its sleep
+`Twinkle, twinkle, twinkle, twinkle--' and went on so long that
+they had to pinch it to make it stop.
+
+  `Well, I'd hardly finished the first verse,' said the Hatter,
+`when the Queen jumped up and bawled out, "He's murdering the
+time!  Off with his head!"'
+
+  `How dreadfully savage!' exclaimed Alice.
+
+  `And ever since that,' the Hatter went on in a mournful tone,
+`he won't do a thing I ask!  It's always six o'clock now.'
+
+  A bright idea came into Alice's head.  `Is that the reason so
+many tea-things are put out here?' she asked.
+
+  `Yes, that's it,' said the Hatter with a sigh:  `it's always
+tea-time, and we've no time to wash the things between whiles.'
+
+  `Then you keep moving round, I suppose?' said Alice.
+
+  `Exactly so,' said the Hatter:  `as the things get used up.'
+
+  `But what happens when you come to the beginning again?' Alice
+ventured to ask.
+
+  `Suppose we change the subject,' the March Hare interrupted,
+yawning.  `I'm getting tired of this.  I vote the young lady
+tells us a story.'
+
+  `I'm afraid I don't know one,' said Alice, rather alarmed at
+the proposal.
+
+  `Then the Dormouse shall!' they both cried.  `Wake up,
+Dormouse!'  And they pinched it on both sides at once.
+
+  The Dormouse slowly opened his eyes.  `I wasn't asleep,' he
+said in a hoarse, feeble voice:  `I heard every word you fellows
+were saying.'
+
+  `Tell us a story!' said the March Hare.
+
+  `Yes, please do!' pleaded Alice.
+
+  `And be quick about it,' added the Hatter, `or you'll be asleep
+again before it's done.'
+
+  `Once upon a time there were three little sisters,' the
+Dormouse began in a great hurry; `and their names were Elsie,
+Lacie, and Tillie; and they lived at the bottom of a well--'
+
+  `What did they live on?' said Alice, who always took a great
+interest in questions of eating and drinking.
+
+  `They lived on treacle,' said the Dormouse, after thinking a
+minute or two.
+
+  `They couldn't have done that, you know,' Alice gently
+remarked; `they'd have been ill.'
+
+  `So they were,' said the Dormouse; `VERY ill.'
+
+  Alice tried to fancy to herself what such an extraordinary ways
+of living would be like, but it puzzled her too much, so she went
+on:  `But why did they live at the bottom of a well?'
+
+  `Take some more tea,' the March Hare said to Alice, very
+earnestly.
+
+  `I've had nothing yet,' Alice replied in an offended tone, `so
+I can't take more.'
+
+  `You mean you can't take LESS,' said the Hatter:  `it's very
+easy to take MORE than nothing.'
+
+  `Nobody asked YOUR opinion,' said Alice.
+
+  `Who's making personal remarks now?' the Hatter asked
+triumphantly.
+
+  Alice did not quite know what to say to this:  so she helped
+herself to some tea and bread-and-butter, and then turned to the
+Dormouse, and repeated her question.  `Why did they live at the
+bottom of a well?'
+
+  The Dormouse again took a minute or two to think about it, and
+then said, `It was a treacle-well.'
+
+  `There's no such thing!'  Alice was beginning very angrily, but
+the Hatter and the March Hare went `Sh! sh!' and the Dormouse
+sulkily remarked, `If you can't be civil, you'd better finish the
+story for yourself.'
+
+  `No, please go on!' Alice said very humbly; `I won't interrupt
+again.  I dare say there may be ONE.'
+
+  `One, indeed!' said the Dormouse indignantly.  However, he
+consented to go on.  `And so these three little sisters--they
+were learning to draw, you know--'
+
+  `What did they draw?' said Alice, quite forgetting her promise.
+
+  `Treacle,' said the Dormouse, without considering at all this
+time.
+
+  `I want a clean cup,' interrupted the Hatter:  `let's all move
+one place on.'
+
+  He moved on as he spoke, and the Dormouse followed him:  the
+March Hare moved into the Dormouse's place, and Alice rather
+unwillingly took the place of the March Hare.  The Hatter was the
+only one who got any advantage from the change:  and Alice was a
+good deal worse off than before, as the March Hare had just upset
+the milk-jug into his plate.
+
+  Alice did not wish to offend the Dormouse again, so she began
+very cautiously:  `But I don't understand.  Where did they draw
+the treacle from?'
+
+  `You can draw water out of a water-well,' said the Hatter; `so
+I should think you could draw treacle out of a treacle-well--eh,
+stupid?'
+
+  `But they were IN the well,' Alice said to the Dormouse, not
+choosing to notice this last remark.
+
+  `Of course they were', said the Dormouse; `--well in.'
+
+  This answer so confused poor Alice, that she let the Dormouse
+go on for some time without interrupting it.
+
+  `They were learning to draw,' the Dormouse went on, yawning and
+rubbing its eyes, for it was getting very sleepy; `and they drew
+all manner of things--everything that begins with an M--'
+
+  `Why with an M?' said Alice.
+
+  `Why not?' said the March Hare.
+
+  Alice was silent.
+
+  The Dormouse had closed its eyes by this time, and was going
+off into a doze; but, on being pinched by the Hatter, it woke up
+again with a little shriek, and went on:  `--that begins with an
+M, such as mouse-traps, and the moon, and memory, and muchness--
+you know you say things are "much of a muchness"--did you ever
+see such a thing as a drawing of a muchness?'
+
+  `Really, now you ask me,' said Alice, very much confused, `I
+don't think--'
+
+  `Then you shouldn't talk,' said the Hatter.
+
+  This piece of rudeness was more than Alice could bear:  she got
+up in great disgust, and walked off; the Dormouse fell asleep
+instantly, and neither of the others took the least notice of her
+going, though she looked back once or twice, half hoping that
+they would call after her:  the last time she saw them, they were
+trying to put the Dormouse into the teapot.
+
+  `At any rate I'll never go THERE again!' said Alice as she
+picked her way through the wood.  `It's the stupidest tea-party I
+ever was at in all my life!'
+
+  Just as she said this, she noticed that one of the trees had a
+door leading right into it.  `That's very curious!' she thought.
+`But everything's curious today.  I think I may as well go in at
+once.'  And in she went.
+
+  Once more she found herself in the long hall, and close to the
+little glass table.  `Now, I'll manage better this time,' she
+said to herself, and began by taking the little golden key, and
+unlocking the door that led into the garden.  Then she went to
+work nibbling at the mushroom (she had kept a piece of it in her
+pocked) till she was about a foot high:  then she walked down the
+little passage:  and THEN--she found herself at last in the
+beautiful garden, among the bright flower-beds and the cool
+fountains.
+
+
+
+                          CHAPTER VIII
+
+                   The Queen's Croquet-Ground
+
+
+  A large rose-tree stood near the entrance of the garden:  the
+roses growing on it were white, but there were three gardeners at
+it, busily painting them red.  Alice thought this a very curious
+thing, and she went nearer to watch them, and just as she came up
+to them she heard one of them say, `Look out now, Five!  Don't go
+splashing paint over me like that!'
+
+  `I couldn't help it,' said Five, in a sulky tone; `Seven jogged
+my elbow.'
+
+  On which Seven looked up and said, `That's right, Five!  Always
+lay the blame on others!'
+
+  `YOU'D better not talk!' said Five.  `I heard the Queen say only
+yesterday you deserved to be beheaded!'
+
+  `What for?' said the one who had spoken first.
+
+  `That's none of YOUR business, Two!' said Seven.
+
+  `Yes, it IS his business!' said Five, `and I'll tell him--it
+was for bringing the cook tulip-roots instead of onions.'
+
+  Seven flung down his brush, and had just begun `Well, of all
+the unjust things--' when his eye chanced to fall upon Alice, as
+she stood watching them, and he checked himself suddenly:  the
+others looked round also, and all of them bowed low.
+
+  `Would you tell me,' said Alice, a little timidly, `why you are
+painting those roses?'
+
+  Five and Seven said nothing, but looked at Two.  Two began in a
+low voice, `Why the fact is, you see, Miss, this here ought to
+have been a RED rose-tree, and we put a white one in by mistake;
+and if the Queen was to find it out, we should all have our heads
+cut off, you know.  So you see, Miss, we're doing our best, afore
+she comes, to--'  At this moment Five, who had been anxiously
+looking across the garden, called out `The Queen!  The Queen!'
+and the three gardeners instantly threw themselves flat upon
+their faces.  There was a sound of many footsteps, and Alice
+looked round, eager to see the Queen.
+
+  First came ten soldiers carrying clubs; these were all shaped
+like the three gardeners, oblong and flat, with their hands and
+feet at the corners:  next the ten courtiers; these were
+ornamented all over with diamonds, and walked two and two, as the
+soldiers did.  After these came the royal children; there were
+ten of them, and the little dears came jumping merrily along hand
+in hand, in couples:  they were all ornamented with hearts.  Next
+came the guests, mostly Kings and Queens, and among them Alice
+recognised the White Rabbit:  it was talking in a hurried nervous
+manner, smiling at everything that was said, and went by without
+noticing her.  Then followed the Knave of Hearts, carrying the
+King's crown on a crimson velvet cushion; and, last of all this
+grand procession, came THE KING AND QUEEN OF HEARTS.
+
+  Alice was rather doubtful whether she ought not to lie down on
+her face like the three gardeners, but she could not remember
+every having heard of such a rule at processions; `and besides,
+what would be the use of a procession,' thought she, `if people
+had all to lie down upon their faces, so that they couldn't see
+it?'  So she stood still where she was, and waited.
+
+  When the procession came opposite to Alice, they all stopped
+and looked at her, and the Queen said severely `Who is this?'
+She said it to the Knave of Hearts, who only bowed and smiled in
+reply.
+
+  `Idiot!' said the Queen, tossing her head impatiently; and,
+turning to Alice, she went on, `What's your name, child?'
+
+  `My name is Alice, so please your Majesty,' said Alice very
+politely; but she added, to herself, `Why, they're only a pack of
+cards, after all.  I needn't be afraid of them!'
+
+  `And who are THESE?' said the Queen, pointing to the three
+gardeners who were lying round the rosetree; for, you see, as
+they were lying on their faces, and the pattern on their backs
+was the same as the rest of the pack, she could not tell whether
+they were gardeners, or soldiers, or courtiers, or three of her
+own children.
+
+  `How should I know?' said Alice, surprised at her own courage.
+`It's no business of MINE.'
+
+  The Queen turned crimson with fury, and, after glaring at her
+for a moment like a wild beast, screamed `Off with her head!
+Off--'
+
+  `Nonsense!' said Alice, very loudly and decidedly, and the
+Queen was silent.
+
+  The King laid his hand upon her arm, and timidly said
+`Consider, my dear:  she is only a child!'
+
+  The Queen turned angrily away from him, and said to the Knave
+`Turn them over!'
+
+  The Knave did so, very carefully, with one foot.
+
+  `Get up!' said the Queen, in a shrill, loud voice, and the
+three gardeners instantly jumped up, and began bowing to the
+King, the Queen, the royal children, and everybody else.
+
+  `Leave off that!' screamed the Queen.  `You make me giddy.'
+And then, turning to the rose-tree, she went on, `What HAVE you
+been doing here?'
+
+  `May it please your Majesty,' said Two, in a very humble tone,
+going down on one knee as he spoke, `we were trying--'
+
+  `I see!' said the Queen, who had meanwhile been examining the
+roses.  `Off with their heads!' and the procession moved on,
+three of the soldiers remaining behind to execute the unfortunate
+gardeners, who ran to Alice for protection.
+
+  `You shan't be beheaded!' said Alice, and she put them into a
+large flower-pot that stood near.  The three soldiers wandered
+about for a minute or two, looking for them, and then quietly
+marched off after the others.
+
+  `Are their heads off?' shouted the Queen.
+
+  `Their heads are gone, if it please your Majesty!' the soldiers
+shouted in reply.
+
+  `That's right!' shouted the Queen.  `Can you play croquet?'
+
+  The soldiers were silent, and looked at Alice, as the question
+was evidently meant for her.
+
+  `Yes!' shouted Alice.
+
+  `Come on, then!' roared the Queen, and Alice joined the
+procession, wondering very much what would happen next.
+
+  `It's--it's a very fine day!' said a timid voice at her side.
+She was walking by the White Rabbit, who was peeping anxiously
+into her face.
+
+  `Very,' said Alice:  `--where's the Duchess?'
+
+  `Hush!  Hush!' said the Rabbit in a low, hurried tone.  He
+looked anxiously over his shoulder as he spoke, and then raised
+himself upon tiptoe, put his mouth close to her ear, and
+whispered `She's under sentence of execution.'
+
+  `What for?' said Alice.
+
+  `Did you say "What a pity!"?' the Rabbit asked.
+
+  `No, I didn't,' said Alice:  `I don't think it's at all a pity.
+I said "What for?"'
+
+  `She boxed the Queen's ears--' the Rabbit began.  Alice gave a
+little scream of laughter.  `Oh, hush!' the Rabbit whispered in a
+frightened tone.  `The Queen will hear you!  You see, she came
+rather late, and the Queen said--'
+
+  `Get to your places!' shouted the Queen in a voice of thunder,
+and people began running about in all directions, tumbling up
+against each other; however, they got settled down in a minute or
+two, and the game began.  Alice thought she had never seen such a
+curious croquet-ground in her life; it was all ridges and
+furrows; the balls were live hedgehogs, the mallets live
+flamingoes, and the soldiers had to double themselves up and to
+stand on their hands and feet, to make the arches.
+
+  The chief difficulty Alice found at first was in managing her
+flamingo:  she succeeded in getting its body tucked away,
+comfortably enough, under her arm, with its legs hanging down,
+but generally, just as she had got its neck nicely straightened
+out, and was going to give the hedgehog a blow with its head, it
+WOULD twist itself round and look up in her face, with such a
+puzzled expression that she could not help bursting out laughing:
+and when she had got its head down, and was going to begin again,
+it was very provoking to find that the hedgehog had unrolled
+itself, and was in the act of crawling away:  besides all this,
+there was generally a ridge or furrow in the way wherever she
+wanted to send the hedgehog to, and, as the doubled-up soldiers
+were always getting up and walking off to other parts of the
+ground, Alice soon came to the conclusion that it was a very
+difficult game indeed.
+
+  The players all played at once without waiting for turns,
+quarrelling all the while, and fighting for the hedgehogs; and in
+a very short time the Queen was in a furious passion, and went
+stamping about, and shouting `Off with his head!' or `Off with
+her head!' about once in a minute.
+
+  Alice began to feel very uneasy:  to be sure, she had not as
+yet had any dispute with the Queen, but she knew that it might
+happen any minute, `and then,' thought she, `what would become of
+me?  They're dreadfully fond of beheading people here; the great
+wonder is, that there's any one left alive!'
+
+  She was looking about for some way of escape, and wondering
+whether she could get away without being seen, when she noticed a
+curious appearance in the air:  it puzzled her very much at
+first, but, after watching it a minute or two, she made it out to
+be a grin, and she said to herself `It's the Cheshire Cat:  now I
+shall have somebody to talk to.'
+
+  `How are you getting on?' said the Cat, as soon as there was
+mouth enough for it to speak with.
+
+  Alice waited till the eyes appeared, and then nodded.  `It's no
+use speaking to it,' she thought, `till its ears have come, or at
+least one of them.'  In another minute the whole head appeared,
+and then Alice put down her flamingo, and began an account of the
+game, feeling very glad she had someone to listen to her.  The
+Cat seemed to think that there was enough of it now in sight, and
+no more of it appeared.
+
+  `I don't think they play at all fairly,' Alice began, in rather
+a complaining tone, `and they all quarrel so dreadfully one can't
+hear oneself speak--and they don't seem to have any rules in
+particular; at least, if there are, nobody attends to them--and
+you've no idea how confusing it is all the things being alive;
+for instance, there's the arch I've got to go through next
+walking about at the other end of the ground--and I should have
+croqueted the Queen's hedgehog just now, only it ran away when it
+saw mine coming!'
+
+  `How do you like the Queen?' said the Cat in a low voice.
+
+  `Not at all,' said Alice:  `she's so extremely--'  Just then
+she noticed that the Queen was close behind her, listening:  so
+she went on, `--likely to win, that it's hardly worth while
+finishing the game.'
+
+  The Queen smiled and passed on.
+
+  `Who ARE you talking to?' said the King, going up to Alice, and
+looking at the Cat's head with great curiosity.
+
+  `It's a friend of mine--a Cheshire Cat,' said Alice:  `allow me
+to introduce it.'
+
+  `I don't like the look of it at all,' said the King:  `however,
+it may kiss my hand if it likes.'
+
+  `I'd rather not,' the Cat remarked.
+
+  `Don't be impertinent,' said the King, `and don't look at me
+like that!'  He got behind Alice as he spoke.
+
+  `A cat may look at a king,' said Alice.  `I've read that in
+some book, but I don't remember where.'
+
+  `Well, it must be removed,' said the King very decidedly, and
+he called the Queen, who was passing at the moment, `My dear!  I
+wish you would have this cat removed!'
+
+  The Queen had only one way of settling all difficulties, great
+or small.  `Off with his head!' she said, without even looking
+round.
+
+  `I'll fetch the executioner myself,' said the King eagerly, and
+he hurried off.
+
+  Alice thought she might as well go back, and see how the game
+was going on, as she heard the Queen's voice in the distance,
+screaming with passion.  She had already heard her sentence three
+of the players to be executed for having missed their turns, and
+she did not like the look of things at all, as the game was in
+such confusion that she never knew whether it was her turn or
+not.  So she went in search of her hedgehog.
+
+  The hedgehog was engaged in a fight with another hedgehog,
+which seemed to Alice an excellent opportunity for croqueting one
+of them with the other:  the only difficulty was, that her
+flamingo was gone across to the other side of the garden, where
+Alice could see it trying in a helpless sort of way to fly up
+into a tree.
+
+  By the time she had caught the flamingo and brought it back,
+the fight was over, and both the hedgehogs were out of sight:
+`but it doesn't matter much,' thought Alice, `as all the arches
+are gone from this side of the ground.'  So she tucked it away
+under her arm, that it might not escape again, and went back for
+a little more conversation with her friend.
+
+  When she got back to the Cheshire Cat, she was surprised to
+find quite a large crowd collected round it:  there was a dispute
+going on between the executioner, the King, and the Queen, who
+were all talking at once, while all the rest were quite silent,
+and looked very uncomfortable.
+
+  The moment Alice appeared, she was appealed to by all three to
+settle the question, and they repeated their arguments to her,
+though, as they all spoke at once, she found it very hard indeed
+to make out exactly what they said.
+
+  The executioner's argument was, that you couldn't cut off a
+head unless there was a body to cut it off from:  that he had
+never had to do such a thing before, and he wasn't going to begin
+at HIS time of life.
+
+  The King's argument was, that anything that had a head could be
+beheaded, and that you weren't to talk nonsense.
+
+  The Queen's argument was, that if something wasn't done about
+it in less than no time she'd have everybody executed, all round.
+(It was this last remark that had made the whole party look so
+grave and anxious.)
+
+  Alice could think of nothing else to say but `It belongs to the
+Duchess:  you'd better ask HER about it.'
+
+  `She's in prison,' the Queen said to the executioner:  `fetch
+her here.'  And the executioner went off like an arrow.
+
+   The Cat's head began fading away the moment he was gone, and,
+by the time he had come back with the Dutchess, it had entirely
+disappeared; so the King and the executioner ran wildly up and
+down looking for it, while the rest of the party went back to the game.
+
+
+
+                           CHAPTER IX
+
+                     The Mock Turtle's Story
+
+
+  `You can't think how glad I am to see you again, you dear old
+thing!' said the Duchess, as she tucked her arm affectionately
+into Alice's, and they walked off together.
+
+  Alice was very glad to find her in such a pleasant temper, and
+thought to herself that perhaps it was only the pepper that had
+made her so savage when they met in the kitchen.
+
+  `When I'M a Duchess,' she said to herself, (not in a very
+hopeful tone though), `I won't have any pepper in my kitchen AT
+ALL.  Soup does very well without--Maybe it's always pepper that
+makes people hot-tempered,' she went on, very much pleased at
+having found out a new kind of rule, `and vinegar that makes them
+sour--and camomile that makes them bitter--and--and barley-sugar
+and such things that make children sweet-tempered.  I only wish
+people knew that:  then they wouldn't be so stingy about it, you
+know--'
+
+  She had quite forgotten the Duchess by this time, and was a
+little startled when she heard her voice close to her ear.
+`You're thinking about something, my dear, and that makes you
+forget to talk.  I can't tell you just now what the moral of that
+is, but I shall remember it in a bit.'
+
+  `Perhaps it hasn't one,' Alice ventured to remark.
+
+  `Tut, tut, child!' said the Duchess.  `Everything's got a
+moral, if only you can find it.'  And she squeezed herself up
+closer to Alice's side as she spoke.
+
+  Alice did not much like keeping so close to her:  first,
+because the Duchess was VERY ugly; and secondly, because she was
+exactly the right height to rest her chin upon Alice's shoulder,
+and it was an uncomfortably sharp chin.  However, she did not
+like to be rude, so she bore it as well as she could.
+
+  `The game's going on rather better now,' she said, by way of
+keeping up the conversation a little.
+
+  `'Tis so,' said the Duchess:  `and the moral of that is--"Oh,
+'tis love, 'tis love, that makes the world go round!"'
+
+  `Somebody said,' Alice whispered, `that it's done by everybody
+minding their own business!'
+
+  `Ah, well!  It means much the same thing,' said the Duchess,
+digging her sharp little chin into Alice's shoulder as she added,
+`and the moral of THAT is--"Take care of the sense, and the
+sounds will take care of themselves."'
+
+  `How fond she is of finding morals in things!' Alice thought to
+herself.
+
+  `I dare say you're wondering why I don't put my arm round your
+waist,' the Duchess said after a pause:  `the reason is, that I'm
+doubtful about the temper of your flamingo.  Shall I try the
+experiment?'
+
+  `HE might bite,' Alice cautiously replied, not feeling at all
+anxious to have the experiment tried.
+
+  `Very true,' said the Duchess:  `flamingoes and mustard both
+bite.  And the moral of that is--"Birds of a feather flock
+together."'
+
+  `Only mustard isn't a bird,' Alice remarked.
+
+  `Right, as usual,' said the Duchess:  `what a clear way you
+have of putting things!'
+
+  `It's a mineral, I THINK,' said Alice.
+
+  `Of course it is,' said the Duchess, who seemed ready to agree
+to everything that Alice said; `there's a large mustard-mine near
+here.  And the moral of that is--"The more there is of mine, the
+less there is of yours."'
+
+  `Oh, I know!' exclaimed Alice, who had not attended to this
+last remark, `it's a vegetable.  It doesn't look like one, but it
+is.'
+
+  `I quite agree with you,' said the Duchess; `and the moral of
+that is--"Be what you would seem to be"--or if you'd like it put
+more simply--"Never imagine yourself not to be otherwise than
+what it might appear to others that what you were or might have
+been was not otherwise than what you had been would have appeared
+to them to be otherwise."'
+
+  `I think I should understand that better,' Alice said very
+politely, `if I had it written down:  but I can't quite follow it
+as you say it.'
+
+  `That's nothing to what I could say if I chose,' the Duchess
+replied, in a pleased tone.
+
+  `Pray don't trouble yourself to say it any longer than that,'
+said Alice.
+
+  `Oh, don't talk about trouble!' said the Duchess.  `I make you
+a present of everything I've said as yet.'
+
+  `A cheap sort of present!' thought Alice.  `I'm glad they don't
+give birthday presents like that!'  But she did not venture to
+say it out loud.
+
+  `Thinking again?' the Duchess asked, with another dig of her
+sharp little chin.
+
+  `I've a right to think,' said Alice sharply, for she was
+beginning to feel a little worried.
+
+  `Just about as much right,' said the Duchess, `as pigs have to
+fly; and the m--'
+
+  But here, to Alice's great surprise, the Duchess's voice died
+away, even in the middle of her favourite word `moral,' and the
+arm that was linked into hers began to tremble.  Alice looked up,
+and there stood the Queen in front of them, with her arms folded,
+frowning like a thunderstorm.
+
+  `A fine day, your Majesty!' the Duchess began in a low, weak
+voice.
+
+  `Now, I give you fair warning,' shouted the Queen, stamping on
+the ground as she spoke; `either you or your head must be off,
+and that in about half no time!  Take your choice!'
+
+  The Duchess took her choice, and was gone in a moment.
+
+  `Let's go on with the game,' the Queen said to Alice; and Alice
+was too much frightened to say a word, but slowly followed her
+back to the croquet-ground.
+
+  The other guests had taken advantage of the Queen's absence,
+and were resting in the shade:  however, the moment they saw her,
+they hurried back to the game, the Queen merely remarking that a
+moment's delay would cost them their lives.
+
+  All the time they were playing the Queen never left off
+quarrelling with the other players, and shouting `Off with his
+head!' or `Off with her head!'  Those whom she sentenced were
+taken into custody by the soldiers, who of course had to leave
+off being arches to do this, so that by the end of half an hour
+or so there were no arches left, and all the players, except the
+King, the Queen, and Alice, were in custody and under sentence of
+execution.
+
+  Then the Queen left off, quite out of breath, and said to
+Alice, `Have you seen the Mock Turtle yet?'
+
+  `No,' said Alice.  `I don't even know what a Mock Turtle is.'
+
+  `It's the thing Mock Turtle Soup is made from,' said the Queen.
+
+  `I never saw one, or heard of one,' said Alice.
+
+  `Come on, then,' said the Queen, `and he shall tell you his
+history,'
+
+  As they walked off together, Alice heard the King say in a low
+voice, to the company generally, `You are all pardoned.'  `Come,
+THAT'S a good thing!' she said to herself, for she had felt quite
+unhappy at the number of executions the Queen had ordered.
+
+  They very soon came upon a Gryphon, lying fast asleep in the
+sun.  (IF you don't know what a Gryphon is, look at the picture.)
+`Up, lazy thing!' said the Queen, `and take this young lady to
+see the Mock Turtle, and to hear his history.  I must go back and
+see after some executions I have ordered'; and she walked off,
+leaving Alice alone with the Gryphon.  Alice did not quite like
+the look of the creature, but on the whole she thought it would
+be quite as safe to stay with it as to go after that savage
+Queen:  so she waited.
+
+  The Gryphon sat up and rubbed its eyes:  then it watched the
+Queen till she was out of sight:  then it chuckled.  `What fun!'
+said the Gryphon, half to itself, half to Alice.
+
+  `What IS the fun?' said Alice.
+
+  `Why, SHE,' said the Gryphon.  `It's all her fancy, that:  they
+never executes nobody, you know.  Come on!'
+
+  `Everybody says "come on!" here,' thought Alice, as she went
+slowly after it:  `I never was so ordered about in all my life,
+never!'
+
+  They had not gone far before they saw the Mock Turtle in the
+distance, sitting sad and lonely on a little ledge of rock, and,
+as they came nearer, Alice could hear him sighing as if his heart
+would break.  She pitied him deeply.  `What is his sorrow?' she
+asked the Gryphon, and the Gryphon answered, very nearly in the
+same words as before, `It's all his fancy, that:  he hasn't got
+no sorrow, you know.  Come on!'
+
+  So they went up to the Mock Turtle, who looked at them with
+large eyes full of tears, but said nothing.
+
+  `This here young lady,' said the Gryphon, `she wants for to
+know your history, she do.'
+
+  `I'll tell it her,' said the Mock Turtle in a deep, hollow
+tone:  `sit down, both of you, and don't speak a word till I've
+finished.'
+
+  So they sat down, and nobody spoke for some minutes.  Alice
+thought to herself, `I don't see how he can EVEN finish, if he
+doesn't begin.'  But she waited patiently.
+
+  `Once,' said the Mock Turtle at last, with a deep sigh, `I was
+a real Turtle.'
+
+  These words were followed by a very long silence, broken only
+by an occasional exclamation of `Hjckrrh!' from the Gryphon, and
+the constant heavy sobbing of the Mock Turtle.  Alice was very
+nearly getting up and saying, `Thank you, sir, for your
+interesting story,' but she could not help thinking there MUST be
+more to come, so she sat still and said nothing.
+
+  `When we were little,' the Mock Turtle went on at last, more
+calmly, though still sobbing a little now and then, `we went to
+school in the sea.  The master was an old Turtle--we used to call
+him Tortoise--'
+
+  `Why did you call him Tortoise, if he wasn't one?' Alice asked.
+
+  `We called him Tortoise because he taught us,' said the Mock
+Turtle angrily:  `really you are very dull!'
+
+  `You ought to be ashamed of yourself for asking such a simple
+question,' added the Gryphon; and then they both sat silent and
+looked at poor Alice, who felt ready to sink into the earth.  At
+last the Gryphon said to the Mock Turtle, `Drive on, old fellow!
+Don't be all day about it!' and he went on in these words:
+
+  `Yes, we went to school in the sea, though you mayn't believe
+it--'
+
+  `I never said I didn't!' interrupted Alice.
+
+  `You did,' said the Mock Turtle.
+
+  `Hold your tongue!' added the Gryphon, before Alice could speak
+again.  The Mock Turtle went on.
+
+  `We had the best of educations--in fact, we went to school
+every day--'
+
+  `I'VE been to a day-school, too,' said Alice; `you needn't be
+so proud as all that.'
+
+  `With extras?' asked the Mock Turtle a little anxiously.
+
+  `Yes,' said Alice, `we learned French and music.'
+
+  `And washing?' said the Mock Turtle.
+
+  `Certainly not!' said Alice indignantly.
+
+  `Ah! then yours wasn't a really good school,' said the Mock
+Turtle in a tone of great relief.  `Now at OURS they had at the
+end of the bill, "French, music, AND WASHING--extra."'
+
+  `You couldn't have wanted it much,' said Alice; `living at the
+bottom of the sea.'
+
+  `I couldn't afford to learn it.' said the Mock Turtle with a
+sigh.  `I only took the regular course.'
+
+  `What was that?' inquired Alice.
+
+  `Reeling and Writhing, of course, to begin with,' the Mock
+Turtle replied; `and then the different branches of Arithmetic--
+Ambition, Distraction, Uglification, and Derision.'
+
+  `I never heard of "Uglification,"' Alice ventured to say.  `What
+is it?'
+
+  The Gryphon lifted up both its paws in surprise.  `What!  Never
+heard of uglifying!' it exclaimed.  `You know what to beautify
+is, I suppose?'
+
+  `Yes,' said Alice doubtfully:  `it means--to--make--anything--
+prettier.'
+
+  `Well, then,' the Gryphon went on, `if you don't know what to
+uglify is, you ARE a simpleton.'
+
+  Alice did not feel encouraged to ask any more questions about
+it, so she turned to the Mock Turtle, and said `What else had you
+to learn?'
+
+  `Well, there was Mystery,' the Mock Turtle replied, counting
+off the subjects on his flappers, `--Mystery, ancient and modern,
+with Seaography:  then Drawling--the Drawling-master was an old
+conger-eel, that used to come once a week:  HE taught us
+Drawling, Stretching, and Fainting in Coils.'
+
+  `What was THAT like?' said Alice.
+
+  `Well, I can't show it you myself,' the Mock Turtle said:  `I'm
+too stiff.  And the Gryphon never learnt it.'
+
+  `Hadn't time,' said the Gryphon:  `I went to the Classics
+master, though.  He was an old crab, HE was.'
+
+  `I never went to him,' the Mock Turtle said with a sigh:  `he
+taught Laughing and Grief, they used to say.'
+
+  `So he did, so he did,' said the Gryphon, sighing in his turn;
+and both creatures hid their faces in their paws.
+
+  `And how many hours a day did you do lessons?' said Alice, in a
+hurry to change the subject.
+
+  `Ten hours the first day,' said the Mock Turtle: `nine the
+next, and so on.'
+
+  `What a curious plan!' exclaimed Alice.
+
+  `That's the reason they're called lessons,' the Gryphon
+remarked:  `because they lessen from day to day.'
+
+  This was quite a new idea to Alice, and she thought it over a
+little before she made her next remark.  `Then the eleventh day
+must have been a holiday?'
+
+  `Of course it was,' said the Mock Turtle.
+
+  `And how did you manage on the twelfth?' Alice went on eagerly.
+
+  `That's enough about lessons,' the Gryphon interrupted in a
+very decided tone:  `tell her something about the games now.'
+
+
+
+                            CHAPTER X
+
+                      The Lobster Quadrille
+
+
+  The Mock Turtle sighed deeply, and drew the back of one flapper
+across his eyes.  He looked at Alice, and tried to speak, but for
+a minute or two sobs choked his voice.  `Same as if he had a bone
+in his throat,' said the Gryphon:  and it set to work shaking him
+and punching him in the back.  At last the Mock Turtle recovered
+his voice, and, with tears running down his cheeks, he went on
+again:--
+
+  `You may not have lived much under the sea--' (`I haven't,'
+said Alice)--`and perhaps you were never even introduced to a lobster--'
+(Alice began to say `I once tasted--' but checked herself hastily,
+and said `No, never') `--so you can have no idea what a delightful
+thing a Lobster Quadrille is!'
+
+  `No, indeed,' said Alice.  `What sort of a dance is it?'
+
+  `Why,' said the Gryphon, `you first form into a line along the
+sea-shore--'
+
+  `Two lines!' cried the Mock Turtle.  `Seals, turtles, salmon,
+and so on; then, when you've cleared all the jelly-fish out of
+the way--'
+
+  `THAT generally takes some time,' interrupted the Gryphon.
+
+  `--you advance twice--'
+
+  `Each with a lobster as a partner!' cried the Gryphon.
+
+  `Of course,' the Mock Turtle said:  `advance twice, set to
+partners--'
+
+  `--change lobsters, and retire in same order,' continued the
+Gryphon.
+
+  `Then, you know,' the Mock Turtle went on, `you throw the--'
+
+  `The lobsters!' shouted the Gryphon, with a bound into the air.
+
+  `--as far out to sea as you can--'
+
+  `Swim after them!' screamed the Gryphon.
+
+  `Turn a somersault in the sea!' cried the Mock Turtle,
+capering wildly about.
+
+  `Back to land again, and that's all the first figure,' said the
+Mock Turtle, suddenly dropping his voice; and the two creatures,
+who had been jumping about like mad things all this time, sat
+down again very sadly and quietly, and looked at Alice.
+
+  `It must be a very pretty dance,' said Alice timidly.
+
+  `Would you like to see a little of it?' said the Mock Turtle.
+
+  `Very much indeed,' said Alice.
+
+  `Come, let's try the first figure!' said the Mock Turtle to the
+Gryphon.  `We can do without lobsters, you know.  Which shall
+sing?'
+
+  `Oh, YOU sing,' said the Gryphon.  `I've forgotten the words.'
+
+  So they began solemnly dancing round and round Alice, every now
+and then treading on her toes when they passed too close, and
+waving their forepaws to mark the time, while the Mock Turtle
+sang this, very slowly and sadly:--
+
+
+`"Will you walk a little faster?" said a whiting to a snail.
+"There's a porpoise close behind us, and he's treading on my
+ tail.
+See how eagerly the lobsters and the turtles all advance!
+They are waiting on the shingle--will you come and join the
+dance?
+
+Will you, won't you, will you, won't you, will you join the
+dance?
+Will you, won't you, will you, won't you, won't you join the
+dance?
+
+
+"You can really have no notion how delightful it will be
+When they take us up and throw us, with the lobsters, out to
+                                                      sea!"
+But the snail replied "Too far, too far!" and gave a look
+                                                       askance--
+Said he thanked the whiting kindly, but he would not join the
+   dance.
+    Would not, could not, would not, could not, would not join
+        the dance.
+    Would not, could not, would not, could not, could not join
+        the dance.
+
+`"What matters it how far we go?" his scaly friend replied.
+"There is another shore, you know, upon the other side.
+The further off from England the nearer is to France--
+Then turn not pale, beloved snail, but come and join the dance.
+
+    Will you, won't you, will you, won't you, will you join the
+         dance?
+    Will you, won't you, will you, won't you, won't you join the
+         dance?"'
+
+
+
+  `Thank you, it's a very interesting dance to watch,' said
+Alice, feeling very glad that it was over at last:  `and I do so
+like that curious song about the whiting!'
+
+  `Oh, as to the whiting,' said the Mock Turtle, `they--you've
+seen them, of course?'
+
+  `Yes,' said Alice, `I've often seen them at dinn--' she
+checked herself hastily.
+
+  `I don't know where Dinn may be,' said the Mock Turtle, `but
+if you've seen them so often, of course you know what they're
+like.'
+
+  `I believe so,' Alice replied thoughtfully.  `They have their
+tails in their mouths--and they're all over crumbs.'
+
+  `You're wrong about the crumbs,' said the Mock Turtle:
+`crumbs would all wash off in the sea.  But they HAVE their tails
+in their mouths; and the reason is--' here the Mock Turtle
+yawned and shut his eyes.--`Tell her about the reason and all
+that,' he said to the Gryphon.
+
+  `The reason is,' said the Gryphon, `that they WOULD go with
+the lobsters to the dance.  So they got thrown out to sea.  So
+they had to fall a long way.  So they got their tails fast in
+their mouths.  So they couldn't get them out again.  That's all.'
+
+  `Thank you,' said Alice, `it's very interesting.  I never knew
+so much about a whiting before.'
+
+  `I can tell you more than that, if you like,' said the
+Gryphon.  `Do you know why it's called a whiting?'
+
+  `I never thought about it,' said Alice.  `Why?'
+
+  `IT DOES THE BOOTS AND SHOES.' the Gryphon replied very
+solemnly.
+
+  Alice was thoroughly puzzled.  `Does the boots and shoes!' she
+repeated in a wondering tone.
+
+  `Why, what are YOUR shoes done with?' said the Gryphon.  `I
+mean, what makes them so shiny?'
+
+  Alice looked down at them, and considered a little before she
+gave her answer.  `They're done with blacking, I believe.'
+
+  `Boots and shoes under the sea,' the Gryphon went on in a deep
+voice, `are done with a whiting.  Now you know.'
+
+  `And what are they made of?' Alice asked in a tone of great
+curiosity.
+
+  `Soles and eels, of course,' the Gryphon replied rather
+impatiently:  `any shrimp could have told you that.'
+
+  `If I'd been the whiting,' said Alice, whose thoughts were
+still running on the song, `I'd have said to the porpoise, "Keep
+back, please:  we don't want YOU with us!"'
+
+  `They were obliged to have him with them,' the Mock Turtle
+said:  `no wise fish would go anywhere without a porpoise.'
+
+  `Wouldn't it really?' said Alice in a tone of great surprise.
+
+  `Of course not,' said the Mock Turtle:  `why, if a fish came
+to ME, and told me he was going a journey, I should say "With
+what porpoise?"'
+
+  `Don't you mean "purpose"?' said Alice.
+
+  `I mean what I say,' the Mock Turtle replied in an offended
+tone.  And the Gryphon added `Come, let's hear some of YOUR
+adventures.'
+
+  `I could tell you my adventures--beginning from this morning,'
+said Alice a little timidly:  `but it's no use going back to
+yesterday, because I was a different person then.'
+
+  `Explain all that,' said the Mock Turtle.
+
+  `No, no!  The adventures first,' said the Gryphon in an
+impatient tone:  `explanations take such a dreadful time.'
+
+  So Alice began telling them her adventures from the time when
+she first saw the White Rabbit.  She was a little nervous about
+it just at first, the two creatures got so close to her, one on
+each side, and opened their eyes and mouths so VERY wide, but she
+gained courage as she went on.  Her listeners were perfectly
+quiet till she got to the part about her repeating `YOU ARE OLD,
+FATHER WILLIAM,' to the Caterpillar, and the words all coming
+different, and then the Mock Turtle drew a long breath, and said
+`That's very curious.'
+
+  `It's all about as curious as it can be,' said the Gryphon.
+
+  `It all came different!' the Mock Turtle repeated
+thoughtfully.  `I should like to hear her try and repeat
+something now.  Tell her to begin.'  He looked at the Gryphon as
+if he thought it had some kind of authority over Alice.
+
+  `Stand up and repeat "'TIS THE VOICE OF THE SLUGGARD,"' said
+the Gryphon.
+
+  `How the creatures order one about, and make one repeat
+lessons!' thought Alice; `I might as well be at school at once.'
+However, she got up, and began to repeat it, but her head was so
+full of the Lobster Quadrille, that she hardly knew what she was
+saying, and the words came very queer indeed:--
+
+    `'Tis the voice of the Lobster; I heard him declare,
+    "You have baked me too brown, I must sugar my hair."
+    As a duck with its eyelids, so he with his nose
+    Trims his belt and his buttons, and turns out his toes.'
+
+              [later editions continued as follows
+    When the sands are all dry, he is gay as a lark,
+    And will talk in contemptuous tones of the Shark,
+    But, when the tide rises and sharks are around,
+    His voice has a timid and tremulous sound.]
+
+  `That's different from what I used to say when I was a child,'
+said the Gryphon.
+
+  `Well, I never heard it before,' said the Mock Turtle; `but it
+sounds uncommon nonsense.'
+
+  Alice said nothing; she had sat down with her face in her
+hands, wondering if anything would EVER happen in a natural way
+again.
+
+  `I should like to have it explained,' said the Mock Turtle.
+
+  `She can't explain it,' said the Gryphon hastily.  `Go on with
+the next verse.'
+
+  `But about his toes?' the Mock Turtle persisted.  `How COULD
+he turn them out with his nose, you know?'
+
+  `It's the first position in dancing.' Alice said; but was
+dreadfully puzzled by the whole thing, and longed to change the
+subject.
+
+  `Go on with the next verse,' the Gryphon repeated impatiently:
+`it begins "I passed by his garden."'
+
+  Alice did not dare to disobey, though she felt sure it would
+all come wrong, and she went on in a trembling voice:--
+
+    `I passed by his garden, and marked, with one eye,
+    How the Owl and the Panther were sharing a pie--'
+
+        [later editions continued as follows
+    The Panther took pie-crust, and gravy, and meat,
+    While the Owl had the dish as its share of the treat.
+    When the pie was all finished, the Owl, as a boon,
+    Was kindly permitted to pocket the spoon:
+    While the Panther received knife and fork with a growl,
+    And concluded the banquet--]
+
+  `What IS the use of repeating all that stuff,' the Mock Turtle
+interrupted, `if you don't explain it as you go on?  It's by far
+the most confusing thing I ever heard!'
+
+  `Yes, I think you'd better leave off,' said the Gryphon:  and
+Alice was only too glad to do so.
+
+  `Shall we try another figure of the Lobster Quadrille?' the
+Gryphon went on.  `Or would you like the Mock Turtle to sing you
+a song?'
+
+  `Oh, a song, please, if the Mock Turtle would be so kind,'
+Alice replied, so eagerly that the Gryphon said, in a rather
+offended tone, `Hm! No accounting for tastes!  Sing her "Turtle
+Soup," will you, old fellow?'
+
+  The Mock Turtle sighed deeply, and began, in a voice sometimes
+choked with sobs, to sing this:--
+
+
+    `Beautiful Soup, so rich and green,
+    Waiting in a hot tureen!
+    Who for such dainties would not stoop?
+    Soup of the evening, beautiful Soup!
+    Soup of the evening, beautiful Soup!
+        Beau--ootiful Soo--oop!
+        Beau--ootiful Soo--oop!
+    Soo--oop of the e--e--evening,
+        Beautiful, beautiful Soup!
+
+    `Beautiful Soup!  Who cares for fish,
+    Game, or any other dish?
+    Who would not give all else for two p
+    ennyworth only of beautiful Soup?
+    Pennyworth only of beautiful Soup?
+        Beau--ootiful Soo--oop!
+        Beau--ootiful Soo--oop!
+    Soo--oop of the e--e--evening,
+        Beautiful, beauti--FUL SOUP!'
+
+  `Chorus again!' cried the Gryphon, and the Mock Turtle had
+just begun to repeat it, when a cry of `The trial's beginning!'
+was heard in the distance.
+
+  `Come on!' cried the Gryphon, and, taking Alice by the hand,
+it hurried off, without waiting for the end of the song.
+
+  `What trial is it?' Alice panted as she ran; but the Gryphon
+only answered `Come on!' and ran the faster, while more and more
+faintly came, carried on the breeze that followed them, the
+melancholy words:--
+
+    `Soo--oop of the e--e--evening,
+        Beautiful, beautiful Soup!'
+
+
+
+                           CHAPTER XI
+
+                      Who Stole the Tarts?
+
+
+  The King and Queen of Hearts were seated on their throne when
+they arrived, with a great crowd assembled about them--all sorts
+of little birds and beasts, as well as the whole pack of cards:
+the Knave was standing before them, in chains, with a soldier on
+each side to guard him; and near the King was the White Rabbit,
+with a trumpet in one hand, and a scroll of parchment in the
+other.  In the very middle of the court was a table, with a large
+dish of tarts upon it:  they looked so good, that it made Alice
+quite hungry to look at them--`I wish they'd get the trial done,'
+she thought, `and hand round the refreshments!'  But there seemed
+to be no chance of this, so she began looking at everything about
+her, to pass away the time.
+
+  Alice had never been in a court of justice before, but she had
+read about them in books, and she was quite pleased to find that
+she knew the name of nearly everything there.  `That's the
+judge,' she said to herself, `because of his great wig.'
+
+  The judge, by the way, was the King; and as he wore his crown
+over the wig, (look at the frontispiece if you want to see how he
+did it,) he did not look at all comfortable, and it was certainly
+not becoming.
+
+  `And that's the jury-box,' thought Alice, `and those twelve
+creatures,' (she was obliged to say `creatures,' you see, because
+some of them were animals, and some were birds,) `I suppose they
+are the jurors.'  She said this last word two or three times over
+to herself, being rather proud of it:  for she thought, and
+rightly too, that very few little girls of her age knew the
+meaning of it at all.  However, `jury-men' would have done just
+as well.
+
+  The twelve jurors were all writing very busily on slates.
+`What are they doing?'  Alice whispered to the Gryphon.  `They
+can't have anything to put down yet, before the trial's begun.'
+
+  `They're putting down their names,' the Gryphon whispered in
+reply, `for fear they should forget them before the end of the
+trial.'
+
+  `Stupid things!' Alice began in a loud, indignant voice, but
+she stopped hastily, for the White Rabbit cried out, `Silence in
+the court!' and the King put on his spectacles and looked
+anxiously round, to make out who was talking.
+
+  Alice could see, as well as if she were looking over their
+shoulders, that all the jurors were writing down `stupid things!'
+on their slates, and she could even make out that one of them
+didn't know how to spell `stupid,' and that he had to ask his
+neighbour to tell him.  `A nice muddle their slates'll be in
+before the trial's over!' thought Alice.
+
+  One of the jurors had a pencil that squeaked.  This of course,
+Alice could not stand, and she went round the court and got
+behind him, and very soon found an opportunity of taking it
+away.  She did it so quickly that the poor little juror (it was
+Bill, the Lizard) could not make out at all what had become of
+it; so, after hunting all about for it, he was obliged to write
+with one finger for the rest of the day; and this was of very
+little use, as it left no mark on the slate.
+
+  `Herald, read the accusation!' said the King.
+
+  On this the White Rabbit blew three blasts on the trumpet, and
+then unrolled the parchment scroll, and read as follows:--
+
+    `The Queen of Hearts, she made some tarts,
+          All on a summer day:
+      The Knave of Hearts, he stole those tarts,
+          And took them quite away!'
+
+  `Consider your verdict,' the King said to the jury.
+
+  `Not yet, not yet!' the Rabbit hastily interrupted.  `There's
+a great deal to come before that!'
+
+  `Call the first witness,' said the King; and the White Rabbit
+blew three blasts on the trumpet, and called out, `First
+witness!'
+
+  The first witness was the Hatter.  He came in with a teacup in
+one hand and a piece of bread-and-butter in the other.  `I beg
+pardon, your Majesty,' he began, `for bringing these in:  but I
+hadn't quite finished my tea when I was sent for.'
+
+  `You ought to have finished,' said the King.  `When did you
+begin?'
+
+  The Hatter looked at the March Hare, who had followed him into
+the court, arm-in-arm with the Dormouse.  `Fourteenth of March, I
+think it was,' he said.
+
+  `Fifteenth,' said the March Hare.
+
+  `Sixteenth,' added the Dormouse.
+
+  `Write that down,' the King said to the jury, and the jury
+eagerly wrote down all three dates on their slates, and then
+added them up, and reduced the answer to shillings and pence.
+
+  `Take off your hat,' the King said to the Hatter.
+
+  `It isn't mine,' said the Hatter.
+
+  `Stolen!' the King exclaimed, turning to the jury, who
+instantly made a memorandum of the fact.
+
+  `I keep them to sell,' the Hatter added as an explanation;
+`I've none of my own.  I'm a hatter.'
+
+  Here the Queen put on her spectacles, and began staring at the
+Hatter, who turned pale and fidgeted.
+
+  `Give your evidence,' said the King; `and don't be nervous, or
+I'll have you executed on the spot.'
+
+  This did not seem to encourage the witness at all:  he kept
+shifting from one foot to the other, looking uneasily at the
+Queen, and in his confusion he bit a large piece out of his
+teacup instead of the bread-and-butter.
+
+  Just at this moment Alice felt a very curious sensation, which
+puzzled her a good deal until she made out what it was:  she was
+beginning to grow larger again, and she thought at first she
+would get up and leave the court; but on second thoughts she
+decided to remain where she was as long as there was room for
+her.
+
+  `I wish you wouldn't squeeze so.' said the Dormouse, who was
+sitting next to her.  `I can hardly breathe.'
+
+  `I can't help it,' said Alice very meekly:  `I'm growing.'
+
+  `You've no right to grow here,' said the Dormouse.
+
+  `Don't talk nonsense,' said Alice more boldly:  `you know
+you're growing too.'
+
+  `Yes, but I grow at a reasonable pace,' said the Dormouse:
+`not in that ridiculous fashion.'  And he got up very sulkily
+and crossed over to the other side of the court.
+
+  All this time the Queen had never left off staring at the
+Hatter, and, just as the Dormouse crossed the court, she said to
+one of the officers of the court, `Bring me the list of the
+singers in the last concert!' on which the wretched Hatter
+trembled so, that he shook both his shoes off.
+
+  `Give your evidence,' the King repeated angrily, `or I'll have
+you executed, whether you're nervous or not.'
+
+  `I'm a poor man, your Majesty,' the Hatter began, in a
+trembling voice, `--and I hadn't begun my tea--not above a week
+or so--and what with the bread-and-butter getting so thin--and
+the twinkling of the tea--'
+
+  `The twinkling of the what?' said the King.
+
+  `It began with the tea,' the Hatter replied.
+
+  `Of course twinkling begins with a T!' said the King sharply.
+`Do you take me for a dunce?  Go on!'
+
+  `I'm a poor man,' the Hatter went on, `and most things
+twinkled after that--only the March Hare said--'
+
+  `I didn't!' the March Hare interrupted in a great hurry.
+
+  `You did!' said the Hatter.
+
+  `I deny it!' said the March Hare.
+
+  `He denies it,' said the King:  `leave out that part.'
+
+  `Well, at any rate, the Dormouse said--' the Hatter went on,
+looking anxiously round to see if he would deny it too:  but the
+Dormouse denied nothing, being fast asleep.
+
+  `After that,' continued the Hatter, `I cut some more bread-
+and-butter--'
+
+  `But what did the Dormouse say?' one of the jury asked.
+
+  `That I can't remember,' said the Hatter.
+
+  `You MUST remember,' remarked the King, `or I'll have you
+executed.'
+
+  The miserable Hatter dropped his teacup and bread-and-butter,
+and went down on one knee.  `I'm a poor man, your Majesty,' he
+began.
+
+  `You're a very poor speaker,' said the King.
+
+  Here one of the guinea-pigs cheered, and was immediately
+suppressed by the officers of the court.  (As that is rather a
+hard word, I will just explain to you how it was done.  They had
+a large canvas bag, which tied up at the mouth with strings:
+into this they slipped the guinea-pig, head first, and then sat
+upon it.)
+
+  `I'm glad I've seen that done,' thought Alice.  `I've so often
+read in the newspapers, at the end of trials, "There was some
+attempts at applause, which was immediately suppressed by the
+officers of the court," and I never understood what it meant
+till now.'
+
+  `If that's all you know about it, you may stand down,'
+continued the King.
+
+  `I can't go no lower,' said the Hatter:  `I'm on the floor, as
+it is.'
+
+  `Then you may SIT down,' the King replied.
+
+  Here the other guinea-pig cheered, and was suppressed.
+
+  `Come, that finished the guinea-pigs!' thought Alice.  `Now we
+shall get on better.'
+
+  `I'd rather finish my tea,' said the Hatter, with an anxious
+look at the Queen, who was reading the list of singers.
+
+  `You may go,' said the King, and the Hatter hurriedly left the
+court, without even waiting to put his shoes on.
+
+  `--and just take his head off outside,' the Queen added to one
+of the officers:  but the Hatter was out of sight before the
+officer could get to the door.
+
+  `Call the next witness!' said the King.
+
+  The next witness was the Duchess's cook.  She carried the
+pepper-box in her hand, and Alice guessed who it was, even before
+she got into the court, by the way the people near the door began
+sneezing all at once.
+
+  `Give your evidence,' said the King.
+
+  `Shan't,' said the cook.
+
+  The King looked anxiously at the White Rabbit, who said in a
+low voice, `Your Majesty must cross-examine THIS witness.'
+
+  `Well, if I must, I must,' the King said, with a melancholy
+air, and, after folding his arms and frowning at the cook till
+his eyes were nearly out of sight, he said in a deep voice, `What
+are tarts made of?'
+
+  `Pepper, mostly,' said the cook.
+
+  `Treacle,' said a sleepy voice behind her.
+
+  `Collar that Dormouse,' the Queen shrieked out.  `Behead that
+Dormouse!  Turn that Dormouse out of court!  Suppress him!  Pinch
+him!  Off with his whiskers!'
+
+  For some minutes the whole court was in confusion, getting the
+Dormouse turned out, and, by the time they had settled down
+again, the cook had disappeared.
+
+  `Never mind!' said the King, with an air of great relief.
+`Call the next witness.'  And he added in an undertone to the
+Queen, `Really, my dear, YOU must cross-examine the next witness.
+It quite makes my forehead ache!'
+
+  Alice watched the White Rabbit as he fumbled over the list,
+feeling very curious to see what the next witness would be like,
+`--for they haven't got much evidence YET,' she said to herself.
+Imagine her surprise, when the White Rabbit read out, at the top
+of his shrill little voice, the name `Alice!'
+
+
+
+                           CHAPTER XII
+
+                        Alice's Evidence
+
+
+  `Here!' cried Alice, quite forgetting in the flurry of the
+moment how large she had grown in the last few minutes, and she
+jumped up in such a hurry that she tipped over the jury-box with
+the edge of her skirt, upsetting all the jurymen on to the heads
+of the crowd below, and there they lay sprawling about, reminding
+her very much of a globe of goldfish she had accidentally upset
+the week before.
+
+  `Oh, I BEG your pardon!' she exclaimed in a tone of great
+dismay, and began picking them up again as quickly as she could,
+for the accident of the goldfish kept running in her head, and
+she had a vague sort of idea that they must be collected at once
+and put back into the jury-box, or they would die.
+
+  `The trial cannot proceed,' said the King in a very grave
+voice, `until all the jurymen are back in their proper places--
+ALL,' he repeated with great emphasis, looking hard at Alice as
+he said do.
+
+  Alice looked at the jury-box, and saw that, in her haste, she
+had put the Lizard in head downwards, and the poor little thing
+was waving its tail about in a melancholy way, being quite unable
+to move.  She soon got it out again, and put it right; `not that
+it signifies much,' she said to herself; `I should think it
+would be QUITE as much use in the trial one way up as the other.'
+
+  As soon as the jury had a little recovered from the shock of
+being upset, and their slates and pencils had been found and
+handed back to them, they set to work very diligently to write
+out a history of the accident, all except the Lizard, who seemed
+too much overcome to do anything but sit with its mouth open,
+gazing up into the roof of the court.
+
+  `What do you know about this business?' the King said to
+Alice.
+
+  `Nothing,' said Alice.
+
+  `Nothing WHATEVER?' persisted the King.
+
+  `Nothing whatever,' said Alice.
+
+  `That's very important,' the King said, turning to the jury.
+They were just beginning to write this down on their slates, when
+the White Rabbit interrupted:  `UNimportant, your Majesty means,
+of course,' he said in a very respectful tone, but frowning and
+making faces at him as he spoke.
+
+  `UNimportant, of course, I meant,' the King hastily said, and
+went on to himself in an undertone, `important--unimportant--
+unimportant--important--' as if he were trying which word
+sounded best.
+
+  Some of the jury wrote it down `important,' and some
+`unimportant.'  Alice could see this, as she was near enough to
+look over their slates; `but it doesn't matter a bit,' she
+thought to herself.
+
+  At this moment the King, who had been for some time busily
+writing in his note-book, cackled out `Silence!' and read out
+from his book, `Rule Forty-two.  ALL PERSONS MORE THAN A MILE
+HIGH TO LEAVE THE COURT.'
+
+  Everybody looked at Alice.
+
+  `I'M not a mile high,' said Alice.
+
+  `You are,' said the King.
+
+  `Nearly two miles high,' added the Queen.
+
+  `Well, I shan't go, at any rate,' said Alice:  `besides,
+that's not a regular rule:  you invented it just now.'
+
+  `It's the oldest rule in the book,' said the King.
+
+  `Then it ought to be Number One,' said Alice.
+
+  The King turned pale, and shut his note-book hastily.
+`Consider your verdict,' he said to the jury, in a low, trembling
+voice.
+
+  `There's more evidence to come yet, please your Majesty,' said
+the White Rabbit, jumping up in a great hurry; `this paper has
+just been picked up.'
+
+  `What's in it?' said the Queen.
+
+  `I haven't opened it yet,' said the White Rabbit, `but it seems
+to be a letter, written by the prisoner to--to somebody.'
+
+  `It must have been that,' said the King, `unless it was
+written to nobody, which isn't usual, you know.'
+
+  `Who is it directed to?' said one of the jurymen.
+
+  `It isn't directed at all,' said the White Rabbit; `in fact,
+there's nothing written on the OUTSIDE.'  He unfolded the paper
+as he spoke, and added `It isn't a letter, after all:  it's a set
+of verses.'
+
+  `Are they in the prisoner's handwriting?' asked another of
+they jurymen.
+
+  `No, they're not,' said the White Rabbit, `and that's the
+queerest thing about it.'  (The jury all looked puzzled.)
+
+  `He must have imitated somebody else's hand,' said the King.
+(The jury all brightened up again.)
+
+  `Please your Majesty,' said the Knave, `I didn't write it, and
+they can't prove I did:  there's no name signed at the end.'
+
+  `If you didn't sign it,' said the King, `that only makes the
+matter worse.  You MUST have meant some mischief, or else you'd
+have signed your name like an honest man.'
+
+  There was a general clapping of hands at this:  it was the
+first really clever thing the King had said that day.
+
+  `That PROVES his guilt,' said the Queen.
+
+  `It proves nothing of the sort!' said Alice.  `Why, you don't
+even know what they're about!'
+
+  `Read them,' said the King.
+
+  The White Rabbit put on his spectacles.  `Where shall I begin,
+please your Majesty?' he asked.
+
+  `Begin at the beginning,' the King said gravely, `and go on
+till you come to the end:  then stop.'
+
+  These were the verses the White Rabbit read:--
+
+        `They told me you had been to her,
+          And mentioned me to him:
+        She gave me a good character,
+          But said I could not swim.
+
+        He sent them word I had not gone
+          (We know it to be true):
+        If she should push the matter on,
+          What would become of you?
+
+        I gave her one, they gave him two,
+          You gave us three or more;
+        They all returned from him to you,
+          Though they were mine before.
+
+        If I or she should chance to be
+          Involved in this affair,
+        He trusts to you to set them free,
+          Exactly as we were.
+
+        My notion was that you had been
+          (Before she had this fit)
+        An obstacle that came between
+          Him, and ourselves, and it.
+
+        Don't let him know she liked them best,
+          For this must ever be
+        A secret, kept from all the rest,
+          Between yourself and me.'
+
+  `That's the most important piece of evidence we've heard yet,'
+said the King, rubbing his hands; `so now let the jury--'
+
+  `If any one of them can explain it,' said Alice, (she had
+grown so large in the last few minutes that she wasn't a bit
+afraid of interrupting him,) `I'll give him sixpence.  _I_ don't
+believe there's an atom of meaning in it.'
+
+  The jury all wrote down on their slates, `SHE doesn't believe
+there's an atom of meaning in it,' but none of them attempted to
+explain the paper.
+
+  `If there's no meaning in it,' said the King, `that saves a
+world of trouble, you know, as we needn't try to find any.  And
+yet I don't know,' he went on, spreading out the verses on his
+knee, and looking at them with one eye; `I seem to see some
+meaning in them, after all.  "--SAID I COULD NOT SWIM--" you
+can't swim, can you?' he added, turning to the Knave.
+
+  The Knave shook his head sadly.  `Do I look like it?' he said.
+(Which he certainly did NOT, being made entirely of cardboard.)
+
+  `All right, so far,' said the King, and he went on muttering
+over the verses to himself:  `"WE KNOW IT TO BE TRUE--" that's
+the jury, of course-- "I GAVE HER ONE, THEY GAVE HIM TWO--" why,
+that must be what he did with the tarts, you know--'
+
+  `But, it goes on "THEY ALL RETURNED FROM HIM TO YOU,"' said
+Alice.
+
+  `Why, there they are!' said the King triumphantly, pointing to
+the tarts on the table.  `Nothing can be clearer than THAT.
+Then again--"BEFORE SHE HAD THIS FIT--"  you never had fits, my
+dear, I think?' he said to the Queen.
+
+  `Never!' said the Queen furiously, throwing an inkstand at the
+Lizard as she spoke.  (The unfortunate little Bill had left off
+writing on his slate with one finger, as he found it made no
+mark; but he now hastily began again, using the ink, that was
+trickling down his face, as long as it lasted.)
+
+  `Then the words don't FIT you,' said the King, looking round
+the court with a smile.  There was a dead silence.
+
+  `It's a pun!' the King added in an offended tone, and
+everybody laughed, `Let the jury consider their verdict,' the
+King said, for about the twentieth time that day.
+
+  `No, no!' said the Queen.  `Sentence first--verdict afterwards.'
+
+  `Stuff and nonsense!' said Alice loudly.  `The idea of having
+the sentence first!'
+
+  `Hold your tongue!' said the Queen, turning purple.
+
+  `I won't!' said Alice.
+
+  `Off with her head!' the Queen shouted at the top of her voice.
+Nobody moved.
+
+  `Who cares for you?' said Alice, (she had grown to her full
+size by this time.)  `You're nothing but a pack of cards!'
+
+  At this the whole pack rose up into the air, and came flying
+down upon her:  she gave a little scream, half of fright and half
+of anger, and tried to beat them off, and found herself lying on
+the bank, with her head in the lap of her sister, who was gently
+brushing away some dead leaves that had fluttered down from the
+trees upon her face.
+
+  `Wake up, Alice dear!' said her sister; `Why, what a long
+sleep you've had!'
+
+  `Oh, I've had such a curious dream!' said Alice, and she told
+her sister, as well as she could remember them, all these strange
+Adventures of hers that you have just been reading about; and
+when she had finished, her sister kissed her, and said, `It WAS a
+curious dream, dear, certainly:  but now run in to your tea; it's
+getting late.'  So Alice got up and ran off, thinking while she
+ran, as well she might, what a wonderful dream it had been.
+
+  But her sister sat still just as she left her, leaning her
+head on her hand, watching the setting sun, and thinking of
+little Alice and all her wonderful Adventures, till she too began
+dreaming after a fashion, and this was her dream:--
+
+  First, she dreamed of little Alice herself, and once again the
+tiny hands were clasped upon her knee, and the bright eager eyes
+were looking up into hers--she could hear the very tones of her
+voice, and see that queer little toss of her head to keep back
+the wandering hair that WOULD always get into her eyes--and
+still as she listened, or seemed to listen, the whole place
+around her became alive the strange creatures of her little
+sister's dream.
+
+  The long grass rustled at her feet as the White Rabbit hurried
+by--the frightened Mouse splashed his way through the
+neighbouring pool--she could hear the rattle of the teacups as
+the March Hare and his friends shared their never-ending meal,
+and the shrill voice of the Queen ordering off her unfortunate
+guests to execution--once more the pig-baby was sneezing on the
+Duchess's knee, while plates and dishes crashed around it--once
+more the shriek of the Gryphon, the squeaking of the Lizard's
+slate-pencil, and the choking of the suppressed guinea-pigs,
+filled the air, mixed up with the distant sobs of the miserable
+Mock Turtle.
+
+  So she sat on, with closed eyes, and half believed herself in
+Wonderland, though she knew she had but to open them again, and
+all would change to dull reality--the grass would be only
+rustling in the wind, and the pool rippling to the waving of the
+reeds--the rattling teacups would change to tinkling sheep-
+bells, and the Queen's shrill cries to the voice of the shepherd
+boy--and the sneeze of the baby, the shriek of the Gryphon, and
+all thy other queer noises, would change (she knew) to the
+confused clamour of the busy farm-yard--while the lowing of the
+cattle in the distance would take the place of the Mock Turtle's
+heavy sobs.
+
+  Lastly, she pictured to herself how this same little sister of
+hers would, in the after-time, be herself a grown woman; and how
+she would keep, through all her riper years, the simple and
+loving heart of her childhood:  and how she would gather about
+her other little children, and make THEIR eyes bright and eager
+with many a strange tale, perhaps even with the dream of
+Wonderland of long ago:  and how she would feel with all their
+simple sorrows, and find a pleasure in all their simple joys,
+remembering her own child-life, and the happy summer days.
+
+                             THE END
+
\ No newline at end of file
diff --git a/src/test/java/org/xerial/snappy/load.code b/src/test/java/org/xerial/snappy/load.code
new file mode 100644
index 0000000..3352527
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/load.code
@@ -0,0 +1,14 @@
+public static void load(String lib) {
+  if(isLoaded) 
+     return;
+      
+  try { 
+    System.load(lib); 
+    isLoaded=true;
+  } 
+  catch(Exception e) {
+    e.printStackTrace(); 
+  } 
+ }
+}
+
diff --git a/src/test/java/org/xerial/snappy/loadLibrary.code b/src/test/java/org/xerial/snappy/loadLibrary.code
new file mode 100644
index 0000000..d57e1a1
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/loadLibrary.code
@@ -0,0 +1,13 @@
+public static void loadLibrary(String libname) {
+  if(isLoaded) 
+     return;
+      
+  try { 
+    System.load(libname); 
+    isLoaded=true;
+  } 
+  catch(Exception e) {
+    e.printStackTrace(); 
+  } 
+ }
+}
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/bib b/src/test/java/org/xerial/snappy/testdata/calgary/bib
new file mode 100644
index 0000000..2f5af24
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/bib
@@ -0,0 +1,6280 @@
+%A Abdou, I.E.
+%A Wong, K.Y.
+%D 1982
+%T Analysis of linear interpolation schemes for bi-level image applications
+%J IBM J Research and Development
+%V 26
+%P 667-680
+
+%A Abell, R.
+%D 1981
+%T Implementation of a Telidon system using Unix file structures
+%B The Telidon book
+%E D.Godfrey and E.Chang
+%I Press Porcepic
+%C Toronto, ON
+%P 203-209
+
+%A Abut, H.
+%A Gray, R.M.
+%A Rebolledo, V.
+%D 1982
+%T Vector quantization of speech and speech-like waveforms
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V Acoustics, Speech, and Signal Processing -30
+%N 3
+%P 423-435 
+%O June
+%K *
+
+%A Achugbue, J.O.
+%D 1981
+%T On the line breaking problem in text formatting
+%J SIGOA Newsletter (Proc ACM Symposium on Text manipulation, Portland, Oregon)
+%V 2
+%N 1/2
+%P 117-121
+%O Spring/Summer
+
+%A Adams, D.N.
+%D 1979
+%T The hitchhiker's guide to the galaxy
+%I Pan
+%C London, England
+
+%A Adams, J.B.
+%D 1976
+%T A probability model of medical reasoning and the MYCIN model
+%J Mathematical Biosciences
+%V 32
+%P 177-186
+
+%A Aho, A.V.
+%A Corasick, M.J.
+%D 1975
+%T Efficient string matching: an aid to bibliographic search
+%J Comm ACM
+%V 18
+%N 6
+%P 333-340
+%O June
+
+%A Aikins, J.S.
+%D 1983
+%T Prototypical knowledge for expert systems
+%J Artificial Intelligence
+%V 20
+%N 2
+%P 163-210
+%O February
+%K *
+
+%A Akers, G.
+%A Lennig, M.
+%D 1984
+%T Intonation in text-to-speech synthesis: evaluation of algorithms
+%R Report
+%I Bell-Northern Research
+%C Verdun, QUE 
+%K *
+
+%A Allebach, J.P.
+%A Liu, B.
+%D 1976
+%T Analysis of halftone dot profile and aliasing in the discrete binary representation of images
+%J Optical Society of America
+%V 67
+%N 9
+%K *
+
+%A Allen, B.P.
+%A Wright, J.M.
+%D 1983
+%T Integrating logic programs and schemata
+%J Proc 8th International Joint Conference on Artificial Intelligence
+%P 340-342
+
+%A Allen, E.M.
+%D 1983
+%T YAPS: yet another production system
+%R Report TR-1146
+%I Maryland Artificial Intelligence Group, Computer Science Department, University of Maryland
+%C Maryland, MD
+%O December
+%K *
+
+%A Allen, J.F.
+%A Perrault, C.R.
+%D 1980
+%T Analyzing intention in utterances
+%J Artificial Intelligence
+%V 15
+%P 143-178
+%K *
+
+%A Allen, J.F.
+%D 1984
+%T Towards a general theory of action and time
+%J Artificial Intelligence
+%V 23
+%P 123-154
+%K *
+
+%A Almes, G.T.
+%A Black, A.P.
+%A Lazowska, E.L.
+%A Noe, J.D.
+%D 1985
+%T The Eden system: a technical review
+%J IEEE Trans Software Engineering
+%V SE-11
+%N 1
+%P 43-59
+%O January
+%K *
+
+%A Alvey, P.
+%D 1983
+%T The problems of designing a medical expert system
+%J Proc Expert Systems 83
+%I Churchill College
+%C Cambridge, England
+%P 30-42
+%O December
+%K *
+
+%A Anderberg, M.R.
+%D 1973
+%T Cluster analysis for applications
+%I Academic Press
+%C New York, NY
+
+%A Anderson, D.P.
+%A Hedin, R.C.
+%D 1982
+%T Voice input/output module
+%J Voice Data Entry Systems Application Conference '82
+%C San Mateo, CA
+%O September 21
+%K *
+
+%A Anderson, J.R.
+%T Knowledge compilation: the general learning mechanism
+%K *
+
+%A Anderson, J.R.
+%A Reiser, B.J.
+%D 1985
+%T The LISP tutor
+%J Byte
+%V 10
+%N 4
+%P 159-175
+%O April
+
+%A Andreae, J.H.
+%D 1984
+%T Numbers in the head
+%R Man-Machine Studies Progress Report UC-DSE/24
+%P 5-28
+%I Department of Electrical Engineering, University of Canterbury
+%C New Zealand
+
+%A Andreae, P.M.
+%D 1984
+%T Constraint limited generalization: acquiring procedures from examples
+%J Proc American Association on Artificial Intelligence
+%C Austin, TX
+%O August
+%K *
+
+%A Andreae, P.M.
+%D 1984
+%T Justified generalization: acquiring procedures from examples
+%R PhD Thesis
+%I Department of Electrical Engineering and Computer Science, MIT
+
+%A Andreae, P.M.
+%D 1986
+%T Justified generalization
+%J Proc International Conference on Future Advances in Computing
+%C Christchurch, New Zealand
+%O February 17-21
+%K *
+
+%A Andreka, H.
+%A Nemeti, I.
+%A Sain, I.
+%D 1982
+%T A complete logic for reasoning about programs via nonstandard model theory I
+%J Theoretical Computer Science
+%V 17
+%P 193-212
+%K *
+
+%A Andreka, H.
+%A Nemeti, I.
+%A Sain, I.
+%D 1982
+%T A complete logic for reasoning about programs via nonstandard model theory II
+%J Theoretical Computer Science
+%V 17
+%P 259-278
+%K *
+
+%A Andrew, A.M.
+%D 1981
+%T Autopoiesis \(em allopoiesis interplay
+%E M.Zeleny
+%B Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York, NY
+%P 157-166
+
+%A Anon
+%D 1972
+%T Holography and computer generated holograms
+%I Mills and Boom
+%C London, England
+%K *
+
+%A ANSI
+%D 1983
+%T Videotex/Teletext presentation level protocol syntax (Draft)
+%I American National Standards Committee X3 -- Information Processing Systems, Technical Committee X3L2 -- Codes and character sets
+%C New York, NY
+%O June
+
+%A Anson, E.
+%D 1982
+%T The device model of interaction
+%J Computer Graphics
+%V 16
+%N 2
+%P 107-114
+%O July
+%K *
+
+%A Aoki, M.
+%D 1965
+%T Optimal control of partially observable markovian systems
+%J J Franklin Institute
+%V 280
+%N 5
+%O November
+%K *
+
+%A Ascher, R.N.
+%A Nagy, G.
+%D 1974
+%T A means for achieving a high degree of compaction on scan-digitized printed text
+%J IEEE Trans Computers
+%V C-23
+%N 11
+%P 1174-1179
+%O November
+%K *
+
+%A Ash, W.L.
+%D 1981
+%T MXEC: parallel processing with an advanced macro facility
+%J Comm ACM
+%V 24
+%N 8
+%P 502-509
+%K *
+
+%A Ashby, W.R.
+%D 1960
+%T Design for a brain: the origin of adaptive behavior
+%I Wiley
+%C New York, NY
+%O (second edition)
+
+%A Askwall, S.
+%D 1985
+%T Computer supported reading vs reading text on paper: a comparison of two reading situations
+%J IJMMS
+%V 22
+%N 4
+%P 425-439
+%O April
+
+%A Atkinson, H.H.
+%A Gargantini, I.
+%A Ramanath, M.V.S.
+%D 1984
+%T Determination of the 3D border by repeated elimination of internal surfaces
+%J Computing
+%V 32
+%P 279-295
+%K *
+
+%A Attardi, G.
+%A Simi, M.
+%D 1982
+%T Semantics of inheritance and attributions in the description system Omega
+%R AI Memo 642
+%I MIT Artificial Intelligence Laboratory
+%O January
+%K *
+
+%A Axelrod, R.
+%D 1984
+%T The evolution of cooperation
+%I Basic Books
+%C New York, NY
+
+%A Backer, D.
+%A Gano, S.
+%D 1982
+%T Dynamically alterable videodisk displays
+%J Proc Graphics Interface 82
+%C Toronto, ON
+%P 365-
+%O May 17-21
+
+%A Baecker, R.
+%A Marcus, A.
+%D 1983
+%T On enhancing the interface to the source code of computer programs
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 251-255
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Bailey, D.
+%D 1985
+%T University of Salford Lisp/Prolog system
+%J Software -- Practice and Experience
+%V 15
+%N 6
+%P 595-609
+%O June
+%K *
+
+%A Ball, G.H.
+%A Hall, D.J.
+%D 1965
+%T ISODATA, a novel method of data analysis and pattern classification
+%R Report AD 699616
+%I Stanford Research Institute
+%C Stanford, CA
+
+%A Bandyopadhyay, S.
+%A Hughes, J.G.
+%A Smith, F.J.
+%A Sen, K.
+%T A generalized scientific information system
+%R Report
+%I Computer Science Department, Queen's University of Belfast
+%C Belfast, Northern Ireland
+%K *
+
+%A Barber, G.R.
+%D 1981
+%T Record of the workshop on research in office semantics
+%R AI Memo 620
+%I MIT
+%O February
+%K *
+
+%A Barber, G.R.
+%D 1982
+%T Office semantics
+%R PhD Thesis
+%I MIT
+%O February
+
+%A Barber, G.R.
+%D 1983
+%T Supporting organizational problem solving with a workstation
+%J ACM Trans Office Information Systems
+%V 1
+%N 1
+%P 45-67
+%O January
+%K *
+
+%A Barber, G.R.
+%A de\|Jong, P.S.
+%A Hewitt, C.
+%D 1983
+%T Semantic support for work in organizations
+%R AI Memo 719
+%I MIT Artificial Intelligence Laboratory
+%O April
+%K *
+
+%A Barnett, J.A.
+%D 1981
+%T Computational methods for a mathematical theory of evidence
+%J Proc 7th International Joint Conference on Artificial Intelligence
+%P 868-875
+%C Vancouver, BC
+%O August
+
+%A Barrow, H.G.
+%D 1979
+%T Artificial intelligence: state of the art
+%R Technical Note 198
+%I SRI International
+%C Menlo Park, CA
+%O October
+
+%A Barsky, B.A.
+%A Beatty, J.C.
+%D 1982
+%T Varying the betas in beta-splines
+%R Report CS-82-49
+%I University of Waterloo
+%O December
+%K *
+
+%A Barwise, J.
+%A Perry, J.
+%D 1983
+%T Situations and attitudes
+%I MIT Press
+%C Cambridge, MA
+
+%A Barwise, J.
+%D 1985
+%T The situation in logic II: conditionals and conditional information
+%R Report CSLI-85-21
+%I Center for the study of language and information, Stanford University
+%C Stanford, CA
+%O January
+%K *
+
+%A Bates, E.
+%D 1979
+%T The emergence of symbols
+%I Academic Press
+
+%A Beer, S.
+%D 1980
+%R Preface to \fIAutopoiesis and cognition\fR (Maturana and Varela, 1980)
+
+%A Bell, T.C.
+%D 1985
+%T Better OPM/L text compression
+%R Internal Report
+%I Computer Science Department, University of Canterbury
+%C Christchurch, New Zealand
+%K *
+
+%A Bell, T.C.
+%A Moffat, A.M.
+%D 1986
+%T A note on the DMC data compression scheme
+%R Internal Report
+%I Computer Science Department, University of Canterbury
+%C Christchurch, New Zealand
+
+%A Bell, T.C.
+%D 1986
+%T An introduction to text compression
+%R Internal Report
+%I Computer Science Department, University of Canterbury
+%C Christchurch, New Zealand
+
+%A Bellanger, M.G.
+%A Daguet, J.L.
+%A Lepagnol, G.P.
+%D 1974
+%T Interpolation, extrapolation, and reduction of computation speed in digital filters
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V ASSP-22
+%N 4
+%P 231-235
+%O August
+%K *
+
+%A Benest, I.D.
+%A Jones, G.
+%D 1982
+%T Computer emulation of books
+%J Proc IEE Conference Man-Machine Systems
+%P 267-271
+%C Manchester, England
+%O July
+
+%A Benest, I.D.
+%A Potok, M.H.N.
+%D 1984
+%T Wayfinding: an approach using signposting techniques
+%J Behaviour and Information Technology
+%V 3
+%N 2
+%P 99-107
+%K *
+
+%A Bentley, J.L.
+%A Friedman, J.H.
+%D 1979
+%T Data structures for range searching
+%J Computing Surveys
+%V 11
+%N 4
+%P 397-409
+%O December
+%K *
+
+%A Bentley, J.L.
+%D 1980
+%T Multidimensional divide-and-conquer
+%J Comm ACM
+%V 23
+%N 4
+%P 214-229
+%K *
+
+%A Bentley, J.L.
+%A Sleator, D.D.
+%A Tarjan, R.E.
+%A Wei, V.K.
+%D 1986
+%T A locally adaptive data compression scheme
+%J Comm ACM
+%V 29
+%N 4
+%P 320-330
+%O April
+
+%A Berglund, E.J.
+%A Cheriton, D.R.
+%T Amaze -- A distributed multi-player game program using the Distributed V Kernel
+%K *
+
+%A Bewley, W.L.
+%A Roberts, T.L.
+%A Schroit, D.
+%A Verplank, W.L.
+%D 1983
+%T Human factors testing in the design of Xerox's 8010 `Star' office workstation
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 72-77
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Bezdek, J.C.
+%D 1980
+%T A convergence theorem for the fuzzy ISODATA clustering algorithms
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-2
+%N 1
+%P 1-8
+%O January
+%K *
+
+%A Bibel, W.
+%D 1983
+%T Matings in matrices
+%J Comm ACM
+%V 26
+%N 11
+%P 844-852
+%O November
+%K *
+
+%A Biederman, I. 
+%D 1985
+%T Human image understanding: recent research and a theory
+%J Computer Vision, Graphics, and Image Processing
+%V 32
+%N 1
+%P 29-73
+%O October.
+
+%A Bigelow, C.
+%A Day, D.
+%D 1983
+%T Digital typography
+%J Scientific American
+%V 249
+%N 2
+%P 106-119
+%O August
+%K *
+
+%A Bigelow, C.
+%D 1984
+%T Principles of font design for the personal workstation
+%R Research Report
+%I Stanford University
+%K *
+
+%A Bigelow, C.
+%D 1986
+%T Notes on typeface protection
+%K *
+
+%A Birkhoff, G.
+%D 1967
+%T Lattice theory
+%I American Mathematical Society
+%C Providence, RI
+
+%A Birrell, A.D.
+%A Levin, R.
+%A Needham R.M.
+%A Schroeder, M.D.
+%D 1982
+%T Grapevine: an exercise in distributed computing
+%J Comm ACM
+%V 25
+%N 4
+%P 260-274
+%O April
+%K *
+
+%A Birtwistle, G.M.
+%A Dahl, O.J.
+%A Myhrhaug, B.
+%A Nygaard, K.
+%D 1973
+%T Simula Begin
+%I Auerbach
+%C Philadelphia, PA
+
+%A Birtwistle, G.
+%A Cleary, J.G.
+%A Joyce, J.
+%A Liblong, B.
+%A Unger, B.W.
+%A Witten, I.H.
+%A Wyvill, B.L.M.
+%D 1984
+%T A simulation environment
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 290-296
+%O May
+%K KConference
+
+%A Blakeslee, T.R.
+%D 1980
+%T The right brain
+%I MacMillan
+%C London, England
+
+%A Bobrow, D.G.
+%D 1985
+%T If Prolog is the answer, what is the question? or What it takes to support AI programming paradigms
+%J IEEE Trans Software Engineering
+%V SE-11
+%N 11
+%P 1401-1408
+%O November
+%K *
+
+%A Boehm-Davis, D.A.
+%A Fregly, A.M.
+%D 1983
+%T Documentation of concurrent programs
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 256-261
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Bonham, M.
+%A Witten, I.H.
+%D 1984
+%T Towards distributed document preparation with interactive and noninteractive viewing
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 365-372
+%O May
+%K KConference
+
+%A Bonham, M.
+%A Witten, I.H.
+%D 1985
+%T Towards distributed document preparation with interactive and noninteractive viewing
+%J Infor
+%V 23
+%N 4
+%P 365-388
+%O November
+%K KJournal
+
+%A Bonham, M.
+%A Witten, I.H.
+%D 1985
+%T More on `A large font virtual terminal interface: a software prosthesis for the visually impaired'
+%J Comm ACM
+%V 28
+%N 11
+%P 1236-1237
+%O November
+%K KCorrespondence
+
+%A Bonham, M.
+%A Witten, I.H.
+%D 1985
+%T Shape \(em a unifying concept in document layout
+%J Proc PROTEXT II -- Second International Conference on Text Processing Systems
+%I Boole Press
+%C Dublin, Ireland
+%P 126-132
+%O October
+%K KConference
+
+%A Bonner, S.
+%A Shin, K.
+%D 1982
+%T A comparative study of robot languages
+%J IEEE Computer
+%V 15
+%N 12
+%P 82-96
+
+%A Boose, J.H.
+%D 1986
+%T Rapid acquisition and combination of knowledge from multiple experts in the same domain
+%J Proc International Conference on Future Advances in Computing
+%C Christchurch, New Zealand
+%O February 17-21
+%K *
+
+%A Booth, T.L.
+%D 1984
+%T Computer education
+%J IEEE Computer
+%V 17
+%N 10
+%P 57-68
+%O October
+%K *
+
+%A Borning, A.
+%D 1981
+%T The programming language aspects of ThingLab, a constraint-oriented simulation laboratory
+%J ACM Trans Programming Languages and Systems
+%V 3
+%N 4
+%P 353-387
+%O October
+%K *
+
+%A Bouachache, B.
+%D 1983
+%T Wigner analysis of time-varying signals
+%B Signal processing II: Theories and applications
+%E H.W.Schussler
+%I Elsevier Science Publishers B.V. (North Holland)
+%P 703-706
+%K *
+
+%A Bouachache, B.
+%A Rodriguez, F.
+%D 1984
+%T Recognition of time-varying signals in the time-frequency domain by means of the Wigner distribution
+%J Proc International Circuits and Systems Symposium
+%K *
+
+%A Bouachache, B.
+%A Whitehouse, H.J.
+%D 1985
+%T Seismic applications of the Wigner-Ville distribution
+%J Proc International Circuits and Systems Symposium
+%C San Jose, CA
+%O May 5
+%K *
+
+%A Boulton, P.I.P.
+%A Lee, E.S.
+%D 1983
+%T The performance of Hubnet
+%J Proc International Electrical, Electronics Conference
+%V 2
+%P 450-453
+%C Toronto, ON
+%O September 26-28
+%K *
+
+%A Bower, G.H.
+%A Black, J.B.
+%D 1979
+%T Scripts in memory for text
+%J Cognitive Psychology
+%V 11
+%P 177-220
+%K *
+
+%A Brachman, R.J.
+%D 1983
+%T What IS-A is and isn't: an analysis of taxonomic links in semantic networks
+%J IEEE Computer
+%V 16
+%N 10
+%P 30-36
+%O October
+%K *
+
+%A Brachman, R.J.
+%A Schmolze, J.G.
+%D 1985
+%T An overview of the KL-ONE knowledge representation scheme
+%J Cognitive Science
+%V 9
+%N ii
+%P 171-216
+%K *
+
+%A Bramer, M.A.\0(Editor)
+%D 1985
+%T Research and development in expert systems
+%I Cambridge University Press
+%C Cambridge, England
+%O (Proc 4th Conference of BCS Group on Expert Systems, December 1984)
+
+%A Bramwell, B.
+%D 1984
+%T Browsing around a manual
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 438-442
+%O May
+%K *
+
+%A Britton, B.K.
+%A Black, J.B.\0(Editors)
+%D 1985
+%T Understanding expository text: a theoretical and practical handbook for analyzing explanatory text
+%I Erlbaum
+%C Hillsdale, NJ
+
+%A Brown, K.Q.
+%D 1979
+%T Voroni diagrams from convex hulls
+%J Information Processing Letters
+%V 9
+%N 5
+%P 223-228
+%O December
+%K *
+
+%A Brown, P.J.
+%D 1984
+%T Interactive documentation
+%R Internal Report
+%I Computing Laboratory, University of Kent
+%O April
+%K *
+
+%A Brown, J.S.
+%A Burton, R.R.
+%D 1975
+%T Multiple representations of knowledge for tutorial reasoning
+%B Representation of Learning
+%E D.G. Bobrow and A. Collins
+%I Academic Press
+%C New York, NY
+
+%A Brownston, L.
+%A Farrell, R.
+%A Kant, E.
+%A Martin, N.
+%D 1985
+%T Programming expert systems in OPS-5: an introduction to rule-based programming
+%I Addison-Wesley
+%C Reading, MA
+
+%A Brunner, J.
+%D 1975
+%T The shockwave rider
+%I Ballantine
+%C New York, NY
+
+%A Bruynooghs, M.
+%D 1982
+%T Adding redundancy to obtain more reliable and more readable Prolog programs
+%J Proc 1st International Logic Programming Conference
+%C Marseille, France
+%P 129-133
+%O September 14-17
+%K *
+
+%A Bryant, J.
+%D 1979
+%T On the clustering of multidimensional pictorial data
+%J Pattern Recognition
+%V 11
+%P 115-125
+%K *
+
+%A Buchman, C.
+%A Berry, D.M.
+%T An adaptation of the Unix DITROFF for formatting bidirectional text
+%I Computer Science Department, University of California
+%C Los Angeles, CA
+%K *
+
+%A Bundy, A.
+%A Silver, B.
+%A Plummer, D.
+%D 1985
+%T An analytical comparison of some rule-learning programs
+%J Artificial Intelligence
+%V 27
+%P 137-181
+
+%A Bundy, A.
+%D 1983
+%T The computer modelling of mathematical reasoning
+%A Academic Press
+%C London, England
+
+%A Burton, R.R.
+%A Brown, J.S.
+%D 1979
+%T An investigation of computer coaching for informal learning activities
+%J IJMMS
+%V 11
+%N 1
+%P 5-24
+%O January
+
+%A Bush, V.
+%D 1945
+%T As we may think
+%J Atlantic Monthly
+%P 101
+%O July
+
+%A Byrd, R.J.
+%A Smith, S.E.
+%A de\|Jong, S.P.
+%D 1982
+%T An actor-based programming system
+%J Proc SIGOA Conference on Office Information Systems
+%P 67-78
+%C Philadelphia, PA
+%O June 21-23
+%K *
+
+%A Campbell, F.W.
+%A Robson, J.G.
+%D 1967
+%T Application of fourier analysis to the visibility of gratings
+%J Physiol
+%N 197
+%P 551-566
+%I University of Cambridge
+%K *
+
+%A Cannon, W.B.
+%D 1932
+%T The wisdom of the body
+%I London
+
+%A Carroll, J.B.
+%D 1967
+%T On sampling from a lognormal model of word-frequency distribution
+%B Computational analysis of present-day American English
+%E Kucera, H. and Francis, W.N.
+%I Brown University Press
+%C Providence, RI
+%P 406-424
+%K *
+
+%A Carroll, J.B.
+%D 1966
+%T Word-frequency studies and the lognormal distribution
+%E E.M.Zale
+%B Proc Conference on Language and Language Behavior
+%I Appleton-Century-Crofts
+%C New York, NY
+%P 213-235
+%K *
+
+%A Carroll, J.M.
+%A Thomas, J.C.
+%D 1982
+%T Metaphor and the cognitive representation of computing systems
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-12
+%N 2
+%P 107-116
+%O March/April
+%K *
+
+%A Carter, K.A.
+%D 1984
+%T The Rainbow workstation in brief/A window manager for the Rainbow workstation
+%R Rainbow Group Note
+%I Computer Laboratory, University of Cambridge
+%O May
+%K *
+
+%A Casey, R.G.
+%A Friedman, T.D.
+%A Wong, K.Y.
+%D 1982
+%T Automatic scaling of digital fonts
+%J IBM J Research and Development
+%V 26
+%P 657-666
+
+%A Casey, R.G.
+%A Nagy, G.
+%D 1984
+%T Decision tree design using a probabilistic model
+TJ IEEE Trans Information Theory
+%V IT-30
+%N 1
+%P 93-99
+%O January
+%K *
+
+%A Cater, J.P.
+%D 1983
+%T Electronically speaking: computer speech generation
+%I Howard W. Sams
+%C Indianapolis, IN
+
+%A Catmull, E.
+%D 1981
+%T New frontiers in computer animation
+%J American Cinematographer
+%P 157-163
+%O October
+
+%A Cendrowska, J.
+%A Bramer, M.A.
+%D 1984
+%T A rational reconstruction of the Mycin consultation system
+%J IJMMS
+%V 20
+%P 229-317
+
+%A Chapanis, A.
+%D 1984
+%T Taming and civilizing computers
+%B Computer culture: the scientific, intellectual, and social impact of the computer
+%E Heinz R. Pagels
+%I New York Academy of Sciences
+%C New York, NY
+%P 202-219
+%K *
+
+%A Chazelle, B.
+%D 1983
+%T A decision procedure for optimal polyhedron partitioning
+%J Information Processing Letters
+%V 16
+%P 75-78
+%O February 26
+%K *
+
+%A Cheeseman, P.
+%D 1985
+%T In defense of probability
+%J Proc 10th International Joint Conference on Artificial Intelligence
+%P 100R2-1009
+
+%A Cheriton, D.R.
+%A Zwaenepoel, W.
+%D 1983
+%T The distributed V kernel and its performance for diskless workstations
+%R Report No STAN-CS-83-973
+%I Stanford University, Computer Science Department
+%C Stanford, CA
+%O July
+%K *
+
+%A Christodoulakis, S
+%A Faloutsos, C.
+%D 1984
+%T Design considerations for a message file server
+%J IEEE Trans Software Engineering
+%V SE-10
+%N 2
+%P 201-210
+%O March
+%K *
+
+%A Ciminiere, L.
+%A Valenzano, A.
+%D 1984
+%T iAPX 432 hardware fault handling mechanisms
+%K *
+
+%A Clancey, W.J.
+%D 1979
+%T Tutoring rules for guiding a case method dialogue
+%J IJMMS
+%V 11
+%P 25-49
+%K *
+
+%A Clancey, W.J.
+%D 1983
+%T The epistemology of a rule-based expert system \(em a framework for explanation
+%J Artificial Intelligence
+%V 20
+%P 215-251
+%K *
+
+%A Clancey, W.J.
+%A Shortliffe, E.H. \0(Editors)
+%D 1984
+%T Readings in medical artificial intelligence
+%I Addison-Wesley
+%C Reading, MA
+
+%A Clarkson, T.
+%T Eye position sensor
+%R Section 7 of a report
+%I King's College
+%C London, England
+%K *
+
+%A Cleary, J.G.
+%D 1979
+%T Analysis of an algorithm for finding nearest neighbors in Euclidean space
+%J ACM Trans Mathematical Software
+%V 5
+%N 2
+%P 183-192
+%O June
+%K *
+
+%A Cleary, J.G.
+%D 1984
+%T Compact hash tables using bidirectional linear probing
+%J IEEE Trans Computers
+%V C-33
+%N 9
+%P 828-834
+%O September
+
+%A Cleary, J.G.
+%A Darragh, J.J.
+%D 1984
+%T A fast compact representation of trees using hash tables
+%R Research Report 83/162/20
+%I Computer Science Department, University of Calgary
+%O Submitted to \fIIEEE Trans Computers\fP
+
+%A Cleary, J.G.
+%A Witten, I.H.
+%D in preparation
+%T Universal data compression
+
+%A Clocksin, W.A.
+%D 1984
+%T Introduction to Prolog
+%B Artificial Intelligence:  tools, techniques, and applications
+%E T.O'Shea and M.Eisenstadt
+%I Harper and Row
+%C New York, NY
+
+%A Codd, E.F.
+%D 1968
+%T Cellular automata
+%I Academic Press
+%C London, England
+
+%A Codd, E.F.
+%D 1978
+%T How about recently?
+%B Databases: Improving usability and responsiveness
+%E B. Shneiderman (Ed.)
+%I Academic Press
+%C New York, NY
+%P 3-28
+
+%A Cohen, E.S.
+%A Smith, E.T.
+%A Iverson, L.A.
+%D 1985
+%T Constraint-based tiled windows
+%R Research Report
+%I Computer Science Department, Carnegie-Mellon University
+
+%A Cohen, J.
+%D 1985
+%T Describing Prolog by its interpretation and compilation
+%J Comm ACM
+%V 28
+%N 12
+%P 1311-1324
+%O December
+%K *
+
+%A Colby, K.M.
+%D 1973
+%T Simulations of belief systems
+%E R.C.Schank and K.M.Colby
+%B Computer models of thought and language
+%I Freeman
+%C San Francisco, CA
+%P 251-286
+
+%A Colmaurer, A.
+%A Colmaurer, C.
+%D 1983
+%T Prolog en 10 figures
+%J TSI
+%V 2
+%N 4
+%O July-August
+%K *
+
+%A Colmerauer, A.
+%D 1985
+%T Prolog in 10 figures
+%J Comm ACM
+%V 28
+%N 12
+%P 1296-1310
+%O December
+%K *
+
+%A Colmaurer, A.
+%T An interesting subset of natural language
+%K *
+
+%A Comer, D.E.
+%A Peterson, L.L.
+%T Conversation-based mail
+%J ACM Transactions on computer systems
+%V 4
+%N 4
+%O November
+%K *
+
+%A Computer\|Science\|Department
+%D 1983
+%T CPSC Student Handbook
+%I University of Calgary
+
+%A Coombs, M.
+%A Alty, J.
+%D 1984
+%T Expert systems: an alternative paradigm
+%J IJMMS
+%V 20
+%N 1
+%P 21-43
+%O January
+%K *
+
+%A Corbett, C.
+%D 1983
+%T MC nroff/troff macros reference manual
+%R Report EES-MMS-1983-2
+%I Department of Electrical Engineering Science, University of Essex
+%C Colchester, Essex, UK
+%K *
+
+%A Corbett, C.
+%D 1983
+%T Figure processing within nroff
+%J Presented at EUUG Meeting
+%C Dublin, Ireland
+%O September
+%K *
+
+%A Cormack, G.V.
+%A Horspool, R.N.
+%D 1984
+%T Algorithms for adaptive Huffman codes
+%J Information Processing Letters
+%V 18
+%N 3
+%P 159-166
+%O March
+%K *
+
+%A Cormack, G.V.
+%A Horspool, R.N.
+%D 1985
+%T Data compression using dynamic Markov modelling
+%R Research Report
+%I Computer Science Department, University of Waterloo
+%O April; submitted to Comm ACM
+%K *
+
+%A Costigan, D.M.
+%D 1978
+%T Electronic delivery of documents and graphics
+%I Van Nostrand Reinhold
+%C New York, NY
+
+%A Coulon, D.
+%A Kayser, D.
+%D 1979
+%T Construction of natural language sentence acceptors by a supervised-learning technique
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-1
+%N 1
+%P 94-99
+%O January
+%K *
+
+%A Cove, J.F.
+%A Walsh, B.C.
+%D 1988
+%T A taxonomy of browsing
+%R Working Paper 85/2
+%I Computer Science Department, University of Liverpool
+%O April
+%K *
+
+%A Cox, B.J.
+%D 1986
+%T Object oriented programming
+%I Addison-Wesley
+%C Reading, MA
+
+%A Crochiere, R.E.
+%A Rabiner, L.R.
+%D 1975
+%T Optimum FIR digital filter implementations for decimation, interpolation, and narrow-band filtering
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V ASSP-23
+%N 5
+%P 444-456
+%O October
+%K *
+
+%A Crochiere, R.E.
+%A Rabiner, L.R.
+%D 1976
+%T Further considerations in the design of decimators and interpolators
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V ASSP-24
+%N 4
+%P 296-311
+%O August
+%K *
+
+%A Croft, W.B.
+%A Lefkowitz, L.S.
+%D 1984
+%T Task support in an office system
+%J ACM Trans Office Information Systems
+%V 2
+%N 3
+%P 197-212
+%O July
+%K *
+
+%A Croft, W.B.
+%D 1984
+%T The role of context and adaptation in user interfaces
+%J IJMMS
+%V 21
+%N 4
+%P 283-292
+%O October
+
+%A Csuri, C.
+%D 1974
+%T Computer graphics and art
+%J Proc IEEE
+%O April
+
+%A Cuff, R.N.
+%D 1982
+%T Database query using menus and natural language fragments
+%R PhD Thesis
+%I Man-Machine Systems Laboratory, Department of Electrical Engineering Science, University of Essex
+%C Colchester, Essex, UK
+
+%A Cuff, R.N.
+%D 1984
+%T HERCULES: database query using natural language fragments
+%J Proc 3rd British National Conference on Database Systems
+%C Leeds
+%O July
+%K *
+
+%A Cullingford, R.E.
+%D 1978
+%T Script application: computer understanding of newspaper stories
+%R PhD Thesis, Research Report 116
+%I Yale University
+
+%A Cullingford, R.E.
+%A Krueger, M.W.
+%A Selfridge, M.
+%A Bienkowski, M.A.
+%D 1982
+%T Automated explanations as a component of a computer-aided design system
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-12
+%N 2
+%P 168-181
+%O March/April
+%K *
+
+%A Cullingford, R.E.
+%A Pazzani, M.J.
+%D 1984
+%T Word-meaning selection in multiprocess language understanding programs
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-6
+%N 4
+%P 493-509
+%O July
+%K *
+
+%A Curry, G.
+%A Baer, L.
+%A Lipkie, D.
+%A Lee, B.
+%D 1982
+%T Traits: an approach to multiple-inheritance subclassing
+%J ACM Conference on Office Information Systems
+%P 1-9
+%O June
+%K *
+
+%A Damper, R.I.
+%A MacDonald, S.L.
+%D 1984
+%T Template adaptation in speech recognition
+%J Proc Institute of Acoustics
+%V 6
+%N 4
+%P 293-299
+%K *
+
+%A Damper, R.I.
+%A MacDonald, S.L.
+%D 1984
+%T Statistical clustering procedures applied to low-cost speech recognition
+%J J Biomed Engineering
+%V 6
+%P 265-271
+%O October
+%K *
+
+%A Darragh, J.J.
+%A Witten, I.H.
+%A Cleary, J.G.
+%D 1983
+%T Adaptive text compression to enhance a modem
+%R Research Report 83/132/21
+%I Computer Science Department, University of Calgary
+%K KReport
+
+%A Davis, R.
+%D 1979
+%T Interactive transfer of expertise: acquisition of new inference rules
+%J Artificial Intelligence
+%V 12
+%N 2
+%P 121-157
+%K *
+
+%A Davis, R.
+%A Lenat, D.B.
+%D 1982
+%T Knowledge-based systems in artificial intelligence
+%I McGraw Hill
+%C New York, NY
+
+%A Day, J.D.
+%A Zimmermann, H.
+%D 1983
+%T The OSI reference model
+%J Proc IEEE
+%V 71
+%N 12
+%P 1334-1340
+%O December
+
+%A Defude, B.
+%D 1984
+%T Knowledge based systems versus thesaurus: an architecture problem about expert systems design
+%J Proc 3rd Joint BCS and ACM Symposium (King's College, Cambridge)
+%I Cambridge University Press
+%P 267-280
+%O July
+%K *
+
+%A de\|Beaugrande, R.
+%D 1980
+%T Text, discourse and process: towards a multidisciplinary science of texts
+%I Ablex Publishing Corporation
+%C Norwood, NJ
+
+%A de\|Jong, G.
+%D 1979
+%T Prediction and substantiation: two processes that comprise understanding
+%J Proc International Joint Conference on Artificial Intelligence
+%C Tokyo, Japan
+%P 217-222
+%O August
+
+%A de\|Jong, G.
+%D 1981
+%T Generalizations based on explanations
+%J Proc IJCAI 81
+%P 67-69
+%K *
+
+%A de\|Jong, S.P.
+%D 1980
+%T The system for business automation (SBA): a unified application development system
+%B Information Processing 80
+%E S.H.Lavington
+%P 469-474
+%I North Holland
+%K *
+
+%A de\|Leon, L.
+%A Harris, W.G.
+%A Evens, M.
+%D 1983
+%T Is there really trouble with Unix?
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 125-129
+%C Boston, MA
+%O December 12-15
+
+%A Dietterich, T.G.
+%A Michalski, R.S.
+%D 1983
+%T A comparative review of selected methods for learning from examples
+%B Machine learning
+%E R.S. Michalski, J.G. Carbonell, and T.M. Mitchell
+%I Tioga
+%P 41-81
+
+%A Denning, P.J.
+%D 1982
+%T Computer-based predictive writing
+%J Comm ACM
+%V 25
+%N 5
+%P 315-316
+%O May
+%K *
+
+%A Denning, P.J.
+%D 1984
+%T Educational ruminations
+%J Comm ACM
+%V 27
+%N 10
+%P 979-983
+%O October
+
+%A Denning, P.J.
+%D 1985
+%T The science of computing: what is Computer Science?
+%J American Scientist
+%V 73
+%O January/February
+%K *
+
+%A Dewdney, A.K.
+%D 1984
+%T Computer recreations
+%J Scientific American
+%V 250
+%N 5
+%P 14-22
+%O May
+
+%A Downs, T.
+%A Cook, A.S.
+%A Rogers, G.
+%D 1984
+%T A partitioning approach to yield estimation for large circuits and systems
+%J IEEE Trans Circuits and Systems
+%V CAS-31
+%N 5
+%P 472-485
+%O May
+%K *
+
+%A Downs, T.
+%D 1985
+%T An approach to the modeling of software testing with some applications
+%J IEEE Trans Software Engineering
+%V SE-11
+%N 4
+%P 375-386
+%O April
+%K *
+
+%A Drummond, M.
+%D 1983
+%T A proposal to study the cost-effectiveness of planning, acting, and sensing
+%R DAI Working paper
+%I Department of Artificial Intelligence, University of Edinburgh
+%K *
+
+%A Dubes, R.
+%A Jain, A.K.
+%D 1979
+%T Validity studies in clustering methodologies
+%J Pattern Recognition
+%V 11
+%P 225-254
+%K *
+
+%A Duda, R.
+%A Gaschnig, J.
+%A Hart, P.
+%D 1979
+%T Model design in the Prospector consultant system for mineral exploration
+%E D. Michie
+%B Expert systems in the microelectronic age
+%I Edinburgh University Press
+%K *
+
+%A Dumais, S.
+%A Landauer, T.
+%D 1982
+%T Psychological investigations of natural terminology for command and query languages
+%B Directions in human/computer interactions
+%E Badre and Shneiderman
+%I Ablex Publishing Corporation
+%C Norwood, NJ
+%P 95-110
+
+%A Dumais, S.
+%A Landauer, T.
+%D 1983
+%T Using examples to describe categories
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 112-115
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Dunham, M.O.
+%A Gray, R.M.
+%D 1985
+%T An algorithm for the design of labeled-transition finite-state vector quantization
+%J IEEE Trans Communications
+%V COM-33
+%N 1
+%P 83-89
+%O January
+%K *
+
+%A Dyer, M.G.
+%D 1983
+%T In-depth understanding
+%I MIT Press
+%C Cambridge, MA
+
+%A Dynkin, E.B.
+%D 1965
+%T Controlled random sequences
+%J Theoretical Probability and its Applications
+%V X
+%N 1
+%K *
+
+%A Eason, K.D.
+%A Damodaran, L
+%D 1979
+%T Design procedures for user involvement and user support
+%J Infotech - Man Computer Communications
+%C London, England
+
+%A Edelsbrunner, H.
+%A Maurer, H.A.
+%D 1985
+%T Finding extreme points in three dimensions and solving the post-office problem in the plane
+%J Information Processing Letters
+%V 21
+%P 39-47
+%O 10 July
+%K *
+
+%A Efron, B.
+%A Thisted, R.
+%D 1976
+%T Estimating the number of unseen species: how many words did Shakespeare know?
+%J Biometrika
+%V 63
+%N 3
+%P 435-447
+%K *
+
+%A Eisenstadt, E.
+%A Hasemar, T.
+%D 1985
+%T An improved user interface for Prolog
+%E B.Shackel
+%B Human-Computer Interaction: Proceedings INTERACT 84
+%I North Holland
+%P 109-113
+%K *
+
+%A Ekeberg, O.
+%D 1986
+%T Robust dictionary lookup using associative methods
+%R Research Report
+%I Computer Vision and Associative Pattern Processing Laboratory, Department of Computing Science, Royal Institute of Technology
+%C Stockholm, Sweden
+%K *
+
+%A Elias, P.
+%D 1955
+%T Predictive coding: Part I and Part II
+%J IRE Trans Information Theory
+%V IT-1
+%N 1
+%P 16-33
+%K *
+
+%A Elias, P.
+%D 1970
+%T Bounds on performance of optimum quantizers
+%J IEEE Trans Information Theory
+%V IT-16
+%N 2
+%P 172-184
+%O March
+%K *
+
+%A Elias, P.
+%D 1975
+%T Universal codeword sets and representations of the integers
+%J IEEE Trans Information Theory
+%V IT-21
+%N 2
+%P 194-203
+%O March
+%K *
+
+%A Elliott, S.J.
+%A Nelson, P.A.
+%D 1985
+%T An algorithm for multichannel LMS adaptive filtering
+%R Research Report
+%I Institute of Sound and Vibration Research, University of Southampton
+%C Southampton, England
+%K *
+
+%A Ellis, C.A.
+%A Nutt, G.J.
+%D 1979
+%T On the equivalence of office models
+%R Research Report SSL-79-8
+%I Xerox PARC
+%O December
+%K *
+
+%A Ellis, C.A.
+%T Formal and informal models of office activity
+%R Research Report
+%I Xerox PARC
+%K *
+
+%A Ellis, C.A.
+%A Bernal, M.
+%D 1982
+%T Officetalk-D: an experimental office information system
+%J Proc ACM Conference 
+%P 131-140
+%K *
+
+%A Embley, D.W.
+%A Nagy, G.
+%D 1981
+%T Behavioral aspects of text editors
+%J Computing Surveys
+%V 13
+%N 1
+%P 33-70
+%O March
+%K *
+
+%A Engel F.L.
+%A Andriessen J.J.
+%A Schmitz, H.J.R.
+%D 1983
+%T What, where and whence: means for improving electronic data access
+%J IJMMS
+%V 18
+%P 145-160
+
+%A Englebart, D.C.
+%A English, W.K.
+%D 1968
+%T A research center for augmenting human intellect
+%J Proc Fall Joint Computer Conference
+%V 33
+%P 395-410
+%I AFIPS Press
+%C Arlington, VA
+
+%A Ernvall, J.
+%A Nevalainen, O.
+%D 1984
+%T Estimating the length of minimal spanning trees in compression of files
+%J BIT
+%V 24
+%P 19-32
+%K *
+
+%A Even, S.
+%A Rodeh, M.
+%D 1978
+%T Economical encodings of commas between strings
+%J Comm ACM
+%V 21
+%P 315-317
+%O April
+%K *
+
+%A Even, S.
+%A Pratt, V.
+%A Rodeh, M.
+%D 1981
+%T Linear algorithm for data compression via string matching
+%J J ACM
+%V 28
+%N 1
+%P 16-24
+%O January
+
+%A Everitt, B.
+%D 1974
+%T Cluster analysis
+%I Heineman
+%C London, England
+
+%A Fano, R.M.
+%D 1949
+%T The transmission of information
+%R Technical Report 65
+%I Research Laboratory of Electronics, MIT
+%C Cambridge, MA
+
+%A Feigenbaum, E.A.
+%A McCorduck, P.
+%D 1983
+%T The fifth generation
+%I Addison-Wesley
+%C Reading, MA
+
+%A Ferrans, J.C.
+%D 1982
+%T SEDL \(em a language for specifying integrity constraints on office forms
+%J SIGOA Newsletter (Proc SIGOA Conference on Office Information Systems)
+%V 3
+%N 3/4
+%P 123-130
+%C Philadelphia, PA
+%O June 21-23
+%K *
+
+%A Fikes, R.
+%A Kehler, T.
+%D 1985
+%T The role of frame-based representation in reasoning
+%J Comm ACM
+%V 28
+%N 9
+%P 904-920
+%O September
+%K *
+
+%A Filipski, A.
+%A Hanko, J.
+%D 1986
+%T Making UNIX secure
+%J Byte
+%P 113-128
+%O April
+
+%A Fillmore, C.J.
+%D 1968
+%T The case for case
+%E E.Bach and R.T.Harms
+%B Universals in linguistic theory
+%P 1-88
+%I Holt, Reinhart and Winston
+%C Chicago, IL
+%K *
+
+%A Finkel, R.A.
+%A Bentley, J.L.
+%D 1974
+%T Quad trees -- a data structure for retrieval on composite keys
+%J Acta Informatica
+%V 4
+%N 1
+%P 1-9
+
+%A Fischer, G.
+%A Lemke, A.
+%A Schwab, T.
+%D 1985
+%T Knowledge-based help systems
+%J Proc Human Factors in Computer Systems
+%C San Francisco, CA
+%P 161-167
+%O April
+%K *
+
+%A Fitter, M.
+%D 1979
+%T Toward more natural interactive systems
+%J IJMMS
+%V 11
+%P 339-350
+
+%A Fogel, L.J.
+%A Owens, A.J.
+%A Walsh, M.J.
+%D 1966
+%T Artificial intelligence through simulated evolution
+%I Wiley
+
+%A Foley, J.D.
+%A Wallace, V.L.
+%A Chan, P.
+%D 1984
+%T The human factors of computer graphics interaction techniques
+%J IEEE Computer Graphics and Applications
+%V 4
+%N 11
+%P 13-48
+%O November
+%K *
+
+%A Foster, J.
+%A Gray, R.M.
+%A Dunham, M.O.
+%D 1985
+%T Finite-state vector quantization for waveform coding
+%J IEEE Trans Information Theory
+%V IT-31
+%O May
+
+%A Freij, G.J.
+%A Cheetham, B.M.G.
+%D 1985
+%T Improved sequential linear prediction by selective time-domain coefficient extraction
+%R Report
+%K *
+
+%A Friedman, J.H.
+%A Baskett, F.
+%A Shustek, L.J.
+%D 1975
+%T An algorithm for finding nearest neighbors
+%J IEEE Trans Computers
+%V C-24
+%P 1000-1006
+%O October
+%K *
+
+%A Friedman, J.H.
+%A Bentley, J.L.
+%A Finkel, R.A.
+%D 1977
+%T An algorithm for finding best matches in logarithmic expected time
+%J ACM Trans Mathematical Software
+%V 3
+%N 3
+%P 209-226
+%O September
+%K *
+
+%A Fukunaga, K.
+%A Narendra, P.M.
+%D 1975
+%T A branch and bound algorithm for computing \fIk\fP-nearest neighbors
+%J IEEE Trans Computers
+%V C-24
+%P 750-753
+%O July
+%K *
+
+%A Fulton, M.A.
+%T A social cognition research model for studying human-computer communication
+%R Research Report
+%I Oklahoma State University Business College
+%C Stillwater, OK
+%K *
+
+%A Gaines, B.R.
+%D 1976
+%T On a danger in the assumption of causality
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-6
+%P 56-59
+
+%A Gaines, B.R.
+%D 1981
+%T Autopoiesis: some questions
+%E M.Zeleny
+%B Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York, NY
+%P 145-154
+
+%A Gaines, B.R.
+%D 1981
+%T The technology of interaction -- dialog programming rules
+%J IJMMS
+%V 14
+%N 1
+%P 133-150
+%O January
+
+%A Gaines, B.R.
+%D 1983
+%T From word processing to image processing in office systems
+%J Proc International Electrical, Electronics Conference
+%V 2
+%P 622-625
+%C Toronto, ON
+%O September 26-28
+%K *
+
+%A Gaines, B.R.
+%D 1984
+%T Fundamentals of decision: probabilistic, possibilistic and other forms of uncertainty in decision analysis
+%J Studies in the Management Sciences
+%V 20
+%P 47-65
+
+%A Gaines, B.R.
+%D 1985
+%T Expert systems and simulation in planning flexible manufacturing systems
+%J Proc Workshop on Coupling Symbolic and Numerical Computing in Expert Systems
+%I Boeing Computer Services AI Center
+%C Bellevue, WA
+%O August 27-29
+
+%A Gaines, B.R.
+%D 1985
+%T The design of expert systems for planning flexible manufacturing
+%R Research Report
+%I Computer Science Department, University of Calgary
+
+%A Gaines, B.R.
+%A Shaw, M.L.G
+%D 1986
+%T Foundations of dialog engineering: the development of human-computer interaction Part II
+%J IJMMS
+%V 24
+%N 2
+%P 101-123
+%O February
+
+%A Gaines, B.R.
+%D 1986
+%T An overview of knowledge acquisition and transfer
+%J Proc AAAI Workshop on Knowledge Acquisition for Knowledge-based Systems
+%C Banff, AL
+%O November
+
+%A Galitz, W.O.
+%D 1980
+%T Human factors in office automation
+%I Life Office Management Association
+%C Atlanta, GA 
+
+%A Gardner, M.
+%T In which `monster' curves force redefinition of the word `curve'
+%J Scientific American
+%P 124-133
+%K*
+
+%A Gargantini, I.
+%A Atkinson, H.H.
+%D 1984
+%T Linear quadtrees: a blocking technique for contour filling
+%J Pattern Recognition
+%V 17
+%N 3
+%P 285-293
+%K *
+
+%A Gargantini, I.A.
+%D 1983
+%T Recent results on linear quadtrees and related techniques
+%R Report 111
+%I Computer Science Department, University of Western Ontario
+%C London, ON
+%O December (to appear in \fIPattern recognition\fP)
+%K *
+
+%A Garudadri, H.
+%A Beddoes, M.P.
+%A Gilbert, J.H.V.
+%A Benguerel, A.P.
+%T Identification of invariant acoustic cues in stop consonants using the Wigner distribution
+%J 
+%K *
+
+%A Garvey, T.D.
+%A Lowrance, J.D.
+%A Fischler, M.A.
+%D 1981
+%T An inference technique for integrating knowledge from disparate sources
+%J Proc 7th International Joint Conference on Artificial Intelligence
+%P 319-325
+%C Vancouver, BC
+%O August
+%K *
+
+%A Gehani, N.H.
+%D 1983
+%T An electronic form system -- an experience in prototyping
+%J Software -- Practice and Experience
+%V 13
+%P 479-486
+%K *
+
+%A Gehani, N.H.
+%D 1983
+%T High level form definition in office information systems
+%J Computer J
+%V 26
+%N 1
+%P 52-59
+%K *
+
+%A Geller, V.J.
+%A Lesk, M.E.
+%D 1981
+%T How users search: a comparison of menu and attribute retrieval systems on a library catalog
+%R Internal Report
+%I Bell Laboratories
+%K *
+
+%A Genesereth, M.R.
+%A Ginsberg, M.L.
+%D 1985
+%T Logic programming
+%J Comm ACM
+%V 28
+%N 9
+%P 933-941
+%O September
+%K *
+
+%A Genesereth, M.R.
+%A Ginsberg, M.L.
+%A Rosenschein, J.S.
+%D 1985
+%T Solving the prisoner's dilemma
+%R Research Report STAN-CS-84-1032
+%I Computer Science Department, Stanford University
+%C Stanford, CA
+%K *
+
+%A Giles, R.
+%D 1976
+%T Lucasiewicz logic and fuzzy set theory
+%J IJMMS
+%V 8
+%P 313-327
+
+%A Ginsberg, M.L.
+%D 1985
+%T Does probability have a place in non-monotonic reasoning?
+%J Proc IJCAI
+%P 107-110
+%K *
+
+%A Georgeff, M.
+%A Lansky, A.L.
+%A Bessiere, P.
+%D 1985
+%T A procedural logic
+%J Proc International Joint Conference on Artificial Intelligence
+%C Los Angeles, CA
+%O August
+%K *
+
+%A Gersham, A.V.
+%D 1982
+%T A framework for conceptual analyzers
+%E W.G. Lenhert and M.H. Ringle
+%B Strategies for natural language processing
+%I Lawrence Erlbaum Associates
+%P 177-202
+
+%A Gersho, A.
+%D 1979
+%T Asymptotically optimal block quantization
+%J IEEE Trans Information Theory
+%V IT-25
+%N 4
+%P 373-380
+%O July
+%K *
+
+%A Gevarter, W.B.
+%D 1983
+%T An overview of computer-based natural language processing
+%R NASA Technical Memorandum 85635
+%C Washington, DC
+
+%A Gevarter, W.B.
+%D 1983
+%T Expert systems: limited but powerful
+%J IEEE Spectrum
+%P 39-45
+%O August
+
+%A Gibbon, D.
+%A Richter, H.\0(Editors)
+%D 1984
+%T Intonation, Accent and Rhythm
+%I de Gruyter
+%C Berlin
+
+%A Gibbs, R.W.
+%A Tenney, Y.J.
+%D 1980
+%T The concept of scripts in understanding stories
+%J J Psycholinguistic Research
+%V 9
+%N 3
+%P 275-284
+%K *
+
+%A Gibson, B.
+%A Wittig, R.
+%D 1983
+%T The Develnet LAN: architecture and experience
+%J Proc International Electrical, Electronics Conference
+%V 1
+%P 26-29
+%C Toronto, ON
+%O September 26-28
+%K *
+
+%A Girill, T.R.
+%A Luk, C.H.
+%D 1983
+%T DOCUMENT: an interactive, online solution to four documentation problems
+%J Comm ACM
+%V 26
+%N 5
+%P 328-337
+%O May
+
+%A Glinert, E.P.
+%A Tanimoto, S.L.
+%D 1984
+%T Pict: an interactive graphical programming environment
+%J IEEE Computer
+%V 17
+%N 11
+%P 7-25
+%O November
+%K *
+
+%A Glinert, E.P.
+%A Ladner, R.E.
+%D 1984
+%T A large font virtual terminal interface
+%J Comm ACM
+%V 27
+%N 7
+%P 567-572
+%O June
+%K *
+
+%A Godfrey, D.
+%A Chang, E.\0(Editors)
+%D 1981
+%T The Telidon book
+%I Press Porcepic
+%C Toronto, ON
+
+%A Goldshlager, L.M.
+%D 1980
+%T Short algorithms for space-filling curves
+%J Software -- Practice and Experience
+%V 11
+%P 99-100
+%O September
+%K *
+
+%A Good, D.I.
+%D 1982
+%T The proof of a distributed system in Gypsy
+%R Technical Report 30
+%I Institute for Computing Science, University of Texas at Austin
+%C Austin, TX
+%O September
+%K *
+
+%A Gordon, J.
+%A Shortliffe, E.H.
+%D 1984
+%T The Dempster-Shafer theory of evidence
+%B Rule-based expert systems
+%E B.G.Buchanan and E.H.Shortliffe
+%I Addison-Wesley
+%C Reading, MA
+%P 272-292
+
+%A Gordon, J.
+%A Shortliffe, E.H.
+%D 1985
+%T A method for managing evidential reasoning in a hierarchical hypothesis space
+%J Artificial Intelligence
+%V 26
+%P 323-357
+
+%A Gosling, J.A.
+%D 1981
+%T A redisplay algorithm
+%J SIGOA Newsletter (Proc ACM Symposium on Text manipulation)
+%C Portland, OR
+%V 2
+%N 1/2
+%P 123-129
+%O Spring/Summer
+
+%A Gosling, J.A.
+%A Rosenthal, D.S.H.
+%D 1983
+%T A network window-manager
+%R Report
+%I Information Technology Center, Carnegie-Mellon University
+%C Pittsburgh, PA
+%K *
+
+%A Grampp, F.T.
+%A Morris, R.H.
+%D 1984
+%T UNIX operating system security
+%J Bell System Technical J
+%V 62
+%N 8, part 2
+%P 1649-1672
+%O October
+
+%A Grasser, A.C.
+%D 1981
+%T Prose comprehension beyond the word
+%I Springer-Verlag
+%C New York, NY
+
+%A Gray, R.M.
+%A Kieffer, J.C.
+%A Linde, Y.
+%D 1980
+%T Locally optimal block quantizer design
+%J Information and Control
+%V 45
+%P 178-198
+%K *
+
+%A Gray, R.M.
+%D 1984
+%T Hardware realization of waveform vector quantizers
+%J IEEE Trans
+%V SAC-2
+%N 2
+
+%A Green, M.
+%D 1982
+%T Towards a user interface prototyping system
+%J Proc Graphics Interface 82
+%P 37-45
+%K *
+
+%A Greenberg, S.
+%D 1984
+%T User modeling in interactive computer systems
+%R MSc Thesis
+%I Computer Science Department, University of Calgary
+
+%A Greenberg, S.
+%A Witten, I.H.
+%D 1984
+%T Comparison of menu displays for ordered lists
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 464-469
+%O May
+%K KConference
+
+%A Greenberg, S.
+%A Witten, I.H.
+%D 1985
+%T Adaptive personalized interfaces -- a question of viability
+%J Behaviour and Information Technology
+%V 4
+%N 1
+%P 31-45
+%O January-March
+%K KJournal
+
+%A Greenberg, S.
+%A Witten, I.H.
+%D 1985
+%T Interactive end-user creation of workbench hierarchies within a window system
+%J Proc Canadian Information Processing Society Conference
+%C Montreal, QUE
+%P 408-416
+%O May
+%K KConference
+
+%A Greenberg, S.
+%A Peterson, M.
+%A Witten, I.H.
+%D 1986
+%T Issues and experiences in the design of a window management system
+%J Proc Canadian Information Processing Society Conference
+%C Edmonton, AL
+%P 33-44
+%K KConference
+
+%A Grice, H.P.
+%D 1957
+%T Meaning
+%J Philosophical Review
+%V LXVI
+%N 3
+%P 377-388
+%K *
+
+%A Grice, H.P.
+%D 1969
+%T Utterer's meaning and intentions
+%J Philosophical Review
+%V LXXVIII
+%N 2
+%P 147-177
+%K *
+
+%A Grossner, C.P.
+%A Radhakrishnan, T.
+%A Pospiech, A.
+%D 1983
+%T An integrated workstation for the visually handicapped
+%J IEEE Micro
+%P 8-16
+%O June
+%K *
+
+%A Gullichsen, E.
+%A Chang, E.
+%D 1985
+%T Generative design in architecture using an expert system
+%R Research Report
+%I Computer Science Department, University of Victoria
+%O February
+%K *
+
+%A Hagelbarger, D.W.
+%A Thompson, R.A.
+%D 1983
+%T Experiments in teleterminal design
+%J IEEE Spectrum
+%P 40-45
+%O October
+%K *
+
+%A Halbert, D.C.
+%D 1984
+%T Programming by example
+%R Technical Report
+%I Xerox PARC, (Office Products Division)
+%C Palo Alto, CA
+%O December
+
+%A Hammond, P.
+%A Sergot, M.
+%D 1983
+%T A Prolog shell for logic based expert systems
+%J Proc Expert Systems 83
+%I Churchill College
+%C Cambridge, England
+%P 95-104
+%O December
+%K *
+
+%A Hammond, P.
+%D 1984
+%T Representation of DHSS regulations as a logic program
+%J Proc Expert Systems 83
+%I Churchill College
+%C Cambridge, England
+%P 225-235
+%O December
+%K *
+
+%A Hanson, S.J.
+%A Kraut, R.E.
+%A Farber, J.M.
+%D 1984
+%T Interface design and multivariate analysis of UNIX command use
+%J ACM Trans Office Information Systems
+%V 2
+%N 1
+%O March
+
+%A Harrison, A.F.
+%A Bramson, R.M.
+%T The art of thinking
+%I Berkley Books
+%C New York, NY
+%K *
+
+%A Harth, E.
+%D 1982
+%T Windows on the mind
+%I Harvester Press
+%C Brighton, Sussex
+
+%A Hartigan, J.A.
+%D 1975
+%T Clustering algorithms
+%I Wiley
+
+%A Hartley, J.
+%D 1978
+%T Designing instructional text
+%I Kogan Page
+%C London, England
+
+%A Hartley, J.
+%D 1982
+%T Designing instructional text
+%E D.H. Jonassen
+%B The technology of text
+%I Educational Technology Publications
+%C Englewood Cliffs, NJ
+
+%A Hasling, D.W.
+%A Clancey, W.J.
+%A Rennels, G.
+%D 1984
+%T Strategic explanations for a diagnostic consultation system
+%J IJMMS
+%V 20
+%P 3-19
+%K *
+
+%A Haugeland, J.
+%D 1979
+%T Understanding natural language
+%V LXXVI
+%N 11
+%P 619-632
+%O November
+%K *
+
+%A Hayes, P.
+%T The naive physics manifesto
+%K *
+
+%A Hayes, P.J.
+%A Ball, E.
+%A Reddy, R.
+%D 1983
+%T Breaking the man-machine communication barrier
+%J IEEE Computer
+%P 19-30
+%O March
+%K *
+
+%A Hayes, P.J.
+%D 1984
+%T Executable interface definitions using form-based interface abstractions
+%R Report CMS-CS-84-110
+%I Computer Science Department, Carnegie-Mellon University
+%K *
+
+%A Hayes, P.J.
+%A Szekely, P.A.
+%A Lerner, R.A.
+%D 1985
+%T Design alternatives for user interface management systems based on experience with Cousin
+%J Proc Human Factors in Computer Systems
+%C San Francisco, CA
+%P 169-175
+%O April
+%K *
+
+%A Hayes, P.J.
+%A Lerner, R.A.
+%A Szekely, P.A.
+%T The COUSIN user interface project
+%K *
+
+%A Hayes-Roth, F.
+%D 1985
+%T Rule-based systems
+%J Comm ACM
+%V 28
+%N 9
+%P 921-932
+%O September
+%K *
+
+%A Hays, D.G.
+%D 1964
+%T Dependency theory -- a formalism and some observations
+%J Language
+%V 40
+%P 511-25
+
+%A Heath, F.G.
+%A Foulk, P.W.
+%A Li, D.Y.
+%D 1984
+%T Analysis and restructuring of concurrent systems using Prolog
+%J Proc IEEE Part E
+%V 131
+%N 5
+%P 169-176
+%O September
+%K *
+
+%A Heckbert, P.
+%D 1982
+%T Color image quantization for frame buffer display
+%J Proc SIGGRAPH 82
+%C Boston, MA
+%P 297-307
+%O July
+%K *
+
+%A Held, G.
+%D 1984
+%T Data compression: techniques and applications
+%I Wiley
+%C New York, NY
+
+%A Hendrix, G.G
+%A Sacerdoti, E.D.
+%A Sagalowicz, D.
+%A Slocum, J.
+%D 1978
+%T Developing a natural language interface to complex data
+%J ACM Trans Database Systems
+%V 3
+%N 2
+%O June
+
+%A Hester, J.H.
+%A Hirschberg, D.S.
+%D 1985
+%T Self-organizing linear search
+%J Computing Surveys
+%V 17
+%N 3
+%P 295-311
+%O September
+
+%A Hewitt, C.
+%D 1977
+%T Viewing control structures as patterns of passing messages
+%J Artificial Intelligence
+%V 8
+%P 323-364
+
+%A Hewitt, C.
+%A de\|Jong, P.S.
+%D 1982
+%T Open systems
+%R AI Memo 691
+%I MIT Artificial Intelligence Laboratory
+%O December
+%K *
+
+%A Hewitt, C.
+%A de\|Jong, P.S.
+%D 1983
+%T Analyzing the roles of descriptions and actions in open systems
+%R AI Memo 727
+%I MIT Artificial Intelligence Laboratory
+%O April
+%K *
+
+%A Hewitt, C.
+%A de\|Jong, P.S.
+%D 1983
+%T Message passing semantics as a foundation for reasoning in open systems
+%R Research Report
+%I MIT Artificial Intelligence Laboratory
+%O May
+%K *
+
+%A Hibbard, P.
+%D 1983
+%T User manual for MINT -- the SPICE document preparation system
+%R Technical Report
+%I Computer Science Department, Carnegie-Mellon University
+%C Pittsburgh, PA
+
+%A Hilbert, D.
+%D 1891
+%T Ueber die stetige Abbildung einer Linie auf ein Flachenstuck
+%J Math Annalen
+%V 38
+%P 459-460
+%K *
+
+%A Hill, D.R.
+%A Dohrn, C.
+%A Darragh, J.
+%A Esau, R.
+%A Levinson, D.
+%A Unger, B.
+%A Witten, I.H.
+%D 1984
+%T Using speech output as a medium for human-computer dialogue
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 470-476
+%O May
+%K KConference
+
+%A Hill, D.R.
+%A Witten, I.H.
+%A Neal, R.
+%A Lomow, G.
+%D 1984
+%T Jecl and Hide: practical questions for the Jade user interface
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 373-380
+%O May
+%K KConference
+
+%A Hiltz, S.R.
+%A Turoff, M.
+%D 1985
+%T Structuring computer-mediated communication systems to avoid information overload
+%J CACM
+%V 28
+%N 7
+%P 680-689
+%O July
+
+%A Hintikka, K.J.
+%D 1975
+%T The intentions of intentionality
+%I D. Reidel
+%C Dordrecht, Holland
+
+%A Ho, C.S.
+%A Hong, Y.C.
+%A Kuo, T.S.
+%D 1986
+%T A society model for office information systems
+%J ACM Trans Office Information Systems
+%V 4
+%N 2
+%P 104-137
+%O April
+%K *
+
+%A Horspool, R.N.
+%A Cormack, G.V.
+%D 1984
+%T A general-purpose data compression technique with practical computer applications
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 138-141
+%O May
+%K *
+
+%A Horspool, R.N.
+%A Cormack, G.V.
+%D 1985
+%T Comments on `Data compression using static Huffman code-decode tables'
+%O submitted to CACM, November 1985
+%K *
+
+%A Horspool, R.N.
+%A Cormack, G.V.
+%D 1986
+%T Dynamic Markov modelling -- a prediction technique
+%J Proc International Conference on the System Sciences
+%C Honolulu, HA
+%O January
+%K *
+
+%A Hosticka, B.J.
+%D 1985
+%T Performance comparison of analog and digital circuits
+%J Proc IEEE
+%V 73
+%N 1
+%P 25-29
+%O January
+
+%A Hou, H.S.
+%A Andrews, H.C.
+%D 1978
+%T Cubic splines for image interpolation and digital filtering
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V ASSP-26
+%N 6
+%P 508-517
+%O December
+%K *
+
+%A Hovy, E.H.
+%T Integrating text planning and production in generation
+%J Proc IJCAI
+%P 848-851
+%K *
+
+%A Hunter, R.
+%A Robinson, A.H.
+%D 1980
+%T International digital facsimile coding standards
+%J Proc IEEE
+%V 68
+%N 7
+%P 854-867
+%O July
+%K *
+
+%A Hutchings, E.
+%D 1983
+%T The autonomous Viking
+%J Science
+%V 219
+%P 803-808
+%O February 18
+
+%A Jackendoff, R.
+%D 1985
+%T Semantics and cognition
+%I MIT Press
+%C Cambridge, MA
+
+%A Jakobsson, M.
+%D 1985
+%T Compression of character strings by an adaptive dictionary
+%J BIT
+%V 25
+%N 4
+%P 593-603
+%K *
+
+%A Jantsch, E.
+%D 1981
+%T Autopoiesis: a central aspect of dissipative self-organization
+%E M.Zeleny
+%B Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York, NY
+%P 65-88
+
+%A Jarvis, J.F.
+%D 1984
+%T Robotics
+%J IEEE Computer
+%P 283-292
+%O October
+%K *
+
+%A Jarvis, R.A.
+%D 1983
+%T Growing polyhedral obstacles for planning collision-free paths
+%J Australian Computer J
+%V 15
+%N 3
+%P 103-111
+%O August
+%K *
+
+%A Jaynes, J.
+%D 1976
+%T The origin of consciousness in the breakdown of the bicameral mind
+%I Houghton Mifflin
+%C Boston, MA
+
+%A Jefferson, D.R.
+%D 1985
+%T Virtual time
+%J ACM Trans Programming Languages and Systems
+%V 7
+%N 3
+%P 404-425
+%O July
+%K *
+
+%A Johnson, W.L.
+%A Soloway, E.
+%A Cutler, B.
+%A Draper, S.W.
+%D 1983
+%T Bug catalogue: I
+%R Research Report
+%I Cognition and Programming Project, Computer Science Department, Yale University
+%O October
+%K *
+
+%A Jones, H.
+%D 1976
+%T Stanley Morison displayed
+%I Frederick Muller
+%C London, England
+
+%A Jones, L.P.
+%A Iyengar, S.S.
+%D 1984
+%T Space and time efficient virtual quadtrees
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-6
+%N 2
+%P 244-247
+%O March
+%K *
+
+%A Kaczmarek, T.
+%A Mark, W.
+%A Sondheimer, N.
+%D 1983
+%T The Consul/CUE interface: an integrated interactive environment
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 98-102
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Kaehler, T.
+%A Patterson, D.
+%D 1986
+%T A taste of Smalltalk
+%I W.W. Norton
+%C New York, NY
+
+%A Kang, A.N.C.
+%A Lee, R.C.T.
+%A Chang, C-L.
+%A Chang, S-K.
+%D 1977
+%T Storage reduction through minimal spanning trees and spanning forests
+%J IEEE Trans Computers
+%V C-26
+%N 5
+%P 425-434
+%O May
+%K *
+
+%A Kawaguchi, E.
+%A Endo, T.
+%D 1980
+%T On a method of binary-picture representation and its application to data compression
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-2
+%N 1
+%P 27-35
+%O January
+%K *
+
+%A Kawaguchi, E.
+%A Endo, T.
+%A Matsunaga, J.I.
+%D 1983
+%T Depth-first picture expression viewed from digital picture processing
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-5
+%N 4
+%P 373-384
+%O July
+%K *
+
+%A Kelley, J.F.
+%A Chapanis, A.
+%D 1982
+%T How professional persons keep their calendars: implications for computerization
+%J J Occupational Psychology
+%V 55
+%P 241-256
+%K *
+
+%A Kennedy, H.C.\0(Editor)
+%D 1980
+%T Selected works of Guiseppe Peano
+%I Allen and Unwin
+%C Winchester, MA
+
+%A Keye, M.
+%D 1984
+%T Technique for real time pitch period estimation
+%R Submitted to \fIElectronics Letters\fP
+%K *
+
+%A Kidd, A.L.
+%A Cooper, M.B.
+%D 1985
+%T Man-machine interface issues in the construction and use of an expert system
+%J IJMMS
+%V 22
+%P 91-102
+%K *
+
+%A Kigger, J.
+%D 1984
+%T The depth/breadth trade-off in the design of menu-driven user interfaces
+%J IJMMS
+%V 20
+
+%A Klir, G.J.
+%A Parviz, B.
+%D 1985
+%T General reconstruction characteristics of probabilistic and possibilistic systems
+%R Research Report
+%K *
+
+%A Knuth, D.E.
+%A Plass, M.F.
+%D 1981
+%T Breaking paragraphs into lines
+%J Software -- Practice and Experience
+%V 11
+%P 1119-1184
+
+%A Knuth, D.E.
+%D 1983
+%T The WEB system of structured documentation
+%R Report STAN-CS-83-980
+%I Computer Science Department, University of Stanford
+%C Stanford, CA
+
+%A Knuth, D.E.
+%D 1984
+%T Literate programming
+%J Computer J
+%V 27
+%N 2
+%P 97-111
+%K *
+
+%A Kolata, G.
+%D 1986
+%T Shakespeare's new poem: an ode to statistics
+%J Science
+%V 231
+%P 335-336
+%O 24 January
+
+%A Kolodner, J.
+%D 1983
+%T Towards an understanding of the role of experience from novice to expert
+%J IJMMS
+%V 19
+%K *
+
+%A Kolodner, J.L.
+%D 1983
+%T Reconstructive memory: a computer model
+%J Cognitive Science
+%V 7
+%P 281-328
+%K *
+
+%A Kolodner, J.L.
+%D 1983
+%T Maintaining organization in a dynamic long-term memory
+%J Cognitive Science
+%V 7
+%P 243-280
+%K *
+
+%A Konopasek, M.
+%A Jayaraman, S.
+%D 1984
+%T Expert systems for personal computers: the TK!Solver approach
+%J Byte
+%P 137-156
+%O May
+%K *
+
+%A Koontz, H.
+%A O'Donnell, C.
+%D 1972
+%T Principles of management: an analysis of managerial functions
+%I McGraw Hill
+
+%A Korein, J.
+%A Badler, N.
+%D 1983
+%T Temporal anti-aliasing in computer generated animation
+%J Computer Graphics
+%V 17
+%N 3
+%P 377-388
+%O July
+%K *
+
+%A Kornfeld, W.A.
+%A Hewitt, C.E.
+%D 1981
+%T The scientific community metaphor
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-11
+%N 1
+%P 24-33
+%O January
+%K *
+
+%A Kowalski, R.
+%D 1983
+%T Logic for expert systems
+%J Proc Expert Systems 83
+%I Churchill College
+%C Cambridge, England
+%P 80-93
+%O December
+%K *
+
+%A Kraut, R.E.
+%A Hanson, S.J.
+%A Farber, J.M.
+%D 1983
+%T Command use and interface design
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 120-123
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Klir, G.J.
+%D 1985
+%T Architecture of systems problem solving
+%I Plenum Press
+%C New York, NY
+
+%A Kunin, J.S.
+%D 1982
+%T Analysis and specification of office procedures
+%R PhD Thesis
+%I Department of Electrical Engineering and Computer Science, MIT
+%O February
+
+%A Lamb, M.
+%A Buckley, V.
+%D 1984
+%T New techniques for gesture-based dialogue
+%J Proc 1st IFIP Conference on Human-Computer Interaction
+%C London, England
+%O 4-7 September
+%K *
+
+%A Langdon, G.G
+%D 1981
+%T Tutorial on arithmetic coding
+%R Research Report RJ3128
+%I IBM Research Laboratory
+%C San Jose, CA
+%K *
+
+%A Langdon, G.G
+%D 1984
+%T An introduction to arithmetic coding
+%J IBM J Research and Development
+%V 28
+%N 2
+%P 135-149
+%O March
+%K *
+
+%A Langdon, G.G
+%D 1983
+%T A note on the Ziv-Lempel model for compressing individual sequences
+%J IEEE Trans Information Theory
+%V IT-30
+%P 284-287
+%O March
+%K *
+
+%A Langdon, G.G.
+%A Rissanen, J.J.
+%D 1983
+%T A doubly-adaptive file compression algorithm
+%J IEEE Trans Communications
+%V COM-31
+%N 11
+%P 1253-1255
+%O November
+%K *
+
+%A Langdon, G.G.
+%A Rissanen, J.J.
+%D 1982
+%T A simple general binary source code
+%J IEEE Trans Information Theory
+%V IT-28
+%P 800-803
+%O September
+
+%A Langley, P.
+%D 1983
+%T Learning search strategies through discrimination
+%J IJMMS
+%V 18
+%P 513-541
+%K *
+
+%A Lansky, A.L.
+%D 1985
+%T Behavioral planning for multi-agent domains
+%R NSF Proposal
+%I SRI International
+%K *
+
+%A Latremouille, S.
+%A Lee, E.
+%D 1981
+%T The design of videotex tree indexes: the use of descriptors and the enhancement of single index pages
+%J Telidon Behavioural Research
+%V 2
+%I Department of Communications
+%O May
+
+%A Lauer, H.C.
+%A Needham, R.M.
+%D 1977
+%T On the duality of operating system structures
+%J Operating Systems: Theory and Practice
+%K *
+
+%A Lazowska, E.D.
+%A Levy, H.M.
+%A Almes, G.T.
+%A Fischer, M.J.
+%A Fowler, R.J.
+%A Vestal, S.C.
+%D 1981
+%T The architecture of the Eden system
+%J Proc Eighth Symposium on Operating System Principles
+%P 148-159
+%C Pacific Grove, CA
+%O December
+%K *
+
+%A Lebowitz, M.
+%D 1980
+%T Generalization and memory in an integrated understanding system
+%R PhD Thesis
+%I Yale University
+%C New Haven, CT
+
+%A Lebowitz, M.
+%D 1981
+%T The nature of generalization in understanding
+%J Proc IJCAI 81
+%P 348-353
+%K *
+
+%A Lebowitz, M.
+%D 1983
+%T Generalization from natural language text
+%J Cognitive Science
+%V 7
+%P 1-40
+%K *
+
+%A Lee, A.
+%A Lochovsky, F.H.
+%D 1983
+%T Enhancing the usability of an office information system through direct manipulation
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 130-134
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Lee, D.T.
+%D 1982
+%T On \fIk\fP-nearest neighbor Voroni diagrams in the plane
+%J IEEE Trans Computers
+%V C-31
+%N 6
+%P 478-487
+%O June
+%K *
+
+%A Lee, D.T.
+%A Preparata, F.P.
+%D 1984
+%T Computational geometry -- a survey
+%J IEEE Trans Computers
+%V C-33
+%N 12
+%P 1072-1101
+%O December
+
+%A Lefebvre, V.A.
+%D 1977
+%T The structure of awareness
+%I Sage Publications
+%C Beverly Hills, CA
+%O (english translation by A.Rapoport)
+
+%A Lehar, A.F.
+%A Stevens, R.J.
+%D 1984
+%T High-speed manipulation of the color chromaticity of digital images
+%J IEEE Computer Graphics and Applications
+%P 34-39
+%O February
+%K *
+
+%A Lehnert, W.G.
+%D 1977
+%T A conceptual theory of question answering
+%J Proc International Joint Conference on Artificial Intelligence
+%I MIT
+%C Cambridge, MA
+%P 158-164
+%O August
+
+%A Lehnert, W.G.
+%D 1978
+%T The process of question answering
+%I Lawrence Erlbaum Associates
+%C Hillsdale, NJ
+%K *
+
+%A Lehnert, W.G.
+%A Dyer, M.G.
+%A Johnson, P.N.
+%A Yang, C.J.
+%A Harley, S.
+%D 1983
+%T BORIS: an experiment in in-depth understanding of narratives
+%J Artificial Intelligence
+%V 20
+%P 15-62
+%K *
+
+%A Lemer, L.
+%D 1974
+%T A.R.T.H.U.R. The life and opinions of a digital computer
+%I Harvester Press
+%C Sussex, England
+
+%A Lempel, A.
+%A Ziv, J.
+%T Compression of two-dimensional data
+%K *
+
+%A Lenat, D.
+%D 1983
+%T The role of heuristics in learning by discovery: three case studies
+%B Machine learning
+%E R.S. Michalski, J.G. Carbonell, and T.M. Mitchell
+%I Tioga
+%P 243-306
+
+%A Lenat, D.B.
+%A Sutherland, W.R.
+%A Gibbons, J.
+%D 1982
+%T Heuristic search for new microcircuit structures: an application of artificial intelligence
+%J AI Magazine
+%P 17-33
+%O Summer
+%K *
+
+%A Lenat, D.B.
+%D 1983
+%T EURISKO: a program that learns new heuristics and domain concepts
+%J Artificial Intelligence
+%V 21
+%P 61-98
+%K *
+
+%A Lenat, D.B.
+%A Brown, J.S.
+%D 1984
+%T Why AM and EURISKO appear to work
+%J Artificial Intelligence
+%V 23
+%P 269-294
+
+%A Lenat, D.B.
+%A Prakesh, M.
+%A Shepherd, M.
+%D 1986
+%T CYC: using common sense knowledge to overcome brittleness and knowledge acquisition bottlenecks
+%J The AI Magazine
+%P 65-85
+%O Winter
+%K *
+
+%A Lewis, J.
+%D 1963
+%T Typography: basic principles.  Influences and trends since the 19th century
+%I Van Nostrand Reinhold
+%C New York, NY
+
+%A Lewis, J.W.
+%D 1983
+%T An effective graphics user interface for rules
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 139-143
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Lewis, J.M.
+%T Analysing the action of UNIX-users
+%D 1986
+%O March
+%I University of Edinburgh, Department of Artificial Intelligence
+%K *
+
+%A Li, D.Y.
+%A Heath, F.G.
+%D 1983
+%T ILEX: an intelligent relational database system
+%J Proc ACM Conference on Personal and Small Computers
+%C San Diego, CA
+%P 245-252
+%O December
+%K *
+
+%A Liang, F.M.
+%D 1983
+%T Word hy-phen-a-tion by com-put-er
+%R PhD Thesis
+%I Computer Science Department, Stanford University
+%C Stanford, CA
+%K *
+
+%A Lieberman, H.
+%D 1978
+%T How to color in a coloring book
+%J Proc SIGGRAPH 78
+%P 111-116
+%K *
+
+%A Lieberman, H.
+%D 1984
+%T Seeing what your programs are doing
+%J IJMMS
+%V 21
+%N 4
+%P 311-331
+%O October
+
+%A Linde, Y.
+%A Buzo, A.
+%A Gray, R.M.
+%D 1980
+%T An algorithm for vector quantizer design
+%J IEEE Trans Communications
+%V COM-28
+%N 1
+%P 84-95
+%O January
+%K *
+
+%A Linington, P.F.
+%D 1983
+%T Fundamentals of the layer service definitions and protocol specifications
+%J Proc IEEE
+%V 71
+%N 12
+%P 1341-1345
+%O December
+
+%A Ljolje, A.
+%A Fallside, F.
+%D 1986
+%T Synthesis of natural sounding pitch contours in isolated utterances using hidden Markov models
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V ASSP-34
+%N 5
+%P 1074-1079
+%O October
+%K *
+
+%A Lloyd, J.W.
+%D 1984
+%T Foundations of logic programming
+%I Springer-Verlag
+%C Berlin
+
+%A Lowrance, R.
+%A Wagner, R.A.
+%D 1975
+%T An extension of the string-to-string correction problem
+%J J ACM
+%V 22
+%N 2
+%P 177-183
+%O April
+%K *
+
+%A Lozano-Perez, T.
+%A Wesley, M.A.
+%D 1979
+%T An algorithm for planning collision-free paths among polyhedral obstacles
+%J Comm ACM
+%V 22
+%N 10
+%P 560-570
+%O October
+%K *
+
+%A Lozano-Perez, T.
+%D 1981
+%T Automatic planning of manipulator transfer movements
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-11
+%N 10
+%P 681-698
+%O October
+
+%A Lozano-Perez, T.
+%D 1983
+%T Robot programming
+%J Proc IEEE
+%V 71
+%N 7
+%P 821-841
+%O July
+
+%A Lu, M.I.
+%A Chen, C.F.
+%T Modified Huffman code
+%R Research Report
+%I Departmental of Electrical Engineering, Tatung Institute of Technology
+%C Taipei, Taiwan
+%K *
+
+%A Lynch, T.J.
+%D 1985
+%T Data compression -- techniques and applications
+%I Lifetime Learning Publications
+%C Belmont, CA
+
+%A MacMillan, S.A.
+%D 1984
+%T User models to personalize an intelligent agent
+%R PhD Thesis
+%I Stanford University
+
+%A MacQueen, J.B.
+%D 1967
+%T Some methods for classification and analysis of multivariate observations
+%J Proc 5th Berkeley Symposium on Mathematical Statistics and Probability
+%V 1
+%P 281-297
+
+%A Maguire, M.
+%D 1982
+%T An evaluation of published recommendations on the design of man-computer dialogues
+%J IJMMS
+%V 16
+%N 3
+%P 237-261
+%O April
+
+%A Malcolm, M.
+%A Dyment, D.
+%D 1983
+%T Experience designing the Waterloo Port user interface
+%J Proc ACM Conference on Personal and Small Computers
+%C San Diego, CA
+%P 168-175
+%O December
+%K *
+
+%A Mannos, J.L.
+%A Sakrison, D.J.
+%D 1974
+%T The effects of a visual fidelity criterion on the encoding of images
+%J IEEE Trans Information Theory
+%V IT-20
+%N 4
+%O July
+%K *
+
+%A Mantei, M.
+%D 1982
+%T Disorientation behavior in person-computer interactions
+%R PhD Thesis
+%I University of Southern California
+%C Los Angeles, CA
+
+%A Maragos, P.A.
+%A Schafer, R.W.
+%A Mersereau, R.M.
+%D 1984
+%T Two-dimensional linear prediction and its application to adaptive predictive coding of images
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V ASSP-32
+%N 6
+%P 1213-1229
+%O December
+%K *
+
+%A Marchetti, C.
+%D 1980
+%T Society as a learning system: discovery, invention, and innovation cycles revisited
+%J Technological Forecasting and Social Change
+%V 18
+%P 267-282
+%K *
+
+%A Martin, T.
+%D 1980
+%T Information retrieval
+%B Human interaction with computers
+%E Smith and Green
+%I Academic Press
+%C London, England
+%P 161-175
+
+%A Maslow, A.H.
+%D 1954
+%T Motivation and personality
+%I Harper and Row
+%C New York, NY
+
+%A Maslow, A.H.
+%D 1968
+%T Toward a psychology of being
+%I Van Nostrand Reinhold
+%C New York, NY
+%O second edition
+
+%A Masrani, R.
+%A Keenan, T.P.
+%D 1984
+%T Security and privacy in cellular telephone systems
+%J Proc AFIPS Conference on Computer Security
+%C Toronto, ON
+%O September
+%K *
+
+%A Masrani, R.
+%A Witten, I.H.
+%D 1984
+%T Natural language processing in object-oriented Prolog
+%R Unpublished note
+%O September
+
+%A Mathews, M.V.
+%D 1969
+%T The technology of computer music
+%I MIT Press
+
+%A Maturana, H.R.
+%D 1975
+%T The organization of the living: a theory of the living organization
+%J IJMMS
+%V 7
+%P 313-332
+
+%A Maturana, H.R.
+%A Varela, F.J.
+%D 1980
+%T Autopoiesis and cognition
+%I D. Reidel
+%C Dordrecht, Holland
+
+%A Mazer, M.S.
+%A Lochovsky, F.H.
+%D 1984
+%T Logical routing specification in office information systems
+%J ACM Trans Office Information Systems
+%V 2
+%N 4
+%P 303-330
+%O October
+
+%A McCarthy, J.
+%D 1980
+%T Circumscription -- a form of non-monotonic reasoning
+%J Artificial Intelligence
+%V 13
+%P 27-39
+%K *
+
+%A McCracken, D.L.
+%A Akscyn, R.M.
+%D 1984
+%T Experience with the ZOG human-computer interface system
+%J IJMMS
+%V 21
+%N 4
+%P 293-310
+%O October
+
+%A McCulloch, W.S.
+%D 1954
+%T Through the den of the metaphysician
+%J British J Philosophy of Science
+%V 5
+%P 18-31
+
+%A McDermott, J.
+%A Steele, B.
+%D 1981
+%T Extending a knowledge-based system to deal with ad hoc constraints
+%J Proc 7th International Joint Conference on Artificial Intelligence
+%P 824-828
+
+%A McDermott, J.
+%T Artificial intelligence meets natural stupidity
+%B Mind Design
+%E J. Haugeland
+%I MIT Press
+%C Cambridge, MA
+%P 143-160
+%K *
+
+%A McDermott, J.
+%D 1982
+%T A temporal logic for reasoning about processes and plans
+%J Cognitive Science
+%V 6
+%P 101-155
+%K *
+
+%A McDonald, D.
+%D 1977
+%T Language generation: the linguistics component
+%J Proc International Joint Conference on Artificial Intelligence
+%P 142
+%K *
+
+%A McDonald, D.D.
+%A Pustejovsky, J.D.
+%D 1985
+%T Description-directed natural language generation
+%J Proc IJCAI
+%P 799-805
+%K *
+
+%A McKeown, K.R.
+%A Wish, M.
+%A Matthews, K.
+%T Tailoring explanations for the user
+%J Proc IJCAI
+%P 794-798
+%K *
+
+%A McLean, R.S.
+%D 1983
+%T Ontario Ministry of Education specifies its microcomputer
+%J Proc 4th Canadian Symposium on Instructional Technology
+%C Winnipeg, MN
+%O October 19-21
+%K *
+
+%A Meehan, J.R.
+%D 1977
+%T TALESPIN, an interactive program that writes stories
+%J Proc 5th International Joint Conference on Artificial Intelligence
+%P 91-98
+
+%A Mervis, C.B.
+%A Rosch, E.
+%D 1981
+%T Categorization of natural objects
+%J Annual Review of Psychology
+%V 32
+%P 89-115
+
+%A Michaelsen, R.H.
+%A Michie, D.
+%A Boulanger, A.
+%D 1985
+%T The technology of expert systems
+%J Byte
+%P 303-312
+%O April
+%K *
+
+%A Miller, P.L.
+%D 1983
+%T ATTENDING: critiquing a physician's management plan
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-5
+%N 5
+%P 449-461
+%O September
+%K *
+
+%A Mitchell, T.M.
+%D 1982
+%T Generalization as search
+%J Artificial Intelligence
+%V 18
+%P 203-226
+%K *
+
+%A Mitchell, T.M.
+%D 1983
+%T Learning and problem solving
+%J Proc IJCAI 83
+%P 1139-1151
+%C Karlsruhe, W.Germany
+%O August
+%K *
+
+%A Moffat, A.
+%D 1986
+%T Predictive text compression based on the future rather than the past
+%R Research Report
+%I Computer Science Department, University of Canterbury
+%C Christchurch, New Zealand
+%K *
+
+%A Moher, T.G.
+%D 1985
+%T Estimating the distribution of software complexity \fIwithin\fP a program
+%J Proc Human Factors in Computer Systems
+%C San Francisco, CA
+%P 61-64
+%O April
+%K *
+
+%A Mooney, R.
+%A de\|Jong, G.
+%T Learning schemata for natural language processing
+%J Proc IJCAI
+%P 681-687
+%K *
+
+%A Morison, S.
+%D 1951
+%T First principles of typography
+%I Cambridge University Press
+%C Cambridge, England
+
+%A Morrin, T.H.
+%D 1974
+%T A black-white representation of a gray-scale picture
+%J IEEE Trans Computers
+%V C-23
+%P 184-186
+%O February
+%K *
+
+%A Morris, R.
+%A Cherry, L.L.
+%D 1975
+%T Computer detection of typographical errors
+%J IEEE Trans Professional Communications
+%V PC-18
+%N 1
+%P 54-56
+%O March
+%K *
+
+%A Morris, R.
+%A Thompson, K.
+%D 1979
+%T Password security: a case history
+%J Comm ACM
+%V 22
+%N 11
+%P 594-597
+%O November
+%K *
+
+%A Moses, J.
+%D 1971
+%T Symbolic integration: the stormy decade
+%J Comm ACM
+%V 14
+%N 8
+%P 548-560
+
+%A Mullen, J.
+%D 1984
+%T Unlimited vocabulary speech synthesis with low data rates
+%J Electronics and Power
+%P 850-852
+%O November/December
+%K *
+
+%A Mycielski, J.
+%D 1985
+%T Can mathematics explain natural intelligence?
+%R Research Report UC-32
+%I Los Alamos National Laboratory
+%C Los Alamos, NM
+%O July
+%K *
+
+%A Mycroft, A.
+%A O'Keefe, R.A.
+%D 1984
+%T A polymorphic type system for Prolog
+%J Artificial Intelligence
+%V 23
+%P 295-307
+%K *
+
+%A Myers, B.A
+%D 1986
+%T Visual programming, programming by example, and program visualization: a taxonomy
+%J Proc ACM CHI 86 Human Factors in Computing Systems
+%P 59-66
+%C Boston, MA
+%O April 13-17
+%K *
+
+%A Nagy, G.
+%A Wagle, S.
+%D 1979
+%T Geographic data processing
+%J Computing Surveys
+%V 11
+%N 2
+%P 139-181
+%O June
+%K *
+
+%A Nagy, G.
+%A Paton, K.
+%D 1982
+%T Intelligent facsimile
+%P Proc Harvard Computer Graphics Week
+%I Graduate School of Design, Harvard University
+%K *
+
+%A Nagy, G.
+%D 1983
+%T Candide's practical principles of experimental pattern recognition
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-5
+%N 2
+%P 199-200
+%O March
+%K *
+
+%A Nagy, G.
+%D 1983
+%T Optical scanning devices
+%J IEEE Computer
+%P 13-24
+%O May
+%K *
+
+%A Nagy, G.
+%A Seth, S.
+%T Hierarchical image representation with application to optically scanned documents
+%R Discussion paper
+%K *
+
+%A Nagy, G.
+%D 1984
+%T Advances in information extraction techniques
+%J Remote Sensing of Environment
+%V 15
+%P 167-175
+%K *
+
+%A Naiman, A.
+%D 1984
+%T Some new ingredients for the cookbook approach to anti-aliased text
+%J Proc Graphics Interface 84
+%I National Computer Graphics Association of Canada
+%P 99-108
+%O May
+
+%A Nakatani, L.H.
+%A Rohrlich, J.A.
+%D 1983
+%T Soft machines: A philosophy of user-computer interface design
+%J Proceedings Human Factors in Computer Systems
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Nasanen, R.
+%D 1984
+%T Visibility of halftone dot textures
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-14
+%N 6
+%P 920-924
+%O November/December
+%K *
+
+%A Nau, D.S.
+%D 1983
+%T Expert computer systems
+%J IEEE Computer
+%V 16
+%N 2
+%P 63-85
+%O February
+
+%A Neal, R.M.
+%A Lomow, G.A.
+%A Peterson, M.W.
+%A Unger, B.W.
+%A Witten, I.H.
+%D 1984
+%T Inter-process communication in a distributed programming environment
+%J Proc Canadian Information Processing Society Conference
+%C Calgary, AL
+%P 361-364
+%O May
+%K KConference
+
+%A Nelson, G.A.
+%A Pfeifer, L.L.
+%A Wood, R.C.
+%D 1972
+%T High-speed octave band digital filtering
+%J IEEE Trans Audio and Electroacoustics
+%V AU-20
+%P 58-65
+%O March
+%K *
+
+%A Niblett, B.\0(Editor)
+%D 1980
+%T Computer science and law
+%I Cambridge University Press
+%C Cambridge, England
+
+%A Nicol, R.C.
+%A Fenn, B.A.
+%A Turkington, R.D.
+%D 1980
+%T Transmission techniques for picture viewdata
+%J Proc International Broadcasting Convention
+%K *
+
+%A Nicholson, R.T.
+%D 1985
+%T Usage patterns in an integrated voice and data communications system
+%J ACM Trans Office Information Systems
+%V 3
+%N 3
+%P 307-314
+%O July
+
+%A Nierstrasz, O.M.
+%D 1985
+%T An object-oriented system
+%E D.Tsichritzis
+%B Office automation
+%I Springer-Verlag
+%C Berlin
+%P 167-189
+
+%A Nilsson, N.J.
+%D 1986
+%T Probabilistic logic
+%J Artificial Intelligence
+%V 28
+%P 71-87
+
+%A Nilsson, N.J.
+%D 1980
+%T Principles of artificial intelligence
+%I Tioga
+%C Palo Alto, CA
+
+%A Nilsson, N.J.
+%D 1980
+%T The interplay between experimental and theoretical methods in artificial intelligence
+%R Technical Note 229
+%I SRI International
+%O September
+%K *
+
+%A Nilsson, N.J.
+%D 1981
+%T Artificial intelligence: engineering, science, or slogan?
+%R Technical Note 248
+%I SRI International
+%O July
+%K *
+
+%A Nix, R.
+%D 1983
+%T Editing by example
+%R PhD Dissertation
+%I Computer Science Department, Yale University
+%C New Haven, CT
+
+%A Nix, R.
+%D 1984
+%T Editing by example
+%J Proc 11th ACM Symposium on Principles of Programming Languages
+%C Salt Lake City, UT
+%P 186-195
+%O January
+
+%A Noakes, P.D.
+%A Aish, R.
+%D 1984
+%T A new peripheral for three-dimensional computer input
+%J IEEE Micro
+%V 4
+%N 5
+%P 26-35
+%O October
+
+%A Nooteboom, S.G.
+%D 1983
+%T The temporal organization of speech and the process of spoken-word recognition
+%J IPO Annual Progress Report
+%V 18
+%P 32-36
+%K *
+
+%A Norman, D.A.
+%D 1981
+%T The trouble about Unix
+%J Datamation
+%V 27
+%N 12
+%P 139-150
+
+%A Norman, D.A.
+%D 1984
+%T Stages and levels in human-machine interaction
+%J IJMMS
+%V 21
+%N 4
+%P 365-375
+%O October
+
+%A Norman, D.A.
+%A Draper, S.W.\0(Editors)
+%D 1986
+%T User centered system design \(em new perspectives on human-computer interaction
+%I Lawrence Erlbaum Associates
+%C Hillsdale, NJ
+
+%A Norman, K.L.
+%A Weldon, L.J.
+%A Shneiderman, B.
+%D 1985
+%T Cognitive representations of windows and multiple screen layouts of computer interfaces
+%R Research Report CAR-TR-123, CS-TR-1498
+%I Computer Science Department, University of Maryland
+%O May
+
+%A Null, A.
+%D 1971
+%T Space-filling curves or how to waste time with a plotter
+%J Software -- Practice and Experience
+%V 1
+%P 403-410
+%K *
+
+%A Oren, T.I.
+%A Brzozowski, J.A.
+%A Gilmore, P.C.
+%D 1982
+%T Crisis in Canadian academic Computer Science: facts and recommendations
+%R Report prepared by the Executive Committee of Canadian Computer Science Departments Chairmen
+%O January
+
+%A O'Shea, T.
+%A Self, J.
+%D 1983
+%T Learning and teaching with computers: artificial intelligence in education
+%I Prentice-Hall
+%C Englewood Cliffs, NJ
+
+%A O'Shea, T.
+%A Eisenstadt, M.\0(Editors)
+%D 1984
+%T Artificial intelligence: tools, techniques, and applications
+%I Harper and Row
+%C New York, NY
+
+%A Ogawa, Y.
+%A Shima, K.
+%A Sugawara, T.
+%A Takagi, S.
+%D 1984
+%T Knowledge representation and inference environment: KRINE -- an approach to integration of frame, Prolog and graphics
+%J Proc International Conference on Fifth Generation Computer Systems
+%I ICOT
+%P 643-651
+%K *
+
+%A Pake, G.E.
+%D 1985
+%T Research at Xerox PARC: a founder's assessment
+%J IEEE Spectrum
+%V 22
+%N 10
+%P 54-61
+%O October
+
+%A Paliwal, K.K.
+%A Espeland, O.
+%D 1983
+%T Some considerations about the shape of the window filter in an adaptive gradient lattice algorithm
+%R Report
+%I Division of Telecommunications, University of Trondheim
+%C Trondheim-NTH, Norway
+%K *
+
+%A Papamichalis, P.E.
+%D 1985
+%T Markov-Huffman coding of LPC parameters
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%C ASSP-33
+%N 2
+%P 451-453
+%O April
+
+%A Park, O.C.
+%A Tennyson, R.D.
+%D 1983
+%T Computer-based instructional systems for adaptive education: a review
+%J Contemporary Education Review
+%V 2
+%N 2
+%P 121-135
+%O Fall
+%K *
+
+%A Parker-Rhodes, A.F.
+%D 1978
+%T Inferential semantics
+%I Harvester Press
+%C Brighton, Sussex
+
+%A Patil, R.S.
+%A Szolovits, P.
+%A Schwartz, W.B.
+%D 1981
+%T Causal understanding of patient illness in medical diagnosis
+%J Proc 7th International Joint Conference on Artificial Intelligence
+%P 893-899
+%K *
+
+%A Patil, R.S.
+%A Szolovits, P.
+%A Schwartz, W.B.
+%T Information acquisition in diagnosis
+%J Proc International Joint Conference on Artificial Intelligence
+%P 345-348
+%K *
+
+%A Patten, T.
+%D 1986
+%T Interpreting systemic grammar as a computational representation: a problem solving approach to text generation
+%R PhD Thesis
+%I University of Edinburgh
+
+%A Paulus, E.
+%D 1980
+%T The concept of the NN-error risk with respect to an arbitrary separating surface and its applications to clustering
+%J Proc IEEE Conference
+%K *
+
+%A Pavlidis, T.
+%D 1981
+%T Contour filling in raster graphics
+%J ACM Computer Graphics
+%V 15
+%N 3
+%P 29-36
+%O August
+%K *
+
+%A Pawlak, Z.
+%D 1982
+%T Rough sets
+%J Int J Computer and Information Systems
+%V 11
+%N 5
+%P 341-356
+%K *
+
+%A Pawlak, Z.
+%D 1985
+%T Rough sets and fuzzy sets
+%J Fuzzy Sets and Systems
+%P 99-103
+%K *
+
+%A Paxton, A.L
+%A Turner, E.J.
+%D 1984
+%T The application of human factors to the needs of the novice computer user
+%J IJMMS
+%V 20
+%N 2
+%P 137-156
+%O February
+
+%A Peano, G.
+%D 1890
+%T Sur une courbe, qui remplit toute une aire plane
+%J Math Annalen
+%V 36
+%P 157-160
+%K *
+
+%A Pearl, J.
+%D 1985
+%T Fusion, propagation, and structuring in Bayesian networks
+%R Technical Report CSD-850022 R-42, Revision I
+%I Cognitive Systems Laboratory, Computer Science Department, UCLA
+%O June
+
+%A Pearl, J.
+%D 1986
+%T Fusion, propagation, and structuring in belief networks
+%J Artificial Intelligence
+%V 29
+%N 3
+%P 241-288
+%O September
+
+%A Peng, X.T.
+%A Tu, X.C.
+%A Wang, P.Z.
+%D 1986
+%T Studies on parametric fuzzy controllers
+%R Research Report
+%K *
+
+%A Pereiro, L.M.
+%A Nagr, R.
+%D 1984
+%T Delta-Prolog: a distributed logic programming language
+%R Submitted to Int Conference on 5th Generation Systems
+%C Tokyo, Japan
+%O November 
+%K *
+
+%A Perlman, G.
+%D 1981
+%T Two papers in cognitive engineering: The design of an interface to a programming system, and MENUNIX: a menu-based interface to Unix (user manual)
+%R Research Report 8105
+%I Center for Human Information Processing, University of California
+%C San Diego, CA
+%O November
+%K *
+
+%A Perlman, G.
+%D 1984
+%T Natural artificial languages: low-level processes
+%J IJMMS
+%V 20
+%N 4
+%P 373-419
+%O April
+
+%A Perry, T.S.
+%A Wallich, P.
+%D 1985
+%T Inside the PARC: the `information architects'
+%J IEEE Spectrum
+%V 22
+%N 10
+%P 62-75
+%O October
+
+%A Peters, A.M.
+%D 1983
+%T The units of language acquisition
+%I Cambridge University Press
+%C Cambridge, England
+
+%A Phillips, J.
+%D 1983
+%T Self-describing programming environments
+%R PhD Thesis
+%I Computer Science Department, Stanford University
+%C Stanford, CA
+
+%A Pierce, J.R.
+%D 1962
+%T Symbols, signals and noise
+%I Hutchinson
+%C London, England
+
+%A Pike, R.
+%D 1983
+%T Graphics in overlapping bitmap layers
+%J ACM Trans Graphics
+%V 2
+%N 2
+%P 135-160
+%O April
+%K *
+
+%A Poggio, A.
+%A Garcia Luna Aceves, J.J.
+%A Craighill, E.J.
+%A Moran, D.
+%A Aguilar, L.
+%A Worthington, D.
+%A Hight, J.
+%D 1985
+%T CCWS: a computer-based, multimedia information system
+%J IEEE Computer
+%V 18
+%N 10
+%P 92-103
+%O October
+
+%A Poritz, A.B.
+%D 1982
+%T Linear predictive hidden Markov models and the speech signal
+%J Proc 
+%P 1291-1294
+%K *
+
+%A Post, E.
+%D 1983
+%T Real programmers don't use Pascal
+%J Datamation
+%P 263-265
+%O July
+%K *
+
+%A Postel, J.B.
+%D 1980
+%T Internetwork protocol approaches
+%J IEEE Trans Communications
+%V COM-28
+%N 4
+%P 604-611
+%O April
+%K *
+
+%A Potmesil, M.
+%A Chakravarty, I.
+%D 1983
+%T Modeling motion blur in computer-generated images
+%J ACM Computer Graphics
+%V 17
+%N 3
+%P 389-399
+%O July
+%K *
+
+%A Poulton, A.S.
+%D 1983
+%T Microcomputer speech synthesis and recognition
+%I Sigma Technical Press
+%C Wilmslow, Cheshire, UK
+
+%A Preucil, M.
+%A Sebela, Z.
+%D 1982
+%T Computer-assisted simulation of a coal-mine winding system
+%J Proc 4th Formator Symposium on Mathematical Methods for the Analysis of Large-scale Systems
+%C Prague
+%P 391-404
+%O May 18-21
+%K *
+
+%A Prusinkiewicz, P.
+%A Christopher, M.
+%D 1984
+%T Hologram-like transmission of pictures
+%R Technical Report CS-84-17
+%I Computer Science Department, University of Regina
+%O November
+%K *
+
+%A Purvy, R.
+%A Farrell, J.
+%A Klose, P.
+%D 1983
+%T The design of Star's records processing: data processing for the noncomputer professional
+%J ACM Trans Office Information Systems
+%V 1
+%N 1
+%P 3-24
+%O January
+%K *
+
+%A Quinlan, J.R.
+%D 1983
+%T Inferno: a cautious approach to uncertain inference
+%J Computer J
+%V 26
+%N 3
+%P 255-269
+
+%A Qureshi, S.U.H.
+%D 1985
+%T Adaptive equalization
+%J Proc IEEE
+%V 73
+%N 9
+%P 1349-1387
+%O September
+
+%A Rabiner, L.R.
+%A Crochiere, R.E.
+%D 1975
+%T A novel implementation for narrow-band FIR digital filters
+%J IEEE Trans Acoustics, Speech and Signal Processing
+%V ASSP-23
+%N 5
+%P 457-464
+%O October
+%K *
+
+%A Radhakrishnan, T.
+%A Grossner, C.P.
+%D 1985
+%T Cuenet \(em a distributed computing facility
+%J IEEE Micro
+%P 42-52
+%O February
+%K *
+
+%A Raeder, G.
+%D 1985
+%T A survey of current graphical programming techniques
+%J IEEE Computer
+%V 18
+%N 8
+%P 11-25
+
+%A Rashid, R.F.
+%D 1980
+%T An interprocess communication facility for Unix
+%R Technical Report
+%I Computer Science Department, Carnegie-Mellon University
+%O February
+
+%A Rashid, R.F.
+%A Robertson, G.G.
+%D 1981
+%T Accent: a communication oriented network operating system kernel
+%J Proc Eighth Symposium on Operating System Principles
+%P 64-75
+%C Pacific Grove, CA
+%O December
+
+%A Rasmussen, J.
+%D 1983
+%T Skills, rules, and knowledge; signals, signs, and symbols, and other distinctions in human performance models
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-13
+%N 3
+%P 257-266
+%O May/June
+%K *
+
+%A Rassbach, M.E.
+%D 1980
+%T CLASSY: an adaptive clustering algorithm
+%J Proc IEEE Conference
+%P 442-444
+%K *
+
+%A Rawlings, C.
+%A Fox, J.
+%D 1983
+%T The UNIT package -- a critical appraisal of a frame-based knowledge representation system
+%J Proc Expert Systems 83
+%I Churchill College
+%C Cambridge, England
+%P 15-29
+%O December
+%K *
+
+%A Redell, D.D.
+%A White, J.E.
+%D 1983
+%T Interconnecting electronic mail systems
+%J IEEE Computer
+%V 16
+%N 9
+%P 55-63
+%O September
+%K *
+
+%A Reeds, J.A.
+%A Weinberger, P.J.
+%D 1984
+%T File security and the UNIX system \fIcrypt\fP command
+%J Bell System Technical J
+%V 63
+%N 8, part 2
+%P 1673-1684
+%O October
+
+%A Reichardt, J.
+%D 1971
+%T The computer in art
+%I Studio Vista
+%C London, England
+
+%A Reiter, R.
+%D 1980
+%T A logic for default reasoning
+%J Artificial Intelligence
+%V 13
+%P 81-132
+%K *
+
+%A Reynolds, J.K.
+%A Postel, J.B.
+%A Katz, A.R.
+%A Finn, G.C.
+%A DeSchon, A.L.
+%D 1985
+%T The DARPA experimental multimedia mail system
+%J IEEE Computer
+%V 18
+%N 10
+%P 82-89
+%O October
+
+%A Rich, C.
+%D 1982
+%T Knowledge representation languages and predicate calculus: how to have your cake and eat it too
+%J Proc National Conference on Artificial Intelligence
+%P 193-196
+
+%A Rich, E.
+%D 1984
+%T The gradual expansion of artificial intelligence
+%J IEEE Computer
+%V 17
+%N 5
+%P 4-12
+%O May
+
+%A Riesbeck, C.K.
+%D 1975
+%T Conceptual analysis
+%B Conceptual information processing
+%E R.C.Schank
+%I North Holland
+%C Amsterdam
+
+%A Riesbeck, C.K.
+%D 1981
+%T Failure-driven reminding for incremental learning
+%J Proc IJCAI 81
+%P 115-120
+%K *
+
+%A Riesbeck, C.K.
+%D 1982
+%T Realistic language comprehension
+%E W.G. Lenhert and M.H. Ringle
+%B Strategies for natural language processing
+%I Lawrence Erlbaum Associates
+%P 37-54
+
+%A Riesbeck, C.K.
+%D 1984
+%T Knowledge reorganization and reasoning style
+%J IJMMS
+%V 20
+%P 45-61
+%K *
+
+%A Rissanen, J.
+%A Langdon, G.G.
+%T Arithmetic coding
+%J IBM J Research and Development
+%D 1979
+%V 23
+%N 2
+%P 149-162
+%O March
+%K *
+
+%A Rissanen, J.
+%D 1984
+%T Complexity of strings in the class of Markov sources
+%R Research Report
+%I IBM Research Laboratory
+%C San Jose, CA
+%K *
+
+%A Rissanen, J.
+%D 1986
+%T Stochastic complexity and sufficient statistics
+%R Research Report
+
+%A Ritchie, D.M.
+%D 1981
+%T On the security of UNIX
+%R Programmers Manual for UNIX System III Volume II: Supplementary Documents
+%I Western Electric Corporation
+
+%A Ritchie, G.D.
+%A Hanna, F.K.
+%D 1984
+%T AM: a case study in AI methodology
+%J Artificial Intelligence
+%V 23
+%P 249-268
+%K *
+
+%A Roberts, M.G.
+%D 1982
+%T Local order estimating Markovian analysis for noiseless source coding and authorship identification
+%R PhD Thesis
+%I Stanford University
+
+%A Rogers, H.
+%D 1943
+%T Paragraphs on printing
+%I William E. Rudges
+%C New York, NY
+%O re-published by Dover Publications, New York, 1979
+
+%A Rosenthal, D.S.H.
+%D 1982
+%T Managing graphical resources
+%J Computer Graphics
+%V 16
+%N 4
+%P 38-45
+%O December
+%K *
+
+%A Ross, P.
+%A Jones, J.
+%A Millington, M.
+%D 1985
+%T User modelling in command-driven computer systems
+%R DAI Research Paper No 264
+%I Department of Artificial Intelligence, University of Edinburgh
+%K *
+
+%A Rouse, S.H.
+%A Rouse, W.B.
+%D 1980
+%T Computer-based manuals for procedural information
+%J IEEE Trans Systems, Man and Cybernetics
+%V SMC-10
+%N 8
+%P 506-510
+%O August
+
+%A Rowe, N.C.
+%D 1984
+%T Modelling degrees of item interest for a general database query system
+%J IJMMS
+%V 20
+%N 5
+%P 421-443
+%O May
+%K *
+
+%A Runciman, C.
+%A Thimbleby, H.
+%D 1986
+%T Equal opportunity interactive systems
+%R Report
+%I Computer Science Department, University of York
+%C York 
+%K *
+
+%A Rychener, M.D.
+%D 1979
+%T A semantic network of production rules in a system for describing computer structures
+%J Proc 6th Joint Conference on Artificial Intelligence
+%P 738-743
+
+%A Ryman, R.
+%A Singh, B.
+%D 1982
+%T The Benesh notation computerized editor
+%J Proc Dance in Canada Conference
+%O June
+
+%A Sagan, H.
+%D 1986
+%T Approximating polygons for Lebesgue's and Schoenberg's space filling curves
+%J American Mathematical Monthly
+%P 361-368
+%O May
+%K *
+
+%A Sammut, C.
+%A Banerji, R.
+%D 1983
+%T Hierarchical memories: an aid to concept learning
+%J Proc International Machine Learning Workshop
+%P 74-80
+%I Allerton House
+%C Monticello, IL
+%O June 22-24
+%K *
+
+%A Sammut, C.
+%A Banerji, R.
+%D 1986
+%T Learning concepts by asking questions
+%B Machine learning Volume 2
+%E R.S. Michalski, J.G. Carbonell, and T.M. Mitchell
+%I Morgan Kaufmann Inc
+%C Los Altos, CA
+%P 167-191
+%K *
+
+%A Sandewall, E.
+%T A functional approach to non-monotonic logic
+%J Proc IJCAI
+%P 100-106
+%K *
+
+%A Sakata, S.
+%A Ueda, T.
+%D 1985
+%T A distributed interoffice mail system
+%J IEEE Computer
+%V 18
+%N 10
+%P 106-116
+%O October
+
+%A Samet, H.
+%D 1983
+%T A quadtree medial axis transform
+%J Comm ACM
+%V 26
+%N 9
+%P 680-693
+%O September
+
+%A Samet, H.
+%D 1984
+%T The quadtree and related hierarchical data structures
+%J Computing Surveys
+%V 16
+%N 4
+%P 187-260
+%O June
+
+%A Santisteban, A.
+%D 1983
+%T The perceptual color space of digital image display terminals
+%J IBM J Research and Development
+%V 27
+%N 2
+%P 127-132
+%O March
+%K *
+
+%A Sawaragi, Y.
+%A Yoshikawa
+%D 1970
+%T Discrete-time markovian decision processes with incomplete state observation
+%J The Annals of Mathematical Statistics
+%V 41
+%N 1
+%P 78-86
+%K *
+
+%A Schank, R.C.\0(Editor)
+%D 1975
+%T Conceptual information processing
+%I North Holland
+
+%A Schank, R.C.
+%A Abelson, R.
+%D 1977
+%T Scripts, plans, goals and understanding
+%I Lawrence Erlbaum Associates
+
+%A Schank, R.C.
+%D 1980
+%T Language and memory
+%J Cognitive Science
+%V 4
+%P 243-284
+%K *
+
+%A Schank, R.C.
+%A Slade, S.
+%T Advisory systems
+%K *
+
+%A Scharf, T.F.
+%D 1984
+%T Sounding out speech synthesis
+%J Electronics and Power
+%P 847-849
+%O November/December
+%K *
+
+%A Schroeder, M.E.
+%D 1969
+%T Images from computers
+%J IEEE Spectrum
+%O March
+%K *
+
+%A Schulert, A.J.
+%A Rogers, G.T.
+%A Hamilton, J.A.
+%D 1985
+%T ADM \(em a dialog manager
+%J Proc ACM CHI 85 Human Factors in Computing Systems
+%P 177-183
+%O April
+%K *
+
+%A Searle, J.R.
+%D 1980
+%T Minds, brains, and programs
+%J Behavioral and Brain Sciences
+%V 3
+%P 417-457
+%K *
+
+%A Searle, J.R.
+%D 1983
+%T Intentionality
+%I Cambridge University Press
+%C Cambridge, England
+
+%A Seely\|Brown, J.
+%A Burton, R.R.
+%A Bell, A.G.
+%D 1975
+%T SOPHIE \(em a step toward creating a reactive learning environment
+%J IJMMS
+%V 7
+%N 5
+%P 675-696
+%O September
+
+%A Segre, A.M.
+%A Sherwood, B.A.
+%A Dickerson, W.B.
+%D 1983
+%T An expert system for the production of phoneme strings from unmarked english text using machine induced rules
+%J Proc Association for Computational Linguistics
+%C Pisa, Italy
+%O September
+%K *
+
+%A Selim, S.Z.
+%A Ismail, M.A.
+%D 1984
+%T \fIK\fP-means-type algorithms: a generalized convergence theorem and characterization of local optimality
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-6
+%N 1
+%P 81-87
+%O January
+%K *
+
+%A Sergot, M.
+%T Prospects for representing the law as logic programs
+%B In Clark and Tarnlund's book
+%K *
+
+%A Seybold
+%D 1985
+%T Apple Laserwriter
+%J Seybold Report on Publishing Systems
+%V 14
+%N 9
+%O January 28
+%K *
+
+%A Shafer, G.
+%D 1976
+%T A mathematical theory of evidence
+%I Princeton University Press
+%C Princeton, NJ
+
+%A Shamos, M.I.
+%A Hoey, D.
+%D 1975
+%T Closest-point problems
+%J Proc 16th IEEE Symposium on Foundations of Computer Science
+%P 151-162
+%O October
+
+%A Shamos, M.I.
+%D 1977
+%T Computational geometry
+%I Springer-Verlag
+%C New York, NY
+%A Shannon, C.E.
+%D 1948
+%T A mathematical theory of communication
+%J Bell System Technical J
+%V 27
+%P 398-403
+%O July
+
+%A Shannon, C.E.
+%D 1951
+%T Presentation of a maze-solving machine
+%B Trans 8th Conference Josiah Macy Foundation
+%E H.von Foerster
+%C New York, NY
+%P 173-192
+
+%A Shannon, C.E.
+%D 1951
+%T Prediction and entropy of printed English
+%J Bell System Technical J
+%P 50-64
+%O January
+%K *
+
+%A Shapiro, E.
+%D 1983
+%T A subset of concurrent Prolog and its interpreter
+%R ICOT Technical Report TR-003
+%O January
+%K *
+
+%A Shapiro, E.
+%D 1983
+%T Systems programming in concurrent Prolog
+%R ICOT Technical Report TR-034
+%O November
+%K *
+
+%A Shapiro, E.
+%A Takeuchi, A.
+%D 1983
+%T Object oriented programming in concurrent Prolog
+%J New Generation Computing
+%V 1
+%P 25-48
+%K *
+
+%A Shaw, M.L.G.
+%A Gaines, B.R.
+%D 1983
+%T Does the human component in the network have a protocol?
+%J Proc International Electrical, Electronics Conference
+%V 2
+%P 546-549
+%C Toronto, ON
+%O September 26-28
+%K *
+
+%A Shaw, M.L.G
+%A Gaines, B.R.
+%D 1985
+%T Knowledge engineering tools for expert systems
+%B Computer models for decision making
+%E G.Mitra
+%I North Holland
+%C Amsterdam
+%K *
+
+%A Shneiderman, B.
+%D 1984
+%T Response time and display rate in human performance with computers
+%J Computing Surveys
+%V 16
+%N 3
+%P 265-285
+%O September
+
+%A Shneiderman, B.
+%A Norman, K.
+%A Rogers, J.
+%A Arifin, R.
+%A Weldon, L.
+%D 1985
+%T A multi-screen programmer work station based on the IBM PC
+%R Research Report
+%I Computer Science Department, University of Maryland
+%O April
+
+%A Shoch, J.F.
+%A Hupp, J.A.
+%D 1982
+%T The `worm' programs \(em early experience with a distributed computation
+%J Comm ACM
+%V 25
+%N 3
+%P 172-180
+%O March
+%K *
+
+%A Shoemake, K.
+%T Animating rotation with quaternion curves
+%D 1985
+%J ACM
+%V 19
+%N 3
+%O July
+%K *
+
+%A Shortliffe, E.H.
+%A Buchanan, B.G.
+%D 1975
+%T A model of inexact reasoning in medicine
+%J Mathematical Biosciences
+%V 23
+%P 351-379
+
+%A Shortliffe, E.H.
+%D 1976
+%T Computer-based medical consultations: MYCIN
+%I Elsevier Science
+%C New York, NY
+%K *
+
+%A Shortliffe, E.H.
+%D 1980
+%T Consultation systems for physicians: the role of artificial intelligence techniques
+%J Proc Canadian Society for Computational Studies of Intelligence
+%I University of Victoria
+%C Victoria, BC
+%K *
+
+%A Shrager, J.C.
+%T Invoking a beginner's aid process by recognizing DCL goals
+%D 1981
+%R MSc Thesis
+%I University of Pennsylvania
+
+%A Shrager, J.C.
+%A Finin, T.
+%D 1982
+%T An expert system that volunteers advice
+%J Proc National Conference on Artificial Intelligence
+%P 339-340
+%K *
+%K *
+
+%A Shu, C.S.
+%D 1985
+%T FORMAL: A forms-oriented visual-directed application development system
+%J IEEE Computer
+%V 18
+%N 8
+%P 38-49
+
+%A Sierpinski, W.
+%D 1912
+%T Sur une nouvelle courbe qui remplit toute une aire plaine
+%J Bull Acad Sci Cracovie
+%V Serie A
+%P 462-478
+%K *
+
+%A Simons, G.L.
+%D 1980
+%T Robots in industry
+%I National Computing Centre
+%C Manchester, England
+
+%A Simpson, R.J.
+%A Terrell, T.J.
+%D 1984
+%T Digital filtering using the NEC PD7720 signal processor
+%J Microprocessing and Microprogramming
+%V 14
+%P 67-78
+%K *
+
+%A Sleeman, D.
+%D 1982
+%T Assessing aspects of competence in basic algebra
+%B Intelligent Tutoring Systems
+%E D. Sleeman and J.S. Brown
+%I Academic Press
+%C London, England
+%P 185-200
+
+%A Sloman, A.
+%A Croucher, M.
+%D 1981
+%T Why robots will have emotions
+%J Proc 7th International Joint Conference on Artificial Intelligence
+%V 1
+%P 197-202
+%C Vancouver, BC
+%K *
+
+%A Smith, K.
+%D 1985
+%T Watch out hackers, public encryption chips are coming
+%J Electronics Week
+%P 30-31
+%O May 20
+%K *
+
+%A Smith, R.
+%D 1979
+%T Tint fill
+%J Proc ACM Conference
+%P 276-284
+%K *
+
+%A Solomon, H.
+%D 1977
+%T Data dependent clustering techniques
+%B Classification and clustering
+%E J. Van Ryzin
+%I Academic Press
+%C New York, NY
+%P 155-173
+
+%A Southall, R.
+%D 1984
+%T First principles of typographic design for document production
+%J TUGBOAT (TEX Users Group Newsletter)
+%V 5
+%N 2
+%P 79-90
+%K *
+
+%A Sowa, J.F.
+%D 1983
+%T Generating language from conceptual graphs
+%B Computational Linguistics
+%E N.Cercone
+%P 29-43
+%I Pergamon
+%C Oxford, England
+%K *
+
+%A Sparck\|Jones, K.
+%D 1984
+%T User models and expert systems
+%R Technical Report
+%I Computer Laboratory, University of Cambridge
+%C Cambridge, England
+%K *
+
+%A Spector, A.Z.
+%D 1982
+%T Performing remote operations efficiently on a local computer network
+%J Comm ACM
+%V 25
+%N 4
+%P 246-260
+%O April
+%K *
+
+%A Spencer, H.
+%D 1969
+%T The visible word
+%I Lund Humphries
+%C London, England
+
+%A Stankovic, J.A.
+%D 1982
+%T Software communication mechanisms: procedure call versus messages
+%J IEEE Computer
+%P 19-25
+%O April
+%K *
+
+%A Stankovic, J.A.
+%D 1984
+%T A perspective on distributed computer systems
+%J IEEE Trans Computers
+%V C-33
+%N 12
+%P 1102-1115
+%O December
+%K *
+
+%A Staunstrup, J.
+%D 1982
+%T Message passing communication versus procedure call communication
+%J Software -- Practice and Experience
+%V 12
+%P 223-234
+%K *
+
+%A Stefik, M.
+%D 1979
+%T An examination of a frame-structured representation system
+%J Proc 6th International Conference on Artificial Intelligence
+%P 265-270
+%K *
+
+%A Stefik, M.
+%A Conway, L.
+%D 1982
+%T Towards the principled engineering of knowledge
+%J AI Magazine
+%P 4-16
+%O Summer
+%K *
+
+%A Stefik, M.
+%A Bobrow, D.G.
+%A Mittal, S.
+%A Conway, L.
+%D 1983
+%T Knowledge programming in LOOPS: report on an experimental course
+%J AI Magazine
+%P 3-13
+%O Fall
+%K *
+
+%A Stefik, M.J.
+%A Bobrow, D.G.
+%A Kahn, K.M.
+%D 1986
+%T Integrating access-oriented programming into a multiparadigm environment
+%J IEEE Software
+%P 10-18
+%O January
+%K *
+
+%A Stefik, M.J.
+%A Bobrow, D.G.
+%D 1986
+%T Object-oriented programming: themes and variations
+%J AI Magazine
+%V 6
+%N 4
+%P 40-62
+%O Winter
+
+%A Stevens, M.E.
+%A Little, J.L.
+%D 1967
+%T Automatic typographic-quality typesetting techniques: a state-of-the-art review
+%I National Bureau of Standards
+
+%A Stevens, R.J.
+%A Lehar, A.F.
+%A Preston, F.H.
+%D 1983
+%T Manipulation and presentation of multi-dimensional image data using the Peano scan
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%P 520-
+%O September
+
+%A Stoffel, J.G.
+%A Moreland, J.F.
+%D 1981
+%T A survey of electronic techniques for pictorial image reproduction
+%J IEEE Trans Communications
+%V COM-17
+%N 12
+%P 1898-1925
+%O December
+%K *
+
+%A Stroustrup, B.
+%D 1984
+%T The C++ programming language
+%R Computing Science Technical Report 108
+%I Bell Laboratories
+%C Murray Hill, NJ
+%O January
+%K *
+
+%A Stroustrup, B.
+%D 1984
+%T Data abstraction in C
+%R Computing Science Technical Report 109
+%I Bell Laboratories
+%C Murray Hill, NJ
+%O January
+%K *
+
+%A Suchman, L.A.
+%D 1982
+%T Toward a sociology of human-machine interaction: pragmatics of instruction-following
+%R Working Paper
+%I Xerox PARC, (Intelligent Systems Laboratory)
+%C Palo Alto, CA
+
+%A Suchman, L.A.
+%D 1982
+%T Human-machine interaction and the idea of a self-explanatory machine
+%J Paper presented at the Annual Meeting of the American Anthropological Society
+%C Washington, DC
+%O December
+%K *
+
+%A Suchman, L.A.
+%D 1983
+%T The role of common sense in interface design
+%B Office Automation: Jekyll or Hyde
+%E D.Marschall and J.Gregory
+%I Working Women Education Fund
+%C Cleveland, OH
+%P 96-102
+
+%A Suchman, L.A.
+%D 1983
+%T Office procedure as practical action: models of work and system design
+%J ACM Trans Office Information Systems
+%V 1
+%N 4
+%P 320-328
+%O October
+%K *
+
+%A Suchman, L.A.
+%D 1985
+%T Plans and situated actions: the problem of human-machine communication
+%R PhD Thesis
+%I Xerox PARC
+%C Palo Alto, CA
+%K *
+
+%A Sugeno, M.
+%A Nishida, M.
+%D 1984
+%T Fuzzy control of model car
+%K *
+
+%A Summers, P.D.
+%A Grossman, D.D.
+%D 1984
+%T XPROBE: an experimental system for programming robots by example
+%J Int J Robotics Research
+%V 3
+%N 1
+%P 25-39
+%O Spring
+
+%A Sussman, G.J.
+%D 1975
+%T A computer model of skill acquisition
+%I American Elsevier
+%C New York, NY
+
+%A Tannenbaum, A.
+%T Political history of UNIX
+%R Report
+%I MASSCOMP
+%C Westford, MA 
+%K *
+
+%A Tanner, W.
+%D 1979
+%T Industrial robots -- Volume 1: Fundamentals
+%I Society of Manufacturing Engineers
+%C Dearborn, MI
+
+%A Tennant, H.R.
+%A Ross, K.M.
+%A Thompson, C.W.
+%D 1983
+%T Usable natural language interfaces through menu-based natural language understanding
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 154-160
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Test, J.A.
+%D 1982
+%T The NUnix window system
+%R Internal Report
+%I Laboratory for Computer Science, MIT
+%C Cambridge, MA
+%K *
+
+%A Thimbleby, H.
+%D 1980
+%T Dialogue determination
+%J IJMMS
+%V 13
+%N 3
+%P 295-304
+%O October
+
+%A Thomsett, R.
+%D 1980
+%T People and project management
+%I Yourden Press
+%C New York, NY
+
+%A Thompson, B.A.
+%A Thompson, W.A.
+%D 1985
+%T Inside an expert system
+%J Byte
+%P 315-330
+%O April
+%K *
+
+%A Thompson, K.
+%D 1984
+%T Reflections on trusting trust
+%J Comm ACM
+%V 27
+%N 8
+%P 761-763
+%O August
+
+%A Ting, D.
+%A Prasada, B.
+%D 1980
+%T Digital processing techniques for encoding of graphics
+%J Proc IEEE
+%V 68
+%N 7
+%P 757-769
+%O July
+
+%A Tokuda, H.
+%A Manning, E.G.
+%D 1983
+%T An interprocess communication model for a distributed software testbed
+%J Proc ACM SIGCOMM 83
+%I University of Texas
+%C Austin, TX
+%O March
+%K *
+
+%A Tokuda, H.
+%A Radia, S.P.
+%A Manning. E.G.
+%D 1983
+%T Shoshin OS: a message-based operating system for a distributed software testbed
+%J Proc 16th Annual Hawaii International Conference on System Sciences
+%P 329-338
+%K *
+
+%A Tou, I.T.
+%A Gonzalez, R.C.
+%D 1974
+%T Pattern recognition principles
+%I Addison-Wesley
+%C Reading, MA
+
+%A Truin, P.G.M.
+%D 1983
+%T The `speaking tablet' as an aid in the acquisition of reading skills by dyslexic children
+%J IPO Annual Progress Report
+%V 18
+%P 79-84
+%K *
+
+%A Tsichritzis, D.\0(Editor)
+%D 1983
+%T Beta Gamma
+%R Technical Report CSRG-150
+%I Computer Systems Research Group, University of Toronto
+%C Toronto, ON
+
+%A Tsichritzis, D.
+%D 1985
+%T Objectworld
+%E D.Tsichritzis
+%B Office automation
+%I Springer-Verlag
+%C Berlin
+%P 379-398
+
+%A Turkle, S.
+%D 1982
+%T The subjective computer: a study in the psychology of personal computation
+%J Social Studies of Science
+%V 12
+%N 2
+%P 173-205
+%K *
+
+%A Tyree, A.
+%D 1986
+%T Expert systems and the law
+%J Current Affairs Bulletin
+%P 13-18
+%P March
+%K *
+
+%A Ulichney, R.A.
+%A Troxel, D.E.
+%D 1982
+%T Scaling binary images with the telescoping template
+%J IEEE Trans Pattern Analysis and Machine Intelligence
+%V PAMI-4
+%N 3
+%P 331-335
+
+%A Umphress, D.
+%A Williams, G.
+%D 1985
+%T Identity verification through keyboard characteristics
+%J IJMMS (submitted)
+%K *
+
+%A Unger, B.
+%A Birtwistle, G.
+%A Cleary, J.
+%A Hill, D.
+%A Lomow, G.
+%A Neal, R.
+%A Peterson, M.
+%A Witten, I.H.
+%A Wyvill, B.
+%D 1984
+%T Jade: a simulation and software prototyping environment
+%J Proc Conference on Simulation in Strongly Typed Languages
+%C San Diego, CA
+%O February
+%K KConference
+
+%A Unger, B.W.
+%A Lomow, G.A.
+%A Birtwistle, G..
+%D 1984
+%T Simulation software and Ada
+%I Society for Computer Simulation
+%K *
+
+%A University\|of\|Chicago\|Press
+%D 1969
+%T A manual of style
+%I University of Chicago 
+
+%A Uribe, R.B.
+%D 1981
+%T Modeling autopoiesis
+%E M.Zeleny
+%B Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York, NY
+%P 51-62
+
+%A Van\|Dijk, T.A.
+%A Kintsch, W.
+%D 1983
+%T Strategies of discourse comprehension
+%I Academic Press
+%C New York, NY
+
+%A Van\|Lehn, K.
+%D 1983
+%T Felicity conditions for human skill acquisition: validating an AI-based theory
+%R Research Report CIS-21
+%I Xerox PARC
+%C Palo Alto, CA
+%O November
+
+%A Varela, F.J.
+%A Maturana, H.R.
+%A Uribe, R.B.
+%D 1974
+%T Autopoiesis: the organization of living systems, its characterization and a model
+%J Biosystems
+%V 5
+%P 187-196
+
+%A Varela, F.J.
+%D 1979
+%T Principles of biological autonomy
+%I North Holland
+%C New York, NY
+
+%A Varela, F.J.
+%D 1981
+%T Describing the logic of the living
+%E M.Zeleny
+%B Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York, NY
+%P 36-48
+
+%A Wade, N.
+%D 1985
+%T Literal pictures
+%J Word and  Image
+%V 1
+%N 3
+%P 242-272
+%O July-September
+%K *
+
+%A Wagner, R.A.
+%A Fischer, M.J.
+%D 1974
+%T The string-to-string correction problem
+%J J ACM
+%V 21
+%N 1
+%P 168-173
+%O January
+%K *
+
+%A Wall, R.S.
+%A Apon, A.W.
+%A Beal, J.
+%A Gately M.T.
+%A Oren, L.G.
+%D 1985
+%T An evaluation of commercial expert system building tools
+%R Computer Science Laboratory Technical Report 85-30
+%I Texas Instruments
+%C Dallas, TX
+%O November
+%K *
+
+%A Waltz, D.L.
+%D 1975
+%T Natural language access to a large data base
+%J Advance papers of the International Joint Conference on Artificial Intelligence
+%I MIT
+%C Cambridge, MA
+
+%A Waterman, D.A.
+%D 1978
+%T A rule-based approach to knowledge acquisition for man-machine interface programs
+%J IJMMS
+%V 10
+%P 693-711
+%K *
+
+%A Waters, R.C.
+%D 1985
+%T The programmer's apprentice: a session with KBEmacs
+%J IEEE Trans Software Engineering
+%V SE-11
+%N 11
+%P 1296-1320
+%O November
+%K *
+
+%A Webber, B.L.
+%A Nilsson, N.J.
+%D 1981
+%T Readings in artificial intelligence
+%I Tioga
+%C Palo Alto, CA
+
+%A Weinreb, D.
+%A Moon, D.
+%D 1981
+%T LISP machine manual
+%I Third edition
+%O March
+
+%A Weizenbaum, J.
+%D 1976
+%T Computer power and human reason
+%I Freeman
+%C San Francisco, CA
+
+%A Welch, T.A.
+%D 1984
+%T A technique for high-performance data compression
+%J IEEE Computer
+%V 17
+%N 6
+%P 8-19
+%O June
+%K *
+
+%A Weyer, S.A.
+%D 1982
+%T Searching for information in a dynamic book
+%R PhD Thesis
+%I School of Education, Stanford University
+%O (Also Report SCG-82-1, Xerox Parc)
+
+%A Whalen, T.
+%A Mason, C.
+%D 1981
+%T The use of tree-structured index which contains three types of design defects
+%J Telidon Behavioural Research
+%V 2
+%I Department of Communications
+%O May
+
+%A Whalen, T.
+%A Latremouille, S.
+%D 1981
+%T The effectiveness of a tree-structured index when the existence of information is uncertain
+%J Telidon Behavioural Research
+%V 2
+%I Department of Communications
+%O May
+
+%A Wijk, C.van
+%A Kempen, G.
+%D 1985
+%T From sentence structure to intonation contour
+%E B.S.Muller
+%T Sprachsynthese: zur Synthese von naturlich gesprochener Sprache aus Texten und Konzepten
+%I Georg Olms Verlag
+%C Hildesheim
+%K *
+
+%A Wilensky, R.
+%A Arens, Y.
+%A Chin, D.
+%D 1984
+%T Talking to Unix in English: an overview of UC
+%J Comm ACM
+%V 27
+%N 6
+%P 574-593
+%O June
+%K *
+
+%A Wilkes, A.J.
+%A Singer, D.W.
+%A Gibbons, J.J.
+%A King, T.R.
+%A Robinson, P.
+%A Wiseman, N.E.
+%D 1984
+%T The Rainbow workstation
+%J Computer J
+%V 27
+%N 2
+%O May
+%K *
+
+%A Wilkes, A.J.
+%A Wiseman, N.E.
+%D 1982
+%T A soft-edged character set and its derivation
+%J Computer J
+%V 25
+%N 1
+%P 140-147
+%O February
+%K *
+
+%A Wilkinson, W.
+%D 1980
+%T Viewdata: The Prestel System
+%B Videotext: the coming revolution in home/office information retrieval
+%E Sigel, E.
+%I Harmony Books
+%C New York, NY
+%P 57-86
+
+%A Wilks, Y.
+%D 1977
+%T Good and bad arguments about semantic primitives
+%R Research Report
+%I Department of Artificial Intelligence, University of Edinburgh
+%O May
+%K *
+
+%A Wilks, Y.
+%D 1984
+%T Beliefs, points of view and multiple environments
+%B Artificial and human intelligence
+%E A.Elithorn and R.Banerji
+%I Elsevier Science
+%P 147-171
+%K *
+
+%A Willems, NJ
+%D 1983
+%T STEP: A model of standard English intonation patterns
+%J IPO Annual Progress Report
+%V 18
+%P 37-42
+%K *
+
+%A Williams, G.
+%D 1984
+%T The Apple Macintosh computer
+%J Byte
+%V 9
+%N 2
+%P 30-54
+%O February
+
+%A Winograd, T.
+%D 1972
+%T Understanding natural language
+%I Academic Press
+%C New York, NY
+
+%A Winograd, T.
+%D 1984
+%T Moving the semantic fulcrum
+%R Report CSLI-84-18
+%I Center for the study of language and information, Stanford University
+%C Stanford, CA
+%O December
+%K *
+
+%A Witten, I.H.
+%D 1983
+%T The Department of Computer Science, University of Calgary
+%J Computer Science Association Newsletter
+%V 11
+%N 1
+%P 15-23
+%O December
+%K KArticle
+
+%A Witten, I.H.
+%A Cleary, J.G.
+%D 1986
+%T Foretelling the future by adaptive modeling
+%J Abacus
+%V 3
+%N 3
+%P 16-36
+%O Spring
+%K KArticle
+
+%A Witten, I.H.
+%A Fremont, D.
+%D 1984
+%T A student information service for a University Computer Science department
+%J Proc 15th Ontario Universities Computing Conference
+%I Lakehead University
+%C Thunder Bay, ON
+%O June
+%K KInvited
+
+%A Witten, I.H.
+%D 1985
+%T Elements of computer typography
+%J IJMMS
+%V 23
+%N 6
+%P 623-687
+%O December
+%K KJournal
+
+%A Witten, I.H.
+%A Bramwell, B.
+%D 1985
+%T A system for interactive viewing of structured documents
+%J Comm ACM
+%V 28
+%N 3
+%P 280-288
+%O March
+%K KJournal
+
+%A Witten, I.H.
+%D 1984
+%T Dynamic documents
+%J Proc PROTEXT I -- First International Conference on Text Processing Systems
+%I Boole Press
+%C Dublin, Ireland
+%P 234-239
+%O October
+%K KConference
+
+%A Witten, I.H.
+%A Greenberg, S.
+%D 1985
+%T User interfaces for office systems
+%B Oxford Surveys in Information Technology Volume 2
+%E P.I. Zorkoczy
+%I Oxford University Press
+%C Oxford, England
+%P 69-104
+%K KJournal
+
+%A Witten, I.H.
+%D 1986
+%T Making computers talk \(em an introduction to speech synthesis
+%I Prentice-Hall
+%C Englewood Cliffs, NJ
+
+%A Witten, I.H.
+%D 1987
+%T Computer speech
+%B The Encyclopaedia of Physical Science and Technology, Volume 3
+%E Robert A Meyers
+%I Academic Press
+%P 482-506
+%K KInvited
+
+%A Witten, I.H.
+%A Bonham, M.
+%A Bramwell, B.
+%A Greenberg, S.
+%D in preparation
+%T Interacting with dynamic documents -- the new age of reading
+%R proposal submitted to MIT Press
+
+%A Witten, I.H.
+%D 1985
+%T Selected topics in computer science I
+%R Report
+%I Institute of Information Processing, Graz, Austria
+%O November
+%K KReport
+
+%A Witten, I.H.
+%D 1986
+%T Modeling behaviour sequences: principles, practice, prospects
+%J Proc International Conference on Future Advances in Computing
+%C Christchurch, New Zealand
+%O February 17-21
+%K KConference
+
+%A Witten, I.H.
+%D 1986
+%T In search of `autonomy'
+%J Proc International Conference on Future Advances in Computing
+%C Christchurch, New Zealand
+%O February 17-21
+%K KConference
+
+%A Witten, I.H.
+%D 1986
+%T Expert systems
+%J Man-Machine Studies
+%V UC-DSE
+%N 28
+%P 5-65
+%I University of Canterbury
+%C Christchurch, New Zealand
+%O May
+%K KArticle
+
+%A Witten, I.H.
+%D 1987
+%T Thoughts on artificial intentionality
+%J Man-Machine Studies
+%V UC-DSE
+%N 9
+%P 5-52
+%I University of Canterbury
+%C Christchurch, New Zealand
+%O January
+%K KArticle
+
+%A Witten, I.H.
+%A Neal, R.
+%A Cleary, J.G.
+%D 1987
+%T Arithmetic coding for data compression
+%J Comm ACM
+%V 30
+%N 6
+%P 520-540
+%O June; reprinted in \fIC Gazette\fP, December 1987
+%K KJournal
+
+%A Witten, I.H.
+%D 1987
+%T A course on `expert systems' for electrical engineering students
+%J Proc ACM SIGCSE Technical Symposium on Computer Science Education
+%C St Louis, MO
+%P 257-260
+%O February (published as SIGCSE Bulletin \fI19\fR(1))
+%K KConference
+
+%A Wong, S.K.M
+%A Ziarko, W.
+%A Ye, R. Li
+%D 1985
+%T Comparison of rough-set and statistical methods in inductive learning
+%R Technical Report CS-85-16
+%I Computer Science Department, University of Regina
+%K *
+
+%A Wood, R.J.
+%D 1982
+%T A window based display management system
+%R Internal Report
+%I University of Maryland
+
+%A Woods, W.A.
+%D 1973
+%T Progress in natural language understanding -- an application to lunar geology
+%J Proc National Computer Conference
+%C Montvale, NJ
+%I AFIPS Press
+
+%A Woolf, B.
+%A McDonald, D.D.
+%D 1983
+%T Human-computer discourse in the design of a Pascal tutor
+%J Proc ACM CHI 83 Human Factors in Computing Systems
+%P 230-234
+%C Boston, MA
+%O December 12-15
+%K *
+
+%A Woolf, B.
+%A McDonald, D.D.
+%D 1984
+%T Building a computer tutor: design issues
+%J IEEE Computer
+%V 17
+%N 9
+%P 61-73
+%O September
+
+%A Wright, W.E.
+%D 1977
+%T Gravitational clustering
+%J Pattern Recognition
+%V 9
+%P 151-166
+%K *
+
+%A Wu, X.
+%A Witten, I.H.
+%D 1985
+%T A fast \fIk-\fPmeans type clustering algorithm
+%R Research Report 85/197/10
+%I Computer Science Department, University of Calgary
+%O June
+
+%A Wupit, A.
+%D 1983
+%T Comparison of UNIX networks
+%J Proc ACM Conference on Personal and Small Computers
+%C San Diego, CA
+%P 99-108
+%O December
+
+%A Wyvill, B.L.M.
+%D 1984
+%T Three computer science plays:  \fISquanderella\fP, \fIDigital Alice\fP, and \fITwenty eighty-four\fP
+%R Research Report
+%I Computer Science Department, University of Calgary
+
+%A Wyvill, B.L.M.
+%A Witten, I.H.
+%D 1984
+%T Three computer science plays
+%R Research Report 84/184/42
+%I Computer Science Department, University of Calgary
+%O December
+%K KReport
+
+%A Xerox\|Corp
+%D 1984
+%T The role of electronic printing in the office of the future
+%R Executive Presentation II
+%K *
+
+%A Yankelovich, N.
+%A Meyrowitz, N.
+%A van Dam, A.
+%D 1985
+%T Reading and writing the electronic book
+%J IEEE Computer
+%V 18
+%N 10
+%P 15-30
+%O October
+
+%A Yoeli, M.
+%A Brzozowski, J.A.
+%D 1984
+%T A mathematical model of digital CMOS networks
+%R Research Report CS-84-22
+%I Computer Science Department, University of Waterloo
+%O August
+%K *
+
+%A Young, J.Z.
+%D 1978
+%T Programs of the brain
+%I Oxford University Press
+%C Oxford, England
+
+%A Zaniolo, C.
+%D 1984
+%T Object-oriented programming in Prolog
+%J Proc International Symposium on Logic Programming
+%C Atlantic City, NJ
+%P 265-270
+%O February 6-9
+%K *
+
+%A Zeleny, M.
+%D 1977
+%T Self-organization of living systems: a formal model of autopoiesis
+%J Int J General Systems
+%V 4
+%N 1
+%P 13-28
+
+%A Zeleny, M.
+%D 1978
+%T Apl-autopoiesis: experiments in self-organization of complexity
+%B Progress in cybernetics and systems research III
+%E R.Trappl, G.J.Klir and L.Ricciardi
+%P 65-84
+%I Hemisphere
+%C Washington, DC
+
+%A Zeleny, M.\0(Editor)
+%D 1981
+%T Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York, NY
+
+%A Zeleny, M.
+%D 1981
+%T What is autopoiesis?
+%E M.Zeleny
+%B Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York, NY
+%P 4-17
+
+%A Zimmermann, H.
+%D 1980
+%T OSI reference model \(em the ISO model of architecture for open systems interconnection
+%J IEEE Trans Communications
+%P 425-432
+%O April
+
+%A Zisman, M.M.
+%D 1977
+%T Representation, specification, and automation of office procedures
+%R PhD Dissertation
+%I Wharton School, University of Pennsylvania
+
+%A Zissos, A.Y.
+%A Witten, I.H.
+%D 1985
+%T User modelling for a computer coach: a case study
+%J IJMMS
+%V 23
+%N 6
+%P 729-750
+%O December
+%K KJournal
+
+%A Ziv, J.
+%A Lempel, A.
+%D 1977
+%T A universal algorithm for sequential data compression
+%J IEEE Trans Information Theory
+%V IT-23
+%N 3
+%P 337-343
+%O May
+%K *
+
+%A Ziv, J.
+%A Lempel, A.
+%D 1978
+%T Compression of individual sequences via variable-rate coding
+%J IEEE Trans Information Theory
+%V IT-24
+%P 530-536
+%O September
+%K *
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/book1 b/src/test/java/org/xerial/snappy/testdata/calgary/book1
new file mode 100644
index 0000000..f3b64ba
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/book1
@@ -0,0 +1,16622 @@
+<Y 1874>
+<A T. HARDY>
+<T Madding Crowd(Penguin 1978)>
+<C i>
+<P 51>
+DESCRIPTION OF FARMER OAK -- AN INCIDENT
+When Farmer Oak smiled, the corners of his mouth
+spread till they were within an unimportant distance of
+his ears, his eyes were reduced to chinks, and diverging
+wrinkles appeared round them, extending upon his
+countenance like the rays in a rudimentary sketch of
+the rising sun.
+His Christian name was Gabriel, and on working
+days he was a young man of sound judgment, easy
+motions, proper dress, and general good character. On
+Sundays he was a man of misty views, rather given to
+postponing, and hampered by his best clothes and
+umbrella : upon the whole, one who felt himself to
+occupy morally that vast middle space of Laodicean
+neutrality which lay between the Communion people
+of the parish and the drunken section, -- that is, he went
+to church, but yawned privately by the time the con+
+gegation reached the Nicene creed,- and thought of
+what there would be for dinner when he meant to be
+listening to the sermon. Or, to state his character as
+it stood in the scale of public opinion, when his friends
+and critics were in tantrums, he was considered rather a
+bad man ; when they were pleased, he was rather a good
+man ; when they were neither, he was a man whose
+moral colour was a kind of pepper-and-salt mixture.
+Since he lived six times as many working-days as
+Sundays, Oak's appearance in his old clothes was most
+peculiarly his own -- the mental picture formed by his
+neighbours in imagining him being always dressed in
+that way. He wore a low-crowned felt hat, spread out
+at the base by tight jamming upon the head for security
+in high winds, and a coat like Dr. Johnson's ; his lower
+extremities being encased in ordinary leather leggings
+and boots emphatically large, affording to each foot a
+roomy apartment so constructed that any wearer might
+stand in a river all day long and know nothing of
+<P 52>
+damp -- their maker being a conscientious man who
+endeavoured to compensate for any weakness in his cut
+by unstinted dimension and solidity.
+Mr. Oak 'carried 'about him, by way of watch,+
+what may be called a small silver clock; in other
+words, it was a watch as to shape and intention, and
+a small clock as to size. This instrument being several
+years older than Oak's grandfather, had the peculiarity
+of going either too fast or not at all. The smaller
+of its hands, too, occasionally slipped round on the
+pivot, and thus, though the minutes were told with
+precision, nobody could be quite certain of the hour
+they belonged to. The stopping peculiarity of his
+watch Oak remedied by thumps and shakes, and he
+escaped any evil consequences from the other two
+defects by constant comparisons with and observations
+of the sun and stars, and by pressing his face close
+to the glass of his neighbours' windows, till he could
+discern the hour marked by the green-faced timekeepers
+within. It may be mentioned that Oak's fob being
+difficult of access, by reason of its somewhat high
+situation in the waistband of his trousers (which also
+lay at a remote height under his waistcoat), the watch
+was as a necessity pulled out by throwing the body to
+one-side, compressing the- mouth and face to a mere
+mass of- ruddy flesh- on account -of the exertion, and
+drawing up the watch by its chain, like a bucket from a
+well.
+But some thoughtfull persons, who had seen him
+walking across one of his fields on a certain December
+morning -- sunny and exceedingly mild -- might have
+regarded Gabriel Oak in other aspects than these. In
+his face one might notice that many of the hues and
+curves of youth had tarried on to manhood: there even
+remained in his remoter crannies some relics of the boy.
+His height and breadth would have been sufficient to
+make his presence imposing, had they been exhibited
+with due consideration. But there is a way some men
+have, rural and urban alike, for which the mind is more
+responsible than flesh and sinew : it is a way of curtail+
+ing their dimensions by their manner of showing them.
+And from a quiet modesty that would have become a
+vestal which seemed continually to impress upon him
+<P 53>
+that he had no great claim on the world's room, Oak
+walked unassumingly and with a faintly perceptible
+bend, yet distinct from a bowing of the shoulders.
+This may be said to be a defect in an individual if he
+depends for his valuation more upon his appearance
+than upon his capacity to wear well, which Oak did not.
+He had just reached the time of life at which " young'
+is ceasing to be the prefix of "man ' in speaking of one.
+He was at the brightest period of masculine growth,
+for his intellect and his emotions were clearly separated :
+he had passed the time during which the influence of
+youth indiscriminately mingles them in the character
+of impulse, and he had not yet arrived at the stage
+wherein they become united again, in the character of
+prejudice, by the influence of a wife and family. In
+short, he was twenty-eight, and a bachelor.
+The field he was in this morning sloped to a
+ridge called Norcombe Hill. Through a spur of this
+hill ran the highway between Emminster and Chalk+
+Newton. Casually glancing over the hedge, Oak saw
+coming down the incline before him an ornamental
+spring waggon, painted yellow and gaily marked,
+drawn by two horses, a waggoner walking alongside
+bearing a whip perpendicularly. The waggon was
+laden with household goods and window plants, and
+on the apex of the whole sat a woman, 'young-'and
+attractive. Gabriel had not beheld the sight for more
+than half a minute, when the vehicle was brought to a
+standstill just beneath his eyes.
+" The tailboard of the waggon is gone, Miss,' said the
+waggoner.
+"Then I heard it fall,' said the girl, in a soft, though
+not particularly low voice. "I heard a noise I could
+not account for when we were coming up the hill.'
+"I'll run back.' +
+" Do,' she answered. +
+The sensible horses stood -- perfectly still, and the
+waggoner's steps sank fainter and fainter in the distance.
+The girl on the summit of the load sat motionless,
+surrounded by tables and chairs with their legs upwards,
+backed by an oak settle, and ornamented in front by
+pots of geraniums, myrtles, and cactuses, together with
+<P 54>
+a caged canary -- all probably from the windows of the
+house just vacated. There was also a cat in a willow
+basket, from the partly-opened lid of which she gazed
+with half-closed eyes, and affectionately-surveyed the
+small birds around.
+The handsome girl waited for some time idly in her
+place, and the only sound heard in the stillness-was -the
+hopping of the canary up-and down the perches of its
+prison. Then she looked attentively downwards. It
+was not at the bird, nor at the cat; it was at an oblong
+package tied in paper, and lying between them. She
+turned her head to learn if the waggoner were coming.
+He was not yet in sight; and her-eyes crept back to
+the package, her thoughts seeming to run 'upon what
+was inside it. At length she drew the article into her
+lap, and untied the paper covering; a small swing
+looking-glass was disclosed, in which she proceeded to
+survey herself attentively. She parted her lips and
+smiled.
+It was a fine morning, and the sun lighted up to a
+scarlet glow the crimson jacket she wore, and painted
+a soft lustre upon her bright face and dark hair. The
+myrtles, geraniums, and cactuses packed around her
+were fresh and green, and at such a leafless season they
+invested the whole concern of horses, waggon, furniture,
+and girl with a peculiar vernal charm. What possessed
+her to indulge in such a performance in the sight of the
+sparrows, blackbirds, and unperceived farmer who were
+alone its spectators, -- whether the smile began as a
+factitious one, to test her capacity in that art, -- nobody
+knows ; it ended certainly in a real smile. She blushed
+at herself, and seeing her reflection blush, blushed the
+more.
+The change from the customary spot and necessary
+occasion of such an act -- from the dressing hour in a
+bedroom to a time of travelling out of doors -- lent to
+the idle deed a novelty it did not intrinsically possess.
+The picture was a delicate one. Woman's prescriptive
+infirmity had stalked into the sunlight, which had
+clothed it in the freshness of an originality. A
+cynical inference was irresistitle by Gabriel Oak as he
+regarded the scene, generous though he fain would have
+been. There was no necessity whatever for her looking
+in the glass. She did not adjust her hat, or pat her
+<P 55>
+hair, or press a dimple into shape, or do one thing to
+signify that any such intention had been her motive in
+taking up the glass. She simply observed herself as a
+fair product of Nature in the feminine kind, her thoughts
+seeming to glide into far-off though likely dramas in
+which men would play a part -- vistas of probable
+triumphs -- the smiles being of a phase suggesting that
+hearts were imagined as lost and won. Still, this was
+but conjecture, and the whole series of actions was so
+idly put forth as to make it rash to assert that intention
+had any part in them at all.
+The waggoner's steps were heard returning. She
+put the glass in the paper, and the whole again into its
+place.
+When the waggon had passed on, Gabriel withdrew
+from his point of espial, and descending into the road,
+followed the vehicle to the turnpike-gate some way
+beyond the bottom of the hill, where the object of his
+contemplation now halted for the payment of toll. About
+twenty steps still remained between him and the gate,
+when he heard a dispute. lt was a difference con+
+cerning twopence between the persons with the waggon
+and the man at the toll-bar.
+" Mis'ess's niece is upon the top of the things, and
+she says that's enough that I've offered ye, you great
+miser, and she won't pay any more.' These were the
+waggoner's words.
+"Very well ; then mis'ess's niece can't pass,' said the
+turnpike-keeper, closing the gate.
+Oak looked from one to the other of the disputants,
+and fell into a reverie. There was something in the
+tone of twopence remarkably insignificant. Threepence
+had a definite value as money -- it was an appreciable
+infringement on a day's wages, and, as such, a higgling
+matter ; but twopence --  -- " Here,' he said, stepping
+forward and handing twopence to the gatekeeper ; "let
+the young woman pass.' He looked up at her then;
+she heard his words, and looked down.
+Gabriel's features adhered throughout their form so
+exactly to the middle line between the beauty of St.
+John and the ugliness of Judas Iscariot, as represented
+in a window of the church he attended, that not a single
+lineament could be selected and called worthy either of
+distinction or notoriety. The redjacketed and dark+
+<P 56>
+haired maiden seemed to think so too, for she carelessly
+glanced over him, and told her man to drive on. She
+might have looked her thanks to Gabriel on a minute
+scale, but she did not speak them; more probably she
+felt none, for in gaining her a passage he had lost her
+her point, and we know how women take a favour of
+that kind.
+The gatekeeper surveyed the retreating vehicle.
+" That's a handsome maid ' he said to Oak
+" But she has her faults,' said Gabriel.
+" True, farmer. '
+"And the greatest of them is -- well, what it is
+always.'
+" Beating people down ? ay, 'tis so.'
+"O no.'
+" What, then ? '
+Gabriel, perhaps a little piqued by the comely
+traveller's indifference, glanced back to where he had
+witnessed her performance over the hedge, and said,
+" Vanity.'
+<C ii>
+<P 57>
+NIGHT -- THE FLOCK -- AN INIERIOR -- ANOTHER INTERIOR
+IT was nearly midnight on the eve of St. Thomas"s, the
+shortest day in the year. A desolating wind wandered
+from the north over the hill whereon Oak had watched
+the yellow waggon and its occupant in the sunshine of
+a few days earlier.
+  Norcombe Hill -- not far from lonely Toller-Down
+ -- was one of the spots which suggest to a passer-by
+that he is in the presence of a shape approaching the
+indestructible as nearly as any to be found on earth.
+It was a featureless convexity of chalk and soil -- an
+ordinary specimen of those smoothly-outlined protuber+
+ances of the globe which may remain undisturbed on
+some great day of confusion, when far grander heights
+and dizzy granite precipices topple down.
+The hill was covered on its northern side by an
+ancient and decaying plantation of beeches, whose
+upper verge formed a line over the crest, fringing its
+arched curve against the sky, like a mane. To-night
+these trees sheltered the southern slope from the keenest
+blasts, which smote the wood and floundered through
+it with a sound as of grumbling, or gushed over its
+crowning boughs in a weakened moan. The dry leaves
+in the ditch simmered and boiled in the same breezes,
+a tongue of air occasionally ferreting out a few, and
+sending them spinning across the grass. A group or
+two of the latest in date amongst the dead multitude
+had remained till this very mid-winter time on the twigs
+which bore them and in falling rattled against the trunks
+with smart taps:
+Betwenne this half-wooded, half naked hill, and the
+vague still horizon that its summit indistinctly com+
+manded, was a mysterious sheet of fathomless shade
+ -- the sounds from which suggested that what it con+
+cealed bore some reduced resemblance to features here.
+<P 58>
+The thin grasses, more or less coating the hill, were
+touched by the wind in breezes of differing powers, and
+almost of differing natures -- one rubbing the blades
+heavily, another raking them piercingly, another brushing
+them like a soft broom. The instinctive act of human+
+kind was to stand and listen, and learn how the trees
+to each other in the regular antiphonies of a cathedral
+choir; how hedges and other shapes to leeward them
+caught the note, lowering it to the tenderest sob; and
+how the hurrying gust then plunged into the south, to
+be heard no more.
+The sky was clear -- remarkably clear -- and the
+twinkling of all the stars seemed to be but throbs of
+one body, timed by a common pulse. The North Star
+was directly in the wind's eye, and since evening the
+Bear had swung round it outwardly to the east, till he
+was now at a right angle with the meridian. A
+difference of colour in the stars -- oftener read of than
+seen in England-was really perceptible here. The
+sovereign brilliancy of Sirius pierced the eye with a steely
+glitter, the star called Capella was yellow, Aldebaran and
+Betelgueux shone with a fiery red.
+To persons standing alone on a hill during a clear
+midnight such as this, the roll of the world eastward is
+almost a palpable movement. The sensation may be
+caused by the panoramic glide of the stars past earthly
+objects, which is perceptible in a few minutes of still+
+ness, or by the better outlook upon space that a hill
+affords, or by the wind, or by the solitude ; but whatever
+be its origin, the impression of riding along is vivid and
+abiding. The poetry of motion is a phrase much in
+use, and to enjoy the epic form of that gratification it
+is necessary to stand on a hill at a small hour of the
+night, and, having first expanded with a sense of differ+
+ence from the mass of civilised mankind, who are
+dreamwrapt and disregardful of all such proceedings at
+this time, long and quietly watch your stately progress
+through the stars. After such a nocturnal reconnoitre
+it is hard to get back to earth, and to believe that the
+consciousness of such majestic speeding is derived from
+a tiny human frame.
+Suddenly an unexpected series of sounds began to
+<P 59>
+be heard
+in this place up against the sky. They had a
+clearness which was to be found nowhere in the wind,
+and a sequence which was to be found nowhere in
+nature. They were the notes of Farmer Oak's flute.
+The tune was not floating unhindered into the open
+air : it seemed muffled in some way, and was altogether
+too curtailed in power to spread high or wide. It came
+from the direction of a small dark object under the
+plantation hedge -- a shepherd's hut -- now presenting
+an outline to which an uninitiated person might have
+been puzzled to attach either meaning or use.
+The image as a whole was that of a small Noah's
+Ark on a small Ararat, allowing the traditionary outlines
+and general form of the Ark which are followed by toy+
+makers -- and by these means are established in men's
+imaginations among their firmest, because earliest im+
+pressions -- to pass as an approximate pattern. The
+hut stood on little wheels, which raised its floor about a
+foot from the ground. Such shepherds' huts are dragged
+into the fields when the lambing season comes on, to
+shelter the shepherd in his- enforced nightly attendance.
+It was only latterly that people had begun to call
+Gabriel !Farmer' Oak. During the twelvemonth pre+
+ceding this time he had been enabled by sustained
+efforts of industry and chronic good spirits to lease the
+small shepp farm of which Norcombe Hill was a portion,
+and stock it with two hundred sheep. Previously he
+had been a bailiff for a short time, and earlier still a
+shepherd only, having from his childhood assisted his
+father in tending the floeks of large proprietors, till old
+Gabriel sank to rest.
+This venture, unaided and alone, into the paths of
+farming as master and not as man, with an advance of
+sheep not yet paid for, was a critical juncture with
+Gabriel Oak, and he recognised his position clearly.
+The first movement in his new progress was the lambing
+of his ewes, and sheep having been his speciality from
+his "youth, he wisely refrained from deputing -- the task
+of tending them at this season to a hireling or a novice.
+The wind continued to beat-about the corners of the
+hut, but the flute-playing ceased. A rectangular space
+of light
+<P 60>
+appeared in the side of the hut, and in the
+opening the outline of Farmer Oak's figure. He carried
+a lantern in his hand, and closing the door behind him,
+came forward and busied himself about this nook of the
+field for nearly twenty minutes, the lantern light appear+
+ing and disappearing here and there, and brightening
+him or darkening him as he stood before or behind it.
+Oak's motions, though they had a quiet-energy, were
+slow, and their deliberateness accorded well with his
+occupation. Fitness being the basis of beauty, nobody
+could-have denied that his steady swings and turns"
+in and- about the flock had elements of grace, Yet,
+although if occasion demanded he could do or think a
+thing with as mercurial a dash as can the men of towns
+who are more to the manner born, his special power,
+morally, physically, and mentally, was static, owing
+little or nothing to momentum as a rule.
+A close examination of the ground hereabout, even
+by the wan starlight only, revealed how a portion of
+what would have been casually called a wild slope had
+been appropriated by Farmer Oak for his great purpose
+this winter. Detached hurdles thatched with straw
+were stuck into the ground at various scattered points,
+amid and under which the whitish forms of his meek
+ewes moved and rustled. The ring of the sheep-bell,
+which had been silent during his absence, recommenced,
+in tones that had more mellowness than clearness, owing
+to an increasing growth of surrounding wool. This
+continued till Oak withdrew again from the flock. He
+ --  returned to the hut, bringing in his arms a new-born
+lamb, consisting of four legs large enough for a full+
+grown sheep, united by a seemingly inconsiderable mem+
+brane about half the substance of the legs collectively,
+which constituted the animal's entire body just at present.
+The little speck of life he placed on a wisp of hay
+before the small stove, where a can of milk was simmer+
+ing. Oak extinguished the lantern by blowing into it
+and then pinching the snuff, the cot being lighted
+by a candle suspended by a twisted wire. A rather
+hard couch, formed of a few corn sacks thrown carelessly
+down, covered half the floor of this little
+<P 61>
+habitation, and
+here the young man stretched himself along, loosened
+his woollen cravat, and closed his eyes. In about the
+time a person unaccustomed to bodily labour would have
+decided upon which side to lie, Farmer Oak was asleep.
+The inside of the hut, as it now presented itself, was
+cosy and alluring, and the scarlet handful of fire in
+addition to the candle, reflecting its own genial colour
+upon whatever it could reach, flung associations of
+enjoyment even over utensils and tools. In the corner
+stood the sheep-crook, and along a shelf at one side
+were ranged bottles and canisters of the simple prepara+
+tions pertaining to ovine surgery and physic; spirits of
+wine, turpentine, tar, magnesia, ginger, and castor-oil
+being the chief. On a triangular shelf across the corner
+stood bread, bacon, cheese, and a cup for ale or cider,
+which was supplied from a flagon beneath. Beside the
+provisions lay the flute whose notes had lately been
+called forth by the lonely watcher to beguile a tedious
+hour. The house was ventilated by two round holes,
+like the lights of a ship's cabin, with wood slides+
+The lamb, revived by the warmth' began to bleat'
+instant meaning, as expected sounds will. Passing
+from the profoundest sleep to the most alert wakefulness
+with the same ease that had accompanied the reverse
+operation, he looked at his watch, found that the hour+
+hand had shifted again, put on his hat, took the lamb
+in his arms, and carried it into the darkness. After
+placing the little creature with its mother, he stood and
+carefully examined the sky, to ascertain the time of
+night from the altitudes of the stars.
+The Dog-star and Aldebaran, pointing to the restless
+Pleiades, were half-way up the Southern sky, and between
+them hung Orion, which gorgeous constellation never
+burnt more vividly than now, as it soared forth above
+the rim of the landscape. Castor and Pollux will
+the north-west; far away through the plantation Vega
+and Cassiopeia's chair stood daintily poised on the
+uppermost boughs.
+<P 62>
+"One o'clock,' said Gabriel.
+Being a man not without a frequent consciousness
+that there was some charm in this life he led, he stood
+still after looking at the sky as a useful instrument, and
+regarded it in an appreciative spirit, as a work of art
+superlatively beautiful. For a moment he seemed
+impressed with the speaking loneliness of the scene, or
+rather with the complete abstraction from all its compass
+of the sights and sounds of man. Human shapes,interferences,
+troubles, and joys were all as if they were not, and there
+seemed to be on the shaded hemisphere of the globe no sentient being
+save himself; he could fancy them all gone round to the sunny side.
+  Occupied this, with eyes stretched afar, Oak gradually per+
+ceived that what he had previously taken to be a star low
+down behind the outskirts of the plantation was in reality no
+such thing. It was an artificial light, almost close at hand.
+ To find themselves utterly alone at night where company
+is desirable and expected makes some people fearful; but a
+case more trying by far to the nerves is to discover some
+mysterious companionship when intuition, sensation, memory,
+analogy, testimony, probability, induction -- every kind of
+evidence in the logician's list -- have united to persuade con+
+sciousness that it is quite in isolation.
+ Farmer Oak went towards the plantation and pushed
+through its lower boughs to the windy side. A dim mass under
+the slope reminded him that a shed occupied a place here,
+the site being a cutting into the slope of the hill, so that at
+its back part the roof was almost level with the ground. In
+front it was formed of board nailed to posts and covered with
+tar as apreservative. Through crevices in the roof and side
+spread streaks and spots of light, a combination of which made
+the radiance that had attracted him. Oak stepped up behind,
+where,leaning down upon the roof and putting his eye close
+to a hole, he could see into the interior clearly.
+ The place contained two women and two cows. By the side
+of the latter a steaming bran-mash stood in a bucket. One
+of the women was past middle age. Her companion was ap+
+parently young and graceful; he could form no decided opinion
+<P 63>
+upon her looks, her position being almost beneath his eye, so
+that he saw her in a bird's-eye view, as Milton's Satan first saw
+Paradise. She wore no bonnet or het, but had enveloped her+
+self in a large cloak, which was carelessly flung over her head
+as a covering.
+ "There, now we'll go home," said the elder of the two, resting
+ her knuckles upon her hips, and looking at their goings-on as
+a whole. "I do hope Daisy will fetch round again now. I have
+never been more frightened in my life, but I don't mind break+
+ing my rest if she recovers."
+ The young woman, whose eyelids were apparently inclined
+to fall together on the smallest provocation of silence,yawned
+in sympathy.
+ "I wish we were rich enough to pay a man to do these
+things," she said.
+ "As we are not, we must do them ourselves," said the other;
+"for you must help me if you stay."
+"Well, my hat is gone, however," continued the younger. "It
+went over the hedge, I think. The idea of such a slight wind
+catching it."
+ The cow standing erect was of the Devon breed, and was
+encased in a tight warm hide of rich Indian red, as absolutely
+uniform from eyes to tail as if the animal had been dipped in
+a dye of that colour, her long back being mathematically level.
+The other was spotted,grey and white. Beside her Oak now
+noticed a little calf about a day old, looking idiotically at
+the two women, which showed that it had not long been
+accustomed to the phenomenon of eyesight, and often turn+
+ing to the lantern, which it apparently mistook for the moon.
+inherited instinct having as yet had little time for correction
+by experience. Between the sheep and the cows Lucina had
+been busy on Norcombe hill lately.
+ "I think we had better send for some oatmeal," said the
+"Yes, aunt; and I'll ride over for it as soon as it is
+light. '
+" But there's no side-saddle.'
+<P 64>
+"I can ride on the other : trust me.'
+Oak, upon hearing these remarks, became more
+curious to observe her features, but this prospect being
+denied him by the hooding efect of the cloak, and by his
+aerial position, he felt himself drawing upon his fancy
+for their details. In making even horizontal and clear
+inspections we colour and mould according to the warts
+within us whatever our eyes bring in. Had Gabriel
+been able from the first to get a distinct view of her +
+countenance, his estimate of it as very handsome or
+slightly so would have been as his soul required a
+divinity at the moment or was ready supplied with one.
+Having for some time known the want of a satisfactory
+form to fill an increasing void within him, his position
+moreover affording the widest scope for his fancy, he
+painted her a beauty.
+By one of those whimsical coincidences in which
+Nature, like a busy mother, seems to spare a moment
+from her unremitting labours to turn and make her
+children smile, the girl now dropped the cloak, and
+forth tumbled ropes of black hair over a red jacket.
+Oak knew her instantly as the heroine of the yellow
+waggon, myrtles, and looking-glass : prosily, as the
+woman who owed him twopence.
+They placed the calf beside its mother again, took
+up the lantern, and went out, the light sinking down
+the hill till it was no more than a nebula. Gabriel
+Oak returned to his flock.
+<C iii>
+<P 65>
+A GIRL ON HORSEBACK -- CONVERSATION
+THE sluggish day began to break. Even its position
+terrestrially is one of the elements of a new interest,
+and for no particular reason save that the incident of
+the night had occurred there, Oak went again into
+the plantation. Lingering and musing here, he heard
+the steps of a horse at the foot of the hill, and soon
+there appeared in view an auburn pony with a girl on
+its back, ascending by the path leading past the cattle+
+shed. She was the young woman of the night before.
+Gabriel instantly thought of the hat she had mentioned
+as having lost in the wind; possibly she had come to
+look for it. He hastily scanned the ditch and after
+walking about ten yards along it, found the hat among the
+leaves. Gabriel took it in his hand and returned to his
+hut. Here he ensconced himself, and peeped through
+the loophole in the direction of the riders approach.
+She came up and looked around -- then on the other
+side of the hedge. Gabriel was about to advance and
+restore the missing article when an unexpected per+
+formance induced him to suspend the action for the
+present. The path, after passing the cowshed, bisected
+the plantation. It was not a bridle-path -- merely a
+pedestrian's track, and the boughs spread horizontally
+at a height not greater than seven feet above the ground,
+which made it impossible to ride erect beneath them.
+The girl, who wore no riding-habit, looked around for
+a moment, as if to assure herself that all humanity was
+out of view, then dexterously dropped backwards flat
+upon the pony's back, her head over its tail, her feet
+against its shoulders, and her eyes to the sky. The
+rapidity of her glide into this position was that of a
+kingfisher -- its noiselessness that of a hawk. Gabriel's
+eyes had scarcely been able to follow her. The tall lank
+pony seemed used to such doings, and ambled
+<P 66>
+along unconcerned. Thus she passed under the level boughs.
+The performer seemed quite at home anywhere
+between a horse's head and its tail, and the necessity
+for this abnormal attitude having ceased with the
+passage of the plantation, she began to adopt another,
+even more obviously convenient than the first. She had
+no side-saddle, and it was very apparent that a firm
+seat upon the smooth leather beneath her was un+
+attainable sideways. Springing to her accustomed
+perpendicular like a bowed sapling, and satisfying her,
+self that nobody was in sight, she seated herself in the
+manner demanded by the saddle, though hardly expected
+of the woman, and trotted off in the direction of Tewnell
+Mill.
+Oak was amused, perhaps a little astonished, and
+hanging up the hat in his hut, went again among his
+ewes. An hour passed, the girl returned, properly
+seated now, with a bag of bran in front of her. On
+nearing the cattle-shed she was met by a boy bringing
+a milking-pail, who held the reins of the pony whilst
+she slid off. The boy led away the horse, leaving the
+pail with the young woman.
+Soon soft spirts alternating with loud spirts came
+in regular succession from within the shed, the obvious
+sounds of a person milking a cow. Gabriel took the
+lost hat in his hand, and waited beside the path she
+would follow in leaving the hill.
+She came, the pail in one hand, hanging against her
+knee. The left arm was extended as a balance, enough
+of it being shown bare to make Oak wish that the event
+ha happened in the summer, when the whole would
+have been revealed. There was a bright air and manner
+about her now, by which she seemed to imply that the
+desirability of her existence could not be questioned;
+and this rather saucy assumption failed in being offensive,
+because a beholder felt it to be, upon the whole, true.
+Like exceptional emphasis in the tone of a genius, that
+which would have made mediocrity ridiculous was an
+addition to recognised power. It was with some
+surprise that she saw Gabriel's face rising like the
+moon behind the hedge.
+The adjustment of the farmer's hazy conceptions of
+her
+<P 67>
+charms to the portrait of herself she now presented
+him with was less a diminuition than a difference. The
+starting-point selected by the judgment was. her height
+She seemed tall, but the pail was a small one, and the
+hedge diminutive; hence, making allowance for error
+by comparison with these, she could have been not
+above the height to be chosen by women as best. All
+features of consequence were severe and regular. It
+may have been observed by persons who go about the
+shires with eyes for beauty, that in Englishwoman a
+classically-formed face is seldom found to be united
+with a figure of the same pattern, the highly-finished
+features being generally too large for the remainder of
+the frame ; that a graceful and proportionate figure of
+eight heads usually goes off into random facial curves.
+Without throwing a Nymphean tissue over a milkmaid,
+let it be said that here criticism checked itself as out
+of place, and looked at her proportions with a long
+consciousness of pleasure. From the contours of her
+figure in its upper part, she must have had a beautiful
+neek and shoulders ; but since her infancy nobody had
+ever seen them. Had she been put into a low dress
+she would have run and thrust her head into a bush.
+Yet she was not a shy girl by any means; it was merely
+her instinct to draw the line dividing the seen from the
+unseen higher than they do it in towns.
+That the girl's thoughts hovered about her face
+and form as soon as she caught Oak's eyes conning the
+same page was natural, and almost certain. The self+
+consciousness shown would have been vanity if a little
+more pronounced, dignity if a little less. Rays of male
+vision seem to have a tickling effect upon virgin faces
+in rural districts ; she brushed hers with her hand, as if
+Gabriel had been irritating its pink surface by actual
+touch, and the free air of her previous movements was
+reduced at the same time to a chastened phase of
+itself. Yet it was the man who blushed, the maid not
+at all.
+" I found a hat,' said Oak.
+" It is mine,' said she, and, from a sense of proportion,
+kept down to a small smile an inclination to laugh dis+
+tinctly : "it flew away last night.'
+" One o'clock this morning ? '
+<P 68>
+" Well -- it was.' She was surprised. " How did you
+know ? ' she said.
+" I was here.'
+" You are Farmer Oak, are you not ? '
+" That or thereabouts. I'm lately come to this place.'
+" A large farm ? ' she inquired, casting her eyes round,
+and swinging back her hair, which was black in the
+shaded hollows of its mass; but it being now an hour
+past sunrise, the rays touched its prominent curves with
+a colour of their own.
+" No ; not large. About a hundred.' (In speaking
+of farms the word "acres ' is omitted by the natives, by
+analogy to such old expressions as "a stag of ten.')
+' "I wanted my hat this morning,' she went on.
+had to ride to Tewnell Mill.'
+"Yes you had.'
+"How do you know?'
+"I saw you!
+"Where?' she inquired, a misgiving bringing every
+muscle of her lineaments and frame to a standstill.
+"Here-going through the plantation, and all down
+the hill,' said Farmer Oak, with an aspect excessively
+knowing with regard to some matter in his mind, as he
+gazed at a remote point in the direction named, and then
+turned back to meet his colloquist's eyes.
+A perception caused him to withdraw his own eyes
+from hers as suddenly as if he had been caught in a
+theft. Recollection of the strange antics she had
+indulged in when passing through the trees, was suc+
+ceeded in the girl by a nettled palpitation, and that' by
+a hot face. It was a time to see a woman redden who
+was not given to reddening s a rule; not a point in
+the milkmaid but was of the deepest rose-colour. From
+the Maiden's Blush, through all varieties of the Provence
+down to the Crimson Tuscany, the countenance of Oak's
+acquaintance quickly graduated ; whereupon he, in con+
+siderateness, turned away his head.
+The sympathetic man still looked the other way, and
+wondered when she would recover coolness sufficient to
+justify him in facing her again. He heard what seemed
+to be the flitting of a
+<P 69>
+dead leaf upon the breeze, and
+looked. She had gone away.
+With an air between that of Tragedy and Comedy !
+Gabriel returned to his work.
+Five mornings and evenings passed. The young
+woman came regularly to milk the healthy cow or to
+attend to the sick one, but never allowed her vision to
+stray in the direction of Oak's person. His want of
+tact had deeply offended her -- not by seeing what he
+could not help, but by letting her know that he had
+seen it. For, as without law there is no sin, without
+eyes there is no indecorum; and she appeared to feel
+that Gabriel's espial had made her an indecorous woman
+without her own connivance. It was food for great regret
+with him; it was also a contretemps which touched into
+life a latent heat he had experienced in that direction.
+The acquaintanceship might, however, have ended in
+a slow forgetting, but for an incident which occurred at
+the end of the same week. One afternoon it began to
+freeze, and the frost increased with evening, which drew
+on like a stealthy tightening of bonds. It was a time
+when in cottages the breath of the sleepers freezes to
+the sheets; when round the drawing-room fire of a
+thick-walled mansion the sitters' backs are cold, even
+whilst their faces are all aglow. Many a small bird went
+to bed supperless that night among the bare boughs.
+As the milking-hour drew near, Oak kept his usual
+watch upon the cowshed. At last he felt cold, and
+shaking an extra quantity of bedding round the yeaning
+ewes he entered the hut and heaped more fuel upon
+the stove. The wind came in at the bottom of the door,
+and to prevent it Oak laid a sack there and wheeled the
+cot round a little more to the south. Then the wind
+spouted in at a ventilating hole -- of which there was one
+on each side of the hut.
+Gabriel had always known that when the fire was
+lighted and the door closed one of these must be kept
+open -- that chosen being always on the side away from
+the wind. Closing the slide to windward, he turned to
+open the other; on second -- -thoughts the farmer con+
+sidered that he would first sit down leaving both
+closed for a minute or two, till the temperature of the
+hut was a little raised. He sat down.
+<P 70>
+His head began to ache in an unwonted manner, and,
+fancying himself weary by reason of the broken rests of
+the preceding nights, Oak decided to get up, open the
+slide, and then allow himself to fall asleep. He fell
+asleep, however, without having performed the necessary
+preliminary.
+How long he remained unconseious Gabriel never
+knew. During the first stages of his return to percep+
+tion peculiar deeds seemed to be in course of enactment.
+His dog was howling, his head was aching fearfully --
+somebody was pulling him about, hands were loosening
+his neckerchief.
+On opening his eyes he found that evening had sunk
+to dusk in a strange manner of unexpectedness. The
+young girl with the remarkably pleasant lips and white
+teeth was beside him. More than this -- astonishingly
+more -- his head was upon her lap, his face and neck
+were disagreeably wet, and her fingers were unbuttoning
+his collar.
+"Whatever is the matter?' said Oak, vacantly.
+She seemed to experience mirth, but of too insignifi+
+cant a kind to start enjoyment.
+"Nothing now', she answered, "since you are not
+dead It is a wonder you were not,suffocated in this
+hut of yours.'
+"Ah, the hut ! ' murmured Gabriel. "I gave ten
+pounds for that hut. But I'll sell it, and sit under
+thatched hurdles as they did in old times, curl up
+to sleep in a lock of straw! It played me nearly the
+same trick the other day .! ' Gabriel, by way of emphasis,
+brought down his fist upon the floor.
+"It was not exactly the fault of the hut,' she ob+
+served in a tone which showed her to be that novelty
+among women -- one who finished a thought before
+beginning the sentence which was to convey it. " You
+should I think, have considered, and not have been so
+foolish as to leave the slides closed.'
+"Yes I suppose I should,' said Oak, absently. He
+was endeavouring to catch and appreciate the sensation
+of being thus with her, his head upon her dress, before
+the event passed on into the heap of bygone things.
+He wished she knew his impressions ; but he would as
+soon have thought of carrying an odour in a net as of
+attempting to convey the intangibilities
+<P 71>
+of his feeling
+in the coarse meshes of language. So he remained
+silent.
+She made him sit up, and then Oak began wiping
+his face and shaking himself like a Samson. "How
+can I thank 'ee ? ' he said at last, gratefully, some of the
+natural rusty red having returned to his face.
+ " Oh, never mind that,' said the girl, smiling, and
+allowing her smile to hold good for Gabriel's next
+remark, whatever that might prove to be.
+"How did you find me?"
+"I heard your dog howling and scratching at the
+door of the hut when I came to the milking (it was so
+lucky, Daisy's milking is almost over for the season, and
+ I shall not come here after this week or the next). The
+dog saw me, and jumped over to me, and laid hold of
+my skirt. I came across and looked round the hut the
+very first thing to see if the slides were closed. My
+uncle has a hut like this one, and I have heard him tell
+his shepherd not to go to sleep without leaving a slide
+open. I opened the door, and there you were like
+dead. I threw the milk over you, as there was no
+water, forgetting it was warm, and no use.'
+"I wonder if I should have died ? ' Gabriel said, in a
+low voice, which was rather meant to travel back to
+himself than to her.
+"O no," the girl replied. She seemed to prefer a
+less tragic probability ; to have saved a man from death
+'involved talk that should harmonise with the dignity of
+such a deed -- and she shunned it.
+"I believe you saved my life, Miss --  -- I don!t know
+your name. I know your aunt's, but not yours.'
+" I would just as soon not tell it -- rather not. There
+is no reason either why I should, as you probably will
+never have much to do with me.'
+ " Still, I should like to know.'
+" You can inquire at my aunt's -- she will tell you.'
+'My name is Gabriel Oak.'
+"And mine isn't. You seem fond of yours in
+speaking it so decisively, Gabriel Oak.'
+<P 72>
+" You see, it is the only one I shall ever have, and I
+must make the most of it.'
+" I always think mine sounds odd and disagreeable.'
+"I should think you might soon get a new one.'
+"Mercy ! -- how many opinions you keep about you
+concerning other people, Gabriel Oak.
+"Well Miss-excuse the words-I thought you
+would like them But I can't match you I know in
+napping out my mind upon my tongue. I never was
+very clever in my inside. But I thank you. Come
+give me your hand!'
+She hesitated, somewhat disconcerted at Oak's old+
+fashioned earnest conclusion. to a dialogue lightly
+carried on."Very well,' she said, and gave him her
+hand, compressing her lips to a demure impassivity.
+He held it but an instant, and in his fear of being too
+demonstrative, swerved to the opposite extreme, touching
+her fingers with the lightness of a small-hearted person.
+" I am sorry,' he said, the instant after.
+" What for?'
+"You may have it again if you like; there it is.'
+She gave him her hand again.
+Oak held it longer this time -- indeed, curiously long.
+"How soft it is -- being winter time, too -- not chapped
+or rough or anything!' he said.
+"There -- that's long enough,' said she, though with+
+out pulling it away "But I suppose you are thinking
+you would like to kiss it? You may if you want to.'
+"I wasn't thinking of any such thing,' said Gabriel,
+simply ; "but I will'
+"That you won't!' She snatched back her hand.
+Gabriel felt himself guilty of another want of tact.
+"Now find out my name,' she said, teasingly; and
+withdrew.
+<C iv>
+<P 73>
+GABRIEL'S RESOLVE -- THE VISIT -- THE MISTAKE
+THE only superiority in women that is tolerable to the
+rival sex is, as a rule, that of the unconscious kind ; but
+a superiority which recognizes itself may sometimes
+please by suggesting possibilities of capture to the
+subordinated man.
+This well-favoured and comely girl soon made appre+
+ciable inroads upon the emotional constitution of young
+Farmer Oak.
+Love, being an extremely exacting usurer (a sense of
+exorbitant profit, spiritually, by an exchange of hearts,
+being at the bottom of pure passions, as that of exorbi+
+tant profit, bodily or materially, is at the bottom of
+those of lower atmosphere), every morning Oak's feelings
+were as sensitive as the money-market in calculations
+upon his chances. His dog waited for his meals in a
+way so like that in which Oak waited for the girl's
+presence, that the farmer was quite struck with the
+resemblance, felt it lowering, and would not look at the
+dog. However, he continued to watch through the
+hedge for her regular coming, and thus his sentiments
+towards her were ideepened without any corresponding
+effect being produced upon herself. Oak had nothing
+finished and ready to say as yet, and not being able
+to frame love phrases which end where they begin ;
+passionate tales -- +
+     -- -Full of sound and fury
+   -- -signifting nothing -- +
+he said no word at all.
+By making inquiries he found that the girl's name
+was Bathsheba Everdene, and that the cow would go
+dry in about seven days. He dreaded the eight day.
+At last the eighth day came. The cow had ceased
+to give milk for that year, and Bathsheba Everdene
+came up the hill no more. Gabriel had reached a
+pitch of existence he never
+<P 74>
+could have anticipated a
+short time before. He liked saying 'Bathsheba' as a
+private enjoyment instead of whistling; turned over his
+taste to black hair, though he had sworn by brown ever
+since he was a boy, isolated himself till the space he
+filled in a possible strength in an actual weakness. Marriage
+transforms a distraction into a support, the power of
+which should be, and happily often is, in direct pro+
+portion to the degree of imbecility it supplants. Oak
+began now to see light in this direction, and said to
+himself, "I'll make her my wife, or upon my soul I shall
+be good for nothing .! '
+All this while he was perplexing himself about an
+errand on which he might consistently visit the cottage
+of Bathsheba's aunt.
+He found his opportunity in the death of a ewe,
+mother of a living lamb. On a day which had a
+summer face and a winter constitution-a fine January
+morning, when there was just enough blue sky visible to
+make cheerfully-disposed people wish for more, and an
+occasional gleam of silvery sunshine, Oak put the lamb
+into a respectable Sunday basket, and stalked across the
+fields to the house of Mrs. Hurst, the aunt -- George,
+the dog walking behind, with a countenance of great
+concern at the serious turn pastoral affairs seemed to be
+taking.
+Gabriel had watched the blue wood-smoke curling
+from the chimney with strange meditation. At evening
+he had fancifully traced it down the chimney to the
+spot of its origin -- seen the hearth and Bathsheba
+beside it -- beside it in her out-door dress; for the
+clothes she had worn on the hill were by association
+equally with her person included in the compass of his
+affection; they seemed at this early time of his love a
+necessary ingredient of the sweet mixture called Bath+
+sheba Everdene.
+He had made a toilet of a nicely-adjusted kind -- of a
+nature between the carefully neat and the carelessly
+ornate -- of a degree between fine-market-day and wet+
+Sunday selection. He thoroughly cleaned his silver
+watch-chain with whiting, put new lacing straps to his
+boots, looked to the brass eyelet-holes,
+<P 75>
+ went to the
+inmost heart of the plantation for a new walking-stick,
+and trimmed it vigorously on his way back; took a new
+handkerchief from the bottom of his clothes-box, put
+on the light waistcoat patterned all over with sprigs
+of an elegant flower uniting the beauties of both rose
+and lily without the defects of either, and used all the
+hair-oil he possessed upon his usually dry, sandy, and
+inextricably curly hair, till he had deepened it to a
+splendidly novel colour, between that of guano and
+Roman cement, making it stick to his head like mace
+round a nutmeg, or wet seaweed round a boulder after
+the ebb.
+Nothing disturbed the stillness of the cottage save
+ the chatter of a knot of sparrows on the eaves; one
+might fancy scandal and rumour to be no less the
+staple topic of these little coteries on roofs than of
+those under them. It seemed that the omen was an
+unpropitious one, for, as the rather untoward commence+
+ment of Oak's overtures, just as he arrived by the garden
+gate, he saw a cat inside, going into various arched shapes
+and fiendish convulsions at the sight of his dog George.
+The dog took no notice , for he had arrived at an age
+at which all superfluous barking was cynically avoided
+as a waste of breath -- -in fact he never barked even
+at the sheep except to order, when it was done with
+an absolutely neutral countenance, as a sort of Com+
+mination-service, which, though offensive, had to be
+gone through once now and then to frighten the flock
+for their own good.
+A voice came from behind some laurel-bushes into
+which the cat had run:
+"Poor dear! Did a nasty brute of a dog want to
+kill it; -- did he poor dear !'
+"I beg your pardon,' said Oak to the voice, 'but
+George was walking on behind me with a temper as
+mild as milk.'
+Almost before he had ceased speaking, Oak was
+seized with a misgiving as to whose ear was the recipient
+of his answer. Nobody appeared, and he heard the
+person retreat among the bushes.
+Gabriel meditated, and so deeply that he brought
+small furrows into his forehead by sheer force of
+reverie. Where the
+<P 76>
+issue of an interview is as likely
+to be a vast change for the worse as for the better,
+any initial difference from expectation causes nipping
+sensations of failure. Oak went up to the door a little
+abashed : his mental rehearsal and the reality had had
+no common grounds of opening.
+Bathsheba's aunt was indoors. " Will you tell Miss
+Everdene that somebody would be glad to speak to
+her ?'said Mr. Oak. (Calling one's self merely Some+
+body, without giving a name, is not to be taken as
+an example of the ill-breeding of the rural world: it
+springs from a refined modesty, of which townspeople,
+with their cards and announcements, have no notion
+whatever.)
+Bathsheba was out. The voice had evidently been
+hers.
+" Will you come in, Mr. Oak ? '
+"Oh, thank 'ee, said Gabriel, following her to the
+fireplace. "I've brought a lamb for Miss Everdene.
+I thought she might like one to rear; girls do.'
+" She might,' said Mrs. Hurst, musingly ; " though
+she's only a visitor here. If you will wait a minute,
+Bathsheba will be in.'
+" Yes, I will wait,' said Gabriel, sitting down. " The
+lamb isn't really the business I came about, Mrs. Hurst.
+In short, I was going to ask her if she'd like to be
+married.'
+"And were you indeed ?'
+" Yes. Because if she would, I should be very glad
+to marry her. D'ye know if she's got any other young
+man hanging about her at all ?'
+"Let me think," said Mrs. Hurst, poking the fire
+superfluously.... " Yes -- bless you, ever so many young
+men. You see, Farmer Oak, she's so good-looking, and
+an excellent scholar besides -- she was going to be a
+governess once, you know, only she was too wild. Not
+that her young men ever come here -- but, Lord, in the
+nature of women, she must have a dozen ! '
+" That's unfortunate,' said Farmer Oak, contemplating
+a crack in the stone floor with sorrow. "I'm only an
+every-day sort of man, and my only chance was in being
+the first comer... , Well, there's no use in my waiting,
+for that was all I came about: so I'll take myself off
+home-along, Mrs. Hurst.'
+When Gabriel had gone about two hundred yards
+along the
+<P 77>
+down, he heard a "hoi-hoi .! " uttered behind
+him, in a piping note of more treble quality than that
+in which the exclamation usually embodies itself when
+shouted across a field. He looked round, and saw a girl
+racing after him, waving a white handkerchief.
+Oak stood still -- and the runner drew nearer. It was
+Bathsheba Everdene. Gabriel's colour deepened: hers
+was already deep, not, as it appeared, from emotion,
+but from running.
+"Farmer Oak -- I -- ' she said, pausing for want of
+breath pulling up in front of him with a slanted face
+and putting her hand to her side.
+"I have just called to see you ' said Gabriel, pending
+her further speech.
+"Yes-I know that,! she said panting like a robin,
+her face red and moist from her exertions, like a peony
+petal before the sun dries off the dew. "I didn't know
+you had come to ask to have me, or I should have come
+in from the garden instantly. I ran after you to say --
+that my aunt made a mistake in sending you away from
+courting me --  --  -- '
+Gabriel expanded."I'm sorry to have made you
+run so fast, my dear,' he said, with a grateful sense of
+favours to come. "Wait a bit till you've found your
+breath.'
+" -- It was quite a mistake-aunt's telling you I had
+a young man "already,'- Bathsheba went on. " I haven't
+a sweetheart at all -- and I never had one, and I thought
+that, as times go with women, it was such a pity to send
+you away thinking that I had several.'
+"Really and truly I am glad to hear that.!' said .=
+Farmer Oak, smiling one of his long special smiles, and
+blushing with gladness. He held out his hand to take
+hers, which, when she had eased her side by pressing
+it there, was prettily extended upon her bosom to still
+her loud-beating heart. Directly he seized it she put
+it behind her, so that it slipped through his fingers like
+an eel. "
+"I have a nice snug little farm,' said Gabriel, with
+half a degree less assurance than when he had seized
+her hand.
+"Yes ; you have.'
+"A man has advanced me money to begin with, but
+still, it
+<P 78>
+will soon be paid off and though I am only an
+every-day sort of man, I have got on a little since I was
+a boy.' Gabriel uttered "a little' in a tone to-show
+her that it was the complacent form of "a great deal.'
+He continued : " When we be married, I am quite sure
+I can work twice as hard as I do now.'
+ He went forward and stretched out his arm again.
+Bathsheba had overtaken him at a point beside which
+stood a low stunted holly bush, now laden with red
+berries. Seeing his advance take the form of an attitude
+threatening a possible enclosure, if not compression, of
+her person, she edged off round the bush.
+" Why, Farmer Oak,' she said, over the top, looking
+at him with rounded eyes, "I never said I was going to
+marry you.'
+" Well -- that is a tale .! ' said Oak,  with dismay. " To
+run after anybody like this, and then say you don"t
+want him ! '
+"What I meant to tell you was only this,' she said
+eagerly, and yet half conscious of the absurdity of the
+position she had made for herself -- "that nobody has
+got me yet as a sweetheart, instead of my having a
+dozen, as my aunt said; I hate to be thought men's
+property in that way, though possibly I shall be had
+some day. Why, if I'd wanted you I shouldn't have
+run after you like this ; 'twould have'been the forwardest
+thing ! But there was no harm in 'hurrying to correct
+a piece of false news that had been told you.'
+"Oh, no -- no harm at all." But there is such a thing
+as being too generous in expressing a judgment impuls+
+ively, and Oak added with a more appreciative sense
+of all the circumstances -- ' Well, I am not quite certain
+it was no harm.'
+"Indeed, I hadn't time to think before starting
+whether I wanted to marry or not, for you'd have been
+gone over the hill.'
+" Come,' said Gabriel, freshening again ; "think a
+minute or two. I'll wait a while, Miss Everdene. Will
+you marry me? Do, Bathsheba. I love you far more
+than common!'
+"I'll try to think,' she observed, rather more timor+
+ously ; "if I can think out of doors; my mind spreads
+away so.'
+"But you can give a guess.'
+<P 79>
+"Then give me time.' Bathsheba looked thought+
+fully into the distance, away from the direction in which
+Gabriel stood.
+"I can make you happy,' said he to the back of her
+head, across the bush. "You shallo have as piano in a
+year or two -- -farmers' wives are getting to have pianos
+now --  and I'll practise up the flute right well to play
+with you in the evenings.'
+" Yes ; I should like that.'
+"And have one of those little ten-pound" gigs for
+market -- and nice flowers, and birds -- cocks and hens
+I mean, because they be useful,' continued Gabriel,
+feeling balanced between poetry and practicality.
+"I should like it very much.'
+"And a frame for cucumbers -- like a gentlman and
+lady.'
+"Yes.'
+"And when the wedding was over, we'd have it put
+in the newspaper list of marriages.'
+" Dearly I should like that ! '
+"And the babies in the births -- every man jack of
+'em! And at home by the fire, whenever you look up,
+there I shall be -- and whenever I look up' there will
+be you.'
+"Wait wait and don't be improper .!'
+Her countenance fell, and she was silent awhile.
+He regarded the red berries between them over and
+over again, to such an extent, that holly seemed in
+his after life to be a cypher signifying a proposal of
+marriage. Bathsheba decisively turned to him.
+"No;' 'tis no use,' she said. 'I don't want to marry
+you. '
+' Try.'
+"I have tried hard all the time I've been thinking;
+for a marriage would be very nice in one sense.
+People would talk about me, and think I had won my
+battle, and I should feel triumphant, and' all that,
+But a husband --  -- ' - +
+" Well .! '
+" Why, he'd always be there, as you say; whenever
+I looked up, there he'd be.'
+" Of course he would -- I, that is.'
+<P 80>
+" Well, what I mean is that I shouldn't mind being
+a bride at a wedding, if I could be one without having
+a husband. But since a woman can't show off in that
+way by herself, I shan't marry -- at least yet.'
+' That's a terrible wooden story.'
+At this criticism of her statement Bathsheba made
+an addition to her dignity by a slight sweep away
+from him.
+"Upon my heart and soul, I don't know what a
+maid can say stupider than that,' said Oak. "But
+dearest,' he continued in a palliative voice, "don't be
+like it !.' Oak sighed a deep honest sigh -- none the
+less so in that, being like the sigh of a pine plantation,
+it was rather noticeable as a disturbance of the atmo+
+sphere. " Why won't you have me ? ' he appealed,
+creeping round the holly to reach her side.
+" I cannot,' she said, retreating.
+"But why ?' he persisted, standing still at last in
+despair of ever reaching her, and facing over the
+bush.
+' Because I don't love you.'
+" Yes, but --  -- '
+She contracted a yawn to an inoffensive smallness,
+so that it was hardly ill-mannered at all. "I don't love
+you,' she said.'
+"But I love you -- and, as for myself, I am content
+to be liked.'
+" O Mr. Oak -- that's very fine ! You'd get to
+despise me.'
+"Never,' said Mr Oak, so earnestly that he seemed
+to be coming, by the forceof his words, straight
+through the bush and into her arms. "I shall do one
+thing in this life -- one thing certain -- that is, love you,
+and long for you, and keep wanting you till I die.' His
+voice had a genuine pathos now, and his large brown
+hands perceptibly trembled.
+"It seems dreadfully wrong not to have you when
+you feel so much!' she said with a little distress, and
+looking hopeleely around for some means of escape
+from her moral dilemma. " H(ow I wish I hadn't run
+after you!' However she seemed to have a short cut
+for getting back to cheerfulness, and set her face to
+signify archness. "It wouldn't do, Mr Oak. I want
+somebody to tame me; I am too independent ; and
+you would never be able to, I know.'
+<P 81>
+Oak cast his eyes down the field in a way implying
+that it was useless to attempt argument.
+" Mr. Oak,' she said, with luminous distinctness and
+common sense, " you are better off than I. I have
+hardly a penny in the world -- I am staying with my
+aunt for my bare sustenance. I am better educated
+than you -- and I don't love you a bit: that's my side
+of the case. Now yours: you are a farmer just begin+
+ing; and you ought in common prudence, if you marry
+at all (which you should certainly not think of doing
+at present) to marry a woman with money, who would
+admiration.
+"That's the very thing I had been thinking myself !'
+he naively said.
+Farmer Oak had one-and-a-half Christian character
+istics too many to succeed with Bathsheba : his humility,
+and a superfluous moiety of honesty. Bathsheba was
+decidedly disconcerted,
+"Well, then, why did you come and disturb me?'
+she said, almost angrily, if not quite, an enlarging red
+spot rising in each cheek.
+" I can't do what I think would be -- would be --  -- '
+" Right ? '
+" No : wise.'
+" You have made an admission now, Mr. Oak,' she
+exclaimed, with even more hauteur, and rocking her
+head disdainfully. 'After that, do you think I could
+marry you? Not if I know it.'
+He broke in passionately ! "But don't mistake me
+like that! Because I am open enough to own what
+every man in my shoes would have thought of, you
+make your colours come up your face, and get crabbed
+with me. That about your not being good enough for
+me is nonsense. You speak like a lady -- all the parish
+notice it, and your uncle at Weatherbury is, I have
+heerd, a large farmer -- much larger than ever I shall
+be. May I call in the evening, or will you walk along
+with me o' Sundays? I don't want you to make-up
+your mind at once, if you'd rather not.'
+<P 82>
+" No -- no -- I cannot. Don't press me any more --
+don't. I don't love you -- so 'twould be ridiculous,'
+she said, with a laugh.
+No man likes to see his emotions the sport of a
+merry-go-round of skittishness. " Very well,' said Oak,
+firmly, with the bearing of one who was going to give '
+his days and nights to Ecclesiastes for ever. "Then
+I'll ask you no more.'
+<C v>
+<P 83>
+DEPARTURE OF BATHSHEBA -- A PASTORAL TRAGEDY
+THE news which one day reached Gabriel, that Bath+
+sheba Everdene had left the neighbourhood, had an
+influence upon him which might have surprised any
+who never suspected that the more emphatic the renun+
+ciation the less absolute its character.
+It may have been observed that there is no regula
+path for getting out of love as there is for getting in.
+Some people look upon marriage as a short cut that way,
+but it has been known to fail. Separation, which was
+the means that chance offered to Gabriel Oak by
+Bathsheba's disappearance though effectual with people
+of certain humours is apt to idealise the removcd object
+with others -- notably those whose affection, placid and
+regular as it may be flows deep and long. Oak belonged
+to the even-tempered order of humanity, and felt the
+secret fusion of himself in Bathsheba to be burning with
+a finer flame now that she was gone -- that was all.
+His incipient friendship with her aunt-had been
+nipped by the failure of his suit, and all that Oak learnt
+of Bathsheba's movements was done indirectly. It ap+
+peared that she had gone to a place called Weatherbury,
+more than twenty miles off, but in what capacity --
+whether as a visitor, or permanently, he could not
+discover.
+Gabriel had two dogs. George, the elder, exhibited
+an ebony-tipped nose, surrounded by a narrow margin
+of pink flesh, and a coat marked in random splotches
+approximating in colour to white and slaty grey ; but the
+grey, after years of sun and rain, had been scorched and
+washed out of the more prominent locks, leaving them
+of a reddish-brown, as if the blue component of the grey
+had faded, like the indigo from the same kind of colour in
+Turner's pictures. In substance it had originally been
+hair, but long contact with sheep seemed
+<P 84>
+to be turning
+it by degrees into wool of a poor quality and staple.
+This dog had originally belonged to a shepherd of
+inferior morals and dreadful temper, and the result was
+that George knew the exact degrees of condemnation
+signified by cursing and swearing of all descriptions
+better than the wickedest old man in the neighbourhood.
+Long experience had so precisely taught the animal the
+difference between such exclamations as 'Come in .! '
+and 'D --  --  ye, come in !.' that he knew to a hair's
+breadth the rate of trotting back from the ewes' tails
+that each call involved, if a staggerer with the sheep
+crook was to be escaped. Though old, he was clever
+and trustworthy still.
+The young dog, George's son, might possibly have
+been the image of his mother, for there was not much
+resemblance between him and George. He was learn+
+ing the sheep-keeping business, so as to follow on at
+the flock when the other should die, but had got no
+further than the rudiments as yet -- still finding an
+insuperable difculty in distinguishing between doing a
+thing well enough and doing it too well. So earnest
+and yet so wrong-headed was this young dog (he had no,
+name in particular, and answered with perfect readiness
+to any pleasant interjection), that if sent behind the
+flock to help them on, he did it so thoroughly that he
+would have chased them across the whole county with
+the greatest pleasure if not called off or reminded when
+to step by the example of old George.
+Thus much for the dogs. On the further side of
+Norcombe Hill was a chalk-pit, from which chalk had
+been drawn for generations, and spread over adjacent
+farms. Two hcdges converged upon it in the form of
+a V, but without quite meeting. The narrow opening
+left, which was immediately over the brow of the pit,
+was protected by a rough railing.
+One night, when Farmer Oak had returned to, his
+house, believing there would be no further necessity for
+his attendance on the down, he called as usual to the
+dogs, previously to shutting them up in the outhouse till
+next morning. Only one responded -- old George ; the
+other-could not be found, either in the house, lane, or
+garden. - Gabriel then remembered
+<P 85>
+that he had left the
+two dogs on the hill eating a dead lamb (a kind of meat
+he usually kept from them, except when other food-ran
+finished his meal, he went indoors to the luxury of a bed,
+which latterly he had only enjoyed on Sundays.
+It was a still, moist night. Just before dawn he was
+assisted in waking by the abnormal reverberation of
+familiar music. To the shepherd, the note of the sheep'
+chronic sound that only makes itself noticed by ceasing
+ever distant, that all is well in the fold. In the solemn
+This exceptional ringing may be caused in two ways -- +
+by the rapid feeding of the sheep bearing the bell, as
+when the flock breaks into new pasture, which gives it
+an intermittent rapidity, or by the sheep starting off in
+a run, when the sound has a regular palpitation. The
+experieced ear of Oak knew the sound he now' heard
+to be caused by the running of the flock with great
+velocity.
+He jumped out of bed, dressed, tore down the lane
+through a foggy dawn, and ascended the hill. The
+forward ewes were kept apart from those among which
+the fall of lambs would be later, there being two hundred
+of the latter class in Gabriel's flock. These two hundred
+seemed to have absolutely vanished from the hill. There
+were the fifty with their lambs, enclosed at the other end
+as he had left them, but the rest, forming the bulk of
+the flock, were nowhere. Gabriel called at the top of
+his voice the shepherd's call.
+" Ovey, ovey, ovey .! '
+Not a single bleat. He went to the hedge -- a gap
+had been broken through it, and in the gap were the
+footprints of the sheep. Rather surprised to find
+them break fence at this season, yet putting it down
+instantly to their great fondness for ivy in winter-time,
+of which a great deal grew in the plantation, he followed
+through the hedge. They were not in the plantation.
+He called again : the valleys and farthest hills
+<P 86>
+resounded
+as when the sailors invoked the lost Hylas on the Mysian
+shore ; but no sheep. He passed through the trees and
+along the ridge of the hill. On the extreme summit,
+where the ends of the two converging hedges of which
+we have spoken were stopped short by meeting the brow
+of the chalk-pit, he saw the younger dog standing against
+the sky -- dark and motionless as Napoleon at St.
+Helena.
+A horrible conviction darted through Oak. With
+a sensation of bodily faintness he advanced : at one
+point the rails were broken through, and there he saw
+the footprints of his ewes. The dog came up, licked
+his hand, and made signs implying that he expected
+some great reward for signal services rendered. Oak
+looked over the precipice. The ewes lay dead and dying
+at its foot -- a heap of two hundred mangled careases,
+representing in their condition just now at least two
+hundred more.
+Oak was an intensely humane man: indeed, his
+humanity often tore in pieces any politic intentions of
+his which bordered on strategy, and carried him on as
+by gravitation. A shadow in his life had always been
+that his flock ended in mutton -- that a day came and
+found every shepherd an arrant traitor to his defenceless
+sheep. His first feeling now was one of pity for the
+untimely fate of these gentle ewes and their unborn
+lambs.
+It was a second to remember another phase of the
+matter. The sheep were not insured. All the savings
+of a frugal life had been dispersed at a blow ; his hopes
+of being an independent farmer were laid low -- possibly
+for ever. Gabriel's energies, patience, and industry had
+been so severely taxed during the years of his life between
+eighteen and eight-and-twenty, to reach his present stage
+of progress' that no more seemed to be left in him. He
+hands.
+Stupors, however, do not last for ever, and Farmer
+Oak recovered from his. It was as remarkable as it was
+characteristic that the one sentence he uttered was in
+thankfulness : --
+'Thank God I am not married : what would she have
+done in the poverty now coming upon me ! '
+<P 87>
+Oak raised his head, and wondering what he could
+do listlessly surveyed the scene. By the outer margin
+of the Pit was an oval pond, and over it hung the
+attenuated skeleton of a chrome-yellow moon which
+had only a few days to last -- the morning star dogging
+her on the left hand. The pool glittered like a dead
+man's eye, and as the world awoke a breeze blew,
+shaking and elongating the reflection of the moon
+without breaking it, and turning the image of the star
+to a phosphoric streak upon the water. All this Oak
+saw and remembered.
+As far as could be learnt it appeared that the poor
+young dog, still under the impression that since he was
+kept for running after sheep, the more he ran after
+them the better, had at the end of his meal off the
+dead lamb, which may have given him additional energy
+and spirits, collected all the ewes into a corner, driven
+the timid creatures through the hedge, across the upper
+field, and by main force of worrying had given them
+momentum enough to break down a portion of the
+rotten railing, and so hurled them over the edge.
+George's son had done his work so thoroughly that
+he was considered too good a workman to live, and was,
+in fact, taken and tragically shot at twelve o'clcck that
+same day -- another instance of the untoward fate which
+so often attends dogs and other philosophers who
+follow out a train of reasoning to its logical conclusion,
+and attempt perfectly consistent conduct in a world
+made up so largely of compromise.
+Gabriel's farm had been stocked by a dealer -- on the
+strength of Oak's promising look and character -- who
+was receiving a percentage from the farmer till such
+time as the advance should be cleared off Oak found+
+that the value of stock, plant, and implements which
+were really his own would be about sufficient to pay his
+debts, leaving himself a free man with the clothes he
+stood up in, and nothing more.
+<C vi>
+<P 88>
+THE FAIR -- THE JOURNEY -- THE FIRE
+TWO months passed away. We are brought on to a
+day in February, on which was held the yearly statute
+or hiring fair in the county-town of Casterbridge.
+At one end of the street stood from two to three
+hundred blithe and hearty labourers waiting upon Chance
+ -- all men of the stamp to whom labour suggests nothing
+worse than a wrestle with gravitation, and pleasure
+nothing better than a renunciation of the same among
+these, carters and waggoners were distinguished by
+having a piece of whip-cord twisted round their hats;
+thatchers wore a fragment of woven straw; shepherds
+held their sheep-crooks in their hands; and thus the
+situation required was known to the hirers at a
+glance.
+In the crowd was an athletic young fellow of some+
+what superior appearance to the rest -- in fact, his
+superiority was marked enough to lead several ruddy
+peasants standing by to speak to him inquiringly, as to
+a farmer, and to use 'Sir' as a finishing word. His
+answer always was,
+'I am looking for a place myself -- a bailiff's. Do
+Ye know of anybody who wants one ?'
+Gabriel was paler now. His eyes were more medi+
+tative, and his expression was more sad. He had
+passed through an ordeal of wretchedness which had
+given him more than it had taken away. He had sunk
+from his modest elevation as pastoral king into the very
+slime-pits of Siddim ; but there was left to him a digni+
+fied calm he had never before known, and that indiffer+
+ence to fate which, though it often makes a villain of
+a man, is the basis of his sublimity when it does not.
+And thus the abasement had been exaltation, and the
+loss gain.
+In the morning a regiment of cavalry had left the
+town, and a sergeant and his party had been beating up
+for recruits through the four streets. As the end of the
+day drew on, and
+<P 89>
+he found himself not hired, Gabriel
+almost wished that he had joined them, and gone off to
+serve his country. Weary of standing in the market+
+place, and not much minding the kind of work he
+turned his hand to, he decided to offer himself in some
+other capacity than that of bailiff.
+All the farmers seemed to be wanting shepherds.
+Sheep-tending was Gabriel's speciality. Turning down
+an obscure street and entering an obscurer lane, he went
+up to a smith's shop.
+'How long would it take you to make a shepherd's
+crook ? '
+'Twenty minutes.'
+'How much ? '
+'Two shillings.'
+He sat on a bench and the crook was made, a stem
+being given him into the bargain.
+He then went to a ready-made clothes' shop, the
+owner of which had a large rural connection. As the
+crook had absorbed most of Gabriel's money, he
+attempted, and carried out, an exchange of his overcoat
+for a shepherd's regulation smock-frock.
+This transaction having been completed, he again
+hurried off to the centre of the town, and stood on the
+kerb of the pavement, as a shepherd, crook in hand.
+Now that Oak had turned himself into a shepherd, it
+seemed that bailifs were most in demand. However, two
+or three farmers noticed him and drew near. Dialogues
+followed, more or lessin the subjoined for: --
+'Where do you come from?'
+'Norcombe.'
+'That's a long way.
+'Fifteen miles.'
+'Who's farm were you upon last?'
+'My own.'
+This reply invariably operated like a rumour of
+cholera. The inquring farmer would edge away and
+shake his head dubiously. Gabriel, like his dog, was
+too good to be trustworthy,. and he never made advance
+beyond this point.
+It is safer to accept any chance that offers itself, and
+ 
+ 
+<P 90>
+extemporize a procedure to fit it, than to get a good
+shepherd, but had laid himself out for anything in the
+whole cycle of labour that was required in the fair. It
+grew dusk. Some merry men were whistling and
+singing by the corn-exchange. Gabriel's hand, which
+had lain for some time idle in his smock-frock pocket,
+touched his flute which he carried there. Here was
+an opportunity for putting his dearly bought wisdom
+into practice.
+He drew out his flute and began to play  Jockey to
+the Fair' in the style of a man who had never known
+moment's sorrow. Oak could pipe with Arcadian
+sweetness and the sound of the well-known notes
+cheered his own heart as well as those of the loungers.
+He played on with spirit, and in half an hour had
+earned in pence what was a small fortune to a destitute
+man.
+By making inquiries he learnt that there was another
+fair at Shottsford the next day.
+'How far is Shottsford?'
+'Ten miles t'other side of Weatherbury.'
+Weatherbury!. It was where Bathsheba had gone
+two months before. This information was like coming
+from night into noon.
+'How far is it to Weatherbury ?'
+'Five or six miles.'
+Bathsheba had probably left Weatherbury long before
+this time, but the place had enough interest attaching
+to it to lead Oak to choose Shottsford fair as his next
+field of inquiry, because it lay in the Weatherbury
+quarter. Moreover, the Weatherbury folk were by no
+means uninteresting intrinsically. If report spoke truly
+they were as hardy, merry, thriving, wicked a set as
+any in the whole county. Oak resolved to sleep at
+Weatherbury -- -that -- night on his way to Shottsford,
+and struck out at once -- into the -- high road which had
+been recommended as the direct route to the village in
+question.
+The road stretched through water-meadows traversed
+by little brooks, whose quivering surfaces were braided
+along their centres, and folded into creases at the sides;
+or, where the flow was more rapid, the stream was pied
+with spots of white froth,
+<P 91>
+which rode on in undisturbed
+serenity. On the higher levels the dead and dry carcases
+of leaves tapped the ground as they bowled along helter+
+skelter upon the shoulders of the wind, and little birds
+in the hedges were rustling their feathers and tucking
+themselves in comfortably for the night, retaining their
+places if Oak kept moving, but flying away if he
+stopped to look at them. He passed by Yalbury-Wood
+where the game-birds were rising to their roosts, and
+heard the crack-voiced cock-pheasants' 'cu-uck, cuck,'
+and the wheezy whistle of the hens.
+By the time he had walked three or four miles every
+shape in the-landscape had assumed a uniform hue of
+blackness. He descended Yalbury Hill and could just
+discern ahead of him a waggon, drawn up under a great
+over-hanging tree by the roadside.
+On coming close, he found there were no horses
+attached to it, the spot being apparently quite deserted.
+The waggon, from its position, seemed to have been left
+there for the night, for beyond about half a truss  of hay
+which was heaped in the bottom, it was quite empty.
+Gabriel sat down on the shafts of the vehicle and con+
+sidered his position. He calculated that he had walked
+a very fair proportion of the journey; and having been
+on foot since daybreak, he felt tempted to lie down upon
+the hay in the waggon instead of pushing on to the
+village of Weatherbury, and having to pay for a lodging.
+Eating his las slices of bread and ham, and drinking
+from the bottle of cider he had taken the precaution to
+bring with him, he got into the lonely waggon. Here
+he spread half of the hay as a bed, and, as well as he
+could in the darkness, pulled the other half over him
+by way of bed-clothes, covering himself entirely, and
+feeling, physically, as comfortable as ever he had been
+in his life. Inward melancholy it was impossible for
+a man like Oak, introspective far beyond his neighbours,
+to banish quite, whilst conning the present. untoward
+page of his history. So, thinking of his misfortunes,
+amorous and pastoral he fell asleep, shepherds enjoying,
+in common with sailors, the privilege of being able to
+summon the god instead of having to wait for him.
+<P 92>
+On somewhat suddenly awaking after a sleep of
+whose length he had no idea, Oak found that the waggon
+was in motion. He was being carried along the road
+at a rate rather considerable for a vehicle without
+springs, and under circumstances of physical uneadiness,
+his head being dandled up and down on the bed of
+the waggon like a kettledrum-stick. He then dis+
+tinguished voices in conversation, comig from the
+forpart of the waggon. His concern at this dilemma
+(which would have been alarm, had he been a thriving
+man; but -- misfortune is a fine opiate to personal terror)
+led him to peer cautiously from the hay, and the first
+sight he beheld was the stars above him. Charles's
+Wain was getting towards a right angle with the Pole
+star, and Gabriel concluded that it must be about nine
+o'clock -- in other words, that he had slept two hours.
+This small astronomical calculation was made without
+any positive effort, and whilst he was stealthily turning
+to discover, if possible, into whose hands he had fallen.
+Two figures were dimly visible in front, sitting with
+their legs outside the waggon, one of whom was driving.
+Gabriel soon found that this was the waggoner, and it
+appeared they had come from Casterbridge fair, like
+himself.
+A conversation was in progress, which continued
+thus : --
+'Be as 'twill, she's a fine handsome body as far's
+looks be concerned. But that's only the skin of the
+woman, and these dandy cattle be as-proud as a lucifer
+in their insides.'
+'Ay -- so 'a do seem, Billy Smallbury -- so 'a do seem.'
+This utterance was very shaky by nature, and more so
+by circumstance, the jolting of the waggon not being+
+without its effect upon the speaker's larynx. It came
+'from the man who held the reins.
+'She's a very vain feymell -- so 'tis said here and
+there.'
+'Ah, now. If so be 'tis like that, I can't look her in
+the face. Lord, no : not I -- heh-heh-heh .! Such a shy
+man as I be.!'
+'Yes -- she's very vain. 'Tis said that every night at
+going to bed she looks in the glass to put on her night+
+cap properly.'
+'And not a married woman. Oh, the world .!
+"And 'a can play the peanner, so 'tis said. Can
+play so clever
+<P 93>
+that 'a can make a psalm tune sound as
+well as the merriest loose song a man can wish for.'
+'D'ye tell o't .! A happy time for us, and I feel quite
+a new man! And how do she play?'
+'That I dson't know, Master Poorgrass.'
+On hearing these and other similar remarks, a wild
+thought flashed into Gabriel's mind that they might
+be speaking of Bathsheba. There were, however, no
+ground for retaining such a supposition, for the waggon,
+though going in the direction of Weatherbury, might be
+going beyond it, and the woman alluded to seemed to be
+the mistress of some estate. They were now apparently
+close upon Weatherbury and not to alarm the speakers
+unnecessarily, Gabriel slipped out of the waggon unseen.
+He turned to an opening in the hedge, which he
+found to be a gate, and mounting thereon, he sat
+meditating whether to seek a cheap lodging in the
+village, or to ensure a cheaper one by lying under
+some hay or corn-stack. The crunching jangle of the
+waggon died upon his ear. He was about to walk on,
+when he noticed on his left hand an unusual light -- +
+appearing about half a mile distant. Oak watched it,
+and the glow increased. Something was on fire.
+Gabriel again mounted the gate, and, leaping down
+on the other side upon what he found to be ploughed
+soil, made across the field in the exact direction of the
+fire. The blaze, enlarging in a  double ratio by his
+approach and its own increase, showed him as he drew
+nearer the outlines of ricks beside it, lighted up to great
+distinctness. A rick-yard was the source of the fire.
+His weary face now began to be painted over with a
+rich orange glow, and the whole front of his smock+
+frock and gaiters was covered with a dancing shadow
+pattern of thorn-twigs -- the light reaching him through
+a leafless intervening hedge -- and the metallic curve of
+his sheep-crook shone silver-bright in the same abound+
+ing rays. He came up to the boundary fence, and
+stood to regain breath. It seemed as if the spot was
+unocupied by a living soul.
+The fire was issuing from a long straw-stack, which
+was so
+<P 94>
+far gone as to preclude a possibility of saving it.
+A rick burns differently from a house. As the wind
+blows the fire inwards, the portion in flames completely
+disappears like melting sugar, and the outline is lost
+to the eye. However, a hay or a wheat-rick, well put
+together, will resist combustion for a length of time, if
+it begins on the outside.
+This before Gabriel's eyes was a- rick of straw, loosely
+put together, and the flames darted into it with lightning
+swiftness. It glowed on the windward side, rising and
+falling in intensity, like the coal of a cigar. Then a
+superincumbent bundle rolled down, with a whisking
+noise ; flames elongated, and bent themselves about
+with a quiet roar, but no crackle. Banks of smoke
+went off horizontally at the back like passing clouds,
+and behind these burned hidden pyres, illuminating
+the semi-transparent sheet of smoke to a lustrous yellow
+uniformity. Individual straws in the foreground were
+consumed in a creeping movement of ruddy heat, as
+if they were knots of red worms, and above shone
+imaginary fiery faces, tongues hanging from lips, glaring
+eyes, and other impish forms, from which at intervals
+sparks flew in clusters like birds from a nest,
+Oak suddenly ceased from being a mere spectator
+by discovering the case to be more serious than he had
+at first imagined. A scroll of smoke blew aside and
+revealed to him a wheat-rick in startling juxtaposition
+with the decaying one, and behind this a series of
+others, composing the main corn produce of the farm;
+so that instead of the straw-stack standing, as he had
+imagined comparatively isolated, there was a regular
+connection between it and the remaining stacks of the
+group.
+Gabriel leapt over the hedge, and saw that he was
+not alone. The first man he came to was running
+about in a great hurry, as if his thoughts were several
+yards in advance of his body, which they could never
+drag on fast enough.
+'O, man -- fire, fire ! A good master and a. bad
+servant is fire, fire .! -- I mane a bad servant and a good
+master O, Mark Clark -- come !- And you, Billy
+Smallbury -- and you, Maryann Money -- and you, Jan
+Coggan, and Matthew there!' Other figures now
+appeared behind this shouting man and among the
+smoke, and
+<P 95>
+Gabriel found that, far from being alone
+he was in a great company -- whose shadows danced
+merrily up and down, timed by the jigging of the
+flames, and not at all by their owners' movements.
+The assemblage -- -belonging to that class of society
+which casts its thoughts into the form of feeling, and
+its feelings into the form of commotion -- set to work
+with a remarkable confusion of purpose.
+'Stop the draught under the wheat-rick!' cried
+Gabriel to those nearest to him. The corn stood on
+stone staddles, and between these, tongues of yellow
+hue from the burning straw licked and darted playfully.
+If the fire once got under this stack, all would be
+lost.
+'Get a tarpaulin -- quick .! ' said Gabriel.
+A rick-cloth was brought, and they hung it like a
+curtain across the channel. The flames immediately
+ceased to go under the bottom of the corn-stack, and
+stood up vertical.
+'Stand here with a bucket of water and keep the
+cloth wet,' said Gabriel again.
+The flames, now driven upwards, began to attack
+the angles of the huge roof covering the wheat-stack.
+'A ladder,' cried Gabriel.
+'The ladder was against the straw-rick and is burnt
+to a cinder,' said a spectre-like form in the smoke.
+Oak seized the cut ends of the sheaves, as if he
+were going to engage in the operation of ' reed-drawing,'
+and digging in his feet, and occasionally sticking in the
+stem of his sheep-crook, he clambered up the beetling
+face. He at once sat astride the very apex, and began
+with his crook to beat off the fiery fragments which had
+lodged thereon, shouting to the others to get him a
+bough and a ladder, and some water.
+Billy Smallbury -- one of the men who had been on
+the waggon -- by this time had found a ladder, which
+Mark Clark ascended, holding on beside Oak upon the
+thatch. The smoke at this corner was stifling, and
+Clark, a nimble fellow, having been handed a bucket
+of water, bathed Oak's face and sprinkled him generally,
+whilst Gabriel, now with a long beech-bough in one
+hand, in addition to his crook in the other, kept
+sweeping the stack and dislodging all fiery particles.
+<P 96>
+On the ground the groups of villagers were still
+occupied in doing all they could to keep down the
+conflagration, which was not much. They were all
+tinged orange, and backed up by shadows of varying
+pattern. Round the corner of the largest stack, out
+of the direct rays of the fire, stood a pony, bearing a
+young woman on its back. By her side was another
+woman, on foot. These two seemed to keep at a
+distance from the fire, that the horse might not beome
+restive.
+'He's a shepherd,' said the woman on foot. 'Yes --
+he is. See how his crook shines as he beats the rick
+with it. And his smock-frock is burnt in two holes, I
+declare.! A fine young shepherd he is too, ma'am.'
+' Whose shepherd is he?' said the equestrian in a
+clear voice.
+'Don't know, ma'am.'
+ " Don't any of the others know ?'
+ " Nobody at all -- I've asked 'em. Quite a stranger,
+ they say.'
+ The young woman on the pony rode out from the
+shade and looked anxiously around.
+"Do you think the barn is safe ?" she said.
+"D'ye think the barn is safe, Jan Coggan ?' said
+the second woman, passing on the question to the
+nearest man in that direction.
+"Safe -now -- leastwise I think so. If this rick had
+gone the barn would have followed. 'Tis- that bold
+shepherd up there that have done the most good -- he
+sitting on the top o' rick, whizzing his great long-arms
+about like a windmill.'
+" He does work hard,' said the young woman on
+horseback, looking up at Gabriel through her thick
+woollen veil. "I wish he was shepherd here. Don't
+any of you know his name.'
+"Never heard the man's name in my life, or seed
+his form afore.'
+The fire began to get worsted, and Gabriel's elevated
+position being no longer required of him, he made as
+if to descend.
+"Maryann,' said the girl on horseback, "go to him
+as he comes down, and say that the farmer wishes to
+thank him for the great service he has done.'
+Maryann stalked off towards the rick and met
+Oak at the foot of the ladder. She delivered ber
+message.
+<P 97>
+" Where is your master the farmer ?' asked Gabriel,
+kindling with the idea of getting employment that
+seemed to strike him now.
+" 'Tisn't a master ; 'tis a mistress, shepherd.'
+" A woman farmer ? '
+"Ay, 'a b'lieve, and a rich one too .!' said a by"
+stander. " Lately 'a came here from a distance. Took
+on her uncle's farm, who died suddenly. Used to
+measure his money in half-pint cups. They say now
+that she've business in every bank in Casterbridge, and
+thinks no more of playing pitch-and-toss sovereign than
+you and I, do pitch-halfpenny -- not a bit in the world,
+shepherd.'
+"That's she, back there upon the pony,' said Mary+
+ann ;"wi'her face a-covered up in that black cloth with
+holes in it.'
+Oak, his features smudged, grimy, and undiscoverable
+from the smoke and heat, his smock-frock burnt-into
+holes and dripping with water, the ash stem of his sheep+
+crook charred six inches shorter, advansed with the
+humility stern adversity had thrust upon him up to
+the slight female form in the saddle. He lifted his
+hat with respect, and not without galantry: stepping
+close to her hanging feet he said in a hesitating voice, --
+" Do you happen to want a shepherd, ma'am ? '
+She lifted the wool veil tied round her face, and
+looked all astonishment. Gabriel and his cold-hearted
+darling, Bathsheba Everdene, were face to face.
+Bathsheba did not speak, and he mechanically
+repeated in an abashed and sad voice, --
+" Do you want a shepherd, ma'am ? '
+<C vii>
+<P 98>
+RECOGNITION -- A TIMID GIRL
+BATHSHEBA withdrew into the shade. She scarcely
+knew whether most to be amused at the singularity of
+the meeting, or to be concerned at its awkwardness.
+There was room for a little pity, also for a very little
+exultation : the former at his position, the latter at her
+own. Embarrassed she was not, and she" remembered
+Gabriel's declaration of love to her at Norcombe only
+to think she had nearly forgotten it.
+" Yes,' she murmured, putting on an air of dignity,
+and turning again to him with a little warmth of cheek ;
+" I do want a shepherd. But --  -- '
+" He's the very man, ma'am,' said one of the villagers,
+quietly.
+Conviction breeds conviction. " Ay, that 'a is,' said
+a second, decisively.
+"The man, truly .! ' said a third, with heartiness."
+" He's all there ! ' said number four, fervidly."
+Then will you tell him to speak to the bailiff, said
+Bathsheba.
+All "was practical again now. A summer eve and
+loneliness would have been necessary to give the
+meeting its proper fulness of romance.
+the palpitation within his breast at discovering that this
+Ashtoreth of strange report was only a modification of
+Venus the well-known and admired, retired with him to
+talk over the necessary preliminaries of hiring.
+The fire before them wasted away. "Men,' said
+Bathsheba, " you shall take a little refreshment after this
+extra work. Will you come to the house ?'
+"We could knock in a bit and a drop a good deal
+freer, Miss,
+<P 99>
+if so be ye'd send it to Warren's Malthouse,'
+replied the spokesman.
+Bathsheba then rode off into the darkness, and the
+men straggled on to the village in twos and threes -- Oak
+and the bailiff being left by the rick alone.
+"And now,' said the bailiff, finally, "all is settled, I
+think, about your coming, and I am going home-along.
+Good-night to ye, shepherd.'
+" Can you get me a lodging ? ' inquired Gabriel.
+'That I can't, indeed," he said, moving past Oak as
+a Christian edges past an offertory-plate when he does
+not mean to contribute. "If you follow on the road till
+you come to Warren's Malthouse, where they are all
+gone to have their snap of victuals, I daresay some of
+'em will tell you of a place. Good-night to ye, shepherd.'
+The bailiff who showed this nervous dread of loving
+his neighbour as himself, went up the hill, and Oak
+walked on to the village, still astonished at the ren+
+counter with Bathsheba, glad of his nearness to her, and
+perplexed at the rapidity with which the unpractised girl
+of Norcombe had developed into the supervising and cool
+woman here. But some women only require an emerg+
+ency to make them fit for one.
+Obligcd, to some extent, to forgo dreaming in order
+to find the way, he reachcd the churchyard, and passed
+round it under the wall where several ancient trees grew.
+There was a wide margin of grass along here, and
+Gabriel's footsteps were deadened by its softness, even
+at this indurating period of the year. When abreast of
+a trunk which appeared to be the oldest of the old, he
+became aware that a figure was standing behind it.
+Gabriel did not pause in his walk, and in another
+moment he accidentally kicked a loose stone. The noise
+was enough to disturb the motionless stranger, who
+started and assumed a careless position.
+It was a slim girl, rather thinly clad.
+" Good-night to you,' said Gabriel, heartily.
+" Good-night,' said the girl to Gabriel.
+The voice was unexpectedly attractive ; it was "the
+low and
+<P 100>
+dulcet note suggestive of romance ; common in
+descriptions, rare in experience.
+'I'll thank you to tell me if I'm in the way for
+Warren's Malthouse ? ' Gabriel resumed, primarily to gain
+the information, indirectly to get more of the music.
+"Quite right. It's at the bottom of the hill. And
+do you know --  -- ' The girl hesitated and then went
+on again. "Do you know how late they keep open
+the Buck's Head Inn?' She seemed" to be won by
+Gabriel's heartiness, as Gabriel had been won by her
+modulations.
+" I don't know where the Buck's Head is, or anything
+about it. Do you think of going there to-night ?'
+" Yes --  -- ' The woman again paused. There was
+no necessity for any continuance of speech, and the fact
+that she did add more seemed to proceed from an
+unconscious desire to show unconcern by making a
+remark, which is noticeable in the ingenuous when they
+are acting by stealth. " You are not a Weatherbury man ? '
+she said, timorously.
+' I am not. I am the new shepherd -- just arrived.'
+"Only a shepherd -- and you seem almost a farmer by
+your ways.'
+" Only a shepherd,' Gabriel repeated, in a dull cadence
+of finality. " His thoughts were directed to the past, his
+eyes to the feet of the girl; and for the first time he
+saw lying there a bundle of some sort. She may have
+perceived the direction of his face, for she said
+coaxingly, --
+" You won't say anything in the parish about having
+seen me here, will you -- at least, not for a day or two ?'
+"I won't if you wish me not to,' said Oak.
+"Thank you, indeed,' the other replied.'I am
+rather poor, and I don't want people to know anything
+about me.'  Then she was silent and shivered.
+'You ought to have a cloak on such a cold night,'
+Gabriel observed. " I would advise 'ee to get indoors."
+"O no! Would you mind going on and leaving
+me ? I thank you much for what you have told me.'
+" I will go on,' he said ; adding hesitatingly, -- ' Since
+you are
+<P 101>
+not very well off, perhaps you would accept this
+trifle from me. It is only a shilling, but'it is all I have
+to spare.'
+' Yes, I will take it,' said the stranger, gratefully.
+She extended her hand ; Gabriel his. In feeling for
+each other's palm in the gloom before the money could
+be passed, a minute incident occurred which told much.
+Gabriel's fingers alighted on the young woman's wrist.
+It was beating with a throb of tragic intensity. He had
+frequently felt the same quick, hard beat in the femoral
+artery of -- his lambs when overdriven. It suggested a
+consumption too great of a vitality which, to judge from
+her figure and stature, was already too little.
+"What is the matter ?'
+" Nothing.'
+'But there is?'
+" No, no, no ! Let your having seen me be a.secret .! "
+' Very well ; I will. Good-night, again.'
+" Good-night.'
+The young girl remained motionless by the tree, and
+Gabriel descended into the village of Weatherbury, or
+Lower Longpuddle as it was sometimes called. He
+fancied that he had felt himself in the penumbra of a
+very deep sadness when touching that slight and fragile
+creature. But wisdom lies in moderating mere impres+
+sions, and Gabriel endeavoured to think little of this.
+<C viii>
+<P 102>
+THE MALTHOUSE -- THE CHAT -- NEWS
+WARREN'S Malthouse was enclosed by an old wall
+inwrapped with ivy, and though not much of the exterior
+was visible at this hour, the character and purposes of
+the building were clearly enough shown by its outline
+upon the sky. From the walls an overhanging thatched
+roof sloped up to a point in the centre, upon which rose
+a small wooden lantern, fitted with louvre-boards on all
+the four sides, and from these openings a mist was dimly
+perceived to be escaping into the night air. There was
+no window in front ; but a square hole in the door was
+glazed with a single pane, through which red, comfortable
+rays now stretched out upon the ivied wall in front.
+Voices were to be heard inside.
+Oak's hand skimmed the surface of the door with
+fingers extended to an Elymas-the-Somerer pattern, till
+he found a leathern strap, which he pulled. This lifted
+a wooden latch, and the door swung open.
+The room inside was lighted only by the, ruddy glow
+from the kiln mouth, which shone over ,the floor with
+the streaming, horizontality of the setting sun, and threw
+upwards the shadows of all facial irregularities in those
+assembled around. The stone-flag floor was worn into
+a path from the doorway to the kiln, and into undula+
+tions everywhere. A curved settle of unplaned oak
+stretched along one side, and in a remote corner was a
+small bed and bedstead, the owner and frequent occupier
+of which was the maltster.
+This aged man was now sitting opposite the fire, his
+frosty white hair and beard overgrowing his gnarled
+figure like the grey moss and lichen upon a leafless
+apple-tree. He wore breeches and the laced-up shoes
+called ankle-jacks; he kept his eyes fixed upon the
+fire.
+<P 103>
+Gabriel's nose was greeted by an atmosphere laden
+with the sweet smell of new malt. The conversation
+(which seemed to have been concerning the origin of the
+fire) immediately ceased, and every one ocularly criticised
+him to the degree expressed by contracting the flesh of
+their foreheads and looking at him with narrowed eye+
+lids, as if he had been a light too strong for their sight.
+Several exclaimed meditatively, after this operation had
+been completed : --
+"Oh, 'tis the new shepherd, 'a b'lieve.'
+"We thought we heard a hand pawing about the
+door for the bobbin, but weren't sure 'twere not a dead
+leaf blowed across,' said another. " Come in, shepherd ;
+sure ye be welcome, though we don't know yer name.'
+" Gabriel Oak, that's my name, neighbours.'
+The ancient maltster sitting in the midst turned up
+this -- his turning being as the turning of a rusty
+crane.
+"That's never Gable Oak's grandson over at Nor+
+combe -- never !. ' he said, as a formula expressive of
+surprise, which nobody was supposed to take literally'.
+'My father and my grandfather were old men of the
+name of Gabriel,' said the shepherd, placidly.
+"Thought I knowed the man's face as I seed him
+on the rick ! -- thought I did.! And where be ye trading
+o't to now, shepherd ? '
+" I'm thinking of biding here,' said Mr. Oak.
+"Knowed yer grandfather for years and years !'
+continued the maltster, the words coming forth of their
+own accord as if the momentum previously imparted
+had been sufficient.
+'Ah -- and did you! '
+" Knowed yer grandmother.'
+'And her too!'
+"Likewise knowed yer father when he was a child.
+Why, my boy Jacob there and your father were sworn
+brothers -- that they were sure -- weren't ye, Jacob ? '
+"Ay, sure,' said his son, a young man about sixty+
+five, with a semi-bald head and one tooth in the left
+centre of his upper jaw, which made much of itself by
+standing prominent, like a
+<P 104>
+milestone in a bank. 'But
+'twas Joe had most to do with him. However, my son
+William must have knowed the very man afore us --
+didn't ye, Billy, afore ye left Norcombe ? '
+"No, 'twas Andrew,' said Jacob's son Billy, a child
+of forty, or thereabouts, who manifested the peculiarity
+of possessing a cheerful soul in a gloomy body, and
+whose whiskers were assuming a chinchilla shade here
+and there.
+"I can mind Andrew,' said Oak, 'as being a man in
+the place when I was quite a child.'
+"Ay -- the other day I and my youngest daughter,
+Liddy, were over at my grandson's christening,' continued
+Billy. ' We were talking about this very family, and
+'twas only last Purification Day in this very world, when
+the use-money is gied away to the second-best poor
+folk, you know, shepherd, and I can mind the day
+because they all had to traypse up to the vestry -- yes,
+this very man's family.'
+' Come, shepherd, and drink. 'Tis gape and
+swaller with us -- a drap of sommit, but not of much
+account,' said the maltster, removing from the fire his
+eyes, which were vermilion-red and bleared by gazing
+into it for so many years. "Take up the God-forgive"
+me, Jacob. See if 'tis warm, Jacoh.'
+Jacob stooped to the God-forgive-me, which was a
+two-handled tall mug standing in the ashes, cracked
+and charred with heat : it was rather furred with ex"
+traneous matter about the outside, especially in the
+crevices of the handles, the innermost curves of which
+may not have seen daylight for several years by reason
+of this encrustation thereon -- formed of ashes accident+
+ally wetted with cider and baked hard; but to the mind
+of any sensible drinker the cup was no worse for that,
+being incontestably clean on the inside and about the
+rim. It may be observed that such a class of mug is
+called a God-forgive-me in Weatherbury and its vicinity
+for uncertain reasons ; probably because its size makes
+any given toper feel ashamed of himself when he sees
+its bottom in drinking it empty.
+Jacob, on receiving the order to see if the liquor was
+warm enough, placidly dipped his forefinger into it by
+way of thermometer, and having pronounced it nearly
+of the proper degree, raised the cup and very civilly
+attempted to dust some of the
+<P 105>
+ashes from the bottom
+with the skirt of his smock-frock, because Shepherd Oak
+was a stranger.
+"A clane cup for the shepherd,' said the maltster
+commandingly.
+"No -- not at all," said Gabriel, in a reproving tone
+of considerateness. "I never fuss about dirt in its pure
+state, and when I know what sort it is.' Taking the
+mug he drank an inch or more from the depth of its
+contents, and duly passed it to the next man.
+wouldn't think of giving such trouble to neighbours in
+washing up when there's so much work to be done in
+the world already,' continued Oak in a moister tone,
+after recovering from the stoppage of breath which is
+occasioned by pulls at large mugs.
+' A right sensible man,' said Jacob.
+" True, true ; it can't be gainsaid!.' observed a brisk
+young man -- Mark Clark by name, a genial and pleasant
+gentleman, whom to meet anywhcre in your travels was
+to know, to know was to drink with, and to drink with
+was, unfortunately, to pay for.
+"And here's a mouthful of bread and bacon that
+mis'ess have sent, shepherd. The cider will go down
+better with a bit of victuals. Don't ye chaw quite close,
+shepherd, for I let the bacon fall in the road outside as
+I was bringing it along, and may be 'tis rather gritty.
+There, 'tis clane dirt; and we all know what that is,
+as you say, and you bain't a particular man we see,
+shepherd.'
+" True, true -- not at all,' said the friendly Oak.
+'Don't let your teeth quite meet, and you won't feel
+the sandiness at all. Ah !. 'tis wonderful what can be
+done by contrivance .! '
+" My own mind exactly, neighbour.'
+" Ah, he's his grandfer's own grandson .! -- his grandfer
+were just such a nice unparticular man !.' said the maltster.
+" Drink, Henry Fray -- drink,' magnanimously said
+Jan Coggan, a person who held Saint-Simonian notions
+of share and share alike where liquor was concerned, as
+the vessel showed signs of approaching him in its gradual
+revolution among them.
+Having at this moment reached the end of a wistful
+gaze
+<P 106>
+into mid-air, Henry did not refuse. He was a man
+of more than middle age, with eyebrows high up in his
+forehead, who laid it down that the law of the world
+was bad, with a long-suffering look through his listeners
+at the world alluded to, as it presented itself to his
+imagination. He always signed his name 'Henery' --
+strenuously insisting upon that spelling, and if any
+passing schoolmaster ventured to remark that the second
+'e' was superfluous and old-fashioned, he received the
+reply that ' H-e-n-e-r-y' was the name he was christened
+and the name he 'would stick to -- in the tone of one
+to whom orthographical differences were matters which
+had a great deal to do with personal character.
+Mr. Jan Coggan, who had passed the cup to Henery,
+was a crimson man with a spacious countenance, and
+private glimmer in his eye, whose name had appeared
+on the marriage register of Weatherbury and neighbour+
+ing parishes as best man and chief witness in countless
+unions of the previous twenty years; he also very
+frequently filled the post of head godfather in baptisms
+of the subtly-jovial kind.
+" Come, Mark Clark -- come. Ther's plenty more
+in the barrel,' said Jan.
+"Ay -- that I will; 'tis my only doctor,' replied Mr.
+Clark, who, twenty years younger than Jan Coggan,
+revolved in the same orbit. He secreted mirth on all
+occasions for special discharge at popular parties.
+" Why, Joseph Poorgrass, ye han't had a drop! ' said
+Mr. Coggan to a self-conscious man in the background,
+thrusting the cup towards him.
+" Such a modest man as he is !. ' said Jacob Smallbury.
+" Why, ye've hardly had strength of eye enough to look
+in our young mis'ess's face, so I hear, Joseph ?'
+All looked at Joseph Poorgrass with pitying reproach.
+" No -- I've hardly looked at her at all,' simpered
+Joseph, reducing his body smaller whilst talking,
+apparently from a meek sense of undue prominence.
+"And when I seed her, 'twas nothing but blushes with
+me!'
+' Poor feller,' said Mr. Clark.
+"'Tis a curious nature for a man,' said Jan Coggan.
+<P 107>
+" Yes,' continued Jdseph Poorgrass -- his shyness,
+which was so painful as a defect, filling him with a
+mild complacency now that it was regarded as an
+interesting study. " 'Twere blush, blush, blush with
+me every minute of the time, when she was speaking
+to me.'
+"I believe ye, Joseph Poorgrass, for we all know ye
+to be a very bashful man.'
+"'Tis a' awkward gift for a man, poor soul,' said the
+maltster. "And ye have suffered from it a long time,
+we know.'
+"Ay ever since I was a boy. Yes -- mother was
+concerned to her heart about it -- yes. But twas all
+nought.'
+"Did ye ever go into the world to try and stop it,
+Joseph Poorgrass ? '
+"Oh ay, tried all sorts o' company. They took me
+to Greenhill Fair, and into a great gay jerry-go-nimble
+show, where there were women-folk riding round --
+standing upon horses, with hardly anything on but their
+smocks; but it didn't cure me a morsel. And then I
+was put errand-man at the Women's Skittle Alley at the
+back of the Tailor's Arms in Casterbridge. 'Twas a
+horrible sinful situation, and a very curious place for a
+good man. I had to stand and look ba'dy people in
+the face from morning till night; but 'twas no use -- I
+was just as-bad as ever after all. Blushes hev been
+in the family for generations. There, 'tis a happy pro+
+vidence that I be no worse.'
+" True,' said Jacob Smallbury, deepening his thoughts
+to a profounder view of the subject. "'Tis a thought
+to look at, that ye might have been worse; but even
+as you be, 'tis a very bad affliction for 'ee, Joseph. For
+ye see, shepherd, though 'tis very well for a woman,
+dang it all, 'tis awkward for a man like him, poor
+feller ? '
+" 'Tis -- 'tis,' said Gabriel, recovering from a medita+
+tion. " Yes, very awkward for the man.'
+" Ay, and he's very timid, too,' observed Jan Coggan.
+"Once he had been working late at Yalbury Bottom,
+and had had a drap of drink, and lost his way as he was
+coming home-along through Yalbury Wood, didn't ye,
+Master Poorgrass ? '
+" No, no, no ; not that story !' expostulated the
+modest man, forcing a laugh to bury his concern.
+<P 108>
+" --  --  And so 'a lost himself quite,' continued Mr
+Coggan, with an impassive face, implying that a true
+narrative, like time and tide, must run its course and
+would respect no man. "And as he was coming along
+in the middle of the night, much afeared, and not able
+to find his way out of the trees nohow, 'a cried out,
+" Man-a-lost!. man-a-lost !." A owl in a tree happened
+to be crying "Whoo-whoo-whoo !" as owls do, you
+know, shepherd ' (Gabriel nodded), " and Joseph, all
+in a tremble, said, " Joseph Poorgrass, of Weatherbury,
+sir.!"
+"No, no, now -- that's too much! ' said the timid
+man, becoming a man of brazen courage all of a sudden.
+"I didn't say sir. I'll tike my oath I didn't say " Joseph
+Poorgrass o' Weatherbury, sir." No, no ; what's right
+is right, and I never said sir to the bird, knowing very
+well that no man of a gentleman's rank would be
+hollering there at that time o' night. " Joseph Poor+
+grass of Weatherbury,"  -- that's every word I said, and
+I shouldn't ha' said that if 't hadn't been for Keeper
+Day's metheglin.... There, 'twas a merciful thing it
+ended where it did.'
+The question of which was right being tacitly waived
+by the company, Jan went on meditatively : --
+"And he's the fearfullest man, bain't ye, Joseph?
+Ay, another time ye were lost by Lambing-Down Gate,
+weren't ye, Joseph ? '
+"I was,' replied Poorgrass, as if there were some
+conditions too serious even for modesty to remember
+itself under, this being one.
+' Yes ; that were the middle of the night, too. The
+gate would not open, try how he would, and knowing
+there was the Devil's hand in it, he kneeled down.'
+'Ay,' said Joseph, acquiring confidence from the
+warmth of the fire, the cider, and a perception of the
+narrative capabilities of the experience alluded to.
+" My heart died within me, that time; but I kneeled
+down and said the Lord's Prayer, and then the Belie
+THE CHAT
+right through, and then the Ten Commandments, in
+earnest prayer. But no, the gate wouldn't open; and
+then I went on with Dearly Beloved Brethren, and,
+thinks I, this makes four, and 'tis all I know out of
+book, and if this don't do it nothing will, and I'm a
+lost man. Well, when I got to
+<P 109>
+Saying After Me, I
+rose from my knees and found the gate would open
+ -- yes, neighbours, the gate opened the same as ever.'
+  A meditation on the obvious inference wsas indulged
+in by all, and during its continuance each directed his
+vision into the ashpit, which glowed like a desert in
+the tropics under a vertical sun, shaping their eyes long
+and liny, partly because of the light, partly from the
+depth of the subject discussed.
+  Gabriel broke the silence. "What sort of a place
+is this to live at, and what sort of a mis'ess is she to
+work under?' Gabriel's bosom thrilled gently as he
+thus slipped under the notice of the assembly the inner+
+most subject of his heart.
+  "We d' know little of her -- nothing. She only
+showed herself a few days ago. Her uncle was took
+bad, and the doctor was called with his world-wide
+skill; but he couldn't save the man. As I take it,
+she's going to keep on the farm.
+  "That's abouyt the shape o't, 'a b'lieve,' said Jan
+uncle was a very fair sort of man. Did ye know en,
+be under 'em as under one here and there. Her
+uncle was a very fair sort of man. Did ye know 'en,
+shepherd -- a bachelor-man ? '
+  "Not at all.'
+  "I used to go to his house a-courting my first wife,
+Charlotte, who was his dairymaid. Well, a very good+
+hearted man were Farmer Everdene, and I being a
+respectable young fellow was allowed to call and see
+her and drink as much ale as I liked, but not to carry
+away any -- outside my skin I mane of course.'
+  "Ay, ay, Jan Coggan; we know yer maning.'
+  "And so you see 'twas beautiful ale, and I wished
+to value his kindness as much as I could, and not to
+be so ill-mannered as to drink only a thimbleful, which
+would have been insulting the man's generosity  --  -- '
+  "True, Master Coggan, 'twould so,' corroborated
+Mark Clark.
+  " --  -- And so I used to eat a lot of salt fish afore
+going, and then by the time I got there I were as dry
+as a lime-basket -- so thorough dry that that ale would
+slip down  -- ah, 'twould slip down sweet! Happy
+times! heavenly times! Such lovely drunks as I
+used to have at that house! You can mind, Jacob?
+You used to go wi' me sometimes.'
+<P 110>
+  "I can -- I can,' said Jacob. "That one, too, that
+we had at Buck's Head on a White Monday was a
+pretty tipple.'
+  "'Twas. But for a wet of the better class, that
+brought you no nearer to the horned man than you were
+afore you begun, there was none like those in Farmer
+Everdene's kitchen. Not a single damn allowed; no,
+not a bare poor one, even at the most cheerful moment
+when all were blindest, though the good old word of
+sin thrown in here and there at such times is a great
+relief to a merry soul.'
+  "True,' said the maltster. "Nater requires her
+swearing at the regular times, or she's not herself; and
+unholy exclamations is a necessity of life.'
+  "But Charlotte,' continued Coggan -- "not a word of
+the sort would Charlotte allow, nor the smallest item of
+taking in vain.... Ay, poor Charlotte, I wonder if she
+had the good fortune to get into Heaven when 'a died!.
+But 'a was never much in luck's way, and perhaps 'a
+went downwards after all, poor soul.'
+  "And did any of you know Miss Everdene's-father
+and mother?' inquired the shepherd, who found some
+difficulty in keeping the conversation in the desired
+channel.
+THE CHAT
+  "I knew them a little,' said Jacob Smallbury; "but
+they were townsfolk, and didn't live here. They've
+been dead for years. Father, what sort of people were
+mis'ess' father and mother?'
+  "Well,' said the maltster, "he wasn't much to look
+at; but she was a lovely woman. He was fond enough
+of her as his sweetheart.'
+  "Used to kiss her scores and long-hundreds o times,
+so 'twas said,' observed Coggan.
+  "He was very proud of her, too, when they were
+married, as I've been told,' said the maltster.
+  "Ay,' said Coggan. "He admired her so much that
+he used to light the candle three time a night to look
+at her.'
+  "Boundless love; I shouldn't have supposed it in the
+universe!' murmered Joseph Poorgrass, who habitually
+spoke on a large scale in his moral reflections.
+  "Well, to be sure,' said Gabriel.
+  "Oh, 'tis true enough. I knowed the man and
+woman both well. Levi Everdene -- that was the man's
+name, sure. ""Man,''
+<P 111>
+saith I in my hurry, but he were
+of a higher circle of life than that -- 'a was a gentleman+
+tailor really, worth scores of pounds. And he became
+a very celebrated bankrupt two or three times.'
+  "Oh, I thought he was quite a common man!.' said
+Joseph.
+  "O no, no! That man failed for heaps of money;
+hundreds in gold and silver.'
+  The maltster being rather short of breath, Mr. Coggan,
+after absently scrutinising a coal which had fallen among
+the ashes, took up the narrative, with a private twirl of
+his eye: --
+  "Well, now, you'd hardly believe it, but that man --
+husbands alive, after a while. Understand' 'a didn't
+want to be fickle, but he couldn't help it. The poor
+feller were faithful and true enough to her in his wish,
+but his heart would rove, do what he would. He spoke
+to me in real tribulation about it once. ""Coggan,''
+he said, ""I could never wish for a handsomer woman
+than I've got, but feeling she's ticketed as my lawful
+wife, I can't help my wicked heart wandering, do what
+I will.'' But at last I believe he cured it by making her
+take off her wedding-ring and calling her by her maiden
+name as they sat together after the shop was shut, and
+so 'a would get to fancy she was only his sweetheart, and
+not married to him at all. And as soon as he could
+thoroughly fancy he was doing wrong and committing
+the seventh, 'a got to like her as well as ever, and they
+lived on a perfect picture of mutel love.'
+  "Well, 'twas a most ungodly remedy,' murmured
+Joseph Poorgrass; "but we ought to feel deep cheerful+
+ness that a 'happy Providence kept it from being any
+worse. You see, he might have gone the bad road and
+given his eyes to unlawfulness entirely -- yes, gross un+
+lawfulness, so to say it.'
+  "You see,' said Billy Smallbury, "The man's will was
+to do right, sure enough, but his heart didn't chime in.'
+  "He got so much better, that he was quite godly
+in his later years, wasn't he, Jan ?' said Joseph Poor+
+grass. "He got himself confirmed over again in a more
+serious way, and took to saying ""Amen'' almost as loud
+as the clerk, and he liked to copy comforting verses
+from the tombstones. He used, too, to hold the money+
+plate at Let Your Light so Shine, and stand
+<P 112>
+godfather
+to poor little come-by-chance children; and he kept a
+missionary' box upon his table to nab folks unawares
+when they called; yes, and he would-box the charity+
+boys' ears, if they laughed in church, till they could
+hardly stand upright, and do other deeds of piety
+natural to the saintly inclined.'
+  "Ay, at that time he thought of nothing but high
+things,' added Billy Smallbury. "One day Parson Thirdly
+met him and said, ""Good-Morning, Mister Everdene; 'tis
+THE CHAT
+a fine day!'' ""Amen'' said Everdene, quite absent+
+like, thinking only of religion when he seed a parson+
+  "Their daughter was not at all a pretty chiel at that
+time,' said Henery Fray. "Never should have. thought
+she'd have growed up such a handsome body as she is.'
+  "'Tis to be hoped her temper is as good as her face.'
+  "Well, yes; but the baily will have most to do with
+the business and ourselves. Ah!' Henery gazed into
+the ashpit, and smiled volumes of ironical knowledge.
+  "A queer Christian, like the Devil's head in a cowl,
+  "He is,' said Henery, implying that irony must cease
+at a certain point. "Between we two, man and man, I
+believe that man would as soon tell a lie Sundays as
+working-days -- that I do so.'
+  "Good faith, you do talk!' said Gabriel.
+  "True enough,' said the man of bitter moods, looking
+round upon the company with the antithetic laughter
+that comes from a keener appreciation of the miseries
+of life than ordinary men are capable of. 'Ah, there's
+people of one sort, and people of another, but that man
+ -- bless your souls!'
+  Gabriel thought fit to change the subject. "You
+must be a very aged man, malter, to have sons growed
+mild and ancient' he remarked.
+  "Father's so old that 'a can't mind his age, can ye,
+father?' interposed Jacob. "And he growled terrible
+crooked too, lately' Jacob continued, surveying his
+father's figure, which
+<P 113>
+was rather more bowed than his own.
+"Really one may say that father there is three-double.'
+  "Crooked folk will last a long while,' said the maltster,
+grimly, and not in the best humour.
+  "Shepherd would like to hear the pedigree of yer
+life, father -- wouldn't ye, shepherd ?
+  "Ay that I should,' said Gabriel with the heartiness
+of a man who had longed to hear it for several months.
+"What may your age be, malter?'
+  The maltster cleared his throat in an exaggerated
+form for emphasis, and elongating his gaze to the
+remotest point of the ashpit! said, in the slow speech
+justifiable when the importance of a subject is so
+generally felt that any mannerism must be tolerated
+in getting at it, "Well, I don't mind the year I were
+born in, but perhaps I can reckon up the places I've
+lived at, and so get it that way. I bode at Upper Long+
+puddle across there' (nodding to the north) "till I were
+eleven. I bode seven at Kingsbere' (nodding to the
+east) "where I took to malting. I went therefrom to
+Norcombe, and malted there two-and-twenty years, and+
+two-and-twenty years I was there turnip-hoeing and
+harvesting. Ah, I knowed that old place, Norcombe,
+years afore you were thought of, Master Oak' (Oak smiled
+sincere belief in the fact). "Then I malted at Dur+
+nover four year, and four year turnip-hoeing; and
+I was fourteen times eleven months at Millpond St.
+Jude's ' (nodding north-west-by-north). "Old Twills
+wouldn't hire me for more than eleven months at a
+time, to keep me from being chargeable to the parish
+if so be I was disabled. Then I was three year at
+Mellstock, and I've been here one-and-thirty year come
+Candlemas. How much is that?"
+  "Hundred and seventeen,' chuckled another old
+gentleman, given to mental arithmetic and little con+
+versation, who had hitherto sat unobserved in a corner.
+  "Well, then, that's my age,' said the maltster, em+
+phatically.
+  "O no, father!' said Jacob. "Your turnip-hoeing
+were in the summer and your malting in the winter of
+the same years, and ye don't ought to count-both halves
+father.'
+<P 114>
+  "Chok' it all! I lived through the summers, didn't
+I? That's my question. I suppose ye'll say next I be
+no age at all to speak of?'
+  "Sure we shan't,' said Gabriel, soothingly.
+  "Ye be a very old aged person, malter,' attested Jan
+must have a wonderful talented constitution to be able
+to live so long, mustn't he, neighbours?'
+  "True, true; ye must, malter, wonderful;' said the
+meeting unanimously.
+  The maltster, being know pacified, was even generous
+enough to voluntarily disparage in a slight degree the
+virtue of having lived a great many years, by mentioning
+that the cup they were drinking out of was three years
+older than he.
+  While the cup was being examined, the end of
+Gabriel Oak's flute became visible over his smock-frock
+I seed you blowing into a great flute by now at Caster+
+bridge?'
+  "You did,' said Gabriel, blushingh faintly. "I've been
+in great trouble, neighbours, and was driven to it.
+take it careless-like, shepherd and your time will come
+tired?'
+  "Neither drum nor trumpet have I heard since
+Christmas,' said Jan Coggan. "Come, raise a tune,
+Master Oak!'
+  "That I will,' said Gabriel, pulling out his flute and
+putting it together. "A poor tool, neighbours; but
+such as I can do ye shall have and welcome.'
+  Oak then struck up "Jockey to the Fair,' and played
+that sparkling melody three times through accenting the
+notes in the third round in a most artistic and lively
+manner by bending his body in small jerks and tapping
+with his foot to beat time.
+  "He can blow the flute very well -- that 'a can,' said
+a young married man, who having no individuality worth
+mentioning was known as "Susan Tall's husband.' He
+continued, "I'd as lief as not be able to blow into a
+flute as well-as that.'
+<P 115>
+  "He's a clever man, and 'tis a true comfort for us to
+have such a shepherd,' murmured Joseph Poorgrass, in
+a soft cadence. "We ought to feel full o' thanksgiving
+that he's not a player of ba'dy songs 'instead of these
+merry tunes; for 'twould have been just as easy for God
+to have made the shepherd a loose low man -- a man of
+iniquity, so to speak it -- as what he is. Yes, for our wives'
+and daughters' sakes we should feel real thanks giving.'
+  "True, true, -- real thanksgiving!' dashed in Mark
+Clark conclusively, not feeling it to be of any conse+
+quence to his opinion that he had only heard about a
+word and three-quarters of what Joseph had said.
+  "Yes,' added Joseph, beginning to feel like a man in
+the Bible; "for evil do thrive so in these times that ye
+may be as much deceived in the clanest shaved and
+whitest shirted man as in the raggedest tramp upon the
+turnpike, if I may term it so.'
+  "Ay, I can mind yer face now, shepherd,' said
+Henery Fray, criticising Gabriel with misty eyes as he
+entered upon his second tune. "Yes -- now I see 'ee
+blowing into the flute I know 'ee to be the same man
+I see play at Casterbridge, for yer mouth were scrimped
+up and yer eyes a-staring out like a strangled man's --
+just as they be now.'
+  "'Tis a pity that playing the flute should make a man
+look such a scarecrow,' observed Mr. Mark Clark, with
+additional criticism of Gabriel's countenance, the latter
+person jerking out, with the ghastly grimace required by
+the instrument, the chorus of "Dame Durden!
+  "I hope you don't mind that young man's bad
+manners in naming your features?' whispered Joseph to
+Gabriel.
+  "Not at all,' said Mr. Oak.
+  "For by nature ye be a very handsome man,
+shepherd,' continued Joseph Poorgrass, with winning
+sauvity.
+  "Ay, that ye be, shepard,' said the company.
+  "Thank you very much,' said Oak, in the modest
+tone good
+<P 116>
+manners demanded, thinking, however, that
+he would never let Bathsheba see him playing the
+flute; in this severe showing s discretion equal to that
+related to its sagacious inventress, the divine Minerva
+herself.
+  "Ah, when I and my wife were married at Norcombe
+Church,' said the old maltster, not pleased at finding
+himself left out of the subject "we were called the
+handsomest couple in the neighbourhood -- everybody
+said so.'
+  "Danged if ye bain't altered now, malter,' said a voice
+with the vigour natural to the enunciation of a remark+
+ably evident truism. It came from the old man in the
+background, whose offensiveness and spiteful ways were
+barely atoned for by the occasional chuckle he con+
+tributed to general laughs.
+  "O no, no,' said Gabriel.
+  "Don't ye play no more shepherd ' said Susan Tall's
+husband, the young married man who had spoken once
+before. "I must be moving and when there's tunes
+going on I seem as if hung in wires. If I thought after
+I'd left that music was still playing, and I not there, I
+should be quite melancholy-like.'
+  "What's yer hurry then, Laban?' inquired Coggan+
+"You used to bide as late as the latest.'
+  "Well, ye see, neighbours, I was lately married to a
+woman, and she's my vocation now, and so ye see --  -- '
+The young man hated lamely.
+  "New Lords new laws, as the saying is, I suppose,'
+remarked Coggan.
+  "Ay, 'a b'lieve -- ha, ha!' said Susan Tall's husband,
+in a tone intended to imply his habitual reception of
+jokes without minding them at all.   The young man
+then wished them good-night and withdrew.
+  Henery Fray was the first to follow. Then Gabriel
+arose and went off with Jan Coggan, who had offered
+him a lodging. A few minutes later, when the remaining
+ones were on their legs and about to depart, Fray came
+back again in a hurry. Flourishing his finger ominously
+he threw a gaze teeming with tidings just -- where his eye
+alighted by accident, which happened to be in Joseph
+Poorgrass's face.
+<P 117>
+  "O -- what's the matter, what's the matter, Henery?'
+said Joseph, starting back.
+  "What's a-brewing, Henrey?' asked Jacob and Mark
+Clark.
+  "Baily Pennyways -- Baily Pennyways -- I said so; yes,
+I said so!'
+  "What, found out stealing anything?'
+  "Stealing it is. The news is, that after Miss
+Everdene got home she went out again to see all was
+safe, as she usually do, and coming in found Baily
+Pennyways creeping down the granary steps with half a
+a bushel of barley. She fleed at him  like a cat -- never
+such a tomboy as she is -- of course I speak with closed
+doors?'
+  "You do -- you do, Henery.'
+  "She fleed at him, and, to cut a long story short,
+he owned to having carried off five sack altogether, upon
+her promising not to persecute him. Well, he's turned
+out neck and crop, and my question is, who's going to
+be baily now?'
+  The question was such a profound one that Henery
+was obliged to drink there and then from the large
+cup till the bottom was distinctly visible inside. Before
+he had replaced it on the table, in came the young man,
+Susan Tall's husband, in a still greater hurry.
+  "Have ye heard the news that's all over parish?'
+  "About Baily Pennyways?'
+  "But besides that?'
+  "No -- not a morsel of it!' they replied, looking into
+the very midst of Laban Tall as if to meet his words
+half-way down his throat.
+  "What a night of horrors!' murmured Joseph Poor+
+grass, waving his hands spasmodically. "I've had the
+news-bell ringing in my left ear quite bad enough for a
+murder, and I've seen a magpie all alone!'
+  "Fanny Robin -- Miss everdene's youngest servant --
+can't be found. They've been wanting to lock up the
+door these two hours, but she isn't come in. And they
+don't know what to do about going to hed for fear of
+locking her out. They wouldn't be so concerned if she
+hadn't been noticed in such low spirits
+<P 118>
+these last few
+days, and Maryann d'think the beginning of a crowner's
+inquest has happened to the poor girl.'
+  "O -- 'tis burned -- 'tis burned!' came from Joseph
+Poorgrass's dry lips.
+  "No -- 'tis drowned!' said 'Tall.
+  "Or 'tis her father's razor!' suggested Billy Smallbury,
+with a vivid sense of detail.
+  "Well -- Miss Everdene wants to speak to one or two
+of us before we go to bed. What with this trouble about
+the baily, and now about the girl, mis'ess is almost wild.'
+  They all hastened up the lane to the farmhouse,
+excepting the old maltster, whom neither news, fire,
+rain, nor thunder could draw from his hole. There, as
+the others' footsteps died away he sat down again and
+continued gazing as usual into the furnace with his red,
+bleared eyes.
+  From the bedroom window above their heads Bath+
+sheba's head and shoulders, robed in mystic white, were
+dimly seen extended into the air.
+  "Are any of my men among you?' she said anxiously.
+  "Yes, ma'am, several,' said Susan Tall's husband.
+  "Tomorrow morning I wish two or three of you to
+make inquiries in the villages round if they have seen
+such a person as Fanny Robin. Do it quietly; there is
+no reason for alarm as yet. She must have left whilst
+we were all at the fire.'
+  "I beg yer pardon, but had she any young man court+
+ing her in the parish, ma'am?" asked Jacob Smallbury.
+  "I don't know,' said Bathsheba.
+  "I've never heard of any such thing, ma'am,' said
+two or three.
+  "It is hardly likely, either,' continued Bathsheba.
+"For any lover of hers might have come to the house if
+he had been a respectable lad. The most mysterious
+matter connected with her absence -- indeed, the only
+thing which gives me serious alarm -- is that she was
+seen to go out of the house by Maryann with only her
+indoor working gown on -- not even a bonnet.'
+  "And you mean, ma'am, excusing my words, that a
+young
+<P 119>
+woman would hardly go to see her young man
+without dressing up,' said Jacob, turning his mental
+vision upon past experiences. "That's true -- she would
+not, ma'am.'
+  "She had, I think, a bundle, though I couldn't see
+very well,' said a female voice from another window,
+which seemed that of Maryann. "But she had no
+young man about here. Hers lives in Casterbridge, and
+I believe he's a soldier.'
+  "Do you know his name?' Bathsheba said.
+  "No, mistress; she was very close about it.'
+  "Perhaps I might be able to find out if I went to
+Casterbridge barracks,' said William Smallbury.
+  "Very well; if she doesn't return tomorrow, mind
+you go there and try to discover which man it is, and
+see him. I feel more responsible than I should if she
+had had any friends or relations alive. I do hope she
+has come to no harm through a man of that kind....
+And then there's this disgraceful affair of the bailiff --
+but I can't speak of him now.'
+  Bathsheba had so many reasons for uneasiness that
+it seemed she did not think it worth while to dwell
+upon any particular one. "Do as I told you, then'
+she said in conclusion, closing the casement.
+  "Ay, ay, mistress; we will,' they replied, and moved
+away.
+  That night at Coggan's, Gabriel Oak, beneath the
+screen of closed eyelids, was busy with fancies, and full
+of movement, like a river flowing rapidly under its ice.
+Night had always been the time at which he saw Bath+
+sheba most vividly, and through the slow hours of
+shadow he tenderly regarded her image now. It is
+rarely that the pleasures of the imagination will compen+
+sate for the pain of sleeplessness, but they possibly did
+with Oak to-night, for the delight of merely seeing her
+effaced for the time his perception of the great differ+
+ence between seeing and possessing.
+  He also thought of Plans for fetching his few utensils
+and books from Norcombe. The Young Man's Best
+Companion, The Farrier's Sure Guide, The Veterinary
+Surgeon, Paradise Lost, The Pilgrim's Progress, Robinson
+Crusoe, Ash's Dictionary, the Walkingame's Arithmetic,
+constituted his library;
+<P 120>
+and though a limited series, it was
+one from which he had acquired more sound informa+
+tion by diligent perusal than many a man of opportunities
+has done from a furlong of laden shelves.
+<C ix>
+<P 121>
+THE HOMESTEAD -- A VISITOR -- HALF-CONFIDENCES
+By daylight, the Bower of Oak's new-found mistress,
+Bathsheba Everdene, presented itself as a hoary build+
+ing, of the early stage of Classic Renaissance as regards
+its architecture, and of 'a proportion which told at a
+glance that, as is so frequently the case, it had once
+been the memorial hall upon a small estate around it,
+now altogether effaced as a distinct property, and merged
+in the vast tract of a non-resident landlord, which com+
+prised several such modest demesnes.
+  Fluted pilasters, worked from the solid stone,
+decorated its front, and above the roof the chimneys
+were panelled or columnar, some coped gables with
+finials and like features still retaining traces of their
+Gothic extraction. Soft Brown mosses, like faded
+velveteen, formed cushions upon the stone tiling, and
+tufts of the houseleek or sengreen sprouted from the
+eaves of the low surrounding buildings. A gravel walk
+leading from the door to the road in front was encrusted
+at the sides with more moss -- here it was a silver-green
+variety, the nut-brown of the gravel being visible to the
+width of only a foot or two in the centre. This circum+
+stance, and the generally sleepy air of the whole prospect
+here, together with the animated and contrasting state
+of the reverse facade, suggested to the imagination that
+on the adaptation of the building for farming purposes
+the vital principle' of the house had turned round inside
+its body to face the other way. Reversals of this kind,
+strange deformities, tremendous paralyses, are often seen
+to be inflicted by trade upon edifices -- either individual
+or in the aggregate as streets and towns -- which were
+originally planned for pleasure alone.
+  Lively voices were heard this morning in the upper
+rooms, the main staircase to which was of hard oak, the
+balusters, heavy as bed-posts, being turned and moulded
+in the quaint
+<P 122>
+fashion of their century, the handrail as
+stout as a parapet-top, and the stairs themselves con+
+tinually twisting round like a person trying to look over
+his shoulder. Going up, the floors above were found
+to have a very irregular surface, rising to ridges, sinking
+into valley; and being just then uncarpeted, the face
+of the boards was seen to be eaten into innumerable
+the opening and shutting of every door a tremble
+followed every bustling movement, and a creak accom+
+panied a walker about the house like a spirit, wherever+
+he went.
+  In the room from which the conversation proceeded,
+Bathsheba and her servant-companion, Liddy Small+
+bury were to be discovered sitting upon the floor, and
+sorting a complication of papers, books, bottles, and
+rubbish spread out thereon -- remnants from the house+
+hold stores of the late occupier. Liddy, the maltster's
+great-granddaughter, was about Bathsheba's equal in
+age, and her face was a prominent advertisement of the
+features' might have lacked in form was amply made up
+for by perfection  of hue, which at this winter-time was
+the softened ruddiness on a surface of high rotundity
+and, like the presentations of those great colourists, it
+was a face which kept well back from the boundary
+between comeliness and the ideal. Though elastic in
+nature she was less daring than Bathsheba, and occa+
+sionally showed some earnestness, which consisted half
+of genuine feeling, and half of mannerliness superadded
+by way of duty.
+  Through a partly-opened door the noise of a scrubbing+
+brush led up to the charwoman, Maryann Money, a person
+who for a face had a circular disc, furrowed less by age
+than by long gazes of perplexity at distant objects. To
+think of her was to get good-humoured; to speak of
+her was to raise the image of a dried Normandy
+pippin.
+  "Stop your scrubbing a moment,' said Bathsheba
+through the door to her. "I hear something.'
+  Maryann suspended the brush.
+<P 123>
+  The tramp of a horse was apparent, approaching the
+front of the building. The paces slackened, turned in
+at the wicket, and, what was most unusual, came up
+the mossy path close to the door. The door was
+tapped with the end of a crop or stick.
+  "What impertinence!' said Liddy, in a low voice.
+"To ride up the footpath like that! Why didn't he
+stop at the gate? Lord! "tis a gentleman! I see the
+top of his hat.'
+  "Be quiet!' said Bathsheba.
+  The further expression of Liddy's concern was con+
+tinued by aspect instead of narrative.
+  "Why doesn't Mrs. Coggan go to the door?' Bath+
+sheba continued.
+  Rat-tat-tat-tat, resounded more decisively from Bath+
+sheba's oak.
+  "Maryann, you go!' said she, fluttering under the
+onset ot a crowd of romantic possibilities.
+  "O ma'am -- see, here's a mess!'
+  The argument was unanswerable after a glance at
+Maryann.
+  "Liddy -- you must,' said Bathsheba.
+  Liddy held up her hands and arms, coated with dust
+from the rubbish they were sorting, and looked implor+
+ingly at her mistress.
+  "There -- -Mrs. Coggan is going!' said Bathsheba,
+exhaling her relief in the form of a long breath which
+had lain in her bosom a minute or more.
+  The door opened, and a deep voice said --
+  "Is Miss Everdene at home?'
+  "I'll see, sir,' said Mrs. Coggan, and in a minute
+appeared in the room.
+  "Dear, what a thirtover place this world is!' con+
+tinued Mrs. Coggan (a wholesome-looking lady who
+had a voice for each class of remark according to the
+emotion involved; who could toss a pancake or twirl
+a mop with the accuracy of pure mathematics, and
+who at this moment showed hands shaggy with frag+
+ments of dough and arms encrusted with flour). "I
+am never up to my elbows, Miss, in making a pudding
+but one of two things do happen -- either my nose must
+needs begin
+<P 124>
+tickling, and I can't live without scratching
+  A woman's dress being a part of her countenance,
+and any disorder in the one being of the same nature
+with a malformation or wound in the other, Bathsheba
+said at once --
+  "I can't see him in this state. Whatever shall I do?'
+  Not-at-homes were hardly naturalized in Weatherbury
+farmhouses, so Liddy suggested -- "Say you're a fright
+with dust, and can't come down.'
+  "Yes -- that sounds very well,' said Mrs. Coggan,
+critically.
+  "Say I can't see him -- that will do.'
+  Mrs. Coggan went downstairs, and returned the
+answer as requested, adding, however, on her own
+responsibility, "Miss is dusting bottles, sir, and is quite
+a object -- that's why 'tis.'
+  "Oh, very well,' said the deep voice,' indifferently.
+"All I wanted to ask was, if anything had been heard
+of Fanny Robin?'
+  "Nothing, sir -- but we may know to-night. William
+Smallbury is gone to Casterbridge, where her young
+man lives, as is supposed, and the other men be inquir+
+ing about everywhere.'
+  The horse's tramp then recommenced and -retreated,
+and the door closed.
+  "Who is Mr. Boldwood?' said Bathsheba.
+  "A gentleman-farmer at Little Weatherbury.'
+  "Married?'
+  "No, miss.'
+  "How old is he?'
+  "Forty, I should say -- very handsome -- rather stern+
+looking -- and rich.'
+  "What a bother this dusting is!  I am always in
+some unfortunate plight or other;' Bathsheba said,
+complainingly. "Why should he inquire aboat Fanny?'
+  "Oh, because, as she had no friends in her childhood,
+he took her and put her to school, and got her her
+place here under your uncle. He's a very kind man
+that way, but Lord -- there!'
+  "What?'
+  "Never was such a hopeless man for a woman!
+He's been
+<P 125>
+courted by sixes and sevens -- all the girls,
+gentle and simple, for miles round, have tried him. Jane
+Perkins worked at him for two months like a slave,
+and the two Miss Taylors spent a year upon him,
+and he cost Farmer Ives's daughter nights of tears
+and twenty pounds' worth of new clothes; but Lord --
+the money might as well have been thrown out of the
+window.'
+  A little boy came up at this moment and looked in
+upon them. This child was one of the Coggans who,
+with the Smallburys, were as common among the
+families of this district as the Avons and Derwents
+among our rivers. He always had a loosened tooth or
+a cut finger to show to particular friends, which he did
+with an air of being thereby elevated above the common
+herd of afflictionless humanity -- to which exhibition
+of congratulation as well as pity.
+  "I've got a pen-nee!' said Master Coggan in a
+scanning measure.
+  "Well -- who gave it you, Teddy?' said Liddy.
+  "Mis-terr Bold-wood! He gave it to me for opening
+the gate.'
+  "What did he say?'
+  "He said "Where are you going, my little man?''
+and I said, "To Miss Everdene's please;'' and he said,
+"She is a staid woman, isn't she, my little man?' and
+I said, ""Yes.'''
+  "You naughty child! What did you say that for?'
+  "Cause he gave me the penny!'
+  "What a pucker evrything is in!' said Bathsheba,
+discontentedly when the child had gone. 'Get away,
+thing! You ought to be married by this time, and not
+here troubling me!'
+  "Ay, mistress -- so I did. But what between the poor
+men I won't have, and the rich men who won't have me,
+I stand as a pelicon in the wilderness!'
+  "Did anybody ever want to marry you miss?' Liddy
+ventured to ask when they were again alone. "Lots of
+'em, i daresay.?'
+  Bathsheba paused, as if about to refuse a reply, but
+the temptation to say yes, since it was really in her
+power was irresistible by aspiring virginity, in spite of
+her spleen at having been published as old.
+<P 126>
+  "A man wanted to once,' she said, in a highly experi+
+enced tone and the image of Gabriel Oak, as the farmer,
+rose before her.
+  "How nice it must seem!' said Liddy, with the fixed
+features of mental realization. "And you wouldn't have
+him?'
+  "He wasn't quite good enough for me.'
+  "How sweet to be able to disdain, when most of us
+are glad to say, ""Thank you!'' I seem I hear it.
+""No, sir -- I'm your better,'' or ""Kiss my foot, sir; my
+face is for mouths of consequence.'' And did you love
+him, miss?'
+  "Oh, no. But I rather liked him.'
+  "Do you now?'
+  "Of course not -- what footsteps are those I hear?'
+  Liddy looked from a back window into the courtyard
+behind, which was now getting low-toned and dim with
+the earliest films of night. A crooked file of men was
+approaching the back door. The whole string of trailing
+individuals advanced in the completest balance of inten+
+tion, like the remarkable creatures known as Chain
+Salpae, which, distinctly organized in other respects, have
+one will common to a whole family. Some were, as
+usual, in snow-white smock-frocks of Russia duck, and
+some in whitey-brown ones of drabbet -- marked on the
+wrists, breasts, backs, and sleeves with honeycomb-work.
+Two or three womcn in pattens brought up the rear.
+  "The Philistines be upon us,' said Liddy, making her
+nose white against the glass.
+  "Oh, very well. Maryann, go down and keep them
+in the kitchen till I am dressed, and then show them in
+to me in the hall.'
+<C x>
+<P 127>
+HALF-AN-HOUR later Bathsheba, in finished dress,
+and followed by Liddy, entered the upper end of the old
+hall to find that her men had all deposited themselves on
+a long form and a settle at the lower extremity. She sat
+down at a table and opened th e time-book, pen in her
+hand, with a canvas money-bag beside her. From this
+she poured a small heap of coin. Liddy chose a
+position at her elbow and began to sew, sometimes
+pausing and looking round, or with the air of a privileged
+person, taking up one of the half-sovereigns lying before
+her and surveying it merely as a work of art, while
+strictly preventing her countenance from expressing any
+wish to possess it as money.
+  "Now before I begin, men,' said Bathsheba, "I have
+two matters to speak of. The first is that the bailiff is
+dismissed for thieving, and that I have formed a resolu+
+tion to have no bailiff at all, but to manage everything
+with my own head and hands.'
+  The men breathed an audible breath of amazement.
+  "The next matter is, have you heard anything of
+Fanny?'
+  "Nothing, ma'am.
+  "Have you done anything?'
+  "I met Farmer Boldwood,' said Jacob Smallbury, 'and
+I went with him and two of his men, and dragged New+
+mill Pond, but we found nothing.'
+  "And the new shepherd have been to Buck's Head,
+by Yalbury, thinking she had gone there, but nobody
+had seed her,' said Laban Tall.
+  "Hasn't William Smallbury been to Casterbridge?'
+  "Yes, ma'am, but he's not yet come home. He
+promised to be back by six.'
+  "It wants a quarter to six at present,' said Bathsheba,
+ 
+<P 128>
+looking at her watch. "I daresay he'll be in directly.
+Well, now then' -- she looked into the book -- "Joseph
+Poorgrass, are you there?'
+  "Yes, sir -- ma'am I mane,' said the person addressed.
+"I be the personal name of Poorgrass.'
+  "And what are you?'
+  "Nothing in my own eye. In the eye of other people
+ -- well, I don't say it; though public thought will out.'
+  "What do you do on the farm?'
+  "I do do carting things all the year, and in seed time I
+shoots the rooks and sparrows, and helps at pig-killing, sir.'
+  "How much to you ?'
+  "Please nine and ninepence and a good halfpenny
+where 'twas a bad one, sir -- ma'am I mane.'
+  "Quite correct. Now here are ten shillings in addi+
+tion as a small present, as I am a new comer.'
+  Bathsheba blushed slightly at the sense of being
+generous in public, and Henery Fray, who had drawn
+up towards her chair, lifted his eyebrows and fingers to
+express amazement on a small scale.
+  "How much do I owe you -- that man in the corner --
+what's your name?' continued Bathsheba.
+  "Matthew Moon, ma'am,' said a singular framework of
+clothes with nothing of any consequence inside them,
+which advanced with the toes in no definite direction
+forwards, but turned in or out as they chanced to swing.
+  "Matthew Mark, did you say? -- speak out -- I shall
+not hurt you,' inquired the young farmer, kindly.
+  "Matthew Moon mem' said Henery Fray, correct+
+ingly, from behind her chair, to which point he had
+edged himself.
+  "Matthew Moon,' murmured Bathsheba, turning her
+bright eyes to the book. "Ten and twopence halfpenny
+is the sum put down to you, I see?'
+  "Yes, mis'ess,' said Matthew, as the rustle of wind
+among dead leaves.
+  "Here it is and ten shillings. Now -the next -- Andrew
+Randle, you are a new man, I hear. How come you to
+leave your last farm?'
+<P 129>
+  "P-p-p-p-p-pl-pl-pl-pl-l-l-l-l-ease, ma'am, p-p-p-p-pl-pl+
+pl-pl-please, ma'am-please'm-please'm --  --  '
+  "'A's a stammering man, mem,' said Henery Fray in
+an undertone, "and they turned him away because the
+only time he ever did speak plain he said his soul was
+his own, and other iniquities, to the squire. "A can cuss,
+mem, as well as you or I, but 'a can't speak a common
+speech to save his life.'
+  "Andrew Randle, here's yours -- finish thanking me
+in a day or two. Temperance Miller -- oh, here's another,
+Soberness -- both women I suppose?'
+  "Yes'm. Here we be, 'a b'lieve,' was echoed in shrill
+unison.
+  "What have you been doing?'
+  "Tending thrashing-machine and wimbling haybonds,
+and saying ""Hoosh!'' to the cocks and hens when they
+go upon your seeds and planting Early Flourballs and
+Thompson's Wonderfuls with a dibble.'
+  "Yes -- I see. Are they satisfactory women?' she
+inquired softly of Henery Fray.
+  "O mem -- don't ask me! Yeilding women?' as
+scarlet a pair as ever was!' groaned Henery under his
+breath.
+  "Sit down.
+  "Who, mem?'
+  "Sit down,'
+  Joseph Poorgrass, in the background twitched, and
+his lips became dry with fear of some terrible conse+
+quences, as he saw Bathsheba summarily speaking, and
+Henery slinking off to a corner.
+  "Now the next. Laban Tall, you'll stay on working
+for me?'
+  "For you or anybody that pays me well, ma'am,'
+replied the young married man.
+  "True -- the man must live!' said a woman in the
+back quarter, who had just entered with clicking pattens.
+  "What woman is that?" Bathsheba asked.
+  "I be his lawful wife!' continued the voice with
+greater prominence of manner and tone. This lady
+called herself five-and-twenty, looked thirty, passed as
+thirty-five, and was forty. She was a woman who never,
+like some newly married, showed
+<P 130>
+conjugal tenderness in
+public, perhaps because she had none to show.
+  "Oh, you are,' said Bathsheba. "Well, Laban, will
+you stay on ?'
+  "Yes, he'll stay, ma'am!' said again the shrill tongue
+of Laban's lawful wife.
+  "Well, he can speak for himself, I suppose.'
+  "O Lord, not he, ma'am! A simple tool. Well
+enough, but a poor gawkhammer mortal,' the wife replied
+  "Heh-heh-heh!' laughed the married man with a
+hideous effort of appreciation, for he was as irrepressibly
+good-humoured under ghastly snubs as a parliamentary
+candidate on the hustings.
+  The names remaining were called in the same
+manner.
+  "Now I think I have done with you,' said Bathsheba,
+closing the book and shaking back a stray twine of hair.
+"Has William Smallbury returned?'
+  "No, ma'am.'
+  "The new shepherd will want a man under him,'
+suggested Henery Fray, trying to make himself official
+again by a sideway approach towards her chair.
+  "Oh -- he will. Who can he have?'
+  "Young Cain Ball is a very good lad,' Henery said,
+"and Shepherd Oak don't mind his youth?' he added,
+turning with an apologetic smile to the shepherd, who
+had just appeared on the scene, and was now leaning
+against the doorpost with his arms folded.
+  "No, I don't mind that,' said Gabriel.
+  "How did Cain come by such a name?' asked
+Bathsheba.
+  "Oh you see, mem, his pore mother, not being a
+Scripture-read woman made a mistake at his christening,
+thinking 'twas Abel killed Cain, and called en Cain,
+but 'twas too late, for the name could never be got rid
+of in the parish. "Tis very unfortunate for the boy.'
+  "It is rather unfortunate.'
+  "Yes. However, we soften it down as much as we
+can, and call him Cainey. Ah, pore widow-woman!
+she cried her heart
+<P 131>
+out about it almost. She was
+brought up by a very heathen father and mother, who
+never sent her to church or school, and it shows how
+the sins of the parents are visited upon the children,
+mem.'
+  Mr. Fray here drew up his features to the mild degree
+of melancholy required when the persons involved in
+the given misfortune do not belong to your own family.
+  "Very well then, Cainey Ball to be under-shepherd
+And you quite understand your duties? -- you I mean,
+Gabriel Oak?'
+  "Quite well, I thank you Miss Everdene,' said
+Shepard Oak from the doorpost. "If I don't, I'll
+inquire.' Gabriel was rather staggered by the remark+
+able coolness of her manner. Certainly nobody without
+previous information would have dreamt that Oak and
+the handsome woman before whom he stood had ever
+been other than strangers. But perhaps her air was
+the inevitable result of the social rise which had advanced
+her from a cottage to a large house and fields. The
+case is not unexampled in high places. When, in the
+writings of the later poets, Jove and his family are found
+to have moved from their cramped quarters on the peak
+of Olympus into the wide sky above it, their words show
+a proportionate increase of arrogance and reserve.
+Footsteps were heard in the passage, combining in
+their character the qualities both of weight and measure,
+rather at the expense of velocity.
+(All.) 'Here's Billy Smallbury come from Caster+
+bridge.'
+' And what's the news ? ' said Bathsheba, as William,
+after marching to the middle of the hall, took a hand+
+kerchief from his hat and wiped his forehead from its
+centre to its remoter boundaries.
+'I should have been sooner, miss,' he said, 'if it
+hadn't been for the weather.' He then stamped with
+each foot severely, and on looking down his boots were
+perceived to be clogged with snow.
+'Come at last, is it ?' said Henery.
+" Well, what about Fanny ? ' said Bathsheba.
+"Well, ma'am, in round numbers, she's run away with
+the soldiers,' said William.
+<P 132>
+" No; not a steady girl like Fanny ! '
+"I'll tell ye all particulars. When I got to Caster,
+bridge Barracks, they said, " The Eleventh Dragoon+
+Guards be gone away, and new troops have come."
+The Eleventh left last week for Melchester and onwards.
+The Route came from Government like a thief in the
+night, as is his nature to, and afore the Eleventh knew
+it almost, they wem on the march. They passed near
+here.'
+Gabriel had listened with interest. 'I saw them go,'
+he said.
+' Yes,' continued William, ' they pranced down the
+street playing "The Girl I Left Behind Me,' so 'tis
+said, in glorious notes of triumph. Every looker-on's
+inside shook with the blows of the great drum to his
+deepest vitals, and there was not a dry eye throughout
+the town among the public-house people and the name+
+less women !.'
+'But they're not gone to any war?'
+'No, ma'am; but they be gone to take the places
+of them who may, which is very close connected. And
+so I said to myself, Fanny's young man was one of the
+regiment, and she's gone after him. There, ma'am,
+that's it in black and white.'
+Gabriel remained musing and said nothing, for he
+was in doubt.
+'Well, we are not likely to know more to-night, at
+any rate,' said Bathsheba. 'But one of you had better
+run across to Farmer Boldwood's and tell him that
+much.'
+She then rose; but before retiring, addressed a few
+words to them with a pretty dignity, to which her
+mourning dress added a soberness that was hardly to
+be found in the words themselves.
+'Now mind, you have a mistress instead of a master
+I don't yet know my powers or my talents in farming;
+but I shall do my best, and if you serve me well, so
+shall I serve you. Don't any unfair ones among you
+(if there are any such, but I hope not) suppose that
+because I'm a woman I don't understand the difference
+between bad goings-on and good.'
+<P 133>
+(All.) 'Nom!.
+(Liddy.) 'Excellent well said.'
+'I shall be up before you are awake; I shall be
+afield before you are up ; and I shall have breakfasted
+before you are afield. In short, I shall astonish you all.
+(All.) 'Yes'm!'
+'And so good-night.'
+(All.) 'Good-night, ma'am.'
+Then this small-thesmothete stepped from the table,
+and surged out of the hall, her black silk dress licking
+up a few straws and dragging them along with a scratch+
+ing noise upon the floor. biddy, elevating her feelings
+to the occasion from a sense of grandeur, floated off
+behind Bathsheba with a milder dignity not entirely
+free from travesty, and the door was closed.
+<C xi>
+<P 134>
+OUTSIDE THE BARRACKS -- SNOW -- A MEETING
+FOR dreariness nothing could surpass a prospect in the
+outskirts of a certain town and military station, many
+miles north of Weatherbury, at a later hour on this
+same snowy evening -- if that may be called a prospect
+of which the chief constituent was darkness.
+It was a night when sorrow may come to the
+brightest without causing any great sense of incongruity :
+when, with impressible persons, love becomes solicitous+
+ness, hope sinks to misgiving, and faith to hope : when
+the exercise of memory does not stir feelings of regret
+at opportunities for ambition that have been passed by,
+and anticipation does not prompt to enterprise.
+The scene was a public path, bordered on the left
+hand by a river, behind which rose a high wall. On
+the right was a tract of land, partly meadow'and partly
+moor, reaching, at its remote verge, to a wide undulating
+uplan.
+The changes of the seasons are less obtrusive on
+spots of this kind than amid woodland scenery. Still,
+to a close observer, they are just as perceptible ; the
+difference is that their media of manifestation are less
+trite and familiar than such well-known ones as the
+bursting of the buds or the fall of the leaf. Many are
+not so stealthy and gradual as we may be apt to
+imagine in considering the general torpidity of a moor
+or waste. Winter, in coming to the country hereabout,
+advanced in well-marked stages, wherein might have
+been successively observed the retreat of the snakes,
+the transformation of the ferns, the filling of the pools,
+a rising of fogs, the embrowning by frost, the collapse
+of the fungi, and an obliteration by snow.
+This climax of the series had been reached to-night on
+the aforesaid moor, and for the first time in the season
+its
+<P 135>
+irregularities were forms without features ; suggestive
+of anything, proclaiming nothing, and without more
+character than that of being the limit of something
+else -- the lowest layer of a firmament of snow. From
+this chaotic skyful of crowding flakes the mead and
+moor momentarily received additional clothing, only
+to appear momentarily more naked thereby. The vast
+arch of cloud above was strangely low, and formed as
+it were the roof of a large dark cavern, gradually sinking
+in upon its floor; for the instinctive thought was that
+the snow lining the heavens and that encrusting the
+earth would soon unite into one mass without any
+intervening stratum of air at all.
+We turn our attention to the left-hand characteristics ;
+which were flatness in respect of the river, verticality
+in respect of the wall behind it, and darkness as to
+both. These features made up the mass. If anything
+could be darker than the sky, it was the wall, and if any
+thing could be gloomier than the wall it was the river
+beneath. The indistinct summit of the facade was
+notched and pronged by chimneys here and there, and
+upon its face were faintly signified the oblong shapes
+of windows, though only in the upper part. Below,
+down to the water's edge, the flat was unbroken by
+hole or projection.
+An indescribable succession of dull blows, perplexing
+in their regularity, sent their sound- with difficulty
+through the fluffy atmosphere. It was a neighbouring
+clock striking ten The bell was in the open air, and
+being overlaid with several inches of muffling snow, had
+lost its voiee for the time.
+About this hour the snow abated : ten flakes fell
+where twenty had fallen, then one had the room of
+ten. Not long after a form moved by the brink of
+the river.
+By its outline upon the colourless background, a close
+observer might have seen 'that it was small. This was
+all that was positively discoverable, though it seemed
+human.
+The shape went slowly along, but without much
+exertion, for the snow, though sudden, was not as yet
+more than two inches deep. At this time some words
+were spoken aloud : --
+' One. Two. 'Three. Four. Five.'
+ Between each utterance the little shape advanced
+about half a dozen yards. It was evident now that
+the windows high
+<P 136>
+in the wall were being counted.
+The word 'Five' represented the fifth window from
+the end of the wall.
+Here the spot stopped, and dwindled smaller. The
+figure was stooping. Then a morsel of snow flew
+across the river towards the fifth window. It smacked
+against the wall at a point several yards from its mark.
+The throw was the idea of a man conjoined with the
+execution of a woman. No man who had ever seen bird,
+rabbit, or squirrel in his childhood, could possibly have
+thrown with such utter imbecility as was shown here.
+Another attempt, and another ; till by degrees the
+wall must have become pimpled with the adhering
+lumps of snow  At last one fragment struck the fifth
+window.
+The river would have been; seen by day to be of
+that deep smooth sort which races middle and' sides
+with the same gliding precision, any irregularities of
+speed being immediately corrected by a small whirl+
+pool. Nothing was heard in reply to the signal but
+the gurgle and cluck of one of these invisible wheels --
+together with a few small sounds which a sad man
+would have called moans, and a happy man laughter --
+caused by the flapping of the waters against trifling
+objects in other parts of the stream.
+The window was struck again in the same manner.
+Then a noise was heard, apparently produced by
+the opening of the window. This was followed by a
+voice from the same quarter.
+'Who's there ? '
+The tones were masculine, and not those of surprise.
+The high wall being that of a barrack, and marriage
+being looked upon with disfavour in the army, assigna+
+tions and communications had probably been made
+across the river before tonight.
+"Is it Sergeant Troy?' said the blurred spot in the
+snow, tremulously.
+This person was so much like a mere shade upon
+the earth, and the other speaker so much a part of
+the building, that one would have said the wall was
+holding a conversation with the snow.
+<P 137>
+'Yes,' came suspiciously from the shadow. ' What
+girl are you ? '
+'O, Frank -- don't you know me ?' said the spot.
+'Your wife, Fanny Robin.'
+' Fanny !.' said the wall, in utter astonishment.
+'Yes,' said the girl, with a half-suppressed gasp of
+emotion.
+There was something in the woman's tone which is
+not that of the wife, and there was a mannerin the man
+which is rarely a husband's. The dialogue went on:
+'How did you come here ?'
+'I asked which was your window. Forgive me !. '
+"I did not expect you to-night. Indeed, I did not
+think you would come at all. It was a wonder you
+found me here. I am orderly to-morrow.'
+'You said I was to come.'
+' Well -- I said that you might.'
+'Yes, I mean that I might. You are glad to see me,
+Frank ? '
+' O yes -- of course.'
+' Can you -- come to me !.'
+'My dear Fan, no .! The bugle has sounded, the
+barrack gates are closed, and I have no leave. We are
+all of us as good as in the county gaol till to-morrow
+morning.'
+' Then I shan't see you till then .! ' The words- were
+in a faltering tone of disappointment.
+' How did you get here from Weatherbury ? '
+'I walked -- some part of the way -- the rest by the
+carriers.'
+' I am surprised.'
+' Yes -- so am I. And Frank, when will it 'be ? '
+' What ? '
+' That you promised.'
+" I don't quite recollect.'
+'0 You do! Don't speak like that. It weighs me
+to the earth. It makes me say what ought to be said
+first by you.'
+' Never mind -- say it.'
+'0, must I? -- it is, when shall we be married,
+Frank ? '
+" Oh, I " see. Well --  you have to get proper
+clothes.'
+"I have money. Will it be by banns or license ?'
+<P 138>
+" Banns, I should think.'
+" And we live in two parishes.'
+"Do we ? What then?'
+"My lodgings are in St. Mary's, and this is not. So
+they will have to be published in both.'
+"Is that the law?'
+" Yes. O Frank -- you think me forward, I am
+afraid .! Don't, dear Frank -- will you -- for I love you so.
+And you said lots of times you would marry me, and
+and -- I -- I -- I --  -- '
+  "Don't cry, now! It is foolish. If i said so, of
+course I will.'
+'And shall I put up the banns in my parish, and will
+you in yours?'
+"Yes'
+"To-morrow?'
+"Not tomorrow. We'll settle in a few days.'
+"You have the permission of the officers?'
+"No, not yet.'
+"O -- how is it? You said you almost had before
+you left Casterbridge.'
+"The fact is, I forgot to ask. Your coming like this
+I'll go away now. Will you qoDe,and seq be to-morroy
+is so sudden and unexpected.'
+"Yes -- yes -- it is. It was wrong of me to worry you.
+I'll go away now. Will you come and see me to-morrow,
+at Mrs. Twills's, in North Street? I don't like to come
+to the Barracks. There are bad women about, and they
+think me one.'
+"Quite,so. I'll come to you, my dean Good-night.'
+"Good-night, Frank -- good-night!'
+And the noise was again heard of a window closing
+The little spot moved away. When she passed the
+corner a subdued exclamation was heard inside the
+wall.
+"Ho -- ho -- Sergeant -- ho -- ho!' An expostulation
+followed, but it was indistinct; and it became lost amid
+a low peal of laughter, which was hardly distinguishable
+from the gurgle of the tiny whirlpools outside.
+<C xii>
+<P 139>
+FARMERS -- A RULE -- IN EXCEPTION
+THE first public evidence of Bathsheba's decision to
+be a farmer in her own person and by proxy no more
+was her appearance the following market-day in. the
+cornmarket at Casterbridge.
+The low though extensive hall, supported by beams
+and pillars, and latterly dignified by-the name of Corn Ex+
+change, was thronged with hot men who talked among
+each other in twos and threes, the speaker of the minute
+looking sideways into his auditor's face and concentrating
+his argument by a contraction of one eyelid during de+
+livery. The greater number carried in their hands
+ground-ash saplings, using them partly as walking-sticks
+and partly for poking up pigs, sheep, neighbours with
+their backs turned, and restful things in general, which
+seemed to require such treatment in the course of their
+peregrinations. During conversations each subjected
+his sapling to great varieties of usage -- bending it round
+his back, forming an"arch of it between his two hands,
+overweighting it on the ground till it reached nearly a
+semicircle; or perhaps it was hastily tucked under the
+arm whilst the sample-bag was pulled forth and a hand+
+ful of corn poured into the palm, which, after criticism,
+was flung upon the floor, an issue of events perfectly
+well known to half-a-dozen acute town-bred fowls which
+had as usual crept into the building unobserved, and
+waited the fulfilment of their anticipations with a high+
+stretched neck and oblique eye.
+Among these heavy yeomen a feminine figure glided,
+the single one of her sex that the room contained. She
+was prettily and even daintily dressed. She moved
+between them as a chaise between carts, was heard after
+them as a romance after sermons, was felt among them
+like a breeze among furnaces. It had required a little
+determination -- far more than she had at
+<P 140>
+first imagined
+ -- to take up a position here, for at her first entry the
+lumbering dialogues had ceased, nearly every face had
+been turned towards her, and those that were already
+turned rigidly fixed there.
+Two or three only of the farmers were personally
+known to Bathsheba, and to these she had made her
+way. But if she was to be the practical woman she had
+intended to show herself, business must be carried on,
+introductions or none, and she ultimately acquired con+
+fidence enough to speak and reply boldly to men merely
+known to her by hearsay. Bathsheba too had her
+sample-bags, and by degrees adopted the professional
+pour into the hand -- holding up the grains in her narrow
+palm for inspection, in perfect Casterbridge manner.
+Something in the exact arch of her upper unbroken
+row of teeth, and in the keenly pointed corners of her
+red mouth when, with parted lips, she somewhat
+defiantly turned up her face to argue a point with a
+tall man, suggested that there was potentiality enough
+in that lithe slip of humanity for alarming exploits of
+sex, and daring enough to carry them out. But her eyes
+had a softness -- invariably a softness -- which, had they
+not been dark, would have seemed mistiness; as they
+were, it lowered an expression that might have been
+piercing to simple clearness,
+Strange to say of a woman in full bloom and vigor,
+she always allowed her interlocutors to finish their state+
+ments before rejoining with hers. In arguing on prices,
+he held to her own firmly, as was natural in a dealer,
+and reduced theirs persistently, as was inevitable in a
+oman. But there was an elasticity in her firmness
+which removed it from obstinacy, as there was a naivete
+in her cheapening which saved it from meanness.
+Those of the farmers with whom she had no dealings
+by far the greater part) were continually asking each
+other, "Who is she?' The reply would be --
+"Farmer Everdene's niece; took on Weatherbury
+Upper Farm; turned away the baily, and swears she'll do
+verything herself.'
+The other man would then shake his head.
+<P 141>
+"Yes, 'tis a pity she's so headstrong,' the first would
+say. "But we ought to be proud of her here -- she
+lightens up the old place. 'Tis such a shapely maid,
+however, that she'll soon get picked up.'
+It would be ungallant to suggest that the novelty of
+her engagement in such an occupation had almost as
+much to do with the magnetism as had the beauty of
+her face and movements. However, te interest was
+eneral, and this Saturday's debut in the forum, whatever
+it may have been to Bathsheba as the buying and selling
+farmer, was unquestionably a triumph to her as the
+maiden. Indeed, the sensation was so pronounced that
+her instinct on two or three occasions was merely to
+valk as a queen among these gods of the fallow, like a
+little sister of a little Jove, and"to neglect closing prices
+altogether.
+The numerous evidences of-her power to attract were
+only thrown into greater relief by a marked exception.
+Women seem to have eyes in their ribbons for such
+matters as these. Bathsheba, without looking within
+a right angle of him, was conscious of a black sheep
+among the flock.
+It perplexed her first. If there had been a respect+
+able minority on either side, the case would have been
+most natural. If nobody had regarded her, she would
+have -- -taken the matter indifferently -- such cases had
+occurred. If eveybody, this man included, she would
+have taken it as a matter of course -- people had done
+so before. But the smallness of the exception made the
+mystery.
+She soon knew thus much of the recusant's appear+
+ance. He was a gentlemanly man, with full and
+distinctly outlined Roman features, the prominences
+of which glowed in the sun with a bronze-like richness
+of tone. He was erect in attitude, and quiet in
+demeanour. One characteristic pre-eminently marked
+him -- dignity.
+Apparently he had some time ago reached that
+entrance to middle age at which a man's aspect naturally
+ceases to alter for the term of a dozen years or so; and,
+artificially, a woman't does likewise.   Thirty-five and
+fifiy were his limits of variation -- he might have been
+either, or anywhere between the two.
+It may be said that married men of forty are usually
+ready
+<P 142>
+and generous enough to fling passing glances at
+any specimen of moderate beauty they may discern by
+the way. Probably, as with persons playing whist for
+love, the consciousness of a certain immunity under
+any circumstances from that worst possible ultimate,
+the having to pay, makes them unduly speculative.
+Bathsheba was convinced that this unmoved person
+was not a married man.
+When marketing was over, she rushed off to Liddy,
+who was waiting for her -- beside the yellowing in which
+they had driven to town. The horse was put in, and
+on they trotted Bathsheba's sugar, tea, and drapery
+parcels being packed behind, and expeessing in some
+indescribable manner, by their colour, shape, and
+general lineaments, that they were that youmg lady+
+farmer's property, and the grocer's and drapers no
+more.
+" I've been through it, Liddy, and it is over. I shan't
+mind it again, for they will all have grown accustomed
+to seeing me there; but this morning it was as bad as
+being married -- eyes everywhere!'
+"I knowed it would. be,' Liddy said "Men be such
+a terrible class of society to look at a body.'
+"But there was one man who had more sense than
+to waste his time upon me.' The information was put
+in this form that Liddy might not for a moment suppose
+her mistress was at all piqued. "A very good-looking
+man,' she continued, "upright; about forty, I should
+think. Do you know at all who he could be?'
+Liddy couldn't think.
+"Can't you guess at all?' said Bathsheba with some
+disappointment.
+"I haven't a notion; besides, 'tis no difference, since
+he took less notice of you than any of the rest. Now,
+if he'd taken more, it would have mattered a great deal.'
+Bathsheba was suffering from the reverse feeling just
+then, and they bowled along in silence. A low carriage,
+bowling along still more rapidly behind a horse of un+
+impeachable breed, overtook and passed them.
+"Why, there he is!' she said.
+Liddy looked. "That! That's Farmer Boldwood --
+of course
+<P 143>
+'tis -- the man you couldn't see the other day
+when he called.'
+"Oh, Farmer Boldwood,' murmured Bathsheba, and
+looked at him as he outstripped them. The farmer had
+never turned his head once, but with eyes fixed on the
+most advanced point along the road, passed as uncon+
+sciously and abstractedly as if Bathshea and her charms
+were thin air.
+"He's an interesting man -- don't you think so?' she
+remarked.
+"O yes, very. Everybody owns it,' replied Liddy.
+"I wonder why he is so wrapt up and indifferent, and
+seemingly so far away from all he sees around him,'
+"It is said -- but not known for certain -- that he met
+with some bitter disappointment when he was a young
+man and merry. A woman jilted him, they say.'
+"People always say that -- and we know very well
+women scarcely ever jilt men; 'tis the men who jilt us.
+I expect it is simply his nature to be so reserved.'
+"Simply his nature -- I expect so, miss -- nothing else
+in the world.'
+"Still, 'tis more romantic to think he has been served
+cruelly, poor thing'! Perhaps, after all, he has! I
+"Depend upon it he has. O yes, miss, he has!
+feel he must have.'
+"However, we are very apt to think extremes of
+people. I --  shouldn't wonder after all if it wasn't a
+little of both -- just between the two -- rather cruelly
+used and rather reserved.'
+"O dear no, miss -- I can't think it between the
+two!'
+"That's most likely.'
+"Well, yes, so it is. I am convinced it is most likely.
+You may --  take my word, miss, that that's what's the
+matter with him.'
+<C xiii>
+<P 144>
+SORTES SANCTORUM -- THE VALENTINE
+IT was Sunday afternoon in the farmhouse, on the
+thirteenth of February. Dinner being over, Bathsheba,
+for want of a better companion, had asked Liddy to
+come and sit with her. The mouldy pile was dreary
+in winter-time before the candles were lighted and the
+shutters closed ; the atmosphere of the place seemed
+as old as the walls; every nook behind the furniture
+had a temperature of its own, for the fire was not
+kindled in this part of the house early in the day;
+and Bathsheba's new piano, which was an old one
+in other annals, looked particularly sloping and out
+of level on the warped floor before night threw a
+shade over its less prominent angles and hid the
+unpleasantness. Liddy, like a little brook, though
+shallow, was always rippling; her presence had not so
+much weight as to task thought, and yet enough to
+exercise it.
+On the table lay an old quarto Bible, bound in
+leather. Liddy looking at it said, --
+"Did you ever find out, miss, who you are going to
+marry by means of the Bible and key ?,
+"Don't be so foolish, Liddy. As if such things
+could be.'
+" Well, there's a good deal in it, all the same.'
+' Nonsense, child.'
+" And it makes your heart beat fearful. Some believe
+in it; some don't; I do.'
+"Very well, let's try it,' said Bathsheba, bounding
+from her seat with that total disregard of consistency
+which can be indulged in towards a dependent, and
+entering into the spirit of divination at once. 'Go and
+get the front door key.'
+Liddy fetched it. 'I wish it wasn't Sunday,' she
+said, on returning. ' Perhaps 'tis wrong.'
+' What's right week days is right Sundays,' replied her
+mistress in a tone which was a proof in itself.
+<P 145>
+The book was opened -- the leaves, drab with age,
+being quite worn away at much-read verses by the fore'
+fingers "of unpractised readers in former days, where they
+were moved along under the line as an aid to the vision.
+The special verse in the Book of Ruth was sought out
+by Bathsheba, and the sublime words met her eye. They
+slightly thrilled and abashed her. It was Wisdom in
+the abstract facing Folly in the concrete. Folly in the
+concrete blushed, persisted in her intention, and placed
+the key on -the book. A rusty patch immediately upon
+the verse, caused by previous pressure of an iron
+substance thereon, told that this was not the first time
+the old volume had been used for the purpose.
+'Now keep steady, and be silent,' said Bathsheba.
+The 'verse was repeated; the book turned round ;
+Bathsheba blushed guiltily.
+'Who did you try ?' said Liddy curiously.
+'I shall not tell you.'
+'Did you notice Mr. Boldwood's doings in church
+this morning, miss ? 'Liddy continued, adumbrating by
+the remark the track her thoughts had taken.
+'No, indeed,' said Bathsheba, with serene indifference
+" His pew is exactly opposite yours, miss.'
+"I know it.'
+"And you did not see his goings on !,'
+Certainly I did not, I tell you.'
+Liddy assumed a smaller physiognomy, and shut
+her lips decisively.
+This move was unexpected, and proportionately dis
+concerting. " What did he do?' Bathsheba said perforce.
+"Didn't turn his head to look at you once all the
+service.
+"Why should he?' again demanded her mistress,
+wearing a nettled look. "I didn't ask him to.
+'Oh no. But everybody else was noticing you ; and
+it was odd he didn't. There, 'tis like him. Rich and
+gentlemanly, what does he care ? '
+Bathsheba dropped into a silence intended to ex+
+press that she had opinions on the matter too abstruse
+for Liddy's comprehension, rather than that she had
+nothing to say.
+"
+<P 146>
+Dear me -- I had nearly forgotten the valentine
+I bought yesterday,' she exclaimed at length.
+"Valentine ! who for, miss ? ' said Liddy. " Farmer
+Boldwood ?'
+It was the single name among all possible wrong
+ones that just at this moment seemed to Bathsheba
+more pertinent than the right.
+"Well, no. It is only for little Teddy Coggan.
+have promised him something, and this will be a pretty
+surprise for him. Liddy, you may as well bring me
+my desk and I'll direct it at once.'
+Bathsheba took from her desk a gorgeously illumin+
+ated and embossed design in post-octavo, which had
+been "bought on the previous market-day at the chief
+stationer's in Casterbridge. In the eentre was a small
+oval enclosure ; this was left blank, that the sender
+might insert tender words more appropriate to the
+special occasion than any generalities by a printer
+could possibly be.
+" Here's a place for writing,' said Bathsheba. 'What
+shall I put ?'
+" Something of this sort, I should think', returned
+Liddy promptly : --
+" The rose is red,
+ The violet blue,
+ Camation's sweet,
+ And so are you.'
+" Yes, that shall be it. It just suits itself to a chubby+
+faced child like him,' said Bathsheba. She ins.erted the
+words in a small though legible handwriting; enelosed
+the sheet in an envelope, and dipped her pen for the
+direction.
+"What fun it would be to send it to the stupid old
+Boldwood, and how he would wonder.! ' said the
+irrepressible Liddy, lifting her eyebrows, and indulging
+in an awful mirth on the verge of fear as she thought
+of the moral and social magnitude of the man contem+
+plated.
+Bathsheba paused to regard the idea at full length.
+Boldwood's had begun to be a troublesome image -- a
+species of Daniel in her kingdom who persisted in
+kneeling eastward
+<P 147>
+when reason and common sense
+said that he might just as well follow suit with the
+rest, and afford her the official glance of admiration
+which cost nothing at all. She was far from being
+seriously concerned about his nonconformity. Still,
+it was faintly depressing that the most dignified and
+valuable man in the parish should withhold his eyes,
+and that a girl like Liddy should talk about it. So
+Liddy's idea was at first rather harassing than piquant.
+" No, I won't do that. He wouldn't see any humour
+in it.'
+" He'd worry to death,' said the persistent Liddy.
+" Really, I don't care particularly to send it to
+Teddy,' remarked her mistress. " He's rather a naughty
+child sometimes.'
+" Yes -- that he is.'
+" Let's toss as men do,' said Bathsheba, idly. 'Now
+then, head, Boldwood ; tail, Teddy. No, we won't toss
+money on a Sunday that would be tempting the devil
+indeed.'
+"Toss this hymn-book; there can't be no sinfulness
+in that, miss.'
+'Very well. Open, Boldwood -- shut, Teddy. No;
+it's more likely to fall open. Open, Teddy -- shut,
+Boldwood.'
+The book went fluttering in the air and came down shut.
+Bathsheba, a small yawn upon her mouth, took the
+pen, and with off-hand serenity directed the missive to
+Boldwood.
+'Now light a candle, Liddy. Which seal shall we
+use? Here's a unicorn's head --  there's nothing in
+that. What's this ? -- two doves -- no. It ought to be
+something extraodinary, ought it not, Lidd? Here's
+one with a motto -- I remember it is some funny one,
+but I can't read it. We'll try this, and if it doen't
+do we'll have another.'
+A large red seal was duly affixed. Bathsheba looked
+closely at the hot wax to discover the words.
+'Capital!' she exclaimed, throwing down the letter
+frolicsomely. " 'Twould upset the solemnity of a parson
+ 
+<P 148>
+The same evening the letter was sent, and was duly
+returned to Weatherbury again in the morning.
+Of love as a spectacle Bathsheba had a fair knowledge;
+but of love subjectively she knew nothing.
+<C xiv>
+<P 149>
+EFFECT OF THE LETTER -- SUNRISE
+AT dusk, on the evening of St. Valentine's Day, Bold+
+wood sat down to supper as usual, by a beaming fire
+of aged logs. Upon the matel-shelf before him was
+a time-piece, surmounted by a spread eagle, and upon
+the eagle's wings was the letter Bathsheba had sent.
+Here the bachelor's gaze was continually fastening
+itself, till the large red seal became as a blot of blood
+on the retina of his eye; and as he ate and drank he
+still read in fancy the words thereon, although they
+were too remote for his sight --
+" MARRY ME.'
+The pert injunction was like those crystal substances
+which, colourless themselves, assume the tone of objects
+about them. Here, in the quiet of Boldwood's parlour,
+where everything that ,was not grave was extraneous,
+and where the atmosphere was that of a Puritan Sunday
+lasting all the week, the letter and its dictum changed'
+their tenor from the thoughtlessness of their origin to
+a deep solemnity, imbibed from their accessories
+now.
+Since the receipt of the missive in the morning,
+Boldwood had felt the symmetry of his existence to
+be slowly getting distorted in the direction of an ideal
+passion. The disturbance was as the first floating
+weed to Columbus -- the eontemptibly little suggesting
+possibilities of the infinitely great.
+The letter must have had an origin and a motive.
+That the latter was of the smallest magnitude com+
+patible with its existence at all, Boldwood, of course,
+did not know. And such an explanation did not
+strike him as a possibility even. It is foreign to a
+mystified condition of mind to realize of the mystifier
+that the processes of approving a course suggested by
+circumstance, and of striking out a course from inner
+impulse, would look the same in the result. The vast
+difference between
+<P 150>
+starting a train of events, and direct+
+ing into a particular groove a series already started, is
+rarely apparent to the person confounded by the
+issue.
+When Boldwood went to bed he placed the valen+
+tine in the corner of the looking-glass. He was
+conscious of its presence, even when his back was
+turned upon it. It was the first time in Boldwood's
+life that such an event had occurred. The same
+fascination that caused him to think it an act which had
+a deliberate motive prevented him from regarding it as
+an impertinence. He looked again at the direction.
+The mysterious influences of night invested the writing
+with the presence of the unknown writer. Somebody's
+some woman's -- hand had travelled softly over the
+paper bearing his name ; her unrevealed eyes had
+watched every curve as she formed it ; her brain had
+seen him in imagination the while. Why should
+she have imagined him ? Her mouth -- were the lips
+red or pale, plump or creased? -- had curved itself to a
+certain expression as the pen went on -- the corners had
+moved with all their natural tremulousness : what had
+been the expression ?
+The vision of the woman writing, as a supplement to
+the words written, had no individuality. She was a
+misty shape, and well she might be, considering that
+her original was at that moment sound asleep and
+oblivious of all love and letter-writing under the sky.
+Whenever Boldwood dozed she took a form, and com+
+paratively ceased to be a vision : when he awoke there
+was the letter justifying the dream.
+The moon shone to-night, and its light was not of
+a customary kind. His window admitted only a
+reflection of its rays, and the pale sheen had that
+reversed direction which snow gives, coming upward
+and lighting up his ceiling in an unnatural way, casting
+shadows in strange places, and putting lights where
+shadows had used to be.
+The substance of the epistle had occupied him but
+little in comparison with the fact of its arrival. He
+suddenly wondered if anything more might be found in
+the envelope than what he had withdrawn. He jumped
+out of bed in the weird light, took the letter, pulled out
+the flimsy sheet, shook the envelope -- searched it.
+Nothing more was there. Boldwood looked, as he
+<P 151>
+had a hundred times the preceding day, at the insistent red
+seal : " Marry me,' he said aloud.
+The solemn and reserved yeoman again closed the
+letter, and stuck it in the frame of the glass. In doing
+so he caught sight of his reflected features, wan in
+expression, and insubstantial in form. He saw how
+closely compressed was his mouth, and that his eyes
+were wide-spread and vacant. Feeling uneasy and dis+
+satisfied with himself for this nervous excitability, he
+returned to bed.
+Then the dawn drew on. The full power of the
+clear heaven was not equal to that of a cloudy sky at
+noon, when Boldwood arose and dressed himself. He
+descended the stairs and went out towards the gate of
+a field to the east, leaning over which he paused and
+looked around.
+It was one of the usual slow sunrises of this time of
+the year, and the sky, pure violet in the zenith, was
+leaden to the northward, and murky to the east, where,
+over the snowy down or ewe-lease on Weatherbury
+Upper Farm, and apparently resting upon the ridge, the
+only half of the sun yet visible burnt rayless, like a red
+and flameless fire shining over a white hearthstone.
+The whole effect resembled a sunset as childhood
+resembles age.
+In other directions, the fields and sky were so much
+of one colour by the snow, that it was difficult in a
+hasty glance to tell whereabouts the horizon occurred ;
+and in general there was here, too, that before-mentioned
+preternatural inversion of light and shade which attends
+the prospect when the garish brightness commonly in
+the sky is found on the earth, and the shades of earth
+are in the sky. Over the west hung the wasting moon,
+now dull and greenish-yellow, like tarnished brass.
+Boldwood was listlessly noting how the frost had
+hardened and glazed the surface of the snow, till it
+shone in the red eastern light wit-h the polish of marble;
+how, in some portions of the slope, withered grass-bents,
+encased in icicles, bristled through the smooth wan
+coverlet in the twisted and curved shapes of old
+Venetian glass; and how the footprints of a few birds,
+which had hopped over the snow whilst it lay in the
+state of a soft fleece, were now frozen to a short perma+
+<P 152>
+nency. A half-muffled noise of light wheels interrupted
+him. Boldwood turned back into the road. It was
+the mail-cart -- a crazy, two-wheeled vehicle, hardly
+heavy enough to resist a puff of wind. The driver held
+out a letter. Boldwood seized it and opened it, ex+
+pecting another anonymous one -- so greatly are people's
+ideas of probability a mere sense that precedent will
+repeat itself.
+"I don't think it is for you, sir,' said the man, when
+he saw Boldwood's action. "Though there is no name
+I think it is for your shepherd.'
+Boldwood looked then at the address --
+To the New Shepherd,
+Weatherbury Farm,
+Near Casterbridge.
+"Oh -- what a mistake !. -- it is not mine. Nor is it
+for my shepherd. It is for Miss Everdene's.' You had
+better take it on to him -- Gabriel Oak -- and say I opencd
+it in mistake."
+At this moment, on the ridge, up against the blazing
+sky, a figure was visible, like the black snuff in the
+midst of a candle-flame. Then it moved and began to
+bustle about vigorously from place to place, carrying
+square skeleton masses, which were riddled by the same
+rays. A small figure on all fours followed behind. The
+tall form was that of Gabriel Oak ; the small one that
+of George ; the articles in course of transit were hurdles.
+'Wait, 'said Boldwood. " That's the man on the hill.
+I'll take the letter to him myself."
+To Boldwood it was now no longer merely a letter to
+I another man. It was an opportunity. Exhibiting a
+face pregnant with intention, he entered the snowy field.
+Gabriel, at that minute, descended the hill towards
+the right. The glow stretched down in this direction
+now, and touched the distant roof of Warren's Malthouse
+whither the shepherd was apparently bent :  Boldwood
+followed at a distance.
+<C xv>
+<P 153>
+THE scarlet and orange light outside the malthouse did
+not penetrate to its interior, which was, as usual, lighted
+by a rival glow of similar hue, radiating from the hearth.
+The maltster, after having lain down in his clothes
+for a few hours, was now sitting beside a three-leggcd
+table, breakfasting of bread and bacon. This was
+eaten on the plateless system, which is performed by
+placing a slice of bread upon the table, the meat flat
+upon the bread, a mustard plaster upon the meat, and
+a pinch of salt upon the whole, then cutting them
+vertically downwards with a large pocket-knife till wood
+is reached, when the severed lamp is impaled on the
+knife, elevated, and sent the proper way of food.
+The maltster's lack of teeth appeared not to sensibly
+diminish his powers as a mill. He had been without
+them for so many years that toothlessness was felt less
+to be a defect than hard gums an acquisition. Indeed,
+he seemed to approach the grave as a hyperbolic curve
+approaches a stmight line -- less directly as he got nearer,
+till it was doubtful if he would ever reach it at all.
+In the ashpit was a heap of potatoes roasting, and a
+boiling pipkin of charred bread, callcd 'coffee,' for the
+benefit of whomsoever should call, for Warren's was a
+sort of clubhouse. used as an alternative to the in!.
+"I say, says I, we get a fine day, and then down
+comes a snapper at night,' was a remark now suddenly
+heard spreading into the malthouse from the door, which
+had been opened the previous moment. The form of
+Henery Fray advanced to the fire, stamping the snow
+from his boots when about half-way there. The speech
+and entry had not seemed to be at all an abrupt begin+
+ning to the maltster, introductoy matter being often
+omitted in this neighbourhood, both from word and
+<P 154>
+deed, and the maltster having the same latitude allowed
+him, did not hurry to reply. He picked up a fragment
+of cheese, by pecking upon it with his knife, as a butcher
+picks up skewers.
+Henery appeared in a drab kerseymere great-coat,
+buttoned over his smock-frock, the white skirts of the
+latter being visible to the distance of about a foot below
+the coat-tails, which, when you got used to the style of
+dress, looked natural enough, and even ornamental -- it
+certainly was comfortable.
+Matthew Moon, Joseph Poorgrass, and other carters
+and waggoners followed at his heels, with great lanterns
+dangling from their hands, which showed that they had
+just come from the cart-horse stables, where they had
+been busily engaged since four o'clock that morning.
+"And how is she getting on without a baily?' the
+maltster inquired.
+Henery shook his head, and smiled one of the bitter
+smiles, dragging all the flesh of his forehead into a
+corrugated heap in the centre.
+" She'll rue it -- surely, surely ! ' he said " Benjy
+Pennyways were not a true man or an honest baily --
+as big a betrayer as Joey Iscariot himself. But to think
+she can carr' on alone! ' He allowed his head to swing
+laterally three or four times in silence. " Never in all my
+creeping up -- never! '
+This was recognized by all as the conclusion of some
+gloomy speech which had been expressed in thought
+alone during the shake of the head; Henery meanwhile
+retained several marks of despair upon his face, to
+imply that they would be required for use again directly
+he should go on speaking.
+'All will be ruined, and ourselves too, or there's no
+meat in gentlemen's houses!' said Mark Clark.
+'A headstrong maid, that's what she is -- and won't
+listen to no advice at all. Pride and vanity have ruined
+many a cobbler's dog. Dear, dear, when I think o' it,
+I sorrows like a man in travel ! '
+'True, Henery, you do, I've heard ye,' said Joseph
+Poorgrass in a voice of thorough attestation, and with
+a wire-drawn smile of misery.
+"'Twould do a martel man no harm to have what's
+under
+<P 155>
+her bonnet,' said Billy Smallbury, who had just
+entered, bearing his one tooth before him. "She can
+spaik real language, and must have some sense some+
+where. Do ye foller me ?'
+"I do: but no baily -- I deserved that place,' wailed
+Henery, signifying wasted genius by gazing blankly at
+visions of a high destiny apparently visible to him on
+Billy Smallbury's smock-frock. " There, 'twas to be, I
+suppose. Your lot is your lot, and Scripture is nothing;
+for if you do good you don't get rewarded according to
+your works, but be cheated in some mean way out of
+your recompense.'
+"No, no; I don't agree with'ee there,' said Mark
+Clark. God's a perfect gentleman in that respect.'
+"Good works good pay, so to speak it,' attested
+Joseph Poorgrass.
+A short pause ensued, and as a sort of entr'acte
+Henery turned and blew out the lanterns, which the
+increase of daylight rendered no longer necessary even
+in the malthouse, with its one pane of glass.
+"I wonder what a farmer-woman can want with a
+harpsichord, dulcimer, pianner, or whatever 'tis they d'call
+it?' said the maltster. 'Liddy saith she've a new one.'
+"Got a pianner?'
+"Ay. Seems her old uncle's things were not good
+enough for her. She've bought all but everything new.
+There's heavy chairs for the stout, weak and wiry ones
+for the slender; great watches, getting on to the size
+of clocks, to stand upon the chimbley-piece.'
+Pictures, for the most part wonderful frames.'
+" And long horse-hair settles for the drunk, with horse+
+hair pillows at each end,' said Mr. Clark. " Likewise
+looking-glasses for the pretty, and lying books for the
+wicked.'
+A firm loud tread was now heard stamping outside;
+the door was opened about six inches, and somebody on
+the other side exclaimed --
+"Neighbours, have ye got room for a few new-born
+lambs?'
+" Ay, sure, shepherd,' said the conclave.
+The door was flung back till it kicked the wall and
+trembled from top to bottom with the blow. Mr.
+Oak appeared in the
+<P 156>
+entry with a steaming face, hay+
+bands wound about his ankles to keep out the snow, a
+leather strap round his waist outside the smock-frock,
+and looking altogether an epitome of the world's health
+and vigour. Four lambs hung in various embarrassing
+attitudes over his shoulders, and the dog George, whom
+Gabriel had contrived to fetch from Norcombe, stalked
+solemnly behind.
+" Well, Shepherd Oak, and how's lambing this year,
+if I mid say it?' inquired Joseph Poorgrass.
+"Terrible trying," said Oak. "I've been wet through
+twice a-day, either in snow or rain, this last fortnight.
+Cainy and I haven't tined our eyes to-night.'
+"A good few twins, too, I hear ?'
+"Too many by half. Yes ; 'tis a very queer lambing
+this year. We shan't have done by Lady Day.'
+"And last year 'twer all over by Sexajessamine
+Sunday,' Joseph remarked.
+"Bring on the rest Cain,' said Gabriel, " and then run
+back to the ewes. I'll follow you soon.'
+Cainy Ball -- a cheery-faced young lad, with a small
+circular orifice by way of mouth, advanced and deposited
+two others, and retired as he was bidden. Oak lowered
+the lambs from their unnatural elevation, wrapped them
+in hay, and placed them round the fire.
+" We've no lambing-hut here, as I used to have at
+Norcombe,' said Gabriel, " and 'tis such a plague to bring
+the weakly ones to a house. If 'twasn't for your place
+here, malter, I don't know what I should do! this keen
+weather. And how is it with you to-day, malter? '
+" Oh, neither sick nor sorry, shepherd ; 'but no
+younger.'
+" Ay -- I understand.
+"Sit down, Shepherd Oak', continued the ancient man
+of malt. " And how was the old place at Norcombe,
+when ye went for your dog? I should like to see the
+old familiar spot ; but faith, I shouldn't" know a soul
+there now.'
+" I suppose you wouldn't. 'Tis' altered very much.'
+"Is it true that Dicky Hill's wooden cider-house is
+pulled down?'
+<P 157>
+" O yes -- years ago, and Dicky's cottage just above it.'
+"Well, to be sure!,
+" Yes ; and Tompkins's old apple-tree is rooted that
+used to bear two hogsheads of cider; and no help from
+other trees.'
+'Rooted? -- you don't say it! Ah! stirring times we
+live in -- stirring times.'
+"And you can mind the old well that used to be in
+the middle of the place? That's turned into a solid
+iron pump with a large stone trough, and all complete.'
+"Dear, dear -- how the face of nations alter, and
+what we live to see nowadays! Yes -- and 'tis the same
+here. They've been talking but now of the mis'ess's
+strange doings.'
+" What have you been saying about her?' inquired
+Oak, sharply turning to the rest, and getting very
+warm.
+" These middle-aged men have been pulling her over
+the coals for pride and vanity,' said Mark Clark; "but
+I say, let her have rope enough. Bless her pretty face
+shouldn't I like to do so -- upon her cherry lips!'
+The gallant Mark Clark here made a peculiar and well
+known sound with his own.
+" Mark,' said Gabriel, sternly, 'now you mind this !
+none of that dalliance-talk -- that smack-and-coddle style
+of yours -- about Miss Everdene. I don't allow it. Do
+you hear? '
+" With all my heart, as I've got no chance,' replied
+Mr. Clark, cordially.
+' I suppose you've been speaking against her? ' said
+Oak, turning to Joseph Poorgrass with a very grim
+look.
+"No, no -- not a word I -- 'tis a real joyful thing that
+she's no worse, that's what I say,' said Joseph, trembling
+and blushing with terror. " Matthew just said --  -- '
+" Matthew Moon, what have you been saying ? ' asked
+Oak.
+'I? Why ye know I wouldn't harm a worm -- no,
+not one underground worm ?' said Matthew Moon,
+looking very uneasy.
+"Well, somebody has -- and look here, neighbours.'
+Gabriel, though one of the quietest and most gentle
+men on earth, rose to the occasion, with martial
+promptness and vigour. "That's my fist.' Here he
+placed his fist, rather smaller in size than a common
+loaf, in the mathemarical centre of the maltster's little
+table, and with it gave a bump or two thereon, as if
+<P 158>
+to ensure that their eyes all thoroughly took in the
+idea of fistiness before he went further. "Now -- the
+first man in the parish that I hear prophesying bad of
+our mistress, why' (here the fist was raised and let fall
+as T'hor might have done with his hammer in assaying
+it) -- "he'll smell and taste that -- or I'm a Dutchman.'
+All earnestly expressed by their features that their
+minds did not wander to Holland for a moment on
+account of this statement, but were deploring the
+difference which gave rise to the figure ; and Mark
+Clark cried "Hear, hear; just what I should ha' said.'
+The dog George looked up at the same time after the
+shepherd's menace, and though he understood English
+but imperfectly, began to growl.
+" Now, don't ye take on so, shepherd, and sit down!'
+said Henery, with a deprecating peacefulness equal to
+anything of the kind in Christianity.
+"We hear that ye bc a extraordinary good and
+clever man, shepherd,' said Joseph Poorgrass with
+considerable anxiety from behind the maltster's bed+
+stead whither he had retired for safety. "'Tis a great
+thing to be clever, I'm sure,' he added, making move+
+ments associated with states of mind rather than body ;
+" we wish we were, don't we, neighbours ? '
+"Ay, that we do, sure,' said Matthew Moon, with
+a small anxious laugh towards Oak, to show how very
+friendly disposed he was likewise.
+" Who's been telling you I'm clever?' said Oak.
+"'Tis blowed about from pillar to post quite common,'
+said Matthew. " We hear that ye can tell the t1me as
+well by the stars as we can by the sun and moon,
+shepherd.'
+" Yes, I can do a little that way,' said Gabriel, as a
+man of medium sentiments on the subject.
+names upon their waggons almost like copper-plate,
+with beautiful flourishes, and great long tails. A
+excellent fine thing for ye to be such a clever man,
+shepherd. Joseph Poorgrass used to prent to Farmer
+James Everdene's waggons before you came, and 'a
+could never mind which way to turn the J's and E's
+ -- could ye, Joseph?' Joseph shook his head to express
+how absolute was
+<P 159>
+the fact that he couldn't. "And so
+you used to do 'em the wrong way, like this, didn't ye,
+Joseph ?' Matthew marked on the dusty floor with his
+whip-handle
+LAMES
+"And how Farmer James would cuss, and call thee a
+fool, wouldn't he, Joseph, when 'a seed his name
+looking so inside-out-like ?' continued Matthew Moon
+with feeling.
+'Ay -- 'a would,' said Joseph, meekly. " But, you see,
+I wasn't so much to blame, for them J's and E's be
+such trying sons o' witches for the memory to mind
+whether they face backward or forward ; and I always
+had such a forgetful memory, too.'
+"'Tis a bad afiction for ye, being such a man of
+calamities in other ways.'
+" Well, 'tis ; but a happy Providence ordered that it
+should be no worse, and I feel my thanks. As to
+shepherd, there, I'm sure mis'ess ought to have made
+ye her baily -- such a fitting man for't as you be.'
+"I don't mind owning that I expected it,' said Oak,
+frankly. ' Indeed, I hoped for the place. At the same
+time, Miss Everdene has a right to be own baily if
+she choose -- and to keep me down to be a common
+shepherd only.' Oak drew a slow breath, looked sadly
+into the bright ashpit, and seemed lost in thoughts not
+of the most hopeful hue.
+The genial warmth of the fire now began to stimulate
+the nearly lifeless lambs to bleat and move their limbs
+briskly upon the hay, and to recognize for the first time
+the fact that they were born. Their noise increased to a
+chorus of baas, upon which Oak pulled the milk-can from
+before the fire, and taking a small tea-pot from the pocket
+of his smock-frock, filled it with milk, and taught those of
+the helpless creatures which were not to be restored to
+their dams how to drink from the spout -- a trick they
+acquired with astonishing aptitude.
+"And she don't even let ye have the skins of the
+dead lambs, I hear?' resumed Joseph Poorgrass, his
+eyes lingering on the operations of Oak with the neces+
+sary melancholy.
+"I don't have them,' said Gabriel.
+"Ye be very badly used, shepherd,' hazardcd Joseph
+again, in
+<P 160>
+the hope of getting Oak as an ally in lamenta+
+tion after all. "I think she's took against ye -- that
+I do.'
+'O no -- not at all,' replied Gabriel, hastily, and a
+sigh escaped him, which the deprivation of lamb skins
+could hardly have caused.
+Before any further remark had been added a shade
+darkened the door, and Boldwood entered the malthouse,
+bestowing upon each a nod of a quality between friendli+
+ness and condescension.
+"Ah! Oak, I thought you were here,' he said. 'I
+met the mail-cart ten minutes ago, and a letter was put
+into my hand, which I opened without reading the
+address. I believe it is yours. You must excuse the
+accident please.'
+"O yes -- not a bit of difference, Mr. Boldwood --
+not a bit,' said Gabriel, readily. He had not a corre+
+spondent on earth, nor was there a possible letter coming
+to him whose contents the whole parish would not have
+been welcome to persue.
+Oak stepped aside, and read the following in an
+unknown hand: --
+" DEAR FRIEND, -- I do not know your name, but l think
+these few lines will reach you, which I wrote to thank you
+for your kindness to me the night I left Weatherbury in a
+reckless way. I also return the money I owe you, which
+you will excuse my not keeping as a gift. All has ended
+well, and I am happy to say I am going to be married to
+the young man who has courted me for some time -- Sergeant
+Troy, of the 11th Dragoon Guards, now quartered in this
+town. He would, I know, object to my having received
+anything except as a loan, being a man of great respecta+
+bility and high honour -- indeed, a nobleman by blood.
+ "I should be much obliged to you if you would keep the
+contents of this letter a secret for the present, dear friend.
+We mean to surprise Weatherbury by coming there soon
+as husband and wife, though l blush to state it to one nearly
+a strangen The sergeant grew up in Weatherbury. Thank+
+ing you again for your kindness,
+"I am, your sincere well-wisher,
+" FANNV ROBIN.'
+' Have you read it, Mr. Boldwood?' said Gabriel;
+"if not, you had better do so. I know you are interested
+in Fanny Robin.'
+<P 161>
+Boldwood read the letter and looked grieved.
+"Fanny -- poor Fanny! the end she is so confident
+of has not yet come, she should remember -- and may
+never come. I see she gives no address.'
+"What sort of a man is this Sergeant Troy?' said
+Gabriel.
+"H'm -- I'm afraid not one to build much hope upon
+in such a case as this,' the farmer murmured, "though
+he's a clever fellow, and up to everything. A slight
+romance attaches to him, too. His mother was a French
+governess, and it seems that a secret attachment existed
+between her and the late Lord Severn. She was married
+to a poor medical man, and soon after an infant was
+horn; and while money was forthcoming all went on
+well. Unfortunately for her boy, his best friends died;
+and he got then a situation as second clerk at a lawyer's
+in Casterbridge. He stayed there for some time, and
+might have worked himself into a dignified position of
+some sort had he not indulged in the wild freak of
+enlisting. I have much doubt if ever little Fanny will
+surprise us in the way she mentions -- very much doubt
+A silly girl! -- silly girl!'
+The door was hurriedly burst open again, and in
+came running Cainy Ball out of breath, his mouth red
+and open, like the bell of a penny trumpet, from which
+he coughed with noisy vigour and great distension of face.
+"Now, Cain Ball,' said Oak, sternly, "why will you
+run so fast and lose your breath so? I'm always telling
+you of it.'
+'Oh -- I -- a puff of mee breath -- went -- the -- wrong
+way, please, Mister Oak, and made me cough -- hok --
+hok!'
+"Well --  what have you come for?'
+"I've run to tell ye,' said the junior shepherd,
+supporting his exhausted youthful frame against the
+doorpost, ' that you must come directly'. Two more ewes
+have twinned -- that's what's the matter, Shepherd Oak.'
+" Oh, that's it,' said Oak, jumping up, and dimissing
+for the present his thoughts on poor Fanny. " You are
+a good boy to run and tell me, Cain, and you shall
+smell a large plum pudding some day as a treat. But,
+before we go, Cainy, bring the tarpot, and we'll mark
+this lot and have done with 'em.'
+<P 162>
+Oak took from his illimitable pockets a marking iron,
+dipped it into the pot, and imprintcd on the buttocks
+of the infant sheep the initials of her he delighted to
+muse on -- "B. E.,' which signified to all the region
+round that henceforth the lambs belonged to Farmer
+Bathsheba Everdene, and to no one else.
+" Now, Cainy, shoulder your two, and off Good
+morning, Mr. Boldwood.' The shepherd lifted the
+sixteen large legs and four small bodies he had himself
+brought, and vanished with them in the direction of
+the lambing field hard by -- their frames being now in a
+sleek and hopeful state, pleasantly contrasting with their
+death's-door plight of hialf an hour before.
+Boldwood followed him a little way up the field,
+hesitated, and turned back. He followed him again
+with a last resolve, annihilating return. On approaching
+the nook in which the fold was constructed, the farmer
+drew out-his pocket-book, unfastened-it, and allowed it
+to lie open on his hand. A letter was revealed -- Bath+
+sheba's.
+"I was going to ask you, Oak,' he said, with unreal
+carelessness, "if you know whose writing this is? '
+Oak glanced into the book, and replied instantly,
+with a flushed face, " Miss Everdene's.'
+Oak had coloured simply at the consciousness of
+sounding her name. He now felt a strangely distressing
+qualm from a new thought. ' The letter could of course
+be no other than anonymous, or the inquiry would not
+have been necessary.
+Boldwood mistook his confusion : sensitive persons
+are always ready with their "Is it I ? ' in prefercnce to
+objective reasoning.
+" The question was perfectly fair,' he returned -- and
+there was something incongruous in the serious eamest+
+ness with which he applied himself to an argument on
+a valentine. " You know it is always expected that
+privy inquiries will be made : that's where the -- fun
+lies.' If the word "fun' had been "torture,' it could
+not have been uttered with a more constrained and
+restless countenance than was Boldwood's then.'
+Soon parting from Gabriel, the lonely and reserved
+man returned to his house to breakfast -- feeling twinges
+of shame and regret at having so far exposed his mood
+by those fevered
+<P 163>
+questions to a stranger. He again
+placed the letter on the mantelpiece, and sat down to
+think of the circumstances attending it by the light of
+Gabriel's information.
+ALL SAINTS' AND ALL SOULS"
+<C xvi>
+<P 164>
+ALL SAINTS' AND ALL SOULS'
+ON a week-day morning a small congregation, con+
+sisting mainly of women and girls, rose from its knees
+in the mouldy nave of a church called All Saints', in
+the distant barrack-town before mentioned, at the end
+of a service without a sermon. They were about to
+disperse, when a smart footstep, entering the porch and
+coming up the central passage, arrested their attention.
+The step echoed with a ring unusual in a church; it
+was the clink of spurs. Everybody looked. A young
+cavalry soldier in a red uniform, with the three chevrons
+of a sergeant upon his sleeve, strode up the aisle, with
+an embarrassment which was only the more marked
+by the intense vigour of his step, and by the deter+
+mination upon his face to show none. A slight flush
+had mounted his cheek by the time he had run the
+gauntlet between these women ; but, passing on through
+the chancel arch, he never paused till he came close
+to the altar railing. Here for a moment he stood
+alone.
+The officiating curate, who had not yet doffed his
+surplice, perceived the new-comer, and followed him
+to the communion-space. He whispered to the soldier,
+and then beckoned to the clerk, who in his turn
+whispered to an elderly woman, apparently his wife, and
+they also went up the chancel steps.
+"'Tis a wedding!' murmured some of the women,
+brightening. " Let's wait!'
+The majority again sat down.
+There was a creaking of machinery behind, and
+some of the young ones turned their heads. From the
+interior face of the west wall of the tower projected a
+little canopy with a quarter-jack and small bcll beneath
+it, the automaton being driven by the same clock
+machinery that struck the large bell in the tower. Be+
+tween the tower and the church was a close sereen, the
+door of which was kept shut during services, hiding
+this
+<P 165>
+grotesque clockwork from sight. At present, how+
+ever, the door was open, and the egress of the jack, the
+blows on the bell, and the mannikin's retreat intc.the
+nook again, were visible to many, and audible through+
+out the church.
+The jack had struck half-past eleven.
+" Where's the woman ?" whispered some of the
+spectators.
+The young sergeant stood still with the abnormal
+rigidity of the old pillars around. He faced the south+
+east, and was as silent as he was still.
+The silence grew to be a noticeable thing as the
+minutes went on, and nobody else appeared, and not a
+soul moved. The rattle of the quarter-jack again from
+its niche, its blows for three-quarters, its fussy retreat,
+were almost painfully abrupt, and caused many of the
+congregation to start palpably.
+"I wonder where the woman is!' a voice whispered
+again.
+There began now that slight shifting of feet, that
+artificial coughing among several, which betrays a
+nervous suspense. At length there was a titter. But
+the soldier never moved. There he stood, his face to
+the south-east, upright as a column, his cap in his hand.
+The clock ticked on. The women threw off their
+nervousness, and titters and giggling became more
+frequent. Then came a dead silence. Every one was
+waiting for the end. Some persons may have noticed
+how extraordinarily the striking of quarters. seems to
+quicken the flight of time. It was hardly credible that
+the jack had not got wrong with the minutes when the
+rattle began again, the puppet emerged, and the four
+quarters were struck fitfully as before: One could al+
+most be positive that there was a malicious leer upon
+the hideous creature's face, and a mischievous delight
+in its twitchings. Then, followed the dull and remote
+resonance of the twelve heavy strokes in the tower
+above. The women were impressed, and there was no
+giggle this time.
+The clergyman glided into the vestry, and the clerk
+vanished. The sergeant had not yet turned ; every
+woman in the church was waiting to see his face, and
+he appeared to know it. At last he did turn, and
+stalked resolutely down the nave, braving them all,
+with a compressed lip. Two bowed and toothless old
+<P 166>
+almsmen then looked at each other and chuckled,
+innocently enough ; but the sound had a strange weird
+effect in that place.
+Opposite to the church was a paved square, around
+which several overhanging wood buildings of old time
+cast a picturesque shade. The young man on leaving
+the door went to cross the square, when, in the middle,
+he met a little woman. The expression of her face,
+which had been one of intense anxiety, sank at the
+sight of his nearly to terror.
+" Well ? ' he said, in a suppressed passion, fixedly
+looking at her.
+" O, Frank -- I made a mistake! -- I thought that
+church with the spire was All Saints', and I was at the
+door at half-past eleven to a minute as you said.
+waited till a quarter to twelve, and found then that I
+was in All Souls'. But I wasn't much frightened, for
+I thought it could be to-morrow as well.'
+"You fool, for so fooling me! But say no more.'
+" Shall it be to-monow, Frank ? ' she asked blankly.
+"To-morrow !' and he gave vent to a hoarse laugh.
+"I don't go through that experience again for some
+time, I warrant you ! '
+" But after all,' she expostulated in a trembling voice,
+"the mistake was not such a terrible thing! Now, dear
+Frank, when shall it be?'
+"Ah, when ? God knows !' he said, with a light
+irony, and turning from her walked rapidly away.
+<C xvii>
+<P 167>
+IN THE MARKET-PLACE
+ON Saturday Boldwood was in Casterbridge market
+house as usual, when the disturber of his dreams entered
+and became visible to him. Adam had awakened from
+his deep sleep, and behold! there was Eve. The
+farmer took courage, and for the first time really looked
+at her.
+Material causes and emotional effects are not to be
+arranged in regular equation. The result from capital
+employed in the production of any movement of a
+mental nature is sometimes as tremendous as the cause
+itself is absurdly minute. When women are in a freakish
+mood, their usual intuition, either from carelessness or
+inherent defect, seemingly fails to teaeh them this, and
+hence it was that Bathsheba was fated to be astonished
+today.
+Boldwood looked at her -- not slily, critically, or
+understandingly, but blankly at gaze, in the way a
+reaper looks up at a passing train -- as something foreign
+to his element, and but dimly understood. To Bold+
+wood women had been remote phenomena rather than
+necessary complements -- comets of such uncertain
+aspeet, movement, and permanence, that whether
+their orbits were as geometrical, unchangeable, and
+as subject to laws as his own, or as absolutely erratic
+as they superficially appeared, he had not deemed it
+his duty to consider.
+He saw her black hair, her correct facial curves
+and profile, and the roundness of her chin and throat.
+He saw then the side of her eyelids, eyes, and lashes,
+and the shape of her ear. Next he noticed her figure,
+her skirt, and the very soles of her shoes.
+Boldwood thought her beautiful, but wondered
+whether he was right in his thought, for it seemed
+impossible that this romance in the flesh, if so sweet
+as he imagined, could have
+<P 168>
+been going on long without
+creating a commotion of delight among men, and pro+
+voking more inquiry than Bathsheba had done, even
+though that was not a little. To the best of his judg+
+ment neither nature nor art could improve this perfect
+one of an imperfect many. His heart began to move
+within him. Boldwood, it must be remembered, though
+forty years of age, had never before inspected a woman
+with the very centre and force of his glance; they had
+struck upon all his senses at wide angles.
+Was she really beautiful? He could not assure
+himself that his opinion was true even now. He fur+
+tively said to a neighbour, 'Is Miss Everdene considered
+handsome?'
+"0 yes; she was a good deal 'notied the first
+time she came, if you remember. A very handsome
+girl indeed.'
+A man is never more credulous than in receiving
+favourable opinions on the beauty of a woman he is
+half, or quite, in love with; a mere child's word on the
+point has the weight of an R.A.'s. Boldwood was
+satisfied now.
+And this charming woman had in effect said to
+him, "Marry me.' Why should she have done that
+strange thing ? Boldwood's blindness to the difference
+between approving of what circumstances suggest, and
+originating what they do not suggest, was well matched
+by Bathsheba's insensibility to the possibly great issues
+of little beginnings.
+She was at this moment coolly dealing with a dashing
+young farmer, adding up accounts with him as indiffer+
+ently as if his face had been the pages of a ledger. It
+was evident that such a nature as his had no attraction
+for a woman of Bathsheba's taste. But Boldwood grew
+hot down to his hands with an incipient jealousy; he
+trod for the first time the threshold of "the injured
+lover's hell.' His first impulse was to go and thrust
+himself between them. This could be done, but only
+in one way -- by asking to see a sample of her corn.
+Boldwood renounced the idea. He could not make
+the request; it was debasing loveliness to ask it to
+buy and sell, and jarred with his conceptions of her.
+All this time Bathsheba was conscious of having
+broken into that dignified stronghold at last. His
+eyes, she knew, were
+<P 169>
+following her everywhere. This
+was a triumph; and had it come naturally, such a
+triumph would have been the sweeter to her for this
+piquing delay. But it had been brought about by
+misdirected ingenuity, and she valued it only as she
+valued an artificial flower or a wax fruit.
+Being a woman with some good sense in reasoning
+on subjects wherein her heart was not involved, Bath+
+sheba genuinely repented that a freak which had owed
+its existence as much to Liddy as to herself, should
+ever have been undertaken, to disturb the placidity of
+a man she respected too highly to deliberately tease.
+She that day nearly formed the intention of begging
+his pardon on the very next occasion of their meeting.
+The worst features of this arrangement were that, if
+he thought she ridiculed him, an apology would in+
+crease the offence by being disbelieved; and if he
+thought she wanted him to woo her, it would read
+like additional evidence of her forwardness.
+<C xviii>
+<P 170>
+BOLDWOOD IN MEDITATION -- REGRET
+BOLDWOOD was tenant of what was called Little
+Weatherbury Farm, and his person was the nearest ap+
+proach to aristocracy that this remoter quarter of the
+parish could boast of. Genteel strangers, whose god
+was their town, who might happen to be compelled to
+linger about this nook for a day, heard the sound of
+light wheels, and prayed to see good society, to the
+degree of a solitary lord, or squire at the very least,
+but it was only Mr. Boldwood going out for the day.
+They heard the sound of wheels yet once more, and
+were re-animated to expectancy : it was only Mr. Bold+
+wood coming home again.
+His house stood recessed from the road, and the
+stables, which are to a farm what a fireplace is to a
+room, were behind, their lower portions being lost
+amid bushes of laurel. Inside the blue door, open
+half-way down, were to be seen at this time the backs
+and tails of half-a-dozen warm and contented horses
+standing in their stalls; and as thus viewed, they pre+
+sented alternations of roan and bay, in shapes like a
+Moorish arch, the tail being a streak down the midst
+of each. Over these, and lost to the eye gazing in
+from the outer light, the mouths of the same animals
+could be heard busily sustaining the above-named
+warmth and plumpness by quantities of oats and hay.
+The restless and shadowy figure of a colt wandered
+about a loose-box at the end, whilst the steady grind
+of all the eaters was occasionally diversified by the
+rattle of a rope or the stamp of a foot.
+Pacing up and down at the heels of the animals was
+Farmer Boldwood himself. This place was his almonry
+and cloister in one : here, after looking to the feeding
+of his four-footed dependants, the celibate would walk
+and meditate of an evening till the moon's rays streamed
+in through the cobwebbed windows, or total darkness
+enveloped the scene.
+<P 171>
+His square-framed perpendicularity showed more fully
+now than in the crowd and bustle of the market-house.
+In this meditative walk his foot met the floor with heel
+and toe simultaneously, and his fine reddish-fleshed face
+was bent downwards just enough to render obscure the
+still mouth and the well-rounded though rather prominent
+and broad chin. A few clear and thread-like horizontal
+lines were the only interruption to the otherwise smooth
+surface of his large forehead.
+The phases of Boldwood's life were ordinary enough,
+but his was not an ordinary nature. That stillness,
+which struck casual observers more than anything else
+in his character and habit, and seemed so precisely
+like the rest of inanition, may have been the perfect
+balance of enormous antagonistic forces -- positives and
+negatives in fine adjustment. His equilibrium disturbed,
+he was in extremity at once. If an emotion possessed
+him at all, it ruled him; a feeling not mastering him
+was entirely latent. Stagnant or rapid, it was never
+slow. He was always hit mortally, or he was missed.
+He had no light and careless touches in his constitu+
+tion, either for good or for evil. Stern in the outlines of
+action, mild in the details, he was serious throughout all.
+He saw no absurd sides to the follies of life, and thus,
+though not quite companionable in the eyes of merry
+men and scoffers, and those to whom all things show
+life as a jest, he was not intolerable to the earnest and
+those acquainted with grief. Being a man -who read
+all the dramas of life seriously, if he failed to please
+when they were comedies, there was no frivolous treat+
+ment to reproach him for when they chanced to end
+tragically.
+Bathsheba was far from dreaming that the dark and
+silent shape upon which she had so carelessly thrown a
+seed was a hotbed of tropic intensity. Had she known
+Boldwood's moods, her blame would have been fearful,
+and the stain upon her heart ineradicable. Moreover,
+had she known her present power for good or evil over
+this man, she would have trembled at her responsibility.
+Luckily for her present, unluckily for her future tran+
+quillity, her understanding had not yet told her what
+Boldwood was. Nobody knew entirely ; for though it
+was possible to form guesses concerning his wild 'capa+
+<P 172>
+bilities from old floodmarks faintly visible, he had never
+been seen at the high tides which caused them.
+Farmer Boldwood came to the stable-door and looked
+forth across the level fields. Beyond the first enclosure
+was a hedge, and on the other side of this a meadow
+belonging to Bathsheba's farm.
+It was now early spring -- the time of going to grass
+with the sheep, when they have the first feed of the
+meadows, before these are laid up for mowing. The
+wind, which had been blowing east for several weeks,
+had veered to the southward, and the middle of spring
+had come abruptly -- almost without a beginning. It
+was that period in the vernal quarter when we map
+suppose the Dryads to be waking for the season. The
+vegetable world begins to move and swell and the saps
+to rise, till in the completest silence of lone gardens
+and trackless plantations, where- everything seems -help+
+less and still after the bond and slavery of frost, there
+are bustlings, strainings, united thrusts, and pulls-all+
+together, in comparison with which the powerful tugs of
+cranes and pulleys in a noisy city are but.  pigmy efforts.
+"Boldwood, looking into the distant meadows, saw
+there three figures. They were those of Miss' Everdene,
+Shepherd Oak, and Cainy Ball.
+When Bathsheba's figure shone upon the farmer's
+eyes it lighted him up as the moon lights up a great
+tower. A man's body is as the shell; or the tablet, of
+his soul, as he is reserved or ingenuous, overflowing or
+self-contained. There was a  change in Boldwood's
+exterior from its former impassibleness ; and his face
+showed that he was now living outside his defences
+for the first time, and with a fearful sense of exposure.
+It is the usual experience of strong natures when they
+love.
+At last he arrived at a conclusion. It was to go
+across and inquire boldly of her.
+The insulation of his heart by reserve during these
+many years, without a channel of any kind for disposable
+emotion, had worked its effect. It has been observed
+more than once that the causes of love are chiefly
+<P 173>
+subjective, and Boldwood was a living testimony to
+the truth of the proposition. No mother existed to
+absorb his devotion, no sister for his tenderness, no
+idle ties for sense. He became surcharged with the
+compound, which was genuine lover's love.
+He approached the gate of the meadow. Beyond
+it the ground was melodious with ripples, and the sky
+with larks; the low bleating of the flock mingling with
+both. Mistress and man were engaged in the operation
+of making a lamb "take,' which is performed whenever
+an ewe has lost her own offspring, one of the twins of
+another ewe being given her as a substitute. Gabriel
+had skinned the dead lamb, and was tying the skin
+over the body of the live lamb, in the customary manner,
+whilst Bathsheba was holding open a little pen of four
+hurdles, into which the Mother and foisted lamb were
+driven, where they would remain till the old sheep
+conceived an affection for the young one.
+Bathsheba looked up at the completion of the
+manouvre, and saw the farmer by the gate, where he
+was overhung by a willow tree in full bloom. Gabriel,
+to whom her face was as the uncertain glory of an April
+day, was ever regardful of its faintest changes, and
+instantly discerned thereon the mark of some influence
+from without, in the form of a keenly self-conscious
+reddening. He also turned and beheld Boldwood.
+At onee connecting these signs with the letter Bold+
+wood had shown him, Gabriel suspected her of some
+coquettish procedure begun by that means, and carried
+on since, he knew not how.
+Farmer Boldwood had read the pantomime denoting
+that they were aware of his presence, and the perception
+was as too much light turned upon his new sensibility.
+He was still in the road, and by moving on he hoped
+that neither would recognize that he had originally
+intended to enter the field. He passed by with an
+utter and overwhelming sensation of ignorance, shyness,
+and doubt. Perhaps in her manner there were signs
+that she wished to see him -- perhaps not -- he could not
+read a woman. The cabala of this erotic philosophy
+seemed to consist of the subtlest meanings expressed in
+misleading ways.
+<P 174>
+Every turn, look, word, and accent
+contained a mystery quite distinct from its obvious
+import, and not one had ever been pondered by him
+until now.
+As for Bathsheba, she was not deceived into the
+belief that Farmer Boldwood had walked by on business
+or in idleness. She collected the probabilities of the
+case, and concluded that she was herself responsible for
+Boldwood's appearance there. It troubled her much
+to see what a great flame a little Wildfire was likely to
+kindle. Bathsheba was no schemer for marriage, nor
+was she deliberately a trifler with the affections of men,
+and a censor's experience on seeing an actual flirt after
+observing her would have been a feeling of surprise
+that Bathsheba could be so different from such a one,
+and yet so like what a flirt is supposed to be.
+She resolved never again, by look or by sign, to
+interrupt the steady flow of this man's life. But a
+resolution to avoid an evil is seldom framed till the evil
+is so far advanced as to make avoidance impossible.
+<C xix>
+<P 175>
+THE SHEEP-WASHING -- THE OFFER
+BOLDWOOD did eventually call upon her. She was
+not at home. " Of course not,' he murmured. In con+
+templating Bathsheba as a woman, he had forgotten the
+accidents of her position as an agriculturist -- that being
+as much of a farmer, and as extensive a farmer, as
+himself, her probable whereabouts was out-of-dooTs at
+this time of the year. This, and the other oversights
+Boldwood was guilty of, were natural to the mood, and
+still more natural to the circumstances. The great aids
+to idealization in love were present here : occasional
+observation of her from a distance, and the absence of
+social intercourse with her -- visual familiarity, oral
+strangeness. The smaller human elements were kept
+out of sight ; the pettinesses that enter so largely into
+all earthly living and doing were disguised by the
+accident of lover and loved-one not being on visiting
+terms ; and there was hardly awakened a thought in
+Boldwood that sorry household realities appertained to
+her, or that she, like all others, had moments of
+commonplace, when to be least plainly seen was to be
+most prettily remembered. Thus a mild sort of
+apotheosis took place in his fancy, whilst she still lived
+and breathed within his own horizon, a troubled creature
+like himself.
+It was the end of May when the farmer determined
+to be no longer repulsed by trivialities or distracted by
+suspense. He had by this time grown used to being in
+love; the passion now startled him less even when it
+tortured him more, and he felt himself adequate to the
+situation. On inquiring for her at her house they had
+told him she was at the sheepwashing, and he went off
+to seek her there.
+The sheep-washing pool was a perfectly circular basin
+of brickwork in the meadows, full of the clearest water.
+To birds on the wing its glassy surface, reflecting the
+light sky, must have been
+<P 176>
+visible for miles around as a
+glistening Cyclops' eye in a green face. The grass
+about the margin at this season was a sight to remember
+long -- in a minor sort of way. Its activity in sucking
+the moisture from the rich damp sod. was almost a pro+
+cess observable by the eye. The outskirts of this level
+water-meadow were diversified by rounded and hollow
+pastures, where just now every flower that was not a
+buttercup was a daisy. The river slid along noiselessly
+as a shade, the swelling reeds and sedge forming a
+flexible palisade upon its moist brink. To the north
+of the mead were trees, the leaves of which were new,
+soft, and moist, not yet having stiffened and darkened
+under summer sun and drought, their colour being
+yellow beside a green -- green beside a yellow.
+From the recesses of this knot of foliage the loud
+notes of three cuckoos were resounding through the
+still air.
+Boldwood went meditating down the slopes with his
+eyes on his boots, which the yellow pollen from the
+buttercups had bronzed in artistic gradations. A tribu+
+tary of the main stream flowed through the basin of the
+pool by an inlet and outlet at opposite points of its
+diameter. Shepherd Oak, Jan Coggan, Moon, Poor+
+grass, Cain Ball, and several others were assembled
+here, all dripping wet to the very roots of their hair,
+and Bathsheba was standing by in a new riding-habit --
+the most elegant she had ever worn -- the reins of her
+horse being looped over her arm. Flagons of cider
+were rolling about upon the green. The meek sheep
+were pushed into the pool by Coggan and Matthew
+Moon, who stood by the lower hatch, immersed to their
+waists; then Gabriel, who stood on the brink, thrust
+them under as they swam along, with an instrument
+like a crutch, formed for the purpose, and also for
+assisting the exhausted animals when the wool became
+saturated and they began to sink. They were let out
+against the stream, and through the upper opening, all
+impurities flowing away below. Cainy Ball and Joseph,
+who performed this latter operation, were if possible
+wetter than the rest ; they resembled dolphins under a
+fountain, every protuberance and angle of their clothes
+dribbling forth a small rill.
+<P 177>
+Boldwood came close and bade her good-morning, with
+such constraint that she could not but think he had
+stepped across to the washing for its own sake, hoping
+not to find her there ; more, she fancied his brow severe
+and his eye slighting. Bathsheba immediately contrived
+to withdraw, and glided along by the river till she was
+a stone's throw off. She heard footsteps brushing the
+grass, and had a consciousness that love was encircling
+her like a perfume. Instead of turning or waiting,
+Bathsheba went further among the high sedges, but
+Boldwood seemed determined, and pressed on till they
+were completely past the bend of the river. Here,
+without being seen, they could hear the splashing and
+shouts of the washers above.
+"Miss Everdene!' said the farmer.
+She trembled, turned, and said 'Good morning.'
+His tone was so utterly removed from all she had
+expected as a beginning. It was lowness and quiet
+accentuated : an emphasis of deep meanings, their form,
+at the same time, being scarcely expressed. Silence
+has sometimes a remarkable power of showing itself as
+the disembodied soul of feeling wandering without its
+carcase, and it is then more impressive than speech.
+In the same way, to say a little is often to tell more
+than to say a great deal. Boldwood told everything in
+that word.
+As the conseiousness expands on learning that what
+was fancied to be the rumble of wheels is the reverbera+
+tion of thunder, so did Bathsheba's at her intuitive
+conviction.
+'I feel -- almost too much -- to think,' he said, with a
+solemn simplicity. "I have come to speak to you with+
+out preface. My life is not my own since I have beheld
+you clearly, Miss Everdene -- I come to make you an
+offer of marriage.'
+Bathsheba tried to preserve an absolutely neutral
+countenance, and all the motion she made was that of
+closing lips which had previously been a little parted.
+"I am now forty-one years old,' he went on. "I may
+have been called a confirmed bachelor, and I was a
+confirmed bachelor. I had never any views of myself
+as a husband in my earlier days, nor have I made any
+calculation on the subject since I have been older.
+But we all change, and my change, in this matter,
+<P 178>
+came
+with seeing you. I have felt lately, more and more,
+that my present way of living is bad in every respect.
+Beyond all things, I want you as my wife.'
+"I feel, Mr. Boldwood, that though I respect you
+much, I do not feel -- what would justify me to -- in
+accepting your offer,' she stammered.
+This giving back of dignity for dignity seemed to
+open the sluices of feeling that Boldwood had as yet
+kept closed.
+" My life is a burden without you,' he exclaimed, in
+a low voice. "I want you -- I want you to let me say
+I love you again and again!'
+Bathsheba answered nothing, and the mare upon
+her arm seemed so impressed that instead of cropping
+the herbage she looked up.
+"I think and hope you care enough for me to listen
+to what I have to tell!"
+   Bathsheba's momentary impulse at hearing this was
+to ask why he thought that, till she remembered that,
+far from being a conceited assumption on Boldwood's
+part, it was but the natural conclusion of serious reflec+
+tion based on deceptive premises of her own offering.
+"I wish I could say courteous flatteries to you,' the
+farmer continued in an easier tone, " and put my rugged
+feeling into a graceful shape: but I have neither power
+nor patience to learn such things. I want you for my
+wife -- so wildly that no other feeling can abide in me;
+but I should not have spoken out had I not been led
+to hope.'
+"The valentine again! O that valentine!' she
+said to herself, but not a word to him.
+  "If you can love me say so, Miss Everdene. If not
+ -- don't say no!'
+  "Mr. Boldwood, it is painful to have to say I am
+surprised, so that I don't know how to answer you with
+propriety and respect -- but am only just able to speak
+out my feeling -- I mean my meaning; that I am afraid
+I can't marry you, much as I respect you. You are too
+dignified for me to suit you, sir.'
+  "But, Miss Everdene!'
+"I -- I didn't -- I know I ought never to have dreamt
+of sending
+<P 179>
+that valentine -- forgive me, sir -- it was a
+wanton thing which no woman with any self-respect
+should have done. If you will only pardon my thought+
+lessness, I promise never to --  -- '
+" No, no, no. Don't say thoughtlessness! Make me
+think it was something more -- that it was a sort of
+prophetic instinct -- the beginning of a feeling that you
+would like me. You torture me to say it was done in
+thoughtlessness -- I never thought of it in that light, and
+I can't endure it. Ah ! I wish I knew how to win you!
+but that I can't do -- I can only ask if I have already got
+you. If I have not, and it is not true that you have
+come unwittingly to me as I have to you, I can say no
+more.'
+  "I have not fallen in love with you, Mr. Boldwood --
+certainly I must say that.' She allowed a very small
+smile to creep for the first time over her serious face in
+saying this, and the white row of upper teeth, and keenly+
+cut lips already noticed, suggested an idea of heartless+
+ness, which was immediately contradicted by the pleasant
+eyes.
+"But you will just think -- in kindness and conde+
+scension think -- if you cannot bear with me as a husband!
+I fear I am too old for you, but believe me I will take
+more care of you than would many a man of your own
+age. I will protect and cherish you with all my strength
+ -- I will indeed! You shall have no cares -- be worried
+by no household affairs, and live quite at ease, Miss
+Everdene. The dairy superintendence shall be done by
+a man -- I can afford it will -- you shall never have so
+much as to look out of doors at haymaking time, or to
+think of weather in the harvest. I rather cling; to the
+chaise, because it is he same my poor father and mother
+drove, but if you don't like it I will sell it, and you shall
+have a pony-carriage of your own. I cannot say how
+far above every other idea and object on earth you seem
+to me -- nobody knows -- God only knows -- how much
+you are to me!'
+Bathsheba's heart was young, and it swelled with
+sympathy for the deep-natured man who spoke so
+simply.
+  "Don't say it! don't! I cannot bear you to feel so
+much, and me to feel nothing. And I am afraid they
+will notice us, Mr. Boldwood. Will you let the matter
+rest now? I cannot think
+<P 180>
+collectedly. I did not know
+you were going to say this to me. 0, I am wicked to
+have made you suffer so!' She was frightened as well
+as agitated at his vehemence.
+  "Say then, that you don't absolutely refuse. Do not
+quite refuse?'
+"I can do nothing. I cannot answer.'
+"I may speak to you again on the subject?'
+"Yes.'
+"I may think of you?'
+"Yes, I suppose you may think of me.'
+"And hope to obtain you?'
+"No -- do not hope! Let us go on.'
+"I will call upon you again to-morrow.'
+"No -- please not. Give me time.'
+"Yes -- I will give you any time,' he said earnestly and
+gratefully. "I am happier now.'
+"No -- I beg you! Don't be happier if happiness
+only comes from my agreeing. Be neutral, Mr. Bold+
+wood! I must think.'
+"I will wait,' he said.
+And then she turned away. Boldwood dropped his
+gaze to the ground, and stood long like a man who did not
+know where he was. Realities then returned upon him
+like the pain of a wound received in an excitement
+which eclipses it, and he, too, then went on.
+<C xx>
+<P 181>
+PERPLEXITy -- GRINDING THE SHEARS -- A QUARREL
+"HE is so disinterested and kind to offer me all that I
+can desire,' Bathsheba mused.
+Yet Farmer Boldwood, whether by nature kind or
+the reverse to kind, did not exercise kindness, here.
+The rarest offerings of the purest loves are but a self+
+indulgence, and no generosity at all.
+Bathsheba, not being the least in love with him, was
+eventually able to look calmly at his offer. It was one
+which many women of her own station in the neighbour+
+hood, and not a few of higher rank, would have been
+wild to accept and proud to publish. In every point of
+view, ranging from politic to passionate, it was desirable
+that she, a lonely girl, should marry, and marry this
+earnest, well-to-do, and respected man. He was close
+to her doors: his standing was sufficient: his qualities
+were even supererogatory. Had she felt, which she did
+not, any wish whatever for the married state in the
+abstract, she could not reasonably have rejected him,
+being a woman who frequently appealed to her under,
+standing for deliverance from her whims. Boldwood as
+a means to marriage was unexceptionable: she esteemed
+and liked him, yet she did not want him. It appears
+that ordinary men take wives because possession is not
+possible without marriage, and that ordinary women
+accept husbands because marriage is not possible with,
+out possession; with totally differing aims the method is
+the same on both sides. But the understood incentive
+on the woman's part was wanting here. Besides, Bath+
+sheba's position as absolute mistress of a farm and house
+was a novel one, and the novelty had not yet begun to
+wear off.
+But a disquiet filled her which was somewhat to her
+credit, for it would have affected few. Beyond the men+
+tioned reasons with which she combated her objections,
+she had a strong
+<P 182>
+feeling that, having been the one who
+began the game, she ought in honesty to accept the conse,
+quences. Still the reluctance remained. She said in the
+same breath that it would be ungenerous not to marry
+Boldwood, and that she couldn't do it to save her life.
+Bathsheba's was an impulsive nature under a delibera,
+tive aspect.  An Elizabeth in brain and a Mary Stuart
+in spirit, she often performed actions of the greatest
+temerity with a manner of extreme discretion. Many of
+her thoughts were perfect syllogisms; unluckily they
+always remained thoughts. Only a few were irrational
+assumptions; but, unfortunately, they were the ones
+which most frequently grew into deeds.
+  The next day to that of the declaration she found
+Gabriel Oak at the bottom of her garden, grinding his
+shears for the sheep-shearing. All the surrounding
+cottages were more or less scenes of the same operation;
+the scurr of whetting spread into the sky from all parts
+of the village as from an armury previous to a campaign.
+Peace and war kiss each other at their hours of prepara+
+tion -- sickles, scythes, shears, and pruning-hooks, ranking
+with swords, bayonets, and lances, in their common
+necessity for point and edge.
+Cainy Ball turned the handle of Gabriel's grinstone,
+his head performing a melancoly see-saw up and down
+with each turn of the wheel. Oak stood somewhat as
+Eros is represented when in the act of sharpening his
+arrows: his figure slightly bent, the weight of his body
+thrown over on the shears, and his head balanced side+
+ways, with a critical compression of the lips and contrac+
+tion of the eyelids to crown the attitude.
+His mistress came up and looked upon them in
+silence for a minute or two; then she said --
+"Cain, go to the lower mead and catch the bay mare.
+I'll turn the winch of the grindstone. I want to speak
+to you, Gabriel.
+Cain departed, and Bathsheba took the handle.
+Gabriel had glanced up in intense surprise, quelled its
+expression, and looked down again. Bathsheba turned
+the winch, and Gabriel applied the shears.
+The peculiar motion involved in turning a wheel
+has a wonderful tendency to benumb the mind. It
+is a sort of
+<P 183>
+attenuated variety of Ixion's punishment,
+and contributes a dismal chapter to the history of
+heavy, and the body's centre of gravity seems to
+settle by degrees in a leaden lump somewhere be+
+tween the eyebrows and the crown. Bathsheba felt
+the unpleasant symptoms after two or three dozen
+turns.
+  "Will you turn, Gabriel, and let me hold the shears?"
+she said. "My head is in a'whirl, and I can't talk.
+Gabriel turned. Bathsheba then began, with some
+awkwardness, allowing her thoughts to stray occasion+
+ally from her story to attend to the shears, which
+required a little nicety in sharpening.
+  "I wanted to ask you if the men made any observa+
+tions on my going behind the sedge with Mr. Boldwood
+yesterday?'
+  "Yes, they did,' said Gabriel. "You don't hold
+the shears right, miss -- I knew you wouldn't know the
+way -- hold like this.'
+He relinquished the winch, and inclosing her two
+hands completely i his own (taking each as we some+
+times slasp a child's hand in teaching him to write),
+grasped the shears with her. "Incline the edge so,'
+he said.
+  Hands and shears were inclined to suit the words,
+and held thus for a peculiarly long time by the in+
+structor as he spoke.
+  "That will do,' exclaimed Bathsheba. "Loose my
+hands. I won't have them held! Turn the winch.'
+Gabriel freed her hands quietly, retired to his
+handle, and the grinding went on.
+  "Did the men think it odd?' she said again.
+"Odd was not the idea, miss.'
+"What did they say?'
+"That Farmer Boldwood's name and your own
+were likely to be flung over pulpit together before the
+year was out.'
+"I thought so by the look of them! Why, there's
+nothing in it. A more foolish remark was never made,
+and I want you to contradict it! that's what I came for.'
+  Gabriel looked incredulous and sad, but between
+his moments of incredulity, relieved.
+"They must have heard our conversation,' she
+continued.
+<P 184>
+"Well, then, Bathsheba!' said Oak, stopping the
+handle, and gazing into her face with astonishment.
+  "Miss Everdene, you mean," she said, with dignity.
+  "I mean this, that if Mr. Boldwood really spoke of
+marriage, I bain't going to tell a story and say he
+didn't to please you. I have already tried to please
+you too much for my own good!'
+Hathsheba regarded him with round-eyed perplexity.
+She did not know whether to pity him for disappointed
+love of her, or to be angry with him for having got
+over it -- his tone being ambiguous.
+  "I said I wanted you just to mention that it was
+not true I was going to be married to him,' she mur+
+mured, with a slight decline in her assurance.
+"I can say that to them if you wish, Miss Everdene.
+And I could likewise give an opinion to 'ee on what
+you have done.'
+"I daresay. But I don't want your opinion.'
+"I suppose not,' said Gabriel bitterly, and going on
+with his turning, his words rising and falling in a
+regular swell and cadence as he stooped or rose with
+the winch, which directed them, according to his
+position, perpendiculary into the earth, or horizontally
+along the garden, his eyes being fixed on a leaf upon
+the ground.
+  With Bathsheba a hastened act was a rash act;
+but, as does not always happen, time gained was
+prudence insured. It must be added, however, that
+time was very seldom gained. At this period the
+single opinion in the parish on herself and her doings
+that she valued as sounder than her own was Gabriel
+Oak's. And the outspoken honesty of his character
+was such- that on any subject even that of her love
+for, or marriage with, another man, the same disinter+
+estedness of opinion might be calculated on, and be
+had for the asking. Thoroughly convinced of the
+impossibility of his own suit, a high resolve constrained
+him not to injure that of another. This is a lover's
+most stoical virtue, as the lack of it is a lover's most
+venial sin. Hnowing he would reply truly, she asked
+the question, painful as she must have known the sub+
+ject would be. Such is the selfishness of some charm+
+ing women. Perhaps it was some excuse for her thus
+torturing honesty to her own advantage, that she had
+<P 185>
+absolutely no other sound judgment within easy reach.
+"Well, what is your opinion of my conduct,' she
+said, quietly.
+"That it is unworthy of any thoughtful, and meek,
+and comely woman.'
+In an instant Bathsheba's face coloured with the
+angry crimson of a danby sunset. But she forbore
+to utter this feeling, and the reticence of her tongue
+only made the loquacity of her face the more notice+
+able.
+The next thing Gabriel did was to make a mistake.
+"Perhaps you don't like the rudeness of my repri+
+manding you, for I know it is rudeness; but I thought
+it would do good.'
+She instantly replied sarcastically --
+"On the contrary, my opinion of you is so low, that
+I see in your abuse the praise of discerning people!'
+"I am glad you don't mind it, for I said it honestly
+and with every serious meaning.'
+  "I see. But, unfortunately, when you try not to
+speak in jest you are amusing -- just as when you wish
+to avoid seriousness you sometimes say a sensible word
+It was a hard hit, but Bathsheba had unmistakably
+lost her temper, and on that account Gabriel had
+never in his life kept his own better. He said nothing.
+She then broke out --
+  "I may ask, I suppose, where in particular my
+unworthiness lies? In my not marrying you, perhaps!
+"Not by any means,' said Gabriel quietly. "I have
+long given up thinking of that matter.'
+"Or wishing it, I suppose,' she said; and it was
+apparent that she expected an unhesitating denial of
+this supposition.
+Whatever Gabriel felt, he coolly echoed her words --
+"Or wishing it either.'
+  A woman may be treated with a bitterness which
+is sweet to her, and with a rudeness which is not
+offensive. Bathsheba would have submitted to an
+indignant chastisement for her levity had Gabriel pro+
+tested that he was loving her at the same time; the
+impetuosity of passion unrequited is bearable, even if
+it stings and anathematizes there is a triumph in the
+humiliation, and a tenderness in the strife. This was
+what she had been expecting, and what she had not
+got. To be lectured
+<P 186>
+because the lecturer saw her in
+the cold morning light of open-shuttered disillusion
+was exasperating. He had not finished, either. He
+continued in a more agitated voice: --
+"My opinion is (since you ask it) that you are
+greatly to blame for playing pranks upon a man like
+Mr. Boldwood, merely as a pastime. Leading on a
+man you don't care for is not a praiseworthy action.
+And even, Miss Everdene, if you seriously inclined
+towards him, you might have let him find it out in
+some way of true loving-kindness, and not by sending
+him a valentine's letter.'
+Bathsheba laid down the shears.
+ "I cannot allow any man to -- to criticise my private
+Conduct!' she exclaimed. "Nor will I for a minute.
+So you'll please leave the farm at the end of the week!'
+It may have been a peculiarity -- at any rate it was
+a fact -- that when Bathsheba was swayed by an emotion
+of an earthly sort her lower lip trembled: when by a
+refined emotion, her upper or heavenward one. Her
+nether lip quivered now.
+"Very well, so I will,' said Gabriel calmly. He had
+been held to her by a beautiful thread which it pained
+him to spoil by breaking, rather than by a chain he
+could not break. "I should be even better pleased to
+go at once,' he added.
+"Go at once then, in Heaven's name!' said she,her
+eyes flashing at his, though never meeting them.
+"Don't let me see your face any more.'
+"Very well, Miss Everdene -- so it shall be.'
+And he took his shears and went away from her in
+placid dignity, as Moses left the presence of Pharaoh.
+<C xxi>
+<P 187>
+TROUBLES IN THE FOLD -- A MESSAGE
+GABRIEL OAK had ceased to feed the Weatherbury
+flock for about four-and-twenty hours, when on Sunday
+afternoon the elderly gentlemen Joseph Poorgrass,
+Matthew Moon, Fray, and half-a-dozen others, came
+running up to the house of the mistress of the Upper
+Farm.
+ "Whatever is the matter, men?' she said, meeting
+them at the door just as she was coming out on her
+way to church, and ceasing in a moment from the close
+compression of her two red lips, with which she had
+accompanied the exertion of pelling on a tight glove.
+"Sixty!' said Joseph Poorgrass.
+"Seventy!' said Moon.
+"Fifty-nine!' said Susan Tall's husband.
+" -- Sheep have broke fence,' said Fray.
+" -- And got into a field of young clover,' said Tall.
+" -- Young clover!' said Moon.
+" -- Clover!' said Joseph Poorgrass.
+"And they be getting blasted,' said Henery Fray.
+"That they be,' said Joseph.
+"And will all die as dead as nits, if they bain't got
+out and cured!'said Tall.
+Joseph's countenance was drawn into lines and
+puckers by his concern. Fray's forehead was wrinkled
+both perpendicularly and crosswise, after the pattern of
+a portcullis, expressive of a double despair. Laban
+Tall's lips were thin, and his face were rigid. Matthew's
+jaws sank, and his eyes turned whichever way the
+strongest muscle happened to pull them.
+  "Yes,' said Joseph, "and I was sitting at home,
+looking for Ephesians, and says I to myself, "'Tis
+nothing but Corinthians and Thessalonians in this
+danged Testament,'' when
+<P 188>
+who should come in but
+Henery there: ""Joseph,'' he said, ""the sheep have
+With Bathsheba it was a moment when thought was
+blasted theirselves -- -'''
+  With Bathsheba it was a moment when thought was
+speech and speech exclamation. Moreover, she had
+hardly recovered her equanimity since the disturbance
+which she had suffered from Oak's remarks.
+'Thats enought -- that's enough! -- oh, you fools!'
+she cried, throwing the parasol and Prayer-book into
+the passage, and running out of doors in the direction
+signified. "To come to me, and not go and get them
+out directly! Oh, the stupid numskulls!'
+Her eyes were at their darkest and brightest now.
+Bathsheba's beauty belonged rather to the demonian
+than to the angelic school, she never looked so well as
+when she was angry -- and particularly when the effect
+was heightened by a rather dashing velvet dress, care+
+fully put on before a glass.
+All the ancient men ran in a jumbled throng after
+her to the clover-field, Joseph sinking down in the
+midst when about half-way, like an individual withering
+in a world which was more and more insupportable.
+Having once received the stimulus that her presence
+always gave them they went round among the sheep
+with a will. The majority of the afflicted animals were
+lying down, and could not be stirred. These were
+bodily lifted out, and the others driven into the adjoining
+field. Here, after the lapse of a few minutes, several
+more fell down, and lay helpless and livid as the rest.
+Bathsheba, with a sad, bursting heart, looked at these
+primest specimens of her prime flock as they rolled
+there --
+Swoln with wind and the rank mist they drew.
+Many of them foamed at the mouth, their breathing
+being quick and short, whilst the bodies of all were
+fearfully distended.
+"O, what can I do, what can I do!' said Bathsheba,
+helplessly. "Sheep are such unfortunate animals! --
+there's always something happening to them! I never
+knew a flock pass a year without getting into some scrape
+or other.'
+"There's only one way of saving them,' said Tall.
+<P 189>
+"What way? Tell me quick!'
+"They must be pierced in the side with a thing made
+on purpose.'
+"Can you do it? Can I?'
+"No, ma'am. We can't, nor you neither. It must
+be done in a particular spot. If ye go to the right or
+left but an inch you stab the ewe and kill her. Not
+even a shepherd can do it, as a rule.'
+"Then they must die,' she said, in a resigned tone.
+"Only one man in the neighbourhood knows the way,'
+said Joseph, now just come up. "He could cure 'em
+all if he were here.'
+"Who is he? Let's get him!'
+"Shepherd Oak," said Matthew. "Ah, he's a clever
+man in talents!'
+"Ah, that he is so!' said Joseph Poorgrass.
+"True -- he's the man,' said Laban Tall.
+"How dare you name that man in my presence!' she
+said excitedly. "I told you never to allude to him, nor
+shall you if you stay with me. Ah!' she added, brighten+
+ing, "Farmer Boldwood knows!'
+  "0 no, ma'am' said Matthew. "Two of his store
+ewes got into some vetches t'other day, and were just
+like these. He sent a man on horseback here post-haste
+for Gable, and Gable went and saved 'em, Farmer
+Boldwood hev got the thing they do it with. 'Tis a
+holler pipe, with a sharp pricker inside. Isn't it,
+Joseph?'
+  "Ay -- a holler pipe,' echoed Joseph. "That's what
+'tis.'
+"Ay, sure -- that's the machine,' chimed in Henery
+Fray, reflectively, with an Oriental indifference to the
+flight of time.
+"Well," burst out Bathsheba, "don't stand there with
+your ""ayes'' and your ""sures,'' talking at me! Get
+somebody to cure the sheep instantly!'
+  All then stalked or in eonsternation, to get some+
+body as directed, without any idea of who it was to be.
+In a minute they had vanished through the gate,.and
+she stood alone with the dying flock.
+"Never will I send for him never!' she said firmly.
+<P 190>
+One of the ewes here contracted its muscles horribly,
+extended itself, and jumped high into the air. The
+leap was an astonishing one. The ewe fell heavily, and
+lay still.
+Bathsheba went up to it. The sheep was dead.
+"O, what shall I do -- what shall I do!' she again
+exclaimed, wringing her hands. "I won't send for him.
+No, I won't!'
+The most vigorous expression of a resolution does
+not always coinicide with the greatest vigour of the
+resolution itself. It is often flung out as a sort of prop
+to support a decaying conviction which, whilst strong,
+required no enunciation to prove it so. The "No, I
+won't' of Bathsheba meant virtually, "I think I must.'
+She followed her assistants through the gate, and
+lifted her hand to one of them. Laban answered to her
+signal.
+"Where is Oak staying?'
+"Across the valley at Nest Cottage!'
+"Jump on the bay mare, and ride across, and say he
+must return instantly -- that I say so.'
+Tall scrambled off to the field, and in two minutes
+was on Poll, the bay, bare-backed, and with only a
+halter by way of rein. He diminished down the
+hill.
+Bathsheba watched. So did all the rest. Tall
+cantered along the bridle-path through Sixteen Acres,
+Sheeplands, Middle Field The Flats, Cappel's Piece,
+shrank almost to a point, crossed the bridge, and
+ascended from the valley through Springmead and
+Whitepits on the other side. The cottage to which
+Gabriel had retired before taking his final departure
+from the locality was visible as a white spot on the
+opposite hill, backed by blue firs. Bathsheba walked
+up and down. The men entered the field and
+endeavoured to ease the anguish of the dumb creatures
+by rubbing them. Nothing availed.
+Bathsheba continued walking. The horse was seen
+descending the hill, and the wearisome series had to be
+repeated in reverse order: Whitepits, Springmead,
+Cappel's Piece, The Flats, Middle Field, Sheeplands,
+Sixteen Acres. She hoped Tall had had presence of
+mind enough to give the mare up to Gabriel, and return
+himself on foot. The rider neared them. It was Tall.
+<P 191>
+"O, what folly!' said Bathsheba.
+Gabriel was not visible anywhere.
+"Perhaps he is already gone!' she said.
+Tall came into the inclosure, and leapt off, his face
+tragic as Morton's after the battle of Shrewsbury.
+"Well?' said Bathsheba, unwilling to believe that
+her verbal lettre-de-cachet could possibly have miscarried.
+"He says beggars mustn't be choosers,' replied Laban.
+"What!' said the young farmer, opening her eyes
+and drawing in her breath for an outburst. Joseph
+Poorgrass retired a few steps behind a hurdle.
+"He says he shall not come onless you request en
+to come civilly and in a proper manner, as becomes any
+'ooman begging a favour.'
+"Oh, oh, that's his answer! Where does he get his
+airs? Who am I, then, to be treated like that? Shall
+I beg to a man who has begged to me?'
+Another of the flock sprang into the air, and fell
+dead.
+The men looked grave, as if they suppressed opinion.
+Bathsheba turned aside, her eyes full of tears. The
+strait she was in through pride and shrewishness could
+not be disguised longer: she burst out crying bitterly;
+they all saw it; and she attempted no further concealment.
+"I wouldn't cry about it, miss,' said William Small+
+bury, compassionately. "Why not ask him softer like?
+I'm sure he'd come then. Gable is a true man in that
+way.'
+Bathsheba checked her grief and wiped her eyes.
+"O, it is a wicked cruelty to me -- it is -- it is!' she
+murmured. "And he drives me to do what I wouldn't;
+yes, he does ! -- Tall, come indoors.'
+After this collapse, not very dignified for the head
+of an establishment, she went into the house, Tall at
+her heels. Here she sat down and hastily scribbled a
+note between the small convulsive sobs of convalescence
+which follow a fit of crying as a ground-swell follows a
+storm. The note was none the less polite for being
+written in a hurry. She held it at a distance, was
+about to fold it, then added these words at the
+bottom: --
+"Do not desert me, Gabriel!'
+<P 193>
+She looked a little redder in refolding it, and closed
+her lips, as if thereby to suspend till too late the action
+of conscience in examining whether such strategy were
+justifiable. The note was despatched as the message
+had been, and Bathsheba waited indoors for the result.
+It was an anxious quarter of an hour that intervened
+between the messenger's departure and the sound of the
+horse's tramp again outside. She- could not watch this
+time, but, leaning over the old bureau at which she had
+written the letter, closed her eyes, as if to keep out both
+hope and fear.
+  The case, however, was a promising one. Gabriel
+was not angry: he was simply neutral, although her first
+command had been so haughty. Such imperiousness
+would have damned a little less beauty; and on the
+other hand, such beauty would have redeemed a little
+less imperiousness.
+She went out when the horse was heard, and looked
+up. A mounted figure passed between her and the
+sky, and drew on towards the fleld of sheep, the rider
+turning his face in receding. Gabriel looked at her.
+It was a moment when a woman's eyes and tongue tell
+distinctly opposite tales. Bathsheba looked full of
+gratitude, and she said: --
+  "O, Gabriel, how could you serve me so unkindly!'
+Such a tenderly-shaped reproach for his previous
+delay was the one speech in the language that he could
+pardon for not being commendation of his readiness
+now.
+Gabriel murmured a confused reply, and hastened
+on. She knew from the look which sentence in her
+note had brought him. Bathsheba followed to the
+field.
+Gabriel was already among the turgid, prostrate forms.
+He had flung off his coat, rolled up his shirt-sleeves,
+and taken from his pocket the instrument of salvation.
+It was a small tube or trochar, with a lance passing
+down the inside; and Gabriel began to use it with a
+dexterity that would have graced a hospital surgeon.
+Passing his hand over the sheep's left flank, and
+selecting the proper point, he punctured the skin and
+rumen with the lance as it stood in the tube; then he
+suddenly withdrew the lance, retaining the tube in its
+place. A current of air rushed up the tube, forcible
+enough to have extinguished a candle held at the
+orifice.
+It has been said that mere ease after torment is de+
+light for a time; and the countenances of these poor
+creatures expressed it now. Forty-nine operations were
+successfully performed. Owing to the great hurry
+necessitated by the far-gone state of some of the flock,
+Gabriel missed his aim in one case, and in one only --
+striking wide of the mark, and inflicting a mortal blow
+at once upon the suffering ewe. Four had died; three
+recovered without an operation. The total number of
+sheep which had thus strayed and injured themselves
+so dangerously was fifty-seven.
+When the love-led man had ceased from his labours,
+Bathsheba came and looked him in the face.
+"Gabriel, will you stay on with me?' she, said,
+smiling winningly, and not troubling to bring her lips
+quite together again at the end, because there was going
+to be another smile soon.
+"I will,' said Gabriel.
+And she smiled on him again.
+<C xxii>
+<P 194>
+THE GREAT BARN AnD THE SHEEP-SHEARERS
+MEN thin away to insignificance and oblivion quite as
+often by not making the most of good spirits when they
+have them as by lacking good spirits when they are
+indispensable. Gabriel lately, for the first time since
+his prostration by misfortune, had been independent in
+thought and vigorous in action to a marked extent --
+conditions which, powerless without an opportunity as
+an opportunity without them is barren, would have
+given him a sure lift upwards when the favourable-con+
+junction should have occurred. But this incurable
+loitering beside Bathsheba Everdene stole his time
+ruinously. The spring tides were going by without
+floating him off, and the neap might soon come which
+could not.
+It was the first day of June, and the sheep-shearing
+season culminated, the landscape, even to the leanest
+pasture, being all health and colour. Every green was
+young, every pore was open, and every stalk was swollen
+with racing currents of juice. God was palpably present
+in the country, and the devil had gone with the world
+to town. Flossy catkins of the later kinds, fern-sprouts
+like bishops' croziers, the square-headed moschatel, the
+odd cuckoo-pint, -- like an apoplectic saint in a niche
+of malachite, -- snow-white ladies'-smocks, the toothwort,
+approximating to human flesh, the enchanter's night+
+shade, and the black-petaled doleful-bells, were among
+the quainter objects of the vegetable world in and about
+Weatherbury at this teeming time; and of the animal,
+the metamorphosed figures of Mr. Jan Coggan, the
+master-shearer; the second and third shearers, who
+travelled in the exercise of their calling, and do not re+
+quire definition by name; Henery Fray the fourth
+shearer, Susan Tall's husband the fifth, Joseph Poorgrass
+the sixth, young Cain Ball as assistant-shearer, and
+Gabriel Oak as general supervisor. None of these were
+clothed
+<P 195>
+to any extent worth mentioning, each appearing
+to have hit in the matter of raiment the decent mean
+between a high and low caste Hindoo. An angularity
+of lineament, and a fixity of facial machinery in general,
+proclaimed that serious work was the order of the day.
+They sheared in the great barn, called for the nonce
+the Shearing-barn, which on ground-plan resembled a
+church with transepts. It not only emulated the form
+of the neighbouring church of the parish, but vied with
+it in antiquity. Whether the barn had ever formed one
+of a group of conventual buildings nobody seemed to be
+aware; no trace of such surroundings remained. The
+vast porches at the sides, lofty enough to admit a waggon
+laden to its highest with corn in the sheaf, were spanned
+by heavy-pointed arches of stone, broadly and boldly cut,
+whose very simplicity was the origin of a grandeur not
+apparent in erections where more ornament has been
+attempted. The dusky, filmed, chestnut roof, braced
+and tied in by huge collars, curves, and diagonals, was
+far nobler in design, because more wealthy in material,
+than nine-tenths of those in our modern churches.
+Along each side wall was a range of striding buttresses,
+throwing deep shadows on the spaces between them,
+which were perforated by lancet openings, combining
+in their proportions the precise requirements both of
+beauty and ventilation.
+One could say about this barn, what could hardly
+be said of either the church or the castle, akin to it in
+age and style, that the purpose which had dictated its
+original erection was the same with that to which it
+was still applied. Unlike and superior to either of
+those two typical remnants of mediaevalism, the old
+barn embodied practices which had suffered no mutila+
+tion at the hands of time. Here at least the spirit of
+the ancient builders was at one with the spirit of the
+modern beholder. Standing before this abraded pile,
+the eye regarded its present usage, the mind-dwelt upon
+its past history, with a satisfied sense of functional
+continuity throughout -- a feeling almost of gratitude,
+and quite of pride, at the permanence of the idea
+which had heaped it up. The fact that four centuries
+had neither proved it to be founded on a mistake,
+<P 196>
+inspired any hatred of its purpose, nor given rise to
+any reaction that had battered it down, invested this
+simple grey effort of old minds with a repose, if not a
+grandeur, which a too curious reflection was apt to
+disturb in its ecclesiastical and military compeers. For
+once medievalism and modernism had a common stand+
+point. The lanccolate windows, the time-eaten arch+
+stones and chamfers, the orientation of the axis, the
+misty chestnut work of the rafters, referred to no exploded
+fortifying art or worn-out religious creed. The defence
+and salvation of the body by daily bread is still a study,
+a religion, and a desire.
+To-day the large side doors were thrown open
+towards the sun to admit a bountiful light to the
+immediate spot of the shearers' operations, which was
+the wood threshing-floor in the centre, formed of thick
+oak, black with age and polished by the beating of flails
+for many generations, till it had grown as slippery and
+as rich in hue as the state-room floors of an Elizabethan
+mansion. Here the shearers knelt, the sun slanting in
+upon their bleached shirts, tanned arms, and the polished
+shears they flourished, causing these to bristle with a
+thousand rays strong enough to blind a weak-eyed man.
+Beneath them a captive sheep lay panting, quickening
+its pants as misgiving merged in terror, till it quivered
+like the hot landscape outside.
+This picture of to-day in its frame of four hundred
+years ago did not produce that marked contrast between
+ancient and modern which is implied by the contrast
+of date. In comparison with cities, Weatherbury was
+immutable. The citizen's Then is the rustic's Now.
+In London, twenty or thirty-years ago are old times;
+in Paris ten years, or five; in Weatherbury three or
+four score years were included in the mere present,
+and nothing less than a century set a mark on its
+face or tone. Five decades hardly modified the cut of
+a gaiter, the embroidery of a smock-frock, by the breadth
+of a hair. Ten generations failed to alter the turn of
+a single phrase. In these Wessex nooks the busy out+
+sider's ancient times are only old; his old times are still
+new; his present is futurity.
+So the barn was natural to the shearers, and the
+shearers were in harmony with the barn.
+The spacious ends of the building, answering ecclesi+
+astically
+<P 197>
+to nave and chancel extremities, were fenced
+off with hurdles, the sheep being all collected in a crowd
+within these two enclosures; and in one angle a catching+
+pen was formed, in which three or four sheep were
+continuously kept ready for the shearers to seize without
+loss of time. In the background, mellowed by tawny
+shade, were the three women, Maryann Money, and
+Temperance and Soberness Miller, gathering up the
+fleeces and twisting ropes of wool with a wimble for
+tying them round. They were indifferently well assisted
+by the old maltster, who, when the malting season from
+October to April had passed, made himself useful upon
+any of the bordering farmsteads.
+"Behind all was Bathsheba, carefully watching the
+men to see that there was no cutting or wounding
+through carelessness, and that the animals were shorn
+close. Gabriel, who flitted and hovered under her
+bright eyes like a moth, did not shear continuously,
+half his time being spent in attending to the others
+and selecting the sheep for them. At the present
+moment he was engaged in handing round a mug of
+mild liquor, supplied from a barrel in the corner,
+and cut pieces of bread and cheese.
+Bathsheba, after throwing a glance here, a caution
+there, and lecturing one of the younger operators who
+had allowed his last finished sheep to go off among
+the flock without re-stamping it with her initials, came
+again to Gabriel, as he put down the luncheon to drag
+a frightened ewe to his shear-station, flinging it over
+upon its back with a dexterous twist of the arm
+He lopped off the tresses about its head, and opened
+up the neck and collar, his mistress quietly looking
+on:
+"She blushes at the insult,' murmured Bathsheba,
+watching the pink flush which arose and overspread
+the neck and shoulders of the ewe where they were
+left bare by the clicking shears -- a flush which was
+enviable, for its delicacy, by many queens of coteries,
+and would have been creditable, for its promptness, to
+any woman in the world.
+Poor Gabriel's soul was fed with a luxury of content
+by having her over him, her eyes critically regarding
+his skilful shears, which apparently were going to gather
+up a piece of the flesh at every close, and yet never did
+so. Like Guildenstern,
+<P 198>
+Oak was happy in that he was
+not over happy. He had no wish to converse with her:
+that his bright lady and himself formed one group,
+exclusively their own, and containing no others in the
+world, was enough.
+So the chatter was all on her side. There is a
+loquacity that tells nothing, which was Bathsheba's;
+and there is a silence which says much: that was
+Gabriel's. Full of this dim and temperate bliss, he
+went on to fling the ewe over upon her other side,
+covering her head with his knee, gradually running
+the shears line after line round her dewlap; thence
+about her flank and back, and finishing over the tail.
+"Well done, and done quickly!' said Bathsheba,
+looking at her watch as the last snip resounded.
+"How long, miss?' said Gabriel, wiping his brow.
+"Three-and-twenty minutes and a half since you took
+the first lock from its forehead. It is the first time that
+I have ever seen one done in less than half an hour.'
+The clean, sleek creature arose from its fleece -- how
+perfectly like Aphrodite rising from the foam should
+have been seen to be realized -- looking startled and
+shy at the loss of its garment, which lay on the floor
+in one soft cloud, united throughout, the portion visible
+being the inner surface only, which, never before exposed,
+was white as snow, and without flaw or blemish of the
+minutest kind.
+"Cain Ball!'
+"Yes, Mister Oak; here I be!'
+Cainy now runs forward with the tar-pot. "B. E.' is
+newly stamped upon the shorn skin, and away the simplc
+dam lcaps, panting, over the board into the shirtless
+flock outside. Then up comes Maryann; throws the
+loose locks into the middle of the fleece, rolls it up,
+and carries it into the background as three-and-a-half
+pounds of unadulterated warmth for the winter enjoy+
+ment of persons unknown and far away, who will,
+however, never experience the superlative comfort
+derivable from the wool as it here exists, new and pure
+ -- before the unctuousness of its nature whilst in a
+living state has dried, stiffened, and been washed out
+ -- rendering it just now as superior to anything woollen
+as cream is superior to milk-and-water.
+<P 199>
+But heartless circumstance could not leave entire
+Gabriel's happiness of this morning. The rams, old
+ewes, and two-shear ewes had duly undergone their
+stripping, and the men were proceeding with the shear+
+lings and hogs, when Oak's belief that she was going to
+stand pleasantly by and time him through another
+performance was painfully interrupted by Farmer Bold+
+wood's appearance in the extremest corner of the barn.
+Nobody seemed to have perceived his entry, but there
+he certainly was. Boldwood always carried with him a
+social atmosphere of his own, which everybody felt who
+came near him; and the talk, which Bathsheba's
+presence had somewhat suppressed, was now totally
+suspended.
+  He crossed over rowards Bathsheba, who turned to
+greet him with a carriage of perfect ease. He spoke to
+her in low tones, and she instinctively modulated her
+own to the same pitch, and her voice ultimately even
+caught the inflection of his. She was far from having
+a wish to appear mysteriously connected with him; but
+woman at the impressionable age gravitates to the larger
+body not only in her choice of words, which is apparent
+every day, but even in her shades of tone and humour,
+when the influence is great.
+  What they conversed about was not audible to
+Gabriel, who was too independent to get near, though
+too concerned to disregard. The issue of their dialogue
+was the taking of her hand by the courteous farmer to
+help her over the spreading-board into the bright June
+sunlight outside. Standing beside the sheep already
+shorn, they went on talking again. Concerning the
+flock? Apparently not. Gabriel theorized, not without
+truth, that in quiet discussion of any matter within reach
+of the speakers' eyes, these are usually fixed upon it.
+Bathsheba demurely regarded a contemptible straw lying
+upon the ground, in a way which suggested less ovine
+criticism than womanly embarrassment. She became
+more or less red in the cheek, the blood wavering in
+uncertain flux and reflux over the sensitive space between
+ebb and flood. Gabriel sheared on, constrained and
+sad.
+She left Boldwood's side, and he walked up and
+down alone for nearly a quarter of an hour. Then she
+reappeared in her
+<P 200>
+new riding-habit of myrtle-green, which
+fitted her to the waist as a rind fits its fruit; and young
+Bob Coggan led -on -her mare, Boldwood fetching his
+own horse from the tree under which it had been tied.
+  Oak's eyes could not forsake them; and in en+
+deavouring to continue his shearing at the same time
+that he watched Boldwood's manner, he snipped the
+sheep in the groin. The animal plunged; Bathsheba
+instantly gazed towards it, and saw the blood.
+"O, Gabriel!' she exclaimed, with severe remon+
+strance you who are so strict with the other men -- see
+what you are doing yourself!'
+To an outsider there was not much to complain of
+in this remark ; but to Oak, who "knew Bathsheba to be
+well aware that she herself was the cause of the poor
+ewe's wound, because she had wounded the ewe's shearer
+in a -- still more vital part, it had a sting which the abiding
+sense of his inferiority to both herself and Boldwood was
+not calculated to heal. But a manly resolve to recognize
+boldly that he had no longer a lover's interest in her,
+helped him oceasionally to conceal a feeling.
+" Bottle .! ' he shouted, in an unmoved voice of routine.
+Cainy Ball ran up, the wound was anointed, and the
+shearing continued.
+Boldwood gently tossed Bathsheba into the saddle,
+and before they turned away she again spoke out to Oak
+with the same dominative and tantalizing graciousness.
+"I am going now to see Mr. Boldwood's Leicesters.
+Take my place in the barn, Gabriel, and keep the men
+carefully to their work.'
+The horses' heads were put about, and they trotted
+away.
+Boldwood's deep attachment was a matter of great
+interest among all around him ; but, after having been
+pointed out for so many years as the perfect exemplar
+of thriving bachelorship, his lapse was an anticlimax
+somewhat resembling that of St. John Long's death by
+consumption in the midst of his proofs that it was not
+a fatal disease.
+<P 201>
+" That means matrimony,' said Temperance Miller,
+following them out of sight with her eyes.
+"I reckon that's the size o't,' said Coggan, working
+along without looking up.
+" Well, better wed over the mixen than over the moor,'
+said Laban Tall, turning his sheep.
+Henery Fray spoke, exhibiting miserable eyes at the
+same time: "I don't see why a maid should take a
+husband when she's bold enough to fight her own
+battles, and don't want a home ; for 'tis keeping another
+woman out. But let it be, for 'tis a pity he and she
+should trouble two houses.'
+As usual with decided characters, Bathsheba invari+
+ably provoked the criticism of individuals like Henery
+Fray. Her emblazoned fault was to be too pronounced
+in her objections, and not sufficiently overt in her
+likings. We learn that it is not the rays which bodies
+absorb, but those which they reject, that give them the
+colours they are known by ; and win the same way people
+are specialized by their dislikes and antagonisms, whilst
+their goodwill is looked upon as no attribute at all.
+Henery continued in a more complaisant mood : "I
+once hinted my mind to her on a few things, as nearly
+as a battered frame dared to do 'so to such a froward
+piece. You all know, neighbours, what a man I be,
+and how I come down with my powerful words when
+my pride is boiling wi' scarn ?'
+" We do, we do, Henery.'
+" So I said, "" Mistress Everdene, there's places empty,
+and there's gifted men willing ; but the spite '' -- no. not
+the spite -- I didn't say spite -- ""but the villainy of the
+contrarikind,'' I said (meaning womankind), "" keeps 'em
+out.'' That wasn't too strong for her, say ? '
+" Passably well put.'
+"Yes; and I would have said it, had death and
+salvation overtook me for it. Such is my spirit when I
+have a mind.'
+"A true man, and proud as a lucifer.'
+"You see the artfulness ? Why, 'twas about being
+baily really; but I didn't put it so plain that she could
+understand my meaning, so I could lay it on all the
+<P 202>
+stronger. That was my depth .! ... However, let her
+marry an she will. Perhaps 'tis high time. I believe
+Farmer Boldwood kissed her behind the spear-bed at the
+sheep-washing t'other day -- that I do.'
+" What a lie !.' said Gabriel.
+" Ah, neighbour Oak -- how'st know ? ' said, Henery,
+mildly.
+" Because she told me all that passed,' said Oak, with
+a pharisaical sense that he was not as other shearers in
+this matter.
+"Ye have a right to believe it,' said Henery, with
+dudgeon; "a very true right. But I mid see a little
+distance into things !. To be long-headed enough for a
+baily's place is a poor mere trifle -- yet a trifle more than
+nothing. However, I look round upon life quite cool.
+Do you heed me, neighbours ? My words, though made
+as simple as I can, mid be rather deep for some heads.'
+" O yes, Henery, we quite heed ye.'
+" A strange old piece, goodmen -- whirled about from
+here to yonder, as if I were nothing ! A little warped,
+too. But I have my depths; ha, and even my great
+depths ! I might gird at a certain shepherd, brain to
+brain. But no -- O no !.'
+" A strange old piece, ye say .! ' interposed the maltster,
+in a querulous voice. "At the same time ye be no old
+man worth naming -- no old man at all. Yer teeth
+bain't  half  gone  yet ; and what's a old  man's standing
+if se be his teeth bain't gone? Weren't I stale in
+wedlock afore ye were out  of arms ? 'Tis a poor thing
+to be sixty, when there's people far past four-score -- a
+boast'weak as water.'
+It was the unvaying custom in Weatherbury to
+sink minor differences when the maltster had to be
+pacified.
+" Weak as-water .! yes,' said Jan Coggan.- "Malter,
+we feel ye to be a wonderful veteran man, and nobody
+can gainsay it.'
+" Nobody,' said Joseph Poorgrass. "Ye be a very
+rare old  spectacle, malter, and we all admire ye for that
+gift. '
+"Ay, and as a young man, when my senses were in
+prosperity, I was likewise liked by a good-few who
+knowed me,' said the maltster.
+" 'Ithout doubt you was -- 'ithout doubt.'
+The bent and hoary 'man was satisfied, and so
+apparently was Henery Frag. That matters should
+continue pleasant Maryann
+<P 203>
+spoke, who, what with her
+brown complexion, and the working wrapper of rusty
+linsey, had at present the mellow hue of an old sketch
+in oils -- notably some of Nicholas Poussin's: --
+" Do anybody know of a crooked man, or a lame, or
+any second-hand fellow at all that would do for poor
+me ?' said Maryann. "A perfect one I don't expect to
+ at my time of life. If I could hear of such a thing
+twould do me more good thantoast and ale.'
+ Coggan furnished a suitable reply. Oak went on
+with his shearing, and said not another word. Pestilent
+moods had come, and teased away his quiet. Bathsheba
+had shown indications of anointing him above his
+fellows by installing him as the bailiff that the farm
+imperatively required. He did not covet the post
+relatively to the farm : in relation to herself, as beloved
+by him and unmarried to another, he had coveted it.
+His readings of her seemed now to be vapoury and
+indistinct. His lecture to her was, he thought, one of
+the absurdest mistakes. Far from coquetting with
+Boldwood, she had trifled with himself in thus feigning
+that she had trifled with another. He was inwardly
+convinced that, in accordance with the anticipations of
+his easy-going and worse-educated comrades, that day
+would see Boldwood the accepted husband of Miss
+Everdene. Gabriel at this time of his life had out+
+grown the instinctive dislike which every Christian
+boy has for reading the Bible, perusing it now quite
+frequently, and he inwardly said, " ''I find more bitter
+than death the woman whose heart is snares and
+nets .! '' ' This was mere exclamation -- the froth of the
+storm. He adored Bathsheba just the same.
+" We workfolk shall have some lordly- junketing
+to-night,' said Cainy Ball, casting forth his thoughts in
+a new direction. "This morning I see'em making the
+great puddens in the milking-pails -- lumps of fat as big
+as yer thumb, Mister Oak ! I've never seed such
+splendid large knobs of fat before in the days of my
+life -- they never used to be bigger then a horse-bean.
+And there was a great black crock upon the brandise
+with his legs a-sticking out, but I dont know what was
+in within."
+'And there's two bushels of biffins for apple-pies,'
+said Maryann.
+<P 204>
+"Well, I hope to do my duty by it all,' said Joseph
+Poorgrass, in a pleasant, masticating manner of anticipa+
+tion. " Yes ; victuals and drink is a cheerful thing,
+and gives nerves to the nerveless, if the form of words
+may be used. 'Tis the gospel of the body, without
+which we perish, so to speak it.'
+<C xxiii>
+<P 205>
+EVENTIDE -- A SECOND DECLARATION
+FOR the shearing-supper a long table was placed on the
+grass-plot beside the house, the end of the table being
+thrust over the sill of the wide parlour window and a
+foot or two into the room. Miss Everdene sat inside
+the window, facing down the table. She was thus at
+the head without mingling with the men.
+This evening Bathsheba was unusually excited, her
+red cheeks and lips contrasting lustrously with the mazy
+skeins of her shadowy hair. She seemed to expect
+assistance, and the seat at the bottom of the table was
+at her request left vacant until after they had begun
+and the duties appertaining to that end, which he did
+with great readiness.
+At this moment Mr. Boldwood came in at the gate,
+and crossed the green to Bathsheba at the window.
+He apologized for his lateness : his arrival was evidently
+by arrangement.
+" Gabriel,' said she, " will you move again, please,
+and let Mr. Boldwood come there ?'
+Oak moved in silence back to his original seat.
+The gentleman-farmer was dressed in cheerful style,
+in a new coat and white waistcoat, quite contrasting
+with his usual sober suits of grey. Inwardy, too, he
+was blithe, and consequently chatty to an exceptional
+degree. So also was Bathsheba now that he had come,
+though the uninvited presence of Pennyways, the bailiff
+who had been dismissed for theft, disturbed her equan+
+imity for a while.
+Supper being ended, Coggan began on his own
+private account, without reference to listeners : --
+l've lost my love and l care not,
+I've lost my love, and l care not;
+I shall soon have another
+<P 206>
+That's better than t'other!
+I've lost my love, and I care not.
+This lyric, when concluded, was received with a
+silently appreciative gaze at the table, implying that the
+performance, like a work by those established authors
+who are independent of notices in the papers, was a
+well-known delight which required no applause.
+"Now, Master Poorgass, your song!' said Coggan.
+"I be all but in liquor, and the gift is wanting in
+me,' said Joseph, diminishing himself.
+"Nonsense; wou'st never be so ungrateful, Joseph --
+never!' said Coggan, expressing hurt feelings by an
+inflection of voice. "And mistress is looking hard at
+ye, as much as to say, ""Sing at once, Joseph Poor+
+grass.'' '
+"Faith, so she is; well, I must suffer it! ... Just
+eye my features, and see if the tell-tale blood overheats
+me much, neighbours?'
+"No, yer blushes be quite reasonable,' said Coggan.
+"I always tries to keep my colours from rising when
+a beauty's eyes get fixed on me,' said Joseph, differently;
+"but if so be 'tis willed they do, they must.'
+"Now, Joseph, your song, please,' said Bathsheba,
+from the window.
+"Well, really, ma'am,' he replied, in a yielding tone,
+"I don't know what to say. It would be a poor plain
+ballet of my own composure.'
+'Hear, hear! ' said the supper-party.
+Poorgrass, thus assured, trilled forth a flickering yet
+commendable piece of sentiment, the tune of which
+consisted of the key-note and another, the latter being
+the sound chiefly dwelt upon. This was so successful
+that he rashly plunged into a second in the same
+breath, after a few false starts : --
+I sow'-ed th'-e
+I sow'-ed
+I sow'-ed the'-e seeds' of love',
+I-it was' all' i'-in the'-e spring',
+I-in A'-pril', Ma'-ay, a'-nd sun'-ny' June',
+When sma'-all bi'-irds they' do' sing.
+<P 207>
+" Well put out of hand,' said Coggan, at the end of the
+verse. ' "" They do sing '' was a very taking paragraph.'
+"Ay; and there was a pretty place at "seeds of
+love,'' and 'twas well heaved out. Though "love '' is
+a nasty high corner when a man's voice is getting
+crazed. Next verse, Master Poorgrass.'
+But during this rendering young Bob Coggan ex+
+hibited one of those anomalies which will afflict little
+people when other persons are particularly serious : in
+trying to check his laughter, he pushed down his throat
+as much of the tablecloth as he could get hold of, when,
+after continuing hermetically sealed for a short time, his
+mirth burst out through his nose. Joseph perceived it,
+and with hectic cheeks of indignation instantly ceased
+singing. Coggan boxed Bob's ears immediately.
+"Go on, Joseph -- go on, and never mind the young
+scamp,' said Coggan. "'Tis a very catching ballet.
+Now then again -- the next bar; I'll help ye to flourish
+up the shrill notes where yer wind is rather wheezy : --
+O the wi'-il-lo'-ow tree' will' twist',
+And the wil'-low' tre'-ee wi'ill twine'.
+But the singer could not be set going again. Bob
+Coggan was sent home for his ill manners, and tran+
+quility was restored by Jacob Smallbury, who volunteered
+a ballad as inclusive and interminable as that with which
+the worthy toper old Silenus amused on a similar occasion
+the swains Chromis and Mnasylus, and other jolly dogs
+of his day.
+It' was still the beaming time .of evening, though
+night was stealthily making itself visible low down upon
+the ground, the western lines of light taking the earth
+without alighting upon it to any extent, or illuminating
+the dead levels at all. The sun had crept round the
+tree as a last effort before death, and then began to
+sink, the shearers' lower parts becoming steeped in
+embrowning twilight, whilst their heads and shoulders
+were still enjoying day, touched with a yellow of self+
+sustained brilliancy that seemed inherent rather than
+acquired.
+The sun went down in an ochreous mist; but they
+sat, and
+<P 208>
+talked on, and grew as merry as the gods in
+Homer's heaven. Bathsheba still remained enthroned
+inside the window, and occupied herself in knitting,
+from which she sometimes looked up to view the fading
+scene outside. The slow twilight expanded and enveloped
+them completely before the signs of moving were shown.
+Gabriel suddenly missed Farmer Boldwood from his
+place at the bottom of the table. How long he had
+been gone Oak did not know; but he had apparently
+withdrawn into the eneircling dusk. Whilst he was
+thinking of this, Liddy brought candles into the back
+part of the room overlooking the shearers, and their
+lively new flames shone down the table and over the
+men, and dispersed among the green shadows behind.
+Bathsheba's form, still in its original position, was now
+again distinct between their eyes and the light, which
+revealed that Boldwood had gone inside the room, and
+was sitting near her.
+Next came the question of the evening. Would Miss
+Everdene sing to them the song she always sang so
+charmingly -- " The Banks of Allan Water ' -- before they
+went home ?
+After a moment's consideration Bathsheba assented,
+beckoning to Gabriel, who hastened up into the coveted
+atmosphere.
+" Have you brought your flute ? " she whispered.
+" Yes, miss.'
+" Play to my singing, then.'
+She stood up in the window-opening, facing the
+men, the candles behind her, Gabriel on her right hand,
+immediately outside the sash-frame. Boldwood had
+drawn up on her left, within the room. Her singing
+was soft and rather tremulous at first, but it soon swelled
+to a steady clearness. Subsequent events caused one
+of the verses to be remembered for many months, and
+even years, by more than one of those who were gathered
+there : --
+For his bride a soldier sought her,
+And a winning tongue had he :
+On the banks of Allan Water
+None was gay as she !.
+<P 209>
+In addition to the dulcet piping of Gabriel's flute,
+Boldwood supplied a bass in his customary profound
+voice, uttering his notes so softly, however, as to abstain
+entirely from making anything like an ordinary duet of
+the song ; they rather formed a rich unexplored shadow,
+which threw her tones into relief. The shearers reclined
+against each other as at suppers in the early ages of the
+world, and so silent and absorbed were they that her
+breathing could almost be heard between the bars ; and
+at the end of the ballad, when the last tone loitered on
+to an inexpressible close, there arose that buzz of
+pleasure which is the attar of applause.
+It is scarcely necessary to state that Gabriel could
+not avoid noting the farmer's bearing to-night towards
+their entertainer. Yet there was nothing exceptional in
+his actions beyond what appertained to his time of
+performing them. It was when the rest were all looking
+away that Boldwood observed her ; when they regarded
+her he turned aside; when they thanked or praised he
+was silent; when they were inattentive he murmured
+his thanks. The meaning lay in the difference between
+actions, none of which had any meaning of itself;
+and the necessity of being jealous, which lovers are
+troubled with, did not lead Oak to underestimate these
+signs.
+Bathsheba then wished them good-night, withdrew
+from the window, and retired to the back part of the
+room, Boldwood thereupon closing the sash and the
+shutters, and remaining inside with her. Oak wandered
+away under the quiet and scented trees. Recovering
+from the softer impressions produced by Bathsheba's
+voice, the shearers rose to leave, Coggan turning to
+Pennyways as he pushed back the bench to pass out : --
+"I like to give praise where praise is due, and the
+man deserves it -- that 'a do so,' he remarked, looking at
+the worthy thief, as if he were the masterpiece of some
+world-renowned artist.
+<P 210>
+"I'm sure I should never have believed it if we hadn t
+proved it, so to allude,' hiccupped Joseph Poorgrass, " that
+every cup, every one of the best knives and forks, and
+every empty bottle be in their place as perfect now as
+at the beginning, and not one stole at all.
+"I'm sure I don't deserve half the praise you give
+me,' said the virtuous thief, grimly.
+" Well, I'll say this for Pennyways,' added Coggan,
+"that whenever he do really make up his mind to do a
+noble thing in the shape of a good action, as I could
+see by his face he. did to-night afore sitting down, he's
+generally able to carry it out. Yes, I'm proud to say.
+neighbours, that he's stole nothing at all.
+"Well,' -- 'tis an honest deed, and we thank ye for it,
+Pennyways,' said Joseph; to which opinion the remainder
+of the company subscribed unanimously.
+  At this time of departure, when nothing more was
+visible of the inside of the parlour than a thin and still
+chink of light between the shutters, a passionate scene
+was in eourse of enactment there.'
+Miss Everdene and Boldwood were alone. Her
+cheeks had lost a great deal of their healthful fire from
+the very seriousness of her position ; but her eye was
+bright with the excitement of a triumph -- though it was
+a triumph which had rather been contemplated than
+desired.
+She was standing behind a low arm-chair, from which
+she had just risen, and he was kneeling in it -- inclining
+himself over its back towards her, and holding her hand
+in both his own. His body moved restlessly, and it was
+with what Keats daintily calls a too happy happiness.
+This unwonted abstraction by love of all dignity from
+a man of whom it had ever seemed the chief component,
+was, in its distressing incongruity, a pain to her which
+quenched much of the pleasure she derived from the
+proof that she was idolized.
+" I will try to love you,' she was saying, in a trembling
+voice quite unlike her usual self-confidence. " And if I
+can believe in any way that I shall make you a good
+wife I shall indeed be willing to marry you. But, Mr.
+Boldwood, hesitation on so high a matter is honourable
+in any woman, and I don't want to give a solemn
+promise to-night. I would rather ask you to wait a few
+weeks till I can see my situation better.'
+"But you have every reason to believe that then --  -- '
+'I have every reason to hope that at the end of the
+five or
+<P 211>
+six weeks, between this time and harvest, that
+you say you are going to be away from home, I shall be
+able to promise to be your wife,' she said, firmly. "But
+remember this distinctly, I don't promise yet.'
+"It is enough I don't ask more. I can wait on
+those dear words. And now, Miss Everdene, good+
+night!'
+" Good-night,' she said, graciously -- almost tenderly;
+and Boldwood withdrew with a serene smile.
+Bathsheba knew more of him now ; he had entirely
+bared his heart before her, even until he had almost
+worn in her eyes the sorry look of a grand bird without
+the feathers that make it grand. She had been awe+
+struck at her past temerity, and was struggling to make
+amends without thinking whether the sin quite deserved
+the penalty she was schooling herself to pay. To have
+brought all this about her ears was terrible; but after a
+while the situation was not without a fearful joy. The
+facility with which even the most timid woman some+
+times acquire a relish for the dreadful when that is
+amalgamated with a little triumph, is marvellous.
+<C xxiv>
+<P 212>
+THE SAME NIGHT -- THE FIR PLANTATION
+AMONG the multifarious duties which Bathsheba had
+voluntarily imposed upon herself by dispensing with the
+services of a bailiff, was the particular one of looking
+round the homestead before going to bed, to see that
+all was right and safe for the night. Gabriel had almost
+constantly preceded her in this tour every evening,
+watching her affairs as carefully as any specially appointed
+officer of surveillance could have done; but this tender
+devotion was to a great extent unknown to his mistress,
+and as much as was known was somewhat thanklessly
+received. Women are never tired of bewailing man's
+fickleness in love, but they only seem to snub his con+
+stancy.
+As watching is best done invisibly, she usually carried
+a dark lantern in her hand, and every now and then
+turned on the light to examine nooks and corners with
+the coolness of a metropolitan policeman. This cool+
+ness may have owed its existence not so much to her
+fearlessness of expected danger as to her freedom from
+the suspicion of any; her worst anticipated discovery
+being that a horse might not be well bedded, the fowls
+not all in, or a door not closed.
+This night the buildings were inspected as usual,
+and she went round to the farm paddock. Here the
+only sounds disturbing the stillness were steady munch+
+ings of many mouths, and stentorian breathings from all
+but invisible noses, ending in snores and puffs like the
+blowing of bellows slowly. Then the munching would
+recommence, when the lively imagination might assist
+the eye to discern a group of pink-white nostrils, shaped
+as caverns, and very clammy and humid on their sur+
+faces, not exactly pleasant to the touch until one got
+used to them; the mouths beneath having a great
+partiality for closing upon any loose end of Bathsheba's
+apparel which came within
+<P 213>
+reach of their tongues.
+Above each of these a still keener vision suggested a
+brown forehead and two staring though not unfriendly
+eyes, and above all a pair of whitish crescent-shaped
+horns like two particularly new moons, an occasional
+stolid " moo!' proclaiming beyond the shade of a doubt
+that these phenomena were the features and persons of
+Daisy, Whitefoot, Bonny-lass, Jolly-O, Spot, Twinkle-eye,
+etc., etc. -- the respectable dairy of Devon cows belonging
+to Bathsheba aforesaid.
+Her way back to the house was by a path through a
+young plantation of tapering firs, which had been planted
+some years earlier to shelter the premises from the north
+wind. By reason of the density of the interwoven foliage
+overhead, it was gloomy there at cloudless noontide,
+twilight in the evening, dark as midnight at dusk, and
+black as the ninth plague of Egypt at midnight. To
+describe the spot is to call it a vast, low, naturally formed
+hall, the plumy ceiling of which was supported by slender
+pillars of living wood, the floor being covered with a soft
+dun carpet of dead spikelets and mildewed cones, with
+a tuft of grass-blades here and there.
+This bit of the path was always the crux of the
+night's ramble, though, before starting, her apprehen+
+sions of danger were not vivid enough to lead her to
+take a companion. Slipping along here covertly as
+Time, Bathsheba fancied she could hear footsteps enter+
+ing the track at the opposite end. It was certainly a
+rustle of footsteps. Her own instantly fell as gently as
+snowflakes. She reassured herself by a remembrance
+that the path was public, and that the traveller was
+probably some villager returning home ; regetting, at
+the same time, that the meeting should be about to
+occur in' the darkest point of her route, even though
+only just outside her own door.
+The noise approached, came close, and a figure was
+apparently on the point of gliding past her when some+
+thing tugged at her skirt and pinned it forcibly to the
+ground. The instantaneous check nearly threw Bath+
+sheba off her balance. In recovering she struck against
+warm clothes and buttons.
+'A rum start, upon my soul!' said a masculine voice,
+a foot or so above her head. 'Have I hurt you, mate?'
+"No,' said Bathsheba, attempting to shrink a way.
+<P 214>
+" We have got hitched together somehow, I think.'
+" Yes.'
+"Are you a woman ?'
+'Yes.'
+"A lady, I should have said.'
+"It doesn't matter.'
+"I am a man.'
+"Oh!'
+Bathsheba softly tugged again, but to no purpose.
+"Is that a dark lantern you have ? I fancy so,' said
+the man.
+'Yes.'
+"If you'll allow me I'll open it, and set you free.'
+A hand seized the lantern, the door was opened, the
+rays burst out from their prison, and Bathsheba beheld
+her position with astonishment.
+The man to whom she was hooked was brilliant in
+brass and scarlet. He was a soldier. His sudden
+appearance was to darkness what the sound of a trumpet
+is to silense. Gloom, the genius loci at all times hitherto,
+was now totally overthrown, less by the lantern-light
+than by what the lantern lighted. The contrast of this
+revelation with her anticipations of some sinister figure
+in sombre garb was so great that it had upon her the
+effect of a fairy transformation.
+It was immediately apparent that the military man's
+spur had become entangled in the gimp which decorated
+the skirt of her dress. He caught a view of her face.
+"I'll unfasten you in one moment, miss,' he said,
+with new-born gallantry.
+" O no -- I can do it, thank you,' she hastily replied,
+and stooped for the performance.
+The unfastening was not such a trifling affair. The
+rowel of the spur had so wound itself among the gimp
+cords in those few moments, that separation was likely
+to be a matter of time.
+He too stooped, and the lantern standing on the
+ground betwixt them threw the gleam from its open side
+among the fir-tree needles and the blades of long damp
+grass with the effect of a large glowworm. It radiated
+upwards into their
+<P 215>
+faces, and sent over half the planta+
+tion gigantic shadows of both man and woman, each
+dusky shape becoming distorted and mangled upon the
+tree-trunks till it wasted to nothing.
+He looked hard into her eyes when she raised them
+for a moment; Bathsheba looked down again, for his
+gaze was too strong to be received point-blank with her
+own. But she had obliquely noticed that he was young
+and slim, and that he wore three chevrons upon his
+sleeve.
+Bathsheba pulled again.
+" You are a prisoner, miss; it is no use blinking the
+matter,' said the soldier, drily. " I must cut your dress
+if you are in such a hurry.'
+" Yes -- please do!' she exclaimed, helplessly. '
+"It wouldn't be necessary if you could wait a
+moment;' and he unwound a cord from the little
+wheel. She withdrew her own hand, but, whether by
+accident or design, he touched it. Bathsheba was
+vexed; she hardly knew why.
+His unravelling went on, but it nevertheless seemed
+coming to no end. She looked at him again.
+'Thank you for the sight of such a beautiful face!'
+said the young sergeant, without ceremony.
+She coloured with embarrassment. "'Twas un+
+willingly shown,' she replied, stiffly, and with as much
+dignity -- which was very little -- as she could infuse into
+a position of captivity
+"I like you the better for that incivility, miss,' he
+said.
+" I should have liked -- I wish -- you had never shown
+yourself to me by intruding here!' She pulled again,
+and the gathers of her dress began to give way like
+liliputian musketry.
+" I deserve the chastisement your words give me.
+But why should such a fair and dutiful girl have such
+an aversion to her father's sex ? '
+"Go on your way, please.'
+' What, Beauty, and drag you after me ? Do but
+look; I never saw such a tangle!'
+'O, 'tis shameful of you ; you have been making
+it worse on purpose to keep me here -- you have ! '
+"Indeed, I don't think so,' said the sergeant, with a
+merry twinkle.
+<P 216>
+"I tell you you have!' she exclaimed, in high
+temper. I insist upon undoing it. Now, allow me!'
+"Certainly, miss; I am not of steel.' He added a
+sigh which had as much archness in it as a sigh could
+possess without losing its nature altogether. 'I am
+thankful for beauty, even when 'tis thrown to me like
+a bone to a dog. These moments will be over too
+soon!'
+She closed her lips in a determined silence.
+Bathsheba was revolving in her mind whether by a
+bold and desperate rush she could free herself at the
+risk of leaving her skirt bodily behind her. The
+thought was too dreadful. The dress -- which she had
+put on to appear stately at the supper -- was the head
+and front of her wardrobe ; not another in her stock
+became her so well. What woman in Bathsheba's
+position, not naturally timid, and within call of her
+retainers, would have bought escape from a dashing
+soldier at so dear a price ?
+"All in good time ; it will soon be done, I perceive,'
+said her cool friend.
+" This trifling provokes, and -- and --  -- '
+" Not too cruel!'
+" --  Insults me.!'
+"It is done in order that I may have the pleasure
+of apologizing to so charming a woman, which I
+straightway do most humbly, madam,' he said, bowing
+low.
+Bathsheba really knew not what to say.
+"I've seen a good many women in my time,
+continued the young man in a murmur, and more
+thoughtfully than hitherto, critically regarding her bent
+head at the same time; "but I've never seen a woman
+so beautiful as you. Take it or leave it -- be offended
+or like it -- I don't care.'
+" Who are you, then, who can so well afford to
+despise opinion ? '
+" No stranger. Sergeant Troy. I am staying in
+this place. -- There ! it is undone at last, you see.
+Your light fingers were more eager than mine. I wish it
+had been the knot of knots, which there's no untying !. '
+This was worse and worse. She started up, and so
+did he.
+<P 217>
+How to decently get away from him -- that
+was her difficulty now. She sidled off inch by inch,
+the lantern in her hand, till she could see the redness
+of his coat no longer.
+" Ah, Beauty ; good-bye !. ' he said.
+She made no reply, and, reaching a distance of
+twenty or thirty yards, turned about, and ran indoors.
+Liddy had just retired to rest. In ascending to her
+own chamber, Bathsheba opened the girl's door an
+inch or two, and, panting, said --
+" Liddy, is any soldier staying in the village --
+sergeant somebody -- rather gentlemanly for a sergeant,
+and good looking -- a red coat with blue facings ?'
+'No, miss ... No, I say; but really it might be
+Sergeant Troy home on furlough, though I have not
+seen him. He was here once in that way when the
+regiment was at Casterbridge.'
+" Yes; that's the name. Had he a moustache -- no
+whiskers or beard ?'
+" He had.'
+" What kind of a person is he ?'
+"O ! miss -- I blush to name it -- a gay man! But
+I know him to be very quick and trim, who might have
+made his thousands, like a squire. Such a clever
+young dand as he is! He's a doctor's son by name,
+which is a great deal; and he's an earl's son by
+nature!'
+" Which is a great deal more. Fancy! Is it true ? '
+" Yes. And, he was brought up so well, and sent to
+Casterbridge Grammar School for years and years.
+Learnt all languages while he was there ; and it was
+said he got on so far that he could take down Chinese
+in shorthand ; but that I don't answer for, as it was
+only reported. However, he wasted his gifted lot,
+and listed a soldier; but even then he rose to be a
+sergeant without trying at all. Ah! such a blessing it
+is to be high-born ; nobility of blood will shine out even
+in the ranks and files. And is he really come home,
+miss ?"
+' I believe so. Good-night, Liddy.'
+After all, how could a cheerful wearer of skirts
+be permanently offended with the man ? There are
+occasions when girls like Bathsheba will put up with
+a great deal of
+<P 218>
+unconventional behaviour. When they
+want to be praised, which is often, when they want to
+be mastered, which is sometimes ; and when they want
+no nonsense, which is seldom. Just now the first
+feeling was in the ascendant with Bathsheba, with a dash
+of the second. Moreover, by chance or by devilry, the
+ministrant was antecedently made interesting by being
+a handsome stranger who had evidently seen better
+days.
+So she could not clearly decide whether it was her
+opinion that he had insulted her or not. '
+"Was ever anything so odd! ' she at last exclaimed
+to herself, in her own room. "And was ever anything
+so meanly done as what I did to to sulk away like that
+from a man who was only civil and kind!' Clearly she
+did not think his barefaced praise of her person an
+insult now.
+It was a fatal omission of Boldwood's that he had
+never once told her she was beautiful.
+<C xxv>
+<P 219>
+THE NEW ACQUAINTANCE DESCRIBED
+IDIOSYNCRASY and vicissitude had combined to
+stamp Sergeant Troy as an exceptional being.
+He was a man to whom memories were an in+
+cumbrance, and anticipations a superfluity. Simply
+feeling, considering, and caring for what was before his
+eyes, he was vulnerable only in the present. His out+
+look upon time was as a transient flash of the eye now
+and then : that projection of consciousness into days
+gone by and to come, which makes the past a synonym
+for the pathetic and the future a word for circum+
+spection, was foreign to Troy. With him the past
+was yesterday ; the future, to-morrow ; never, the day
+after.
+On this account he might, in certain lights, have
+been regarded as one of the most fortunate of his
+order. For it may be argued with great plausibility
+that reminiscence is less an endowment than a disease,
+and that expectation in its only comfortable form -- that
+of absolute faith -- is practically an impossibility; whilst
+in the form of hope and the secondary compounds,
+patience, impatience, resolve, curiosity, it is a constant
+fluctuation between pleasure and pain.
+Sergeant Troy, being entirely innocent of the
+practice of expectation, was never disappointed. To
+set against this negative gain there may have been
+some positive losses from a certain narrowing of the
+higher tastes and sensations which it entailed. But
+limitation of the capacity is never recognized as a loss
+by the loser therefrom : in this attribute moral or
+aesthetic poverty contrasts plausibly with material, since
+those who suffer do not mind it, whilst those who mind
+it soon cease to suffer. It is not a denial of anything
+to have been always without it, and what Troy had
+never enjoyed he did not miss; but, being fully
+conscious that what sober
+<P 220>
+people missed he enjoyed,
+his capacity, though really less, seemed greater than
+theirs.
+He was moderately truthful towards men, but to
+women lied like a Cretan -- a system of ethics above all
+others calculated to win popularity at the first flush of
+admission into lively society ; and the possibility of the
+favour gained being transitory had reference only to
+the future.
+He never passed the line which divides the spruce
+vices from the ugly ; and hence, though his morals had
+hardly been applauded, disapproval of them" had fre+
+quently been tempered with a smile. This treatment
+had led to his becoming a sort of regrater of other
+men's gallantries, to his own aggrandizement as a
+Corinthian, rather than to the moral profit of his
+hearers.
+His reason and his propensities had seldom any
+reciprocating influence, having separated by mutual
+consent long ago : thence it sometimes happened that,
+while his intentions were as honourable as could be
+wished, any particular deed formed a dark background
+which threw them into fine relief. The sergeant's
+vicious phases being the offspring of impulse, and
+his virtuous phases of cool meditation, the latter
+had a modest tendency to be oftener heard of than
+seen.
+Troy was full of activity, but his activities were less of
+a locomotive than a vegetative nature ; and, never being
+based upon any original choice of foundation or direc+
+tion, they were exercised on whatever object chance
+might place in their way. Hence, whilst he sometimes
+reached the brilliant in speech because that -was
+spontaneous, he fell below the commonplace in action,
+from inability to guide incipient effort. He had a
+quick comprehension and considerable force of char+
+acter ; but, being without the power to combine them,
+the comprehension became engaged with trivialities
+whilst waiting for the will to direct it, and the force
+wasted itself in useless grooves through unheeding the
+comprehension.
+He was a fairly well-educated man for one of middle
+class -- exceptionally well educated for a common soldier.
+He spoke fluently and unceasingly. He could in this
+way be one thing and seem another : for instance, he
+could speak of love and
+<P 221>
+think of dinner; call on the
+intend to owe.
+The wondrous power of flattery in passados at woman
+is a perception so universal as to be remarked upon by
+many people almost as automatically as they repeat a
+proverb, or say that they are Christians and the like,
+without thinking much of the enormous corollaries
+which spring from the proposition. Still less is it acted
+upon for the good of the complemental being alluded
+to. With the majority such an opinion is shelved with
+all those trite aphorisms which require some catastrophe
+to bring their tremendous meanings thoroughly home.
+When expressed with some amount of reflectiveness it
+seems co-ordinate with a belief that this flattery must
+be reasonable to be effective. It is to the credit of
+men that few attempt to settle the question by experi+
+ment, and it is for their happiness, perhaps, that accident
+has never settled it for them. Nevertheless, that a
+male dissembler who by deluging her with untenable
+fictions charms the female wisely, may acquire powers
+reaching to the extremity of perdition, is a truth taught
+to many by unsought and wringing occurrences. And
+some profess to have attained to the same knowledge
+by experiment as aforesaid, and jauntily continue their
+indulgence in such experiments with terrible effect.
+Sergeant Troy was one.
+He had been known to observe casually that in
+dealing with womankind the only alternative to flattery
+was cursing and swearing. There was no third method.
+" Treat them fairly, and you are a lost man,' he would
+say.
+This philosopher's public appearance in Weatherbury
+promptly followed his arrival there. A week or two
+after the shearing, Bathsheba, feeling a nameless relief
+of spirits on account of Boldwood's absence, approached
+her hayfields and looked over the hedge towards the
+haymakers. They consisted in about equal proportions
+of gnarled and flexuous forms, the former being the
+men, the latter the women, who wore tilt bonnets
+covered with nankeen, which hung in a curtain upon
+their shoulders. Coggan and Mark Clark were mowing
+in a less forward meadow, Clark humming a tune to
+the strokes of his
+<P 222>
+scythe, to which Jan made no attempt
+to keep time with his. In the first mead they were
+already loading hay, the women raking it into cocks
+and windrows, and the men tossing it upon the
+waggon.
+From behind the waggon a bright scarlet spot
+emerged, and went on loading unconcernedly with the
+rest. It was the gallant sergeant, who had come hay+
+making for pleasure ; and nobody could deny that he
+was doing the mistress of the farm real knight-service
+by this voluntary contribution of his labour at a busy
+time.
+As soon as she had entered the field Troy saw her,
+and sticking his pitchfork into the ground and picking
+up his crop or cane, he came forward. Bathsheba
+blushed with half-angry embarrassment, and adjusted
+her eyes as well as her feet to the direct line of her
+path.
+<C xxvi>
+<P 223>
+SCENE ON THE VERGE OF THE HAY-MEAD
+'AH, Miss Everdene!' said the sergeant, touching his
+diminutive cap. "Little did I think it was you I was
+speaking to the other night. And yet, if I had reflected,
+the "Queen of the Corn-market" (truth is truth at any
+hour of the day or night, and I heard you so named in
+Casterbridge yesterday), the "Queen of the Corn-market,''
+I say, could be no other woman. I step across now to
+beg your forgiveness a thousand times for having been
+led by my feelings to express myself too strongly for a
+stranger. To be sure I am no stranger to the place --
+I am Sergeant Troy, as I told you, and I have assisted
+your uncle in these fields no end of times when I was a
+lad. I have been doing the same for you today.'
+"I suppose I must thank you for that, Sergeant
+Troy,' said the Queen of the Corn-market, in an in+
+differently grateful tone.
+The sergeant looked hurt and sad. "Indeed you
+must not, Miss Everdene,' he said. " Why could you
+think such a thing necessary ? '
+"I am glad it is not.'
+" Why ? if I may ask without offence.'
+" Because I don't much want to thank you for any"
+thing.'
+"I am afraid I have made a hole with my tongue
+that my heart will never mend. O these intolerable
+times: that ill-luck should follow a man for honestly
+telling a woman she is beautiful.! 'Twas the most I
+said -- you must own that; and the least I could say --
+that I own myself.'
+'There is some talk I could do without more easily
+than money.'
+"Indeed. That remark is a sort of digression.'
+" No. It means that I would rather have your room
+than your company.'
+<P 224>
+"And I would rather have curses from you than
+kisses from any other woman ; so I'll stay here.'
+Bathsheba was absolutely speechless. And yet she
+could not help feeling that the assistance he was render+
+ing forbade a harsh repulse.
+" Well,' continued Troy, "I suppose there is a praise
+which is rudeness, and that may be mine. At the
+same time there is a treatment which is injustice, and
+that may be yours. Because a plain blunt man, who
+has never been taught concealment, speaks out his
+mind without exactly intending it, he's to be snapped
+off like the son of a sinner.'
+"Indeed there's no such case between us,' she said,
+turning away. "I don't allow strangers to be bold and
+impudent -- even in praise of me.'
+" Ah -- it is not the fact but the method which offends
+you,' he said, carelessly. "But I have the sad satis+
+faction of knowing that my words, whether pleasing or
+offensive, are unmistakably true. Would you have had
+me look at you, and tell my acquaintance that you are
+quite a common-place woman, to save you the embar+
+rassment of being stared at if they come near you ?
+Not I. I couldn't tell any such ridiculous lie about
+a beauty to encourage a single woman in England in
+too excessive a modesty.'
+"It is all pretence -- what you are saying!' exclaimed
+Bathsheba, laughing in spite of herself at the sergeant's
+sly method. " You have a rare invention, Sergeant
+Troy. Why couldn't you have passed by me that
+night, and said nothing ? -- that was all I meant to
+reproach you for.'
+"Because I wasn't going to. Half the pleasure of
+a feeling lies in being able to express it on the spur of
+the moment, and I let out mine. It would have been
+just the same if you had been the reverse person -- ugly
+and old -- I should have exclaimed about it in the same
+way. '
+" How long is it since you have been so afflicted with
+strong feeling, then ? '
+" Oh, ever since I was big enough to know loveliness
+from deformity.'
+<P 225>
+"'Tis to be hoped your sense of the difference you
+speak of doesn't stop at faces, but extends to morals as
+well. '
+'I won't speak of morals or religion -- my own or
+anybody else's. Though perhaps I should have been a
+very good Christian if you pretty women hadn't made
+me an idolater.'
+Bathsheba moved on to hide the irrepressible dimp+
+lings of merriment. Troy followed, whirling his crop.
+'But -- Miss Everdene -- you do forgive me ? '
+" Hardly. '
+"Why ?'
+" You say such things.'
+"I said you were beautiful, and I'll say so still; for,
+by --  so you are !. The most beautiful ever I saw, or
+may I fall dead this instant! Why, upon my --  -- '
+" Don't -- don't! I won't listen to you -- you are so
+profane!' she said, in a restless state between distress
+at hearing him and a penchant to hear more.
+"I again say you are a most fascinating woman.
+There's nothing remarkable in my saying so, is there?
+I'm sure the fact is evident enough. Miss Everdene,
+my opinion may be too forcibly let out to please you,
+and, for the matter of that, too insignificant to convince
+you, but surely it is honest, and why can't it be ex+
+cused? '
+"Because it -- it isn't a correct one,' she femininely
+murmured.
+" 0, fie -- fie-! Am I any worse for breaking the
+third of that Terrible Ten than you for breaking the
+ninth ?"
+"Well, it doesn't seem quite true to me that I am
+fascinating,' she replied evasively.
+' Not so to you : then I say with all respect that, if
+so, it is owing to your modesty, Miss Everdene. But
+surely you must have been told by everybody of what
+everybody notices ? and you should take their words
+for it.'
+" They don't say so exactly.'
+" O yes, they must!'
+"Well, I mean to my face, as you do,' she went on,
+allowing
+<P 226>
+herself to be further lured into a conversation
+that intention had rigorously forbidden.
+"But you know they think so ?'
+"No -- that is -- I certainly have heard Liddy say
+they do, but --  -- ' She paused.
+Capitulation -- that was the purport of the simple
+reply, guarded as it was -- capitulation, unknown to her+
+self. Never did a fragile tailless sentence convey a
+more perfect meaning. The careless sergeant smiled
+within himself, and probably too the devil smiled from
+a loop-hole in Tophet, for the moment was the turning+
+point of a career. Her tone and mien signified beyond
+mistake that the seed which was to lift the foundation
+had taken root in the chink : the remainder was a mere
+question of time and natural changes.
+"There the truth comes out ! ' said the soldier, in
+reply. "Never tell me that a young lady can live in a
+buzz of admiration without knowing something about it.
+Ah,' well, Miss Everdene, you are -- pardon my blunt
+way -- you are rather an injury to our race than other+
+wise.
+" How -- indeed ? ' she said, opening her eyes.
+"O, it is true enough. I may as well be hung for
+a sheep as a lamb (an old country saying, not of much
+account, but it will do for a rough soldier), and so I
+will speak my mind, regardless of your pleasure, and
+without hoping or intending to get your pardon. Why,
+Miss Everdene, it is in this manner that your good
+looks may do more. harm than good in the world.'
+The sergeant looked down the mead in critical abstrac+
+ion. " Probably some one man on an average falls in'
+love, with each ordinary woman. She can marry him :
+he is content, and leads a useful life. Such women as
+you a hundred men always covet -- your eyes will be+
+witch scores on scores into an unavailing fancy for you
+you can only marry one of that many. Out of these
+say twenty will endeavour to. drown the bitterness of
+espised love in drink ; twenty more will mope away
+their lives without a wish or attempt to make a mark in
+he world, because they have no ambition apart from
+their attachment to you ; twenty more -- the susceptible
+person
+<P 227>
+myself possibly among them -- will be always
+draggling after you, getting where they may just see
+you, doing desperate things. Men are such constant
+fools! The rest may try to get over their passion with
+more or less success. But all these men will be
+saddened. And not only those ninety-nine men, but
+the ninety-nine women they might have married are
+saddened with them. There's my tale. That's why I
+say that a woman so charming as yourself, Miss Ever+
+dene, is hardly a blessing to her race.'
+The handsome sergeant's features were during this
+speech as rigid and stern as John Knox's in addressing
+his gay young queen.
+Seeing she made no reply, he said, "Do you read
+French ? '
+"No; I began, but when I got to the verbs, father
+died,' she said simply.
+'I do -- -when I have an opportunity, which latterly
+has not been often (my mother was a Parisienne) -- -and
+there's a proverb they have, Qui aime bien chatie bien
+ -- "He chastens who loves well." Do you understand
+me?
+'Ah!' she replied, and there was even a little tremu+
+lousness in the usually cool girl's voice; 'if you can
+only fight half as winningly as you can talk, you are
+able to make a pleasure of a bayonet wound!' And
+then poor Bathsheba instanly perceived her slip in
+making this admission: in hastily trying to retrieve it,
+she went from bad to worse. 'Don't, however, suppose
+that I derive any pleasure from what you tell me.'
+'I know you do not -- -I know it perfectly,' said Troy,
+with much hearty conviction on the exterior of his face:
+and altering the expression to moodiness; 'when a
+dozen men arfe ready to speak tenderly to you, and
+give the admiration you deserve without adding the
+warning you need, it stands to reason that my poor
+rough-and-ready mixture of praise and blame cannot
+convey much pleasure. Fool as I may be, I am not so
+conceited as to suppose that!'
+'I think you -- -are conceited, nevertheless,' said
+Bathsheba, looking askance at a reed she was fitfully
+pulling with one hand, having lately grown feverish
+under the soldier's
+<P 228>
+system of procedure -- not because
+the nature of his cajolery was entirely unperceived, but
+because its vigour was overwelming.
+'I would not own it to anybody esle -- nor do I
+exactly to you. Still, there might have been some self+
+conceit in my foolish supposition the other night. I
+knew that what I said in admiration might be an
+opinion too often forced upon you to give any pleasure
+but I certainly did think that the kindness of your
+nature might prevent you judging an uncontrolled
+tongue harshly -- which you have done -- and thinking
+badly of me and wounding me this morning, when I
+am working hard to save your hay.'
+'Well, you need not think more of that: perhaps you
+did not mean to be rude to me by speaking out your
+mind: indeed, I believe you did not,' said the shrewd
+woman, in painfully innocent earnest. 'And I thank
+you for giving help here. But -- -but mind you don't
+speak to me again in that way, or in any other, unless
+I speak to you.'
+'O, Miss Bathsheba! That is to hard!'
+'No, it isn't. Why is it?'
+'You will never speak to me; for I shall not be
+here long. I am soon going back again to the miser+
+able monotony of drill -- and perhaps our regiment will
+be ordered out soon. And yet you take away the one
+little ewe-lamb of plaesure that I have in this dull life
+of mine. Well, perhaps generosity is not a woman's
+most marked characteristic.'
+'When are you going from here?' she asked, with
+some interest.
+'In a month.'
+'But how can it give you pleasure to speak to me?'
+'Can you ask Miss Everdene -- knowing as you do
+ -- what my offence is based on?'
+'I you do care so much for a silly trifle of that
+kind, then, I don't mind doing it,' she uncertainly and
+doubtingly answered. 'But you can't really care for a
+word from me? you only say so -- I think you only
+say so.'
+'that's unjust -- but I won't repeat the remark. I
+am too
+<P 229>
+gratified to get such a mark of your friendship
+at any price to cavil at the tone. I do Miss Everdene,
+care for it. You may think a man foolish to want a
+mere word --  just a good morning. Perhaps he is -- I
+don't know. But you have never been a man looking
+upon a woman, and that woman yourself.'
+" Well.'
+" Then you know nothing of what such an experience
+is like -- and Heaven forbid that you ever should!'
+"Nonsense, flatterer! What is it like? I am
+interested in knowing."
+"Put shortly, it is not being able to think, hear, or
+look in any direction except one without wretchedness,
+nor there without torture.'
+" Ah, sergeant, it won't do -- you are pretending ! ' she
+said, shaking her head. ' Your words are too dashing
+to be true.'
+"I am not, upon the honour of a soldier'
+"But why is it so? -- Of course I ask for mere pas+
+time.'
+" Because you are so distracting -- and I am so
+distracted. '
+" You look like it.'
+" I am indeed.'
+" Why, you only saw me the other night!'
+" That makes no difference. The lightning works in+
+stantaneously. I loved you then, at once -- as I do now.'
+Bathsheba surveyed him curiously, from the feet
+upward, as high as she liked to venture her glance,
+which was not quite so high as his eyes.
+" You cannot and you don"t,' she said demurely.
+"There is-no such sudden feeling in people. I won't
+listen to you any longer. Hear me, I wish I knew what
+o'clock it is -- I am going -- I have wasted too much time
+here already!"
+The sergeant looked at his watch and told her.
+" What, haven't you a watch, miss?' he inquired.
+"I have not just at present -- I am about to get a
+new one.'
+"No. You shall be given one. Yes -- you  shall.
+A gift, Miss Everdene -- a gift."
+And before she knew what the young -- man was
+intending, a heavy gold watch was in her hand.
+<P 230>
+"It is an unusually good one for a man like me to
+possess,' he quietly said. "That watch has a history.
+Press the spring and open the back.'
+She did so.
+'What do you see?'
+'A crest and a motto.'
+" A coronet with five points, and beneath, Cedit amor
+rebus -- "Love yields to circumstance." It's the motto
+of the Earls of Severn. That watch belonged to the
+last lord, and was given to my mother's husband, a
+medical man, for his use till I came of age, when it was
+to be given to me. It was all the fortune that ever I
+inherited. That watch has regulated imperial interests
+in its time -- the stately ceremonial, the courtly assigna+
+tion, pompous travels, and lordly sleeps. Now it is
+yours.
+" But, Sergeant Troy, I cannot take this -- I cannot ! '
+she exclaimed, with round-eyed wonder. " A gold watch !
+What are you doing? Don't be such a dissembler!"
+The sergeant retreated to avoid receiving back his
+gift, which she held out persistently towards him.
+Bathsheba followed as he retired.
+"Keep it -- do, Miss Everdene -- keep it !' said the
+erratic child of impulse. " The fact of your possessing
+it makes it worth ten times as much to me. A more
+plebeian one will answer my purpose just as well, and
+the pleasure of knowing whose heart my old one beats
+against -- well, I won't speak of that. It is in far
+worthier hands than ever it has been in before.'
+"But indeed I can't have it!' she said, in a perfect
+simmer of distress. " O, how can you do such a thing ;
+that is if you really mean it! Give me your dead
+father's watch, and such a valuable one! You should
+not be so reckless, indeed, Sergeant Troy!'
+"I loved my father: good; but better, I love you
+more. That's how I can do it,' said the sergeant, with
+an intonation of such exquisite fidelity to nature that it.
+was evidently not all acted now. Her beauty, which,
+whilst it had been quiescent, he had praised in jest,
+had in its animated phases moved him to
+<P 231>
+earnest; and
+though his seriousness was less than she imagined, it
+was probably more than he imagined himself.
+Bathsheba was brimming with agitated bewilderment,
+and she said, in half-suspicious accents of feeling, "Can
+it be! 0, how can it be, that you care for me, and
+so suddenly,! You have seen so little of me: I may
+not be really so -- so nice-looking as I seem to you.
+Please, do take it ; O, do! I cannot and will not have
+it. Believe me, your generosity is too great. I have
+never done you a single kindness, and why should you
+be so kind to me?'
+A factitious reply had been again upon his lips, but
+it was again suspended, and he looked at her with an
+arrested eye. The truth was, that as she now stood --
+excited, wild, and honest as the day --  her alluring
+beauty bore out so fully the epithets he had bestowed
+upon it that he was quite startled at his temerity in
+advancing them as false. He said mechanically, "Ah,
+why ?' and continued to look at her.
+"And my workfolk see me following you about the
+field, and are wondering. O, this is dreadful!' she
+went on, unconscious of the transmutation she was
+effecting.
+"I did not quite mean you to accept it at first, for it
+as my one poor patent of nobility,' he broke out,
+bluntly; "but, upon my soul, I wish you would now.
+Without any shamming, come! Don't deny me the
+happiness of wearing it for my sake ? But you are too
+lovely even to care to be kind as others are.'
+" No, no ; don"t say so !. I have reasons for reserve
+which I cannot explain.'
+" bet it be, then, let it be,' he said, receiving back
+the watch at last; "I must be leaving you now. And
+will you speak to me for these few weeks of my stay ? '
+'Indeed I will. Yet, I don't know if I will! O,
+why did you come and disturb me so !'
+"Perhaps in setting a gin, I have caught myself.
+Such things have happened. Well, will you let me
+work in your fields ? ' he coaxed.
+" Yes, I suppose so ; if it is any pleasure to you.'
+" Miss Everdene, I thank you.
+" No, no.'
+<P 232>
+'Good-bye!'
+The sergeant brought his hand to the cap on the
+slope of his head, saluted, and returned to the distant
+group of haymakers.
+Bathsheba could not face the haymakers now. Her
+heart erratically flitting hither and thither from per+
+plexed excitement, hot, and almost tearful, she retreated
+homeward, murmuring, O, what have I done ! What
+does it mean ! I wish I knew how much of it was
+true!
+<C xxvii>
+<P 233>
+HIVING THE BEES
+THE Weatherbury bees were late in their swarming this
+year. It was in the latter part of June, and the day after
+the interview with Troy in the hayfield, that Bathsheba
+was standing in her garden, watching a swarm in the
+air and guessing their probable settling place. Not only
+were they late this year, but unruly. Sometimes through+
+out a whole season all the swarms would alight on the
+lowest attainable bough -- such as part of a currant-bush
+or espalier apple-tree ; next year they would, with just
+the same unanimity, make straight off to the uppermost
+member of some tall, gaunt costard, or quarrenden,
+and there defy all invaders who did not come armed
+with ladders and staves to take them.
+This was the case at present. Bathsheba's eyes,
+shaded by one hand, were following the ascending
+multitude against the unexplorable stretch of blue till
+they ultimately halted by one of the unwieldy trees
+spoken of. A process somewhat analogous to that of
+alleged formations of the universe, time and times ago,
+was observable. The bustling swarm had swept the sky
+in a scattered and uniform haze, which now thickened to
+a nebulous centre: this glided on to a bough and grew
+still denser, till it formed a solid black spot upon the
+light.
+The men and women being all busily engaged in
+saving the hay -- even Liddy had left the house for the
+purpose of lending a hand -- Bathsheba resolved to hive
+the bees herself, if possible. She had dressed the hive
+with herbs and honey, fetched a ladder, brush, and
+crook, made herself impregnable with armour of leather
+gloves, straw hat, and large gauze veil -- once green but
+now faded to snuff colour -- and ascended a dozen rungs
+of the ladder. At once she heard, not ten yards off,
+a voice that was beginning to have a strange power in
+agitating her.
+<P 234>
+"Miss Everdene, let me assist you ; you should not
+attempt such a thing alone.'
+Troy was just opening the garden gate.
+Bathsheba flung down the brush, crook, and empty
+hive, pulled the skirt of her dress tightly round her
+ankles in a tremendous flurry, and as well as she could
+slid down the ladder. By the time she reached the
+bottom Troy was there also, and he stooped to pick
+up the hive.
+"How fortunate I am to have dropped in at this
+moment!' exclaimed the sergeant.
+She found her voice in a minute. "What! and will
+you shake them in for me?' she asked, in what, for a
+defiant girl, was a faltering way; though, for a timid
+girl, it would have seemed a brave way enough.
+" Will I ! ' said Troy. " Why, of course I will. How
+blooming you are to-day ! ' Troy flung down his cane
+and put his foot on the ladder to ascend.
+"But you must have on the veil and gloves, or you'll
+be stung fearfully!'
+"Ah, yes. I must put on the veil and gloves. Will
+you kindly show me how to fix them properly?'
+'And you must have the broad-brimmed hat, too ;, for
+your cap has no brim to keep the veil off, and they'd
+reach your face.'
+" The broad-brimmed hat, too, by all means.'
+So a whimsical fate ordered that her hat should be
+taken off -- veil and all attached -- and placed upon his
+head, Troy tossing his own into a gooseberry bush.
+Then the veil had to be tied at its lower edge round
+his collar and the gloves put on him.
+He looked such an extraordinary object in this guise
+that, flurried as she was, she could not avoid laughing
+outright. It was the removal of yet another stake from
+the palisade of cold manners which had kept him off
+Bathsheba looked on from the g:-ound whilst he was
+busy sweeping and shaking the bees from the tree,
+holding up the hive with the other hand for them to
+fall into. She made use of an unobserved minute
+whilst his attention was absorbed in the
+<P 235>
+operation to
+arrange her plumes a little. He came down holding
+the hive at arm's length, behind which trailed a cloud
+of bees.
+' Upon my life,' said Troy, through the veil, ' holding
+up this hive makes one"s arm ache worse than a week
+of sword-exercise.' When the manoeuvre was complete
+he approached her. 'Would you be good enough to
+untie me and let me out? I am nearly stifled inside
+this silk cage.'
+To hide her embarrassment during the unwonted
+process of untying the string about his neck, she said : --
+'I have never seen that you spoke of.'
+'What ?'
+'The sword-exercise.'
+'Ah ! would you like to ?' said Troy.
+Bathsheba hesitated. She had heard wondrous
+reports from time to time by dwellers in Weatherbury,
+who had by chance sojourned awhile in Casterbridge,
+near the barracks, of this strange and glorious perform+
+ance, tlie sword-exercise. Men and boys who had
+peeped through chinks or over walls into the barrack+
+yard returned with accounts of its being the most
+flashing affair conceivable ; accoutrements and weapons
+glistening like stars-here,there,around-yet all by rule
+and compass. So she said mildly what she felt strongly.
+'Yes ; I should like to see it very much.'
+'And so you shall; you shall see me go through it.'
+'No! How?'
+'Let me consider.'
+'Not with a walking-stick -- I don't care to see that.
+lt must be a real sword.'
+'Yes, I know; and I have no sword here; but I
+think I could get one by the evening. Now, will you
+do this?'
+'O no, indeed !' said Bathsheba, blushing. ' Thank
+you very much, but I couldn't on any account.
+'Surely you might? Nobody would know.'
+She shook her head, but with a weakened negation.
+' If I were to,' she said, 'I must bring Liddy too. Might
+I not?'
+<P 236>
+Troy looked far away. 'I don't see why you want
+to bring her,' he said coldly.
+An unconscious look of assent in Bathsheba's eyes
+betrayed that something more than his coldness had
+made her also feel that Liddy Would be superfluous in
+the suggested scene. She had felt it, even whilst making
+the proposal.
+'Well, I won't bring Liddy -- and I'll come. But
+only for a very short time,' she added; 'a very short
+time.'
+'It will not take five minutes,' said Troy.
+<P 237>
+<C xxviii>
+THE HOLLOW AMID THE FERNS
+THE hill opposite Bathsheba's dwelling extended, a
+mile off, into an uncultivated tract of land, dotted at
+this season with tall thickets of brake fern, plump and
+diaphanous from recent rapid growth, and radiant in
+hues of clear and untainted green.
+At eight o'clock this midsummer evening, whilst the
+bristling ball of gold in the west still swept the tips of
+the ferns with its long, luxuriant rays, a soft brushing+
+by of garments might have been heard among them,
+and Bathsheba appeared in their midst, their soft,
+feathery arms caressing her up to her shoulders. She
+paused, turned, went back over the hill and half-way
+to her own door, whence she cast a farewell glance upon
+the spot she had just left, having resolved not to remain
+near the place after all.
+She saw a dim spot of artificial red moving round
+the shoulder of the rise. It disappeared on the other
+side.
+She waited one minute -- two minutes -- thought of
+Troy's disappointment at her non-fulfilment of a promised
+engagement, till she again ran along the field, clambered
+over the bank, and followed the original direction. She
+was now literally trembling and panting at this her
+temerity in such an errant undertaking; her breath
+came and went quickly, and her eyes shone with an in+
+frequent light. Yet go she must. She reached the
+verge of a pit in the middle of the ferns. Troy stood
+in the bottom, looking up towards her.
+'I heard you rustling through the fern before I saw
+you,' he said, coming up and giving her his hand to help
+her down the slope.
+The pit was a saucer-shaped concave, naturally
+formed, with a top diameter of about thirty feet, and
+shallow enough to allow the sunshine to reach their
+heads. Standing in the
+<P 238>
+centre, the sky overhead was
+met by a circular horizon of fern : this grew nearly to
+the bottom of the slope and then abruptly ceased. The
+middle within the belt of verdure was floored with a
+thick flossy carpet of moss and grass intermingled, so
+yielding that the foot was half-buried within it.
+'Now,' said 'Troy, producing the sword, which, as he
+raised it into the sunlight, gleamed a sort of greeting,
+like a living thing, 'first, we have four right and four
+left cuts; four right and four left thrusts. Infantry cuts
+and guards are more interesting than ours, to my mind;
+but they are not so swashing. They have seven cuts
+and three thrusts. So much as a preliminary. Well,
+next, our cut one is as if you were sowing your corn --
+so.' Bathsheba saw a sort of rainbow, upside down in
+the air, and Troy's arm was still again. 'Cut two, as if
+you were hedging -- so. Three, as if you were reaping
+ -- so.' Four, as if you were threshing -- in that way.
+'Then the same on the left. The thrusts are these : one,
+two, three, four, right ; one, two, three, four, left.' He
+repeated them. 'Have 'em again ?' he said. 'One,
+two --  -- '
+She hurriedly interrupted : 'I'd rather not; though
+I don't mind your twos and fours; but your ones and
+threes are terrible !'
+'Very well. I'll let you off the ones and threes.
+Next, cuts, points and guards altogether.' Troy duly
+exhibited them. 'Then there's pursuing practice, in
+this way.' He gave the movements as before. 'There,
+those are the stereotyped forms. The infantry have
+two most diabolical upward cuts, which we are too
+humane to use. Like this -- three, four.'
+'How murderous and bloodthirsty !'
+'They are rather deathy. Now I'll be more inter+
+esting, and let you see some loose play -- giving all the
+cuts and points, infantry and cavalry, quicker than
+lightning, and as promiscuously -- with just enough rule
+to regulate instinct and yet not to fetter it. You are
+my antagonist, with this difference from real warfare,
+that I shall miss you every time by one hair's breadth,
+or perhaps two. Mind you don't flinch, whatever you
+do.'
+<P 239>
+'I'll be sure not to!' she said invincibly.
+He pointed to about a yard in front of him.
+Bathsheba's adventurous spirit was beginning to find
+some grains of relish in these highly novel proceedings.
+She took up her position as directed, facing Troy.
+'Now just to learn whether you have pluck enough
+to let me do what I wish, I'll give you a preliminary
+test.'
+He flourished the sword by way of introduction
+number two, and the next thing of which she was
+conscious was that the point and blade of the sword
+were darting with a gleam towards her left side, just
+above her hip; then of their reappearance on her right
+side, emerging as it were from between her ribs, having
+apparently passed through her body. The third item
+of consciousness was that of seeing the same sword,
+perfectly clean and free from blood held vertically in
+Troy's hand (in the position technically called 'recover
+swords'). All was as quick as electricity.
+'Oh!' she cried out in affright, pressing her hand to
+her side. ' Have you run me through ? -- no, you have
+not! Whatever have you done!'
+'I have not touched you,' said Troy, quietly. 'It
+was mere sleight of hand. The sword passed behind
+you. Now you are not afraid, are you ? Because if
+you are l can't perform. I give my word that l will
+not only not hurt you, but not once touch you.'
+'I don't think I am afraid. You are quite sure you
+will not hurt me ?'
+'Quite sure.'
+"Is the sWord very sharp ?'
+'O no -- only stand as still as a statue. Now !'
+In an instant the atmosphere was transformed to
+Bathsheba's eyes. Beams of light caught from the low
+sun's rays, above, around, in front of her, well-nigh shut
+out earth and heaven -- all emitted in the marvellous
+evolutions of Troy's reflecting blade, which seemed
+everywhere at once, and yet nowherre specially. These
+circling gleams were accompanied by a keen rush that
+was almost a whistling -- also springing
+<P 240>
+from all sides of
+her at once. In short, she was enclosed in a firmament
+of light, and of sharp hisses, resembling a sky-full of
+meteors close at hand.
+Never since the broadsword became the national
+weapon had there been more dexterity shown in its
+management than by the hands of Sergeant Troy, and
+never had he been in such splendid temper for the
+performance as now in the evening sunshine among the
+ferns with Bathsheba. It may safely be asserted with
+respect to the closeness of his cuts, that had it been
+possible for the edge of the sword to leave in the air a
+permanent substance wherever it flew past, the space
+left untouched would have been almost a mould of
+Bathsheba's figure.
+Behind the luminous streams of this aurora militaris,
+she could see the hue of Troy's sword arm, spread in a
+scarlet haze over the space covered by its motions, like
+a twanged harpstring, and behind all Troy himself,
+mostly facing her; sometimes, to show the rear cuts,
+half turned away, his eye nevertheless always keenly
+measuring her breadth and outline, and his lips tightly
+closed in sustained effort. Next, his movements lapsed
+slower, and she could see them individually. The
+hissing of the sword had ceased, and he stopped
+entirely.
+'That outer loose lock of hair wants tidying, he
+said, before she had moved or spoken. 'Wait: I'll do
+it for you.'
+An arc of silver shone on her right side: the sword
+had descended. The lock droped to the ground.
+'Bravely borne!' said Troy. 'You didn't flinch a
+shade's thickness. Wonderful in a woman!'
+'It was because I didn't expect it. O, you have
+spoilt my hair!'
+'Only once more.'
+'No -- no! I am afraid of you -- indeed I am !' she
+cried.
+'I won't touch you at all -- not even your hair. I
+am only going to kill that caterpillar settling on you.
+Now: still!'
+It appeared that a caterpillar had come from the
+fern and chosen the front of her bodice as his resting
+place. She saw the point glisten towards her bosom,
+and seemingly enter it. Bathsheba closed her eyes in
+the full persuasion that she was
+<P 241>
+killed at last. How+
+ever, feeling just as usual, she opened them again.
+'There it is, look,' said the sargeant, holding his
+sword before her eyes.
+The caterpillar was spitted upon its point.
+'Why, it is magic!' said Bathsheba, amazed.
+'O no -- dexterity. I merely gave point to your
+bosom where the caterpillar was, and instead of running
+you through checked the extension a thousandth of an
+inch short of your surface.'
+'But how could you chop off a curl of my hair with
+a sword that has no edge?'
+THE HOLLOW AMID THE FERNS
+"No edge .! This sword will shave like a razor.
+Look here.'
+He touched the palm of his hand with the blade,
+and then, lifting it, showed her a thin shaving of scarf+
+skin dangling therefrom.
+" But you said before beginning that it was blunt and
+couldn't cut me .!'
+'That was to get you to stand still, and so make sure
+of your safety. The risk of injuring you through your
+moving was too great not to force me to tell you a
+fib to escape it.'
+She shuddered. 'I have been within an inch of my
+life, and didn't know it! '
+'More precisely speaking, you have been within half
+an inch of being pared alive two hundred and ninety-five
+tinies.'
+" Cruel, cruel, 'tis of you !. '
+" You have been perfectly safe, nevertheless. My
+sword never errs.' And Troy returned the weapon to
+the scabbard.
+Bathsheba, overcome by a hundred tumultuous feel'
+ings resulting from the scene, abstractedly sat down on
+a tuft of heather.
+'I must leave you now,' said Troy, softly. " And I'll
+venture to take and keep this in remembrance of you.'
+She saw him stoop to the grass, pick up the winding
+lock which he had severcd from her manifold tresses,
+twist it round his fingers, unfasten a button in the hreast
+of his coat, and carefully put it inside. She felt power+
+less to withstand or deny him. He was altogether too
+much for her, and Bathsheba
+<P 242>
+seemed as one who, facing
+a reviving wind, finds it blow so strongly that it stops
+the breath.
+He drew near and said, 'I must be leaving you.'
+He drew nearer still. A minute later and she saw his
+scarlet form disappear amid the ferny thicket, almost in
+a flash, like a brand swiftly waved.
+That minute's interval had brought the blood beating
+into her face, set her stinging as if aflame to the very
+hollows oi her feet, and enlarged emotion to a compass
+which quite swamped thought. It had brought upon
+her a stroke resulting, as did that of Moses in Horeh, in
+a liquid stream -- here a stream of tears. She felt like
+one who has sinned a great sin.
+The circumstance had been the gentle dip of Troy's
+mouth downwards upon her own. He had kissed her,
+PARTICULARS OF A TWILIGHT WALK
+<C xxix>
+<P 243>
+PARTICULARS OF A TWILIGHT WALK
+WE now see the element of folly distinctly mingling
+with the many varying particulars which made up the
+character of Bathsheba Everdene. It was almost foreign
+to her intrinsic nature. Introduced as lymph on the
+dart of Eros, it eventually permeated and coloured
+her whole constitution. Bathsheba, though she had too
+much understanding to be entirely governed by her
+womanliness, had too much womanliness to use her
+understanding to the best advantage. Perhaps in no
+minor point does woman astonish her helpmate more
+than in the strange power she possesses of believing
+cajoleries that she knows to be false -- except, indeed, in
+that of being utterly sceptical on strictures that she
+knows to be true.
+Bathsheba loved Troy in the way that only self-reliant
+women love when they abandon their self-reliance.
+When a strong woman recklessly throws away her
+strength she is worse than a weak woman who has never
+had any strength to throw away. One source of her
+inadequacy is the novelty of the occasion. She has
+never had practice in making the best of such a
+condition. Weakness is doubly weak by being new.
+Bathsheba was not conscious of guile in this matter.
+Though in one sense a woman of the world, it was, after
+all, that world of daylight coteries and green carpets
+wherein cattle form the passing crowd and winds the
+busy hum ; where a quiet family of rabbits or hares lives
+on the other side of your party-wall, where your neigh+
+bour is everybody in the tything, and where calculation
+formulated self-indulgence of bad, nothing at all. Had
+her utmost thoughts in this direction been distinctly
+worded (and by herself they never were), they would
+<P 244>
+only have amounted to such a matter as that she felt
+her impulses to be pleasanter guides than her discretion .
+Her love was entire as a child's, and though warm as
+summer it was fresh as spring. Her culpability lay in
+her making no attempt to control feeling by subtle and
+careful inquiry into consuences. She could show others
+the steep and thorny way, but 'reck'd not her own rede,'
+And Troy's deformities lay deep down from a
+woman's vision, whilst his embellishments were upon
+the verysurface; thus contrasting with homely Oak,
+whose defects were patent to the blindest, and whose
+vertues were as metals in a mine.
+The difference between love and respect was mark+
+edly shown in her conduct. Bathsheba had spoken of
+her interest in Boldwood with the greatest freedom to
+Liddy, but she had only communed with her own heart
+concerning 'Troy'.
+All this infatuation Gabriel saw, and was troubled
+thereby from the time of his daily journey a-field to the
+time of his return, and on to the small hours of many a
+night. That he was not beloved had hitherto been his
+great that Bathsheba was getting into the toils
+was now a sorrow greater than the first, and one which
+nearly olbscured it. It was a result which paralleled
+the oft-quoted observation of Hippocrates concerning
+physical pains.
+That is a noble though perhaps an unpromising love
+PARTICULARS OF A TWILlGHT WALK
+which not even the fear of breeding aversion in the
+bosom of the one beloved can deter from combating his
+or her errors. Oak determined to speak to his mistress.
+He would base his appeal on what he considered her
+unfair treatment of Farmer Boldwood, now absent from
+home.
+An opportunity occurred one evening when she had
+gone for a short walk by a path through the neighbour+
+ing cornfields. It was dusk when Oak, who had not
+been far a-field that day, took the same path and met
+her returning, quite pensively, as he thought.
+The wheat was now tall, and the path was narrow;
+thus the way was quite a sunken groove between the
+embowing thicket on either side. Two persons could
+not walk abreast
+<P 245>
+without damaging the crop, and Oak
+stood aside to let her pass.
+'Oh, is it Gabriel?' she said. 'You are taking a
+walk too. Good-night.'
+"I thought I would come to meet you, as it is rather
+late," said Oak, turning and following at her heels when
+she had brushed somewhat quickly by him.
+"Thank you, indeed, but I am not very fearful.'
+" O no ; but there are bad characters about.'
+"I never meet them.'
+Now Oak, with marvellous ingenuity, had been going
+to introduce the gallant sergeant through the channel of
+"bad characters.' But all at once the scheme broke
+down, it suddenly occurring to him that this was rather a
+clumsy way, and too barefaced to begin with. He tried
+another preamble.
+"And as the man who would naturally come to meet
+you is away from home, too -- I mean Farmer Boldwood
+ -- why, thinks I, I'll go,' he said.
+"Ah, yes.' She walked on without turning her head,
+and for many steps nothing further was heard from her
+quarter than the rustle of her dress against the heavy
+corn-ears. Then she resumed rather tartly --
+'I don't quite understand what you meant by saying
+that Mr. Boldwood would naturally come to meet me.'
+I meant on account of the wedding which they say
+is likely to take place between you and him, miss. For+
+give my speaking plainly.'
+"They say what is not true,' she returned quickly.
+No marriage is likely to take place between us.'
+Gabriel now put forth his unobscured opinion, for
+the moment had come. " Well, Miss Everdene,' he
+said, "putting aside what people say, I never in my life
+saw any courting if his is not a courting of you."
+Bathsheba would probably have terminated the con'
+versation there and then by flatly forbidding the subject,
+had not her conscious weakness of position allured her
+to palter and argue in endeavours to better it.
+<P 246>
+"Since this subject has been mentioned,' she said
+very emphatically, 'I am glad of the opportunity of
+clearing up a mistake which is very common and very
+provoking. I didn't definitely promise Mr. Boldwood
+anything. I have never cared for him. I respect him,
+and he has urged me to marry him. But I have given
+him no distinct answer. As soon as he returns I shall
+do so; and the answer will be that I cannot think of
+marrying him.'
+'People are full of mistakes, seemingly.'
+' They are.'
+The other day they said you were trifling with him,
+and you almost proved that you were not; lately they
+have said that you be not, and you straightway begin
+to show --  -- '
+That I am, I suppose you mean.'
+' Well, I hope they speak the truth.'
+They do, but wrongly applied. I don't trifle with
+him ; but then, I have nothing to do with him.'
+Oak was unfortunately led on to speak of Boldwood's
+rival in a wrong tone to her after all. 'I wish you had
+never met that young Sergeant Troy, miss,' he sighed.
+PARTlCULARS OF A TWILIGHT WALK
+Bathsheba's steps became faintly spasmodic. " Why?'
+she asked.
+' He is not good enough for 'ee.'
+"Did any one tell you to speak to me like this ?'
+" Nobody at all.'
+"Then it appears to me that Sergeant Troy does not
+concern us here,' she said, intractably. ' Yet I must say
+that Sergeant 'Troy is an educated man, and quite worthy
+of any woman. He is well born.'
+"His being higher in learning and birth than the
+ruck o' soldiers is anything but a proof of his worth. It
+show's his course to be down'ard.'
+"I cannot see what this has to do with our conversa+
+tion. Mr. Troy's course is not by any means downward;
+and his superiority <1is>1 a proof of his worth .! '
+"I believe him to have no conscience at all. And I
+cannot help begging you, miss, to have nothing to do
+with him. Listen to me this once -- only this once !.
+I don't say he's such
+<P 247>
+a bad man as I have fancied -- I
+pray to God he is not. But since we don't exactly
+know what he is, why not behave as if he <1might>1 be bad,
+simply for your own safety ? Don't trust him, mistress;
+I ask you not to trust him so.'
+" Why, pray ? '
+"I like soldiers, but this one I do not like,' he said,
+sturdily. " His cleverness in his calling may have
+tempted him astray, and what is mirth to the neighbours
+is ruin to the woman. When he tries to talk to 'ee again,
+why not turn away with a short 'Good day' ; and when
+you see him coming one way, turn the other. When
+he says anything laughable, fail to see the point
+and don't smile, and speak of him before those who will
+report your talk as "that fantastical man,' or " that
+Sergeant What's-his-name." "That man of a family
+that has come to the dogs.' Don't be unmannerly
+towards en, but harmless-uncivil, and so get rid of the
+man.'
+No Christmas robin detained by a window-pane ever
+pulsed as did Bathsheba now.
+I say -- I say again -- that it doesn't become you to
+talk about him. Why he should be mentioned passes
+me quite . she exclaimed desperately. " I know this,
+th-th-that he is a thoroughly conscientious man -- blunt
+sometimes even to rudeness -- but always speaking his
+mind about you plain to your face .! '
+"Oh.'
+"He is as good as anybody in this parish.! He is
+very particular, too, about going to church -- yes, he
+is.!'
+'I am afraid nobody saw him there. I never
+did certainly.'
+' The reason of that is,' she said eagerly, " that he goes
+in privately by the old tower door, just when the service
+commences, and sits at the back of the gallery. He
+told me so.'
+This supreme instance of Troy's goodness fell upon
+Gabriel ears like the thirteenth stroke of crazy clock.
+It was not only received with utter incredulity as re+
+garded itself, but threw a doubt on all the assurances
+that had preceded it.
+Oak was grieved to find how entirely she trusted him.
+He brimmed with deep feeling as he replied in a steady
+voice, the
+<P 248>
+steadiness of which was spoilt by the palpable+
+ness of his great effort to keep it so : --
+' You know, mistress, that I love you, and shall love
+you always. I only mention this to bring to your mind
+that at any rate I would wish to do you no harm :
+beyond that I put it aside. I have lost in the race for
+money and good things, and I am not such a fool as to
+pretend to 'ee now I am poor, and you have got alto+
+gether above me. But Bathsheba, dear mistress, this
+I beg you to consider -- that, both to keep yourself well
+honoured among the workfolk, and in common generosity
+to an honourable man who loves you as well as I, you
+PARTICULARS OF A TWILIGHT WALK
+should be more discreet in your bearing towards this
+soldier.'
+" Don't, don't, don't !. ' she exclaimed, in a choking
+voice.
+"Are ye not more to me than my own affairs, and
+even life .! ' he went on. "Come, listen to me.! I am
+six years older than you, and Mr. Boldwood is ten years
+older than I, and consider -- I do beg of 'ee to consider
+before it is too late -- how safe you would be in his
+hands .! '
+Oak's allusion to his own love for her lessened, to
+some extent, her anger at his interference ; but she
+could not really forgive him for letting his wish to marry
+her be eclipsed by his wish to do her good, any more
+than for his slighting treatment of Troy.
+"I wish you to go elsewhere,' she commanded, a
+paleness of face invisible to the eye being suggested by
+the trembling words. " Do not remain on this farm any
+longer. I don't want you -- I beg you to go !.'
+"That's nonsense,' said Oak, calmly. " This is the
+second time you have pretended to dismiss me; and
+what's the use o' it?'
+" Pretended !. You shall go, sir -- your lecturing I
+will not hear .! I am mistress here.'
+" Go, indeed -- what folly will you say next ? Treating
+me like Dick, Tom and Harry when you know that a
+short time ago my position was as good as yours !. Upon
+my life, Bathsheba, it is too barefaced. You know, too,
+that I can't go without putting things in such a strait as
+you wouldn't get out of
+<P 249>
+I can't tell when. Unless, indeed,
+you'll promise to have an understanding man as bailiff,
+or manager, or something. I'll go at once if you'll
+promise that.'
+'I shall have no bailiff; I shall continue to be my
+own manager,' she said decisively.
+"Very well, then ; you should be thankful to me for
+biding. How would the farm go on with nobody to
+mind it but a woman? But mind this, I don't wish
+'ee to feel you owe me anything. Not I. What I do,
+I do. Sometimes I say I should be as glad as a bird to
+leave the place -- for don't suppose I'm content to be a
+nobody. I was made for better things. However, I
+don't like to see your concerns going to ruin, as they
+must if you keep in this mind.... I hate taking my
+own measure so plain, but, upon my life, your provok+
+ing ways make a man say what he wouldn't dream of
+at other times ! I own to being rather interfering. But
+you know well enough how it is, and who she is that I
+like too well, and feel too much like a fool about to be
+civil to her ! '
+It is more than probable that she privately and un+
+consciously respected him a little for this grim fidelity,
+which had been shown in his tone even more than in
+his words. At any rate she murmured something to the
+effect that he might stay if he wished. She said more
+distinctly, " Will you leave me alone now? I don't
+order it as a mistress -- I ask it as a woman, and I
+expect you not to be so uncourteous as to refuse.'
+" Certainly I will, Miss Everdene,' said Gabriel, gently.
+He wondered that the request should have come at this
+moment, for the strife was over, and they were on a
+most desolate hill, far from every human habitation, and
+the hour was getting late. He stood still and allowed
+her to get far ahead of him till he could only see her
+form upon the sky.
+A distressing explanation of this anxiety to be rid of
+him at that point now ensued. A figure apparently rose
+from the earth beside her. The shape beyond all doubt
+was Troy's. Oak would not be even a possible listener,
+and at once turned back till a good two hundred yards
+were between the lovers and himself.
+<P 250>
+Gabriel went home by way of the churchyard. In
+passing the tower he thought of what she had said about
+the sergeant's virtuous habit of entering the church un+
+PARTICULARS OF A TWILIGHT WALK
+perceived at the beginning of service. Believing that
+the little gallery door alluded to was quite disused, he
+ascended the external flight of steps at the top of which
+it stood, and examined it. The pale lustre yet hanging
+in the north-western heaven was sufficient to show that
+a sprig of ivy had grown from the wall across the door
+to a length of more than a foot, delicately tying the
+panel to the stone jamb. It was a decisive proof that
+the door had not been opened at least since Troy came
+back to Weatherbury.
+<C xxx>
+<P 251>
+HOT CHEEKS AND TEARFUL EYES
+HALF an hour later Bathsheba entered her own house.
+There burnt upon her face when she met the light of
+the candles the flush and excitement which were little
+less than chronic with her now. The farewell words of
+Troy, who had accompanied her to the very door, still
+lingered in her ears. He had bidden her adieu for two
+days, which were so he stated, to be spent at Bath in
+visiting some friends. He had also kissed her a second
+time.
+It is only fair to Bathsheba to explain here a little
+fact which did not come to light till a long time after+
+wards : that Troy's presentation of himself so aptly at
+the roadside this evening was not by any distinctly pre+
+concerted arrangement. He had hinted -- she had
+forbidden; and it was only on the chance of his still
+coming that she had dismissed Oak, fearing a meeting
+between them just then.
+She now sank down into a chair, wild and perturbed
+by all these new and fevering sequences. Then she
+jumped up with a manner of decision, and fetched her
+desk from a side tahle.
+In three minutes, without pause or modification, she
+had written a letter to Boldwood, at his address beyond
+Casterbridge, saying mildly but firmly that she had well
+HOT CHEEKS AND TEARFUL EYES
+considered the whole subject he had brought before her
+and kindly given her time to decide upon; that her
+final decision was that she could not marry him. She
+had expressed to Oak an intention to wait till Boldwood
+came home before communicating to him her conclusive
+reply. But Bathsheba found that she could not wait.
+It was impossible to send this letter till the next day;
+yet to quell her uneasiness by getting it out of her hands,
+and so, as it were, setting the act in motion at once, she
+arose to take it to any one of the women who might be
+in the kitchen.
+<P 252>
+She paused in the passage. A dialogue was going
+on in the kitchen, and Bathsheba and Troy were the
+subject of it.
+"If he marry her, she'll gie up farming.'
+"Twill be a gallant life, but may bring some trouble
+between the mirth -- so say I.'
+"Well, I wish I had half such a husband.'
+Bathsheba had too much sense to mind seriously
+what her servitors said about her ; but too much womanly
+redundance of speech to leave alone what was said till
+it died the natural death of unminded things. She
+burst in upon them.
+"Who are you speaking of? ' she asked.
+There was a pause before anybody replied. At last
+Liddy said frankly, ' What was passing was a bit of a
+word about yourself, miss.'
+"I thought so .! Maryann and Liddy and Temper+
+ance -- now I forbid you to suppose such things. You
+know I don't care the least for Mr. Troy -- not I. Every+
+body knows how much I hate him. -- Yes,' repeated the
+froward young person, "<1hate>1 him .! '
+" We know you do, miss,' said Liddy; "and so do we
+all.'
+" I hate him too,' said Maryann.
+" Maryann -- O you perjured woman !. How can you
+speak that wicked story ! ' said Bathsheba, excitedly.
+"You admired him from your heart only this morning
+in the very world, you did. Yes, Maryann, you know it ! '
+'Yes, miss, but so did you. He is a wild scamp
+now, and you are right to hate him."
+"He's <1not>1 a wild scamp.! How dare you to my face !.
+I have no right to hate him, nor you, nor anybody.
+But I am a silly woman.! What is it to me what he is ?
+You know it is nothing. I don't care for him ; I don"t
+mean to defend his good name, not I. Mind this, if
+any of you say a word against him you'll be dismissed
+instantly !. '
+She flung down the letter and surged back into the
+parlour, with a big heart and tearful eyes, Liddy following
+her.
+'O miss.!' said mild Liddy, looking pitifully into
+Bathsheba's face. "I am sorry we mistook you so .!
+did think you cared for him; but I see you don't now.'
+" Shut the door, Liddy.'
+<P 253>
+Liddy closed the door, and went on : ' People always
+say such foolery, miss. I'll make answer hencefor'ard,
+"Of course a lady like Miss Everdene can't love him;'
+I'll say it out in plain black and white.'
+Bathsheba burst out : 'O Liddy, are you such a
+simpleton ? Can't you read riddles ? Can't you see?
+Are you a woman yourself ? '
+Liddy's clear eyes rounded with wonderment.
+' Yes; you must be a blind thing, Liddy .! ' she said,
+in reckless abandonment and grief. "O, I love him
+to very distraction and misery and agony .! Don't be
+frightened at me, though perhaps I am enough to frighten
+any innocent woman. Come closer -- closer.' She put
+her arms round Liddy's neck. "I must let it out to
+somebody; it is wearing me away !. Don't you yet know
+enough of me to see through that miserable denial of
+mine? O God, what a lie it was !. Heaven and my
+Love forgive me. And don't you know that a woman
+who loves at all thinks nothing of perjury when it is
+HOT CHEEKS AND TEARFUL EYES
+balanced against her love ? There, go out of the room ;
+I want to be quite alone.'
+Liddy went towards the door.
+' Liddy, come here. Solemnly swear to me that he's
+not a fast man; that it is all lies they say about him !.'
+'Put, miss, how can I say he is not if --  -- '
+"You graceless girl.! How can you have the cruel
+heart to repeat what they say? Unfeeling thing that
+you are.... But <1I'll>1 see if you or anybody else in the
+village, or town either, dare do such a thing .! ' She
+started off, pacing from fireplace to door, and back
+again.
+"No, miss. I don't -- I know it is not true !. ' said
+Liddy, frightened at Bathsheba's unwonted vehemence.
+I suppose you only agree with me like that to please
+me. But, Liddy, he <1cannot be>1 had, as is said. Do you
+hear? "
+' Yes, miss, yes.'
+"And you don't believe he is?"
+'I don't know what to say, miss,' said Liddy, be+
+ginning to cry. "If I say No, you don"t believe me;
+and if I say Yes, you rage at me ! '
+" Say you don't believe it -- say you don't ! '
+<P 254>
+'I don't believe him to be so had as they make out.'
+"He is not had at all.... My poor life and heart,
+how weak I am .! ' she moaned, in a relaxed, desultory
+way, heedless of Liddy's presence. "O, how I wish I
+had never seen him.! Loving is misery for women
+always. I shall never forgive God for making me a
+woman, and dearly am I beginning to pay for the honour
+of owning a pretty face.' She freshened and turned to
+Liddy suddenly. " Mind this, Lydia Smallbury, if you
+repeat anywhere a single word of what l have said to
+you inside this closed door, I'll never trust you, or love
+you, or have you with me a moment longer -- not a
+moment ! '
+" I don't want to repeat anything,' said Liddy, with
+womanly dignity of a diminutive order; "but I don't
+wish to stay with you. And, if you please, I'll go at the
+end of the harvest, or this week, or to-day.... I don't
+see that I deserve to be put upon and stormed at for
+nothing ! ' concluded the small woman, bigly.
+" No, no, Liddy ; you must stay ! ' said Bathsheba,
+dropping from haughtiness to entreaty with capricious
+inconsequence. "You must not notice my being in a
+taking just now. You are not as a servant -- -you are a
+companion to me. Dear, dear -- I don't know what I
+am doing since this miserable ache o'! my heart has
+weighted and worn upon me so .! What shall I come
+to ! I suppose I shall get further and further into
+troubles. I wonder sometimes if I am doomed to die
+in the Union. I am friendless enough, God knows .! '
+'I won't notice anything, nor will I leave you ! " sobbed
+Liddy, impulsively putting up her lips to Bathsheba's,
+and kissing her.
+Then Bathsheba kissed Liddy, and all was smooth
+again.
+"I don't often cry, do I, Lidd ? but you have made
+tears come into my eyes,' she said, a smile shining
+through the moisture. "Try to think him a good man,
+won't you, dear Liddy ? '
+"I will, miss, indeed.'
+"He is a sort of steady man in a wild way, you know.
+way. I am afraid that's how I am. And promise me
+to keep my secret -- do, Liddy.! And do not let them
+know that I have been crying
+<P 255>
+about him, because it will
+be dreadful for me, and no good to him, poor thing .!'
+"Death's head himself shan't wring it from me, mistress,
+if I've a mind to keep anything; and I'll always be your
+friend,' replied Liddy, emphatically, at the same time
+bringing a few more tears into her own eyes, not from
+any particular necessity, but from an artistic sense of
+making herself in keeping with the remainder of the
+HOT CHEEKS AND TEARFUL EYES
+picture, which seems to influence women at such times.
+"I think God likes us to be good friends, don't you ?'
+"Indeed I do.'
+"And, dear miss, you won"t harry me and storm at
+me, will you ? because you seem to swell so tall as a
+lion then, and it frightens me !. Do you know, I fancy
+you would be a match for any man when you are in one
+0' your takings.'
+"Never.! do you ? ' said Bathsheba, slightly laughing,
+though somewhat seriously alarmed by this Amazonian
+picture of herself. "I hope I am not a bold sort of
+maid -- mannish ? ' she continued with some anxiety.
+"O no, not mannish; but so almighty womanish
+that 'tis getting on that way sometimes. Ah ! miss,' she
+said, after having drawn her breath very sadly in and
+sent it very sadly out, "I wish I had half your failing
+that way. 'Tis a great protection to a poor maid in
+these illegit'mate days !. '
+<C xxxi>
+<P 256>
+BLAME -- FURY
+THE next evening Bathsheba, with the idea of getting
+out of the way of Mr. Boldwood in the event of his
+returning to answer her note in person, proceeded to
+fulfil an engagement made with Liddy some few hours
+earlier. Bathsheba's companion, as a gage of their
+reconciliation, had heen granted a week's holiday to
+visit her sister, who was married to a thriving hurdler
+and cattle-crib-maker living in a delightful labyrinth of
+hazel copse not far beyond Yalbury. The arrangement
+was that Miss Everdene should honour them by coming
+there for a day or two to inspect some ingenious con+
+tnvances which this man of the woods had introduced
+into his wares.
+Leaving her instructions with Gabriel and Maryann,
+that they were to see everything carefully locked up for
+the night, she went out of the house just at the close of
+a timely thunder-shower, which had refined the air, and
+daintily bathed the coat of the land, though all beneath
+was dry as ever. Freshness was exhaled in an essence
+from the varied contours of bank and hollow, as if the
+earth breathed maiden breath; and the pleased birds
+were hymning to the scene. Before her, among the
+clouds, there was a contrast in the shape of lairs of
+fierce light which showed themselves in the neighbour+
+hood of a hidden sun, lingering on to the farthest north+
+west corner of the heavens that this midsummer season
+allowed.
+She had walked nearly two miles of her journey,
+watching how the day was retreating, and thinking how
+the time of deeds was quietly melting into the time of
+thought, to give place in its turn to the time of prayer
+and sleep, when she beheld advancing over Yalbury hill
+the very man she sought so anxiously to elude. Boldwood
+was stepping on, not with that quiet tread of reserved
+strength which was his customary
+<P 257>
+gait, in which he
+always seemed to be balancing two thoughts. His
+manner was stunned and sluggish now.
+Boldwood had for the first time been awakened to
+woman's privileges in tergiversation even when it involves
+another person's possible blight. That Bathsheba was
+a firm and positive girl, far less inconsequent than her
+fellows, had been the very lung of his hope ; for he had
+held that these qualities would lead her to adhere to a
+straight course for consistency's sake, and accept him,
+though her fancy might not flood him with the iridescent
+hues of uncritical love. But the argument now came
+back as sorry gleams from a broken mirror. The dis+
+covery was no less a scourge than a surprise.
+He came on looking upon the ground, and did not
+see Bathsheba till they were less than a stone's throw
+apart. He looked up at the sound of her pit-pat, and
+his changed appearance sufficiently denoted to her the
+depth and strength of the feelings paralyzed by her
+letter.
+" Oh ; is it you, Mr. Boldwood ? ' she faltered, a guilty
+warmth pulsing in her face.
+Those who have the power of reproaching in silence
+may find it a means more effective than words. There
+are accents in the eye which are not on the tongue, and
+more tales come from pale lips than can enter an ear.
+It is both the grandeur and the pain of the remoter
+moods that they avoid the pathway of sound. Bold+
+wood's look was unanswerable.
+Seeing she turned a little aside, he said, 'What, are
+you afraid of me?'
+" Why should you say that ? ' said Bathsheba.
+"I fancied you looked so,' said he. 'And it is most
+strange, because of its contrast with my feeling for you.
+She regained self-possession, fixed her eyes calmly,
+and waited.
+" You know what that feeling is,' continued Boldwood,
+deliberately. "A thing strong as death. No dismissal
+by a hasty letter affects that.'
+'I wish you did not feel so strongly about me,' she
+murmured. "It is generous of you, and more than I
+deserve, but I must not hear it now.'
+<P 258>
+"Hear it? What do you think I have to say, then ?
+I am not to marry you, and thats enough. Your letter
+was excellently plain. I want you to hear nothing --
+not I.'
+Bathsheba was unable to direct her will into any
+definite groove for freeing herself from this fearfully
+and was moving on. Boldwood walked up to her heavily
+and dully.
+"Bathsheba -- -darling -- -is it final indeed?'
+"Indeed it is.'
+"O, Bathsheba -- -have pity upon me!' Boldwood
+burst out. "God's sake, yes -- I am come to that low,
+lowest stage -- -to ask a woman for pity! Still, she is
+you -- -she is you.'
+Bathsheba commanded herself well. But she could
+hardly get a clear voice for what came instinctively to
+her lips: "There is little honour to the woman in that
+speech.' It was only whispered, for something unutter+
+ably mournful no less than distressing in this spectacle
+of a man showing himself to be so entirely the vane of a
+passion enervated the feminine instinct for punctilios.
+BLAME
+"I am beyond myself about this, and am mad,' he
+said. "I am no stoic at all to he supplicating here ; but
+I do supplicate to you. I wish you knew what is in
+me of devotion to you ; but it is impossible, that. In
+bare human mercy to a lonely man, don't throw me off
+now !'
+'I don't throw you off -- indeed, how can I ? I never
+had you.' In her noon-clear sense that she had never
+loved him she forgot for a moment her thoughtless angle
+on that day in February.
+'But there was a time when you turned to me,
+before I thought of you ! I don't reproach you, for
+even now I feel that the ignorant and cold darkness
+that I should have lived in if you had not attracted me
+by that letter -- valentine you call it -- would have becn
+worse than my knowledge of you, though it has brought
+this misery. But, I say, there was a time when I knew
+nothing of you, and cared nothing for you, and yet you
+drew me on. And if you say you gave me no en+
+couragement, I cannot but contradict you.'
+<P 259>
+"What you call encouragement was the childish
+game of an idle minute. I have bitterly repented of it
+ -- ay, bitterly, and in tears. Can you still go on re+
+minding me ?'
+'I don't accuse you of it -- I deplore it. I took for
+earnest what you insist was jest, and now this that I
+pray to be jest you say is awful, wretched earnest. Our
+moods meet at wrong places. I wish your feeling was
+more like mine, or my feeling more like yours.! O,
+could I but have foreseen the torture that trifling trick
+was going to lead me into, how I should have cursed
+you ; but only having been able to see it since, I cannot
+do that, for I love you too well.! But it is weak, idle
+drivelling to go on like this.... Bathsheba, you are
+the first woman of any shade or nature that I have ever
+looked at to love, and it is the having been so near
+claiming you for my own that makes this denial so hard
+to bear. How nearly you promised me ! But I don't
+speak now to move your heart, and make you grieve
+because of my pain ; it is no use, that. I must bear it;
+my pain would get no less by paining you.'
+"But I do pity you -- deeply -- O so deeply .!' she
+earnestly said.
+"Do no such thing -- do no such thing. Your dear
+love, Bathsheba, is such a vast thing beside your pity,
+that the loss of your pity as well as your love is no great
+addition to my sorrow, nor does the gain of your pity
+make it sensibly less. O sweet -- how dearly you
+spoke to me behind the spear-bed at the washing-pool,
+and in the barn at the shearing, and that dearest last
+time in the evening at your home.! Where are your
+pleasant words all gone -- your earnest hope to be able
+to love me? Where is your firm conviction that you
+would get to care for me very much ? Really forgotten ?
+ -- really ? '
+She checked emotion, looked him quietly and clearly
+in the face, and said in her low, firm voice, " Mr. Bold+
+wood, I promised you nothing. Would you have had
+me a woman of clay when you paid me that furthest,
+highest compliment a man can pay a woman -- telling
+her he loves her? I was bound to show some feeling,
+if l would not be a graceless shrew. Yet each of those
+pleasures was just for the day -- the day just for the
+<P 260>
+pleasure. How was I to know that what is a pastime
+to all other men was death to you ? Have reason, do,
+and think more kindly of me !'
+'Well, never mind arguing -- never mind. One
+thing is sure: you were all but mine, and now you are
+not nearly mine. Everything is changed, and that by
+you alone, remember. You were nothing to me once,
+and I was contented; you are now nothing to me again,
+and how different the second nothing is from the first .!
+Would to God you had never taken me up, since it was
+only to throw me down .! '
+FURY
+Bathsheba, in spite of her mettle, began to feel un+
+mistakable signs that she was inherently the weaker
+vessel. She strove miserably against this feminity
+which would insist upon supplying unbidden emotions
+in stronger and stronger current. She had tried to
+elude agitation by fixing her mind on the trees, sky, any
+trivial object before her eyes, whilst his reproaches fell,
+but ingenuity could not save her now.
+"I did not take you up -- -surely I did not!' she
+answered as heroically as she could. " But don't be in
+this mood with me. I can endure being told I am in
+the wrong, if you will only tell it me gently! O sir,
+will you not kindly forgive me, and look at it
+cheerfully ? '
+"Cheerfully! Can a man fooled to utter heart+
+burning find a reason for being merry> If I have lost,
+how can I be as if I had won? Heavens you must be
+heartless quite ! Had I known what a fearfully bitter
+sweet this was to be, how would I have avoided you,
+and never seen you, and been deaf of you. I tell you
+all this, but what do you care! You don't care.'
+She returned silent and weak denials to his charges,
+and swayed her head desperately, as if to thrust away
+the words as they came showering ahout her ears from
+the lips of the trembling man in the climax of life, with
+his bronzed Roman face and fine frame.
+"Dearest, dearest, I am wavering even now between
+the two opposites of recklessly renouncing you, and
+labouring humbly for you again. Forget that you have
+said No, and let it be as it was !. Say, Bathsheba, that
+you only wrote that refusal to me in fun -- -come, say it
+to me!'
+<P 261>
+" It would be untrue, and painful to both of us. You
+overrate my capacity for love. I don't possess half
+the warmth of nature you believe me to have. An un+
+protected childhood in a cold world has beaten gentle+
+ness out of me.'
+He immediately said with more resentment: "That
+may be true, somewhat ; but ah, Miss Everdene, it won't
+do as a reason! You are not the cold woman you
+would have me believe. No, no .! It isn't because you
+have no feeling in you that you don't love me. You
+naturally would have me think so -- -you would hide from
+that you have a burning heart like mine. You have
+love enough, but it is turned into a new channel. I
+know where.'
+The swift music of her heart became hubbub now,
+and she throbbed to extremity. He was coming to
+Troy. He did then know what had occurred .! And
+the name fell from his lips the next moment.
+"Why did Troy not leave my treasure alone?' he
+asked, fiercely. "When I had no thought of injuring
+him, why did he force himself upon your notice.!
+Before he worried you your inclination was to have me;
+when next I should have come to you your answer
+would have been Yes. Can you deny it -- -I ask, can
+you deny it?'
+She delayed the reply, but was to honest to with
+hold it. ' I cannot,' she whispered.
+"I know you cannot. But he stole in in my absence
+and robbed me. Why did't he win you away before,
+when nobody would have been grieved? -- -when nobody
+would have been set tale-bearing. Now the people
+sneer at me -- -the very hills and sky seem to laugh at
+me till I blush shamefuly for my folly. I have lost my
+respect, my good name, my standing -- -lost it, never to
+get it again. Go and marry your man -- go on .! '
+"O sir -- -Mr. Boldwood!'
+" You may as well. I have no further claim upon you.
+As for me, I had better go somewhere alone, and hide --
+and pray. I loved a woman once. I am now ashamed.
+When I am dead they'll say, Miserable love-sick man
+that he was. Heaven -- -heaven -- -if I had got jilted
+secretly, and the dishonour not known, and my position
+FURY
+kept.! But no matter, it is
+<P 262>
+gone, and the woman not
+gained. Shame upon him -- shame .! '
+His unreasonable anger terrified her, and she glided
+from him, without obviously moving, as she said, "I am
+only a girl -- do not speak to me so.!'
+"All the time you knew -- how very well you knew --
+that your new freak was my misery. Dazzled by brass
+and scarlet -- O, Bathsheba -- this is woman's folly
+indeed .! '
+She fired up at once. "You are taking too much
+upon yourself .! ' she said, veheniently. " Everybody is
+upon me  -- everybody. It is unmanly to attack a
+woman so ! I have nobody in the world to fight my
+battles for me; but no mercy is shown. Yet if a
+thousand of you sneer and say things against me, I <1will>1
+<1not>1 be put down !."
+" You'll chatter with him doubtless about me. Say to
+him, "Boldwood would have died for me.' Yes, and
+you have given way to him, knowing him to be not the
+man for you. He has kissed you -- claimed you as his.
+Do you hear -- he has kissed you. Deny it .! '
+The most tragic woman is cowed by a tragic man,
+and although Boldwood was, in vehemence and glow,
+nearly her own self rendered into another sex,
+Bathsheba's cheek quivered. She gasped, ' Leave me,
+sir -- leave me !. I am nothing to you. Let me go on !.'
+"Deny that he has kissed you.'
+"I shall not.'
+" Ha -- then he has ! ' came hoarsely from the farmer.
+"He has," she said, slowly, and, in spite of her fear,
+defiantly. 'I am not ashamed to speak the truth.'
+"Then curse him; and curse him !. ' said Boldwood,
+breaking into a whispered fury. ' Whilst I would have
+given worlds to touch your hand, you have let a rake come
+in without right or ceremony and -- kiss you .! Heaven's
+mercy -- kiss you ! ... Ah, a time of his life shall come
+when he will have to repent, and think wretchedly of
+the pain he has caused another man ; and then may he
+ache, and wish, and curse, and yearn -- as I do now .! "
+'Don't, don't, O, don't pray down evil upon him.! '
+she
+<P 263>
+implored in a miserable cry. "Anything but that --
+anything. O, be kind to him, sir, for I love him true .'
+Boldwood's ideas had reached that point of fusion at
+which outline and consistency entirely disappear. The
+impending night appeared to concentrate in his eye.
+He did not hear her at all now.
+"I'll punish him -- -by my soul, that will I.! I'll meet
+him, soldier or no, and I'll horsewhip the untimely
+stripling for this reckless theft of my one delight. If he
+were a hundred men I'd horsewhip him --  -- ' He
+dropped his voice suddenly and unnaturally. "Bath+
+sheba, sweet, lost coquette, pardon me .! I've been
+blaming you, threatening you, behaving like a churl to
+you, when he's the greatest sinner. He stole your dear
+heart away with his unfathomable lies.! ... lt is a
+fortunate thing for him that he's gone back to his
+regiment -- -that he's away up the country, and not here!
+I hope he may not return here just yet. I pray God
+he may not come into my sight, for I may be tempted
+beyond myself. O, Bathsheba, keep him away -- yes,
+keep him away from me.!"
+For a moment Boldwood stood so inertly after this
+that his soul seemed to have been entirely exhaled with
+the breath of his passionate words. He turned his face
+away, and withdrew, and his form was soon covered over
+by the twilight as his footsteps mixed in with the low
+hiss of the leafy trees.
+Bathsheba, who had been standing motionless as a
+model all this latter time, flung her hands to her face,
+and wildly attempted to ponder on the exhibition which
+had just passed away. Such astounding wells of fevered
+feeling in a still man like Mr. Boldwood were incompre+
+hensible, dreadful. Instead of being a man trained to
+repression he was -- what she had seen him.
+The force of the farmer's threats lay in their relation to a
+circumstance known at present only to herself: her lover was
+coming back to Weatherby in the course of the very next
+day or two. Troy had not returned to his distant barracks as
+Boldwood and others supposed, but had merely gone to visit
+<P 264>
+some acquaintance in Bath, and had yet a wek or more
+remaining to his furlough.
+ She felt wretchedly certain that if he revisited her just at
+this nick of time, and came into contact with Boldwood,a
+fierce quarrel would be the consequence. She panted with
+solicitude when she thought of possible injury to Troy. The
+least spark would kindle the farmer's swift feelings of rage
+and jealousy; he would lose his self-mastery as he had this
+evening; Troy's blitheness might become aggressive; it might
+take the direction of derision, and Boldwood's anger might
+then take the direction of revenge.
+ With almost a morbid dread of being thought a gushing
+girl, this guideless woman too well concealed from the world
+under a manner of carelessness the warm depths of her strong
+emotions. But now there was no reserve. In fer
+ 
+her distraction,instead of advancing further she
+walked up and down,beating
+the air with her fingers,pressing on her brow, and sobbing
+brokenly to herself. Then she sat down on a heap of stones by
+the wayside to think. There she remained long. Above the
+dark margin of the earth appeared foreshores and promontor+
+ies of coppery cloud,bounding a green and pellucid expanse
+in the western sky. Amaranthine glosses came over them then,
+and the unresting world wheeled her round to a contrasting
+prospect eastward, in the shape of indecisive and palpitating
+stars. She gazed upon their silent throes amid the shades of
+space, but realised none at all. Her troubled spirit was far
+away with Troy.
+<C xxxii>
+<P 265>
+NIGHT -- HORSES TRAMPING
+THE village of Weatherbury was quiet as the graveyard
+in its midst, and the living were lying welinigh as still
+as the dead. The church clock struck eleven. The
+air was so empty of other sounds that the whirr of the
+clock-work immediately before the strokes was distinct,
+and so was also the click of the same at their close.
+The notes flew forth with the usual blind obtuseness
+of inanimate things -- flapping and rebounding among
+walls, undulating against the scattered clouds, spreading
+through their interstices into unexplored miles of space.
+Bathsheba's crannied and mouldy halls were to-night
+occupied only by Maryann, Liddy being, as was stated,
+with her sister, whom Bathsheba had set out to visit.
+A few minutes after eleven had struck, Maryann turned
+in her bed with a sense of being disturbed. She was
+totally unconscious of the nature of the interruption to
+her sleep. It led to a dream, and the dream to an
+awakening, with an uneasy sensation that something
+had happened. She left her bed and looked out of
+the window. The paddock abutted on this end of the
+building, and in the paddock she could just discern by
+the uncertain gray a moving figure approaching the
+horse that was feeding there. The figure seized the
+horse by the forelock, and led it to the corner of the
+field. Here she could see some object which circum+
+stances proved to be a vehicle for after a few minutes
+the horse down the road, mingled with the sound of
+light wheels.
+Two varieties only of humanity could have entered
+the paddock with the ghostiike glide of that mysterious
+figure. They were a woman and a gipsy man. A woman
+was out of the question in such an occupation at this
+hour, and the comer could be no less than a thief, who
+might probably have known the weakness of the house+
+hold on this particular night, and have
+<P 266>
+chosen it on
+that account for his daring attempt. Moreover, to
+raise suspicion to conviction itself, there were gipsies in !
+Weatherbury Bottom.
+Maryann, who had been afraid to shout in the robber's
+presence, having seen him depart had no fear. She
+hastily slipped on her clothes, stumped down the dis+
+jointed staircase with its hundred creaks, ran to Coggan's,
+the nearest house, and raised an alarm. Coggan called
+Gabriel, who now again lodged in his house as at first,
+and together they went to the paddock. Beyond all
+doubt the horse was gone.
+" Hark .! ' said Gabriel.
+They listened. Distinct upon the stagnant air came
+the sounds of a trotting horse passing up Longpuddle
+Lane -- just beyond the gipsies' encampment in Weather+
+bury Bottom.
+" That's our Dainty-i'll swear to her step,' said Jan.
+" Mighty me ! Won't mis'ess storm and call us stupids
+wen she comes back ! ' moaned Maryann. "How I
+wish it had happened when she was at home, and none
+of us had been answerable .! '
+" We must ride after,' said Gabriel, decisively.
+be responsible to Miss Everdene for what we do. Yes,
+we'll follow. '
+" Faith, I don't see how,' said Coggan. " All our
+horses are too heavy for that trick except little Poppet,
+and what's she between two of us?-if we only had that
+" pair over the hedge we might do something.'
+'Which pair ? '
+'Mr Boldwood's Tidy and Moll.'
+" Then wait here till I come hither again,' said Gabriel.
+He ran down the hill towards Farmer Boldwood's.
+" Farmer Boldwood is not at home,' said Maryann.
+",All the better,' said Coggan. "I know what he's
+gone for.'
+Less than five minutes brought up Oak again, running
+at the same pace, with two halters dangling from his hand,
+"Where did you find 'em ?" said Coggan, turning
+round and leaping upon the hedge without waiting for
+an answer.
+"Under the eaves. I knew where they were kept,'
+said Gabriel, following him. "Coggan, you can ride
+bare-backed ? there's no time to look for saddles.'
+<P 267>
+" Like a hero .! ' said Jan.
+'Maryann, you go to hed,' Gabriel shouted to her
+from the top of the hedge.
+Springing down into Boldwood's pastures, each
+pocketed his halter to hide it from the horses, who,
+seeing the men empty-handed, docilely allowed them+
+selves to he seized by the mane, when the halters
+were dexterously slipped on. Having neither bit nor
+bridle, Oak and Coggan extemporized the former by
+passing the rope in each case through the animal's
+mouth and looping it on the other side. Oak vaulted
+astride, and Coggan clambered up by aid of the hank,
+when they ascended to the gate and galloped off in the
+direction taken by Bathsheha's horse and the robber.
+Whose vehicle the horse had been harnessed to was a
+matter of some uncertainty.
+Weatherbury Bottom was reached in three or four
+minutes. They scanned the shady green patch by the
+roadside. The gipsies were gone.
+"The villains .! ' said Gabriel. 'Which way have they
+gone, I wonder ? '
+'Straight on, as sure as God made little apples,'
+said Jan.
+" Very well; we are better mounted, and must over+
+discovered. The road-metal grew softer and more
+rain had wetted its surface to a somewhat plastic, but
+not muddy state. They came to cross-roads. Coggan
+suddenly pulled up Moll and slipped off.
+" What"s the matter ? ' said Gabriel.
+"We must try to track 'em, since we can't hear 'em,'
+said Jan, fumbling in his pockets. He struck a light,
+and held the match to the ground. The rain had been
+heavier here, and all foot and horse tracks made previous
+to the storm had been abraded and blurred by the drops,
+and they were now so many little scoops of water, which
+reflected the flame of the match like eyes. One set of
+tracks was fresh and had no water in them; one pair of
+ruts was also empty, and not small canals, like the cthers.
+The footprints forming this recent impression were full
+<P 268>
+of information as to pace ; they were in equidistant pairs,
+three or four feet apart, the right and left foot of each
+pair being exactly opposite one another.
+"Straight on !. ' Jan exclaimed. "Tracks like that
+mean a stiff gallop. No wonder we don't hear him.
+And the horse is harnessed-iook at the ruts. Ay,
+'How do you know ?'
+"Old Jimmy Harris only shoed her last week, and
+I'd swear to his make among ten thousand.'
+"The rest of the gipsies must ha" gone on earlier,
+or some other way,' said Oak. " 'You saw there were
+no other tracks ? '
+"True.' They rode along silently for a long weary
+time. Coggan carried an old pinchbeck repeater which
+he had inherited from some genius in his family; and
+it now struck one. He lighted another match, and ex+
+amined the ground again.
+"'Tis a canter now,' he said, throwing away the light.
+'A twisty', rickety pace for a gig. The fact is, they over+
+drove her at starting ; we shall catch "em yet.'
+Again they hastened on, and entered Blackmore
+Vale. Coggan's watch struck one. When they looked
+again the hoof-marks were so spaced as to form a sort
+of zigzag if united, like the lamps along a street.
+" That's a trot, I know,' said Gabriel.
+"Only a trot now,' said Coggan, cheerfully. "We
+shall overtake him in time.'
+They pushed rapidly on for yet two or three miles.
+"Ah .! a moment,' said Jan. 'Let's see how she was
+driven up this hill. "Twill help us,' A light was
+promptly struck upon his gaiters as before, and the ex+
+amination made,
+" Hurrah .! ' said Coggan. "She walked up here --
+and well she might. We shall get them in two miles,
+for a crown.'
+They rode three, and listened. No sound was to be
+heard save a milipond trickling hoarsely through a
+hatch, and suggesting gloomy possibilities of drowning
+by juraping in. Gabriel dismounted when they came
+to a turning. The tracks were ahsolutely the only guide
+as to the direction that they now had, and great caution
+was necessary to avoid confusing them
+<P 269>
+with some others
+which had made their appearance lately.
+"What does this mean ? -- though I guess,' said
+Gabriel, looking up at Coggan as he moved the match
+over the ground about the turning. Coggan, who, no
+less than the panting horses, had latterly shown signs
+of weariness, again scrutinized the mystic characters.
+This time only three were of the regular horseshoe
+shape. Every fourth was a dot.
+HORSES TRAMPING
+He screwed up his face and emitted a long
+" whew-w-w !. '
+" Lame,' said Oak.
+" Yes Dainty is lamed ; the near-foot-afore,' said
+Coggan slowly staring still at the footprints.
+" We'll push on,' said Gabriel, remounting his humid
+steed.
+Although the road along its greater part had been as
+good as any turnpike-road in the country, it was nomin+
+ally only a byway. The last turning had brought them
+into the high road leading to Bath. Coggan recollected
+himself.
+"We shall have him now ! ' he exclaimed.
+" Where ? "
+' Sherton Turnpike. The keeper of that gate is the
+sleepiest man between here and London -- Dan Randall.
+that's his name -- knowed en for years, when he was at
+Casterbridge gate. Between the lameness and the gate
+'tis a done job.'
+was said until, against a shady background of foliage,
+five white bars were visible, crossing their route a little
+way ahead.
+" Hush -- we are almost close !. ' said Gabriel.
+"Amble on upon the grass,' said Coggan.
+The white bars were blotted out in the midst by a
+dark shape in front of them. The silence of this lonely
+time was pierced by an exclamation from that quarter.
+" Hoy-a-hoy ! Gate .! '
+It appeared that there had been a previous call which
+they had not noticed, for on their close approach the
+door of the turnpike-house opened, and the keeper
+came out half-dressed, with a candle in his hand. The
+rays illumined the whole group.
+" Keep the gate close .! ' shouted Gabriel. " He has
+stolen the horse !. '
+<P 270>
+" Who ? ' said the turnpike-man.
+Gabriel looked at the driver of the gig, and saw a
+woman -- Bathsheba, his mistress.
+On hearing his voice she had turned her face away
+from the light. Coggan had, however, caught sight of
+her in the meanwhile.
+"Why, 'tis mistress-i'll take my oath .! ' he said,
+amazed.
+Bathsheba it certainly was, and she had by this time
+done the trick she could do so well in crises not of love,
+namely, mask a surprise by coolness of manner.
+' Well, Gabriel,' she inquired quietly, ' where are you
+going ? '
+' We thought --  -- ' began Gabriel.
+Bath,' she said, taking for her own
+use the assurance that Gahriel lacked. 'An important
+matter made it necessary for me to give up my visit to
+liddy, and go off at once. What, then, were you
+following me ?'
+' We thought the horse was stole.'
+" Weli-what a thing .! How very foolish of you not
+to know that I had taken the trap and horse. I could
+neither wake Maryann nor get into the house, though
+I hammered for ten minutes against her window-sill.
+Fortunately, I could get the key of the coach-house, so
+I troubled no one further. Didn't you think it might
+be me?"
+' Why should we, miss ? '
+" Perhaps not Why, those are never Farmer Bold+
+wood's horses .! Goodness mercy .! what have you been
+" doing bringing trouble upon me in this way? What.!
+mustn't a lady move an inch from her door without being
+dogged like a thief?'
+'But how was we to know, if you left no account of
+your doings ? ' expostulated Coggan, "and ladies don't
+" drive at these hours, miss, as a jineral rule of society.'
+"I did leave an account -- and you would have seen
+it in the morning. I wrote in chalk on the coach-house
+doors that I had come back for the horse and gig, and
+driven off; that I could arouse nobody, and should
+return soon.'
+" But you'll consider, ma'am, that we couldn't see
+that till it got daylight.'
+'True,' she said, and though vexed at first she had
+too much
+<P 271>
+sense to blame them long or seriously for a
+devotion to her that was as valuable as it was rare.
+She added with a very pretty grace, ' Well, I really thank
+you heartily for taking all this trouble; but I wish you
+had borrowed anybody's horses but Mr. Boldwood's.'
+'Dainty is lame, miss,' said Coggan. 'Can ye go
+on?'
+'lt was only a stone in her shoe. I got down and
+pulled it out a hundred yards back. I can manage
+very well, thank you. I shall be in Bath by daylight.
+Will you now return, please?'
+She turned her head -- the gateman's candle
+shimmering upon her quick, clear eyes as she did so --
+passed through the gate, and was soon wrapped in the
+embowering shades of mysterious summer boughs.
+Coggan and Gabriel put about their horses, and, fanned
+by the velvety air of this July night, retraced the road
+by which they had come.
+'A strange vagary, this of hers, isn't it, Oak?' said
+Coggan, curiously.
+'Yes,' said Gabriel, shortly.
+'She won't be in Bath by no daylight!.'
+'Coggan, suppose we keep this night's work as quiet
+as we can?'
+'I am of one and the same mind.'
+'Very well. We shall be home by three o'clock or
+so, and can creep into the parish like lambs.'
+Bathsheba's perturbed meditations by the roadside
+had ultimately evolved a conclusion that there were only
+two remedies for the present desperate state of affairs.
+The first was merely to keep Troy away from Weather+
+bury till Boldwood's indignation had cooled; the second
+to listen to Oak's entreaties, and Boldwood's denuncia+
+tions, and give up Troy altogether.
+Alas! Could she give up this new love -- induce
+him to renounce her by saying she did not like him --
+could no more speak to him, and beg him, for her good,
+to end his furlough in Bath, and see her and Weather'
+bury no niore?
+It was a picture full of misery, but for a while she
+contemplated it firmly, allowing herself, nevertheless,
+as girls will, to
+<P 272>
+dwell upon the happy life she would
+have enjoyed had Troy been Boldwood, and the path
+of love the path of duty -- inflicting upon herself gratuit+
+ous tortures by imagining him the lover of another
+woman after forgetting her; for she had penetrated
+Troy's nature so far as to estimate his tendencies pretty
+accurately, hut unfortunately loved him no less in
+thinking that he might soon cease to love her -- indeed,
+considerably more.
+She jumped to her feet. She would see him at once.
+Yes, she would implore him by word of mouth to assist
+her in this dilemma. A letter to keep him away could
+not reach him in time, even if he should be disposed to
+listen to it.
+Was Bathsheba altogether blind to the obvious fact
+that the support of a lover's arms is not of a kind best
+calculated to assist a resolve to renounce him? Or was
+she sophistically sensible, with a thrill of pleasure, that
+by adopting this course for getting rid of him she was
+ensuring a meeting with him, at any rate, once more?
+It was now dark, and the hour must have been nearly
+ten. The only way to accomplish her purpose was to
+give up her idea of visiting Liddy at Yalbury, return to
+Weatherbury Farm, put the horse into the gig, and drive
+at once to Bath. The scheme seemed at first impossible :
+the journey was a fearfully heavy one, even for a strong
+horse, at her own estimate; and she much underrated
+the distance. It was most venturesome for a woman,
+at night, and alone.
+But could she go on to Liddy's and leave things to
+take their course? No, no; anything but that. Bath+
+sheba was full of a stimulating turbulence, beside which
+caution vainly' prayed for a hearing. she turned back
+towards the village.
+Her walk was slow, for she wished not to enter
+Weatherbury till the cottagers were in bed, and, par+
+ticularly, till Boldwood was secure. Her plan was now
+to drive to Bath during the night, see Sergeant 'Troy in
+the morning before he set out to come to her, bid him
+farewell, and dismiss him: then to rest the horse
+thoroughly (herself to weep the while, she thought),
+starting early the next morning on her return journey.
+By this arrangement she could trot Dainty gently all
+the day, reach
+<P 273>
+Liddy at Yalbury in the evening, and
+come home to Weatherbury with her whenever they
+chose -- so nobody would know she had been to Bath
+at all.
+Such was Bathsheba's scheme. But in her topo+
+graphical ignorance as a late comer to the place, slie
+misreckoned the distance of her journey as not much
+more than half what it really was. Her idea, however,
+she proceeded to carry out, with what initial success we
+have already seen.
+<C xxxiii>
+<P 274>
+IN THE SUN -- A HARBINGER
+A WEEK passed, and there were no tidings of Bath+
+sheba; nor was there any explanation of her Gilpin's
+rig.
+Then a note came for Maryann, stating that the
+business which had called her mistress to Bath still
+detained her there; but that she hoped to return
+in the course of another week.
+Another week passed. The oat-harvest began, and
+all the men were a-field under a monochromatic Lammas
+sky, amid the trembling air and short shadows of noon.
+Indoors nothing was to be heard save the droning of
+blue-bottle flies; out-of-doors the whetting of scythes
+and the hiss of tressy oat-ears rubbing together as their
+perpendicular stalks of amber-yellow fell heavily to each
+swath. Every drop of moisture not in the men's bottles
+and flagons in the form of cider was raining as perspira+
+tion from their foreheads and cheeks. Drought was
+everywhere else.
+They were about to withdraw for a while into the
+charitable shade of a tree in the fence, when Coggan
+saw a figure in a blue coat and brass buttons running
+to them across the field.
+'I wonder who that is?' he said.
+'I hope nothing is wrong about mistress,' said
+Maryann, who with some other women was tying the
+bundles (oats being always sheafed on this farm), 'but
+an unlucky token came to me indoors this morning.
+l went to unlock the door and dropped the key, and it
+fell upon the stone floor and broke into two pieces.
+Breaking a key is a dreadful bodement. I wish mis'ess
+was home.'
+''Tis Cain Ball,' said Gabriel, pausing from whetting
+his reaphook.
+Oak was not bound by his agreement to assist in the
+corn-field; but the harvest month is an anxious time for
+<P 275>
+a farmer, and the corn was Bathsheba's, so he lent a
+hand.
+'He's dressed up in his best clothes,' said Matthew
+Moon. 'He hev been away from home for a few days,
+since he's had that felon upon his finger; for 'a said,
+since I can't work I'll have a hollerday.'
+  'A good time for one -- a" excellent time,' said Joseph
+Poorgrass, straightening his back; for he, like some of
+the others, had a way of resting a while from his labour
+on such hot days for reasons preternaturally small; of
+which Cain Pall's advent on a week-day in his Sunday+
+clothes was one of the first magnitude. ''Twas a bad leg
+allowed me to read the Pilgrim's Progress, and Mark
+Clark learnt AliFours in a whitlow.'
+'Ay, and my father put his arm out of joint to have
+time to go courting,' said Jan Coggan, in an eclipsing
+tone, wiping his face with his shirt-sleeve and thrusting
+back his hat upon the nape of his neck.
+By this time Cainy was nearing the group of harvesters,
+and was perceived to be carrying a large slice of bread
+and ham in one hand, from which he took mouthfuls
+as he ran, the other being wrapped in a bandage.
+When he came close, his mouth assumed the bell shape,
+and he began to cough violently.
+   'Now, Cainy!.' said Gabriel, sternly.  'How many
+more times must I tell you to keep from running so fast
+when you be eating? You'll choke yourself some day,
+that's what you'll do, Cain Ball.'
+ 'Hok-hok-hok.!  'replied Cain. 'A crumb of my
+victuals went the wrong way -- hok-hok!, That's what
+'tis, Mister Oak.! And I've been visiting to Bath
+because I had a felon on my thumb; yes, and l've
+seen -- ahok-hok!'
+Directly Cain mentioned Bath, they all threw down
+their hooks and forks and drew round him. Un+
+fortunately the erratic crumb did not improve his
+narrative powers, and a supplementary hindrance was
+that of a sneeze, jerking from his pocket his rather large
+watch, which dangled in front of the young man
+pendulum-wise.
+<P 276>
+ 'Yes,' he continued, directing his thoughts to Bath
+and letting his eyes follow, 'l've seed the world at last
+ -- yes -- and I've seed our mis'ess -- ahok-hok-hok ! '
+' Bother the boy! ' said Gabriel. ' Something is
+always going the wrong way down your throat, so that
+you can't tell what's necessary to be told.'
+"Ahok !. there ! Please, Mister Oak, a gnat have
+just fleed into my stomach and brought the cough on
+again !. '
+'Yes, that's just it. Your mouth is always open, you
+young rascal .! '
+''Tis terrible bad to have a gnat fly down yer throat,
+pore boy !. ' said Matthew Moon.
+' Well, at Bath you saw --  -- ' prompted Gabriel.
+'I saw our mistress,' continued the junior shepherd,
+'and a sojer, walking along. And bymeby they got
+closer and closer, and then they went arm-in-crook, like
+courting complete -- hok-hok ! like courting complete --
+hok .! -- courting complete --  -- " Losing the thread of his
+narrative at this point simultaneously with his loss of
+breath, their informant looked up and down the field
+apparently for some clue to it. 'Well, I see our mis'ess
+and a soldier -- a-ha-a-wk .! '
+A HARBlNGER
+!Damn the boy !' said Gabriel.
+!'Tis only my manner, Mister Oak, if ye'll excuse it,'
+said Cain Ball, looking reproachfully at Oak, with eyes
+drenched in their own dew.
+!Here's some cider for him -- that'll cure his throat,'
+said Jan Coggan, lifting a flagon of cider, pulling out
+the cork, and applying the hole to Cainy's mouth;
+Joseph Poorgrass in the meantime beginning to think
+apprehensively of the serious consequences that would
+follow Cainy Ball's strangulation in his cough, and the
+history of his Bath adventures dying with him.
+"For my poor self, I always say "please God ' afore
+I do anything,' said Joseph, in an unboastful voice ; " and
+so should you, Cain Ball. "Tis a great safeguard, and
+might perhaps save you from being choked to death
+some day.'
+Mr. Coggan poured the liquor with unstinted liber+
+ality at the suffering Cain's circular mouth; half of it
+running down the
+<P 277>
+side of the flagon, and half of what
+reached his mouth running down outside his throat,
+and half of what ran in going the wrong way, and being
+coughed and sneezed around the persons of the gathered
+reapers in the form of a cider fog, which for a moment
+hung in the sunny air like a small exhalation.
+"There's a great clumsy sneeze ! Why can't ye have
+better manners, you young dog ! ' said Coggan, with+
+drawing the flagon.
+"The cider went up my nose ! ' cried Cainy, as soon
+as he could speak; "and now 'tis gone down my neck,
+and into my poor dumb felon, and over my shiny
+buttons and all my best cloze ! '
+"The poor lad's cough is terrible onfortunate,' said
+Matthew Moon. 'And a great history on hand, too.
+Bump his back, shepherd.'
+"'Tis my nater,' mourned Cain. "Mother says I
+always was so excitable when my feelings were worked
+up to a point!'
+" True, true,' said Joseph Poorgrass. "The Balls
+were always a very excitable family. I knowed the
+boy's grandfather -- a truly nervous and modest man,
+even to genteel refinery. 'Twas blush, blush with him,
+almost as much as 'tis with me -- not but that 'tis a
+fault in me !'
+"Not at all, Master Poorgrass,' said Coggan. " 'Tis
+a very noble quality in ye.'
+"Heh-heh ! well, I wish to noise nothing abroad --
+nothing at all,' murmured Poorgrass, diffidently. " But
+we be born to things -- that's true. Yet I would rather
+my trifle were hid ; though, perhaps, a high nater is a
+little high, and at my birth all things were possible to
+my Maker, and he may have begrudged no gifts....
+But under your bushel, Joseph ! under your bushel with
+'ee ! A strange desire, neighbours, this desire to hide,
+and no praise due. Yet there is a Sermon on the
+Mount with a calendar of the blessed at the head, and
+certain meek men may be named therein.'
+"Cainy's grandfather was a very clever man,' said
+Matthew Moon. "Invented a' apple-tree out of his own
+head, which is called by his name to this day -- the Early
+Ball. You know 'em,
+<P 278>
+Jan ? A Quarrenden grafted on
+a Tom Putt, and a Rathe-ripe upon top o' that again.
+'Tis trew 'a used to bide about in a public-house wi' a
+'ooman in a way he had no business to by rights, but
+there -- 'a were a clever man in the sense of the term.'
+" Now then,' said Gabriel, impatiently, " what did you
+see, Cain ? '
+"I seed our mis'ess go into a sort of a park place,
+where there's seats, and shrubs and flowers, arm-in-crook
+with a sojer,' continued Cainy, firmly, and with a dim
+sense that his words were very effective as regarded
+Gabriel's emotions. "And I think the sojer was
+Sergeant Troy. And they sat there together for more
+than half-an-hour, talking moving things, and she once
+was crying a'most to death. And when they came out
+her eyes were shining and she was as white as a lily;
+and they looked into one another's faces, as far-gone
+friendly as a man and woman can be.'
+Gabriel's features seemed to get thinner. " Well,
+what did you see besides ? '
+" Oh, all sorts."
+"White as a lily? You are sure 'twas she?
+" Yes."
+" Well, what besides ? '
+"Great glass windows to the shops, and great clouds
+in the sky, full of rain, and old wooden trees in the
+country round.'
+" You stun-poll! What will ye say next?' said
+Coggan.
+" Let en alone,' interposed Joseph Poorgrass. "The
+boy's maning is that the sky and the earth in the
+kingdom of Bath is not altogether different from ours
+here. 'Tis for our good to gain knowledge of strange
+cities, and as such the boy's words should be suffered,
+so to speak it.'
+" And the people of Bath,' continued Cain, "never
+need to light their fires except as a luxury, for the
+water springs up out of the earth ready boiled for
+use.'
+" 'Tis true as the light,' testified Matthew Moon. ' I've
+heard other navigators say the same thing.'
+" They drink nothing else there,' said Cain, ' and seem
+to enjoy it, to see how they swaller it down.'
+<P 279>
+"Well, it seems a barbarian practice enough to us,
+but I daresay the natives think nothing o' it,' said
+Matthew.
+"And don't victuals spring up as well as drink?'
+asked Coggan, twirling his eye.
+"No-i own to a blot there in Bath -- a true blot.
+God didn't proride 'em with victuals as well as (+
+and 'twas a drawback I couldn't get over at all.'
+" Well, 'tis a curious place, to say the least,' observed
+Moon; "and it must be a curious people that live
+therein. '
+"Miss Everdene and the soldier were walking about
+together, you say ? ' said Gabriel, returning to the
+group.
+"Ay, and she wore a beautiful gold-colour silk
+gown, trimmed with black lace, that would have stood
+alone 'ithout legs inside if required. 'Twas a very
+winsome sight; and her hair was brushed splendid.
+And when the sun shone upon the bright gown and his
+red coat -- my ! how handsome they looked. You
+could see 'em all the length of the street.'
+" And what then ? ' murmured Gabriel.
+"And then I went into Griffin's to hae my boots
+hobbed, and then I went to Riggs's batty-cake shop,
+and asked 'em for a penneth of the cheapest and nicest
+stales, that were all but blue-mouldy, but not quite.
+And whilst I was chawing 'em down I walked on and
+seed a clock with a face as big as a baking trendle --  -- '
+"But that's nothing to do with mistress ! '
+"I'm coming to that, if you'll leave me alone, Mister
+Oak ! ' remonstrated Cainy. "If you excites me,
+perhaps you'll bring on my cough, and then I shan't be
+able to tell ye nothing.'
+" Yes-iet him tell it his own way,' said Coggan.
+Gabriel settled into a despairing attitude of patience,
+and Cainy went on : --
+"And there were great large houses, and more
+people all the week long than at Weatherbury club+
+walking on White Tuesdays. And I went to grand
+churches and chapels. And how the parson would pray !
+Yes; he would kneel down and put up his hands
+together, and make the holy gold rings on his fingers
+gleam and twinkle in yer eyes, that he'd earned
+by praying so excellent well ! -- Ah yes, I wish I lived
+there.'
+<P 280>
+"Our poor Parson Thirdly can't get no money to
+buy such rings,' said  Matthew Moon, thoughtfully.
+"And as good a man as ever walked. I don't believe
+poor Thirdly have a single one, even of humblest tin or
+copper. Such a great ornament as they'd be to him on
+a dull a'ternoon, when he's up in the pulpit lighted by
+the wax candles ! But 'tis impossible, poor man. Ah,
+to think how unequal things be.'
+"Perhaps he's made of different stuff than to wear
+'em,' said Gabriel, grimly. ' Well, that's enough of this.
+Go on, Cainy -- quick.'
+' Oh -- and the new style of pa'sons wear moustaches
+and long beards,' continued the illustrious traveller,
+'and look like Moses and Aaron complete, and make
+we fokes in the congregation feel all over like the
+children of Israel.'
+"A very right feeling -- very,' said Joseph Poorgrass.
+"And there's two religions going on in the nation
+now -- High Church and High Chapel. And, thinks I,
+I'll play fair; so I went to High Church in the morning,
+and High Chapel in the afternoon.'
+' A right and proper boy,' said Joseph Poorgrass.
+"Well, at High Church they pray singing, and worship
+all the colours of the rainbow; and at High Chapel they
+pray preaching, and worship drab and whitewash only.
+And then-i didn't see no more of Miss Everdene at
+all.'
+'Why didn't you say so afore, then ? ' exclaimed Oak,
+with much disappointment.
+' Ah,' said Matthew Moon, 'she'll wish her cake
+dough if so be she's over intimate with that man.'
+'She's not over intimate with him,' said Gabriel,
+indignantly.
+'She would know better,' said Coggan. "Our
+mis'ess has too much sense under they knots of black
+hair to do such a mad thing.'
+"You see, he's not a coarse, ignorant man, for he
+was well brought up,' said Matthew, dubiously. " 'Twas
+only wildness that made him a soldier, and maids rather
+like your man of sin.'
+"Now, Cain Ball,' said Gabriel restlessly, "can you
+swear in the most
+<P 281>
+awful form that the woman you saw
+was Miss Everdene ? '
+'Cain Ball, you be no longer a babe and suckling,'
+said Joseph in the sepulchral tone the circumstances
+demanded, "and you know what taking an oath is.
+'Tis a horrible testament mind ye, which you say and
+seal with your blood-stone, and the prophet Matthew
+tells us that on whomsoever it shall fall it will grind
+him to powder. Now, before all the work-folk here
+assembled, can you swear to your words as the shep+
+herd asks ye ?'
+" Please no, Mister Oak ! ' said Cainy, looking from
+one to the other with great uneasiness at the spiritual
+magnitude of the position. "I don't mind saying 'tis
+true, but I don't like to say 'tis damn true, if that's
+what you mane.'
+'Cain, Cain, how can you ! ' asked Joseph sternly.
+"You be asked to swear in a holy manner, and you
+swear like wicked Shimei, the son of Gera, who cursed
+as he came. Young man, fie ! '
+"No, I don't ! 'Tis you want to squander a pore
+boy's soul, Joseph Poorgrass -- that's what 'tis ! ' said
+Cain, beginning to cry. "All I mane is that in common
+truth 'twas Miss Everdene and Sergeant Troy, but in
+the horrible so-help-me truth that ye want to make of
+it perhaps 'twas somebody else ! '
+'There's no getting at the rights of it,' said Gabriel,
+turning to his work.
+"Cain Ball, you'll come to a bit of bread ! ' groaned
+Joseph Poorgrass.
+Then the reapers' hooks were flourished again, and
+the old sounds went on. Gabriel, without making any
+pretence of being lively, did nothing to show that he
+was particularly dull. However, Coggan knew pretty
+nearly how the land lay, and when they were in a nook
+together he said --
+' Don't take on about her, Gabriel. What difference
+does it make whose sweetheart she is, since she can't be
+yours ? '
+"That's the very thing I say to myself,' said Gabriel.
+ <C xxxiv>
+<P 282>
+HOME AGAIN -- A TRICKSTER
+THAT same evening at dusk Gabriel was leaning over
+Coggan's garden-gate, taking an up-and-down survey
+before retiring to rest.
+A vehicle of some kind was softly creeping along
+the grassy margin of the lane. From it spread the
+tones of two women talking. The tones were natural
+and not at all suppressed. Oak instantly knew the
+voices to he those of Bathsheba and Liddy.
+The carriage came opposite and passed by. It was
+Miss Everdene's gig, and Liddy and her mistress were
+the only occupants of the seat. Liddy was asking
+questions about the city of Bath, and her companion
+was answering them listlessly and unconcernedly. Both
+Bathsheba and the horse seemed weary.
+The exquisite relief of finding that she was here
+again, safe and sound, overpowered all reflection, and
+Oak could only luxuriate in the sense of it. All grave
+reports were forgotten.
+He lingered and lingered on, till there was no
+difference between the eastern and western expanses
+of sky, and the timid hares began to limp courageously
+round the dim hillocks. Gabriel might have been
+there an additional half-hour when a dark form walked
+slowly by. " Good-night, Gabriel,' the passer said.
+It was Boldwood. " Good-night, sir,' said Gabriel.
+Boldwood likewise vanished up the road, and Oak
+shortly afterwards turned indoors to bed.
+Farmer Boldwood went on towards Miss Everdene's
+house. He reached the front, and approaching the
+entrance, saw a light in the parlour. The blind was
+not drawn down, and inside the room was Bathsheba,
+looking over some papers or letters. Her back was
+towards Boldwood. He went to the door,
+<P 283>
+knocked,
+and waited with tense muscles and an aching brow.
+Boldwood had not been outside his garden since
+his meeting with Bathsheba in the road to Yalbury.
+Silent and alone, he had remained in moody medita+
+tion on woman's ways, deeming as essentials of the
+whole sex the accidents of the single one of their
+number he had ever closely beheld. By degrees a
+more charitable temper had pervaded him, and this
+was the reason of his sally to-night. He had come to
+apologize and beg forgiveness of Bathsheba with some+
+thing like a sense of shame at his violence, having but
+just now learnt that she had returned -- only from a
+visit to Liddy, as he supposed, the Bath escapade
+being quite unknown to him.
+He inquired for Miss Everdene. Liddy's manner
+was odd, but he did not notice it. She went in, leaving
+him standing there, and in her absence the blind of the
+room containing Bathsheba was pulled down. Bold+
+wood augured ill from that sign. Liddy came out.
+"My mistress cannot see you, sir,' she said.
+The farmer instantly went out by the gate. He
+as unforgiven -- that was the issue of it all. He had
+seen her who was to him simultaneously a delight and
+a torture, sitting in the room he had shared with her
+as a peculiarly privileged guest only a little earlier in
+he summer, and she had denied him an entrance
+there now.
+Boldwood did not hurry homeward. It was ten
+o'clock at least, when, walking deliberately through the
+lower part of Weatherbury, he heard the carrier's spring
+van entering the village. The van ran to and from a
+town in a northern direction, and it was owned and
+driven by a Weatherbury man, at the door of whose
+house it now pulled up. The lamp fixed to the head
+of the hood illuminated a scarlet and gilded form, who
+was the first to alight.
+'Ah ! ' said Boldwood to himself, "come to see her
+again.'
+Troy entered the carrier's house, which had been
+the place of his lodging on his last visit to his native
+place. Boldwood was moved by a sudden determina+
+tion. He hastened home. In ten minutes he was
+back again, and made as if he were going to call upon
+Troy at the carrier's. But as he approached, some
+<P 284>
+one opened the door and came out. He heard this
+person say " Good-night ' to the inmates, and the voice
+was Troy's. 'This was strange, coming so immediately
+after his arrival. Boldwood, however, hastened up
+to him. Troy had what appeared to be a carpet-bag
+in his hand -- the same that he had brought with him.
+It seemed as if he were going to leave again this very
+night.
+Troy turned up the hill and quickened his pace.
+Boldwood stepped forward.
+" Sergeant Troy ? '
+" Yes-i'm Sergeant Troy.'
+" Just arrived from up the country, I think ?'
+" Just arrived from Bath.'
+" I am William Boldwood.'
+" Indeed.'
+The tone in which this word was uttered was all
+that had been wanted to bring Boldwood to the
+point.
+" I wish to speak a word with you,' he said.
+" What about ? '
+" About her who lives just ahead there -- and about
+a woman you have wronged.'
+" I wonder at your impertinence,' said Troy, moving
+on.
+" Now look here,' said Boldwood, standing in front
+of him, " wonder or not, you are going to hold a conver+
+sation with me.'
+Troy heard the dull determination in Boldwood's
+voice, looked at his stalwart frame, then at the thick
+cudgel he carried in his hand. He remembered it was
+past ten o'clock. It seemed worth while to be civil to
+Boldwood.
+" Very well, I'll listen with pleasure,' said Troy,
+placing his bag on the ground, "only speak low, for
+somebody or other may overhear us in the farmhouse
+there.'
+" Well then -- I know a good deal concerning your
+Fanny Robin's attachment to you. I may say, too, that
+I believe I am the only person in the village, excepting
+Gabriel Oak, who does know it. You ought to marry
+her.'
+" I suppose I ought. Indeed, l wish to, but I
+cannot.'
+" Why ? '
+Troy was about to utter something hastily; he then
+checked
+<P 285>
+himself and said, "I am too poor.' His voice
+was changed. Previously it had had a deviimay-care
+tone. It was the voice of a trickster now.
+Boldwood's present mood was not critical enough to
+notice tones. He continued, "I may as well speak
+plainly; and understand, I don't wish to enter into the
+questions of right or wrong, woman's honour and shame,
+or to express any opinion on your conduct. I intend a
+business transaction with you.'
+" I see,' said Troy. " Suppose we sit down here.'
+An old tree trunk lay under the hedge immediately
+opposite, and they sat down.
+The tone in which this word was uttered was all
+Troy heard the dull determination in Boldwood's
+voice, looked at his stalwart frame, then at the thick
+plainly ; and understand, I don't wish to enter into the
+" I was engaged to be married to Miss Everdene,'
+said Boldwood, "but you came and --  -- '
+" Not engaged,' said Troy.
+" As good as engaged.'
+" If I had not turned up she might have become en+
+gaged to you.'
+" Hang might ! '
+" Would, then.'
+" If you had not come I should certainly -- yes,
+certainly -- have been accepted by this time. If you had
+not seen her you might have been married to Fanny.
+Well, there's too much difference between Miss Ever+
+dene's station and your own for this flirtation with her
+ever to benefit you by ending in marriage. So all I ask
+is, don't molest her any more. Marry Fanny.
+make it worth your while.'
+" How will you ?'
+" I'll pay you well now, I'll settle a sum of money
+upon her, and I'll see that you don't suffer from poverty
+in the future. I'll put it clearly. Bathsheba is only
+playing with you: you are too poor for her as I said;
+so give up wasting your time about a great match you'll
+never make for a moderate and rightful match you may
+make to-morrow; take up your carpet-bag, turn about,
+leave Weatherbury now, this night, and you shall take
+fifty pounds with you. Fanny shall have fifty to enable
+her to prepare for the wedding, when you have told me
+where she is living, and she shall have five hundred
+paid down on her wedding-day.'
+<P 286>
+In making this statement Boldwood's voice revealed
+only too clearly a consciousness of the weakness of his
+position, his aims, and his method. His manner had
+lapsed quite from that of the firm and dignified Bold+
+wood of former times; and such a scheme as he had
+now engaged in he would have condemned as childishly
+imbecile only a few months ago. We discern a grand
+force in the lover which helacks whilst a free man; but
+there is a breadth of vision in the free man which in
+the lover we vainly seek. Where there is much bias
+there must be some narrowness, and love, though added
+emotion, is subtracted capacity. Boldwood exemplified
+this to an abnormal degree: he knew nothing of Fanny
+Robin's circumstances or whereabouts, he knew nothing
+of Troy's possibilities, yet that was what he said.
+" I like Fanny best,' said Troy; "and if, as you say,
+Miss Everdene is out of my reach, why I have all to
+gain by accepting your money, and marrying Fan. But
+she's only a servant.'
+" Never mind -- do you agree to my arrangement ?'
+" I do.'
+" Ah ! ' said Boldwood, in a more elastic voice. "O,
+Troy, if you like her best, why then did you step in here
+and injure my happiness ? '
+" I love Fanny best now,' said Troy. "But
+Bathsh --  -- Miss Everdene inflamed me, and displaced
+Fanny for a time. It is over now.'
+" Why should it be over so soon? And why then
+did you come here again ? '
+" There are weighty reasons. Fifty pounds at once,
+you said !'
+" I did,' said Boldwood, " and here they are -- fifty
+sovereigns.' He handed Troy a small packet.
+" You have everything ready -- it seems that you
+calculated on my accepting them,' said the sergeant,
+taking the packet.
+" I thought you might accept them,' said Boldwood.
+" You've only my word that the programme shall be
+adhered to, whilst I at any rate have fifty pounds.'
+" l had thought of that, and l have considered that
+if I can't appeal to your honour I can trust to your --
+well, shrewdness we'll call it -- not to lose five hundred
+pounds in prospect, and
+<P 287>
+also make a bitter enemy of a
+man who is willing to be an extremely useful friend.'
+" Stop, listen ! ' said Troy in a whisper.
+A light pit-pat was audible upon the road just above
+them.
+'By George -- 'tis she,' he continued. 'I must go
+on and meet her.'
+'She -- who ? '
+'Bathsheba.'
+'Bathsheba -- out alone at this time o' night .! ' said
+Boldwood in amazement, and starting up. ' Why must
+you meet her ?'
+'She was expecting me to-night -- and I must now
+speak to her, and wish her good-bye, according to your
+wish. '
+'I don't see the necessity of speaking.'
+'It can do no harm -- and she'll be wandering about
+looking for me if I don't. You shall hear all I say to her.
+It will help you in your love-making when I am gone.'
+'Your tone is mocking.'
+'O no. And renaember this, if she does not know
+what has become of me, she will think more about me
+than if I tell her flatly I have come to give her up.'
+'Will you confine your words to that one point ? -- +
+Shall I hear every word you say ? '
+'Every word. Now sit still there, and hold my'
+carpet bag for me, and mark what you hear.'
+The light footstep came closer, halting occasionally,
+as if the walker listened for a sound. Troy whistled a
+double note in a soft, fluty tone.
+'Come to that, is it ! ' murmured Boldwood, uneasily.
+'You promised silence,' said Troy.
+'I promise again.'
+Troy stepped forward.
+'Frank, dearest, is that you ? ' The tones were
+Bathsheba's.
+'O God .! ' said Boldwood.
+'Yes,' said Troy to her.
+'How late you are,' she continued, tenderly. 'Did
+you come by the carrier ? I listened and heard his
+wheels entering the village, but it was some time ago,
+and I had almost given you up, Frank.'
+<P 288>
+'I was sure to come,' said Frank. 'You knew I
+should, did you not ? '
+'Well, I thought you would,' she said, playfully ;
+'and, Frank, it is so lucky .! There's not a soul in my
+house but me to-night. I've packed them all off so
+nobody on earth will know of your visit to your lady's
+bower. Liddy wanted to go to her grandfather's to
+tell him about her holiday, and I said she might stay
+with them till to-morrow -- when you'll be gone again.'
+'Capital,' said Troy. ' But, dear me, I. had better
+go back for my bag, because my slippers and brush and
+comb are in it; you run home whilst I fetch it, and I'll
+promise to be in your parlour in ten minutes.'
+'Yes.' She turned and tripped up the hill again.
+During the progress of this dialogue there was a
+nervous twitching of Boldwood's tightly closed lips, and
+his face became bathed in a clammy dew. He now
+started forward towards Troy. Troy turned to him and
+took up the bag.
+'Shall I tell her I have come to give her up and
+cannot marry her ? ' said the soldier, mockingly.
+'No, no; wait a minute. I want to say more to
+you -- more to you !. ' said Boldwood, in a hoarse whisper.
+'Now,' said Troy, ' you see my dilemma. Perhaps
+I am a bad man -- the victim of my impulses -- led away
+to do what I ought to leave undone. I can't, however,
+marry them both. And I have two reasons for- choosing
+Fanny. First, I like her best upon the whole, and
+second, you make it worth my while.'
+At the same instant Boldwood sprang upon him, and
+held him by the neck. Troy felt Boldwood's grasp slowly
+tightening. The move was absolutely unexpected.
+'A moment,' he gasped. 'You are injuring her you
+love .! '
+'Well, what do you mean ? ' said the farmer.
+Give me breath,' said Troy.
+Boldwood loosened his hand, saying, 'By Heaven,
+I've a mind to kill you .!'
+'And ruin her.'
+'Save her.'
+'Oh, how can she be saved now, unless I marry her ? '
+<P 289>
+Boldwood groaned. He reluctantly released the
+soldier, and flung him back against the hedge. 'Devil,
+you torture me .! ' said he.
+Troy rebounded like a ball, and was about to make
+a dash at the farmer; but he checked himself, saying
+lightly --
+'It is not worth while to measure my strength with
+you. Indeed it is a barbarous way of settling a quarrel.
+I shall shortly leave the army because of the same
+conviction. Now after that revelation of how the land
+lies with Bathsheba, 'twould be a mistake to kill me,
+would it not?'
+''Twould be a mistake to kill you,' repeated Boldwood,
+mechanically, with a bowed head.
+'Better kill yourself.'
+' Far better.'
+'I'm glad you see it.'
+'Troy, make her your wife, and don't act upon what
+I arranged just now. The alternative is dreadful, but
+take Bathsheba; I give her up .! She must love you
+indeed to sell soul and body to you so utterly as she
+has done. Wretched woman -- deluded woman -- you
+are, Bathsheba .! '
+'But about Fanny ? '
+'Bathsheba is a woman well to do,' continued Bold+
+wood, in nervous anxiety, 'and, Troy, she will make a
+good wife ; and, indeed, she is worth your hastening
+on your marriage with her .! '
+'But she has a wili-not to say a temper, and I shall
+be a mere slave to her. I could do anything with poor
+Fanny Robin.'
+'Troy,' said Boldwood, imploringly, ' I'll do anything
+for you, only don't desert her; pray don't desert her,
+Troy.'
+'Which, poor Fanny ? '
+'No ; Bathsheba Everdene. Love her best .! Love
+her tenderly !. How shall I get you to see how advan+
+tageous it will be to you to secure her at once ?'
+'I don't wish to secure her in any new way.'
+Boldwood's arm moved spasmodically towards Troy's
+person again. He repressed the instinct, and his form
+drooped as with pain.
+Troy went on --
+<P 290>
+"I shall soon purchase my discharge, and then --  -- '
+'But I wish you to hasten on this marriage !. It will
+be better for you both. You love each other, and you
+must let me help you to do it.'
+'How ? '
+'Why, by settling the five hundred on Bathsheba
+instead of Fanny, to enable you to marry at once.
+No ; she wouldn't have it of me. I'll pay it down to
+you on the wedding-day.'
+Troy paused in secret amazement at Boldwood's
+wild infatuation. He carelessly said, 'And am I to
+have anything now ? '
+'Yes, if you wish to. But I have not much additional
+money with me. I did not expect this; but all I have
+is yours.'
+Boldwood, more like a somnambulist than a wakeful
+man, pulled out the large canvas bag he carried by way
+of a purse, and searched it.
+'I have twenty-one pounds more with me,' he said.
+'Two notes and a sovereign. But before I leave you
+I must have a paper signed --  -- '
+'Pay me the money, and we'll go straight to her
+parlour, and make any arrangement you please to secure
+my compliance with your wishes. But she must know
+nothing of this cash business.'
+' Nothing, nothing,' said Boldwood, hastily. 'Here
+is the sum, and if you'll come to my house we'll write
+out the agreement for the remainder, and the terms
+also.'
+' First we'll call upon her.'
+'But why? Come with me to-night, and go with
+me to-morrow to the surrogate's.'
+'But she must be consulted; at any rate informed.'
+'Very well; go on.'
+They went up the hill to Bathsheba's house. When
+they stood at the entrance, Troy said, 'Wait here a
+moment.' Opening the door, he glided inside, leaving
+the door ajar.
+Boldwood waited. In two minutes a light appeared
+in the passage. Boldwood then saw that the chain
+had been fastened across the door. Troy appeared
+inside, carrying a bedroom candlestick.
+<P 291>
+'What, did you think I should break in ?' said
+Boldwood, contemptuously.
+'Oh, no; it is merely my humour to secure things.
+Will you read this a moment ? I'll hold the light.'
+Troy handed a folded newspaper through the slit
+between door and doorpost, and put the candle close.
+'That's the paragraph,' he said, placing his finger on
+a line.
+Boldwood looked and read --
+'MARRIAGES.
+'On the 17th inst., at St. Ambrose's Church, Bath,
+by the Rev. G. Mincing, B.A., Francis Troy, only son
+of the late Edward Troy, Esq., H.D., of Weatherbury,
+and sergeant iith Dragoon Guards, to Bathsheba, only
+surviving daughter of the late Mr, John Everdene, of
+Casterbridge.'
+'This may be called Fort meeting Feeble, hey,
+Boldwood ?' said Troy. A low gurgle of derisive
+laughter followed the words.
+The paper fell from Boldwood's hands. Troy
+continued --
+'Fifty pounds to marry Fanny, Good. Twenty-+
+one pounds not to marry Fanny, but Bathsheba. Good.
+Finale : already Bathsheba's husband. Now, Boldwood,
+yours is the ridiculous fate which always attends inter+
+ference between a man and his wife. And another
+word. Bad as I am, I am not such a villain as to
+make the marriage or misery of any woman a matter
+of huckster and sale. Fanny has long ago left me.
+don't know where she is. I have searched everywhere.
+Another word yet. You say you love Bathsheba ; yet
+on the merest apparent evidence you instantly believe
+in her dishonour. A fig for such love !. Now that I've
+taught you a lesson, take your money back again.'
+'I will not ; I will not !. ' said Boldwood, in a hiss.
+'Anyhow I won't have it,' said Troy, contemptuously.
+He wrapped the packet of gold in the notes, and threw
+the whole into the road.
+Boldwood shook his clenched fist at him. 'You
+juggler of Satan .! You black hound .! But I'll punish
+you yet ; mark me, I'll punish you yet !. '
+<P 292>
+Another peal of laughter. Troy then closed the
+door, and locked himself in.
+Throughout the whole of that night Boldwood's dark
+downs of Weatherbury like an unhappy Shade in the
+Mournful Fields by Acheron.
+<C xxxv>
+<P 293>
+CHAPTER XXXV
+AT AN UPPER WINDOW
+IT was very early the next morning -- a time of sun and
+dew. The confused beginnings of many birds' songs
+spread into the healthy air, and the wan blue of the
+heaven was here and there coated with thin webs of
+incorporeal cloud which were of no efect in obscuring
+day. All the lights in the scene were yellow as to
+colour, and all the shadows were attenuated as to form.
+The creeping plants about the old manor-house were
+bowed with rows of heavy water drops, which had upon
+objects behind them the effect of minute lenses of high
+magnifying power.
+Just before the clock struck five Gabriel Oak and
+Coggan passed the village cross, and went on together
+to the fields. They were yet barely in view of their
+mistress"s house, when Oak fancied he saw the opening
+of a casement in one of the upper windows. The two
+men were at this moment partially screened by an elder
+bush, now beginning to be enriched with black bunches
+of fruit, and they paused before emerging from its
+shade.
+A handsome man leaned idly from the lattice. He
+looked east and then west, in the manner of one who
+makes a first morning survey. The man was Sergeant
+Troy. His red jacket was loosely thrown on, but not
+buttoned, and he had altogether the relaxed bearing of
+a soldier taking his ease.
+Coggan spoke first, looking quietly at the window.
+'She has married him ! ' he said.
+Gabriel had previously beheld the sight, and he now
+stood with his back turned, making no reply.
+'I fancied we should know something to-day,' con+
+tinued Coggan. 'I heard wheels pass my door just
+after dark -- you were out somewhere.'He glanced
+round upon Gabriel. 'Good
+<P 294>
+heavens above us, Oak,
+how white your face is; you look like a corpse !.'
+'Do I?' said Oak, with a faint smile.
+'Lean on the gate: I'll wait a bit.'
+',All right, all right. '
+They stood by the gate awhile, Gabriel listlessly
+staring at the ground. His mind sped into the future,
+and saw there enacted in years of leisure the scenes o
+repentance that would ensue from this work of haste
+That they were married he had instantly decided. Why
+had it been so mysteriously managed ? It had become
+known that she had had a fearful journey to Bath, owing
+to her miscalculating the distance : that the horse had
+broken down, and that she had been more than two
+days getting there. It was not Bathsheba's way to do
+things furtively. With all her faults, she was candour
+itself. Could she have been entrapped ? The union
+was not only an unutterable grief to him: it amazed
+him, notwithstanding that he had passed the preceding
+week in a suspicion that such might be the issue of
+Troy's meeting her away from home. Her quiet return
+with liddy had to some extent dispersed the dread.
+Just as that imperceptible motion which appears like
+stillness is infinitely divided in its properties from stili
+ness itself, so had his hope undistinguishable from
+despair differed from despair indeed.
+In a few minutes they moved on again towards the
+house. The sergeant still looked from the window.
+'Morning, comrades .! ' he shouted, in a cheery voice,
+when they came up.
+Coggan replied to the greeting. ' Bain't ye going to
+answer the man ?' he then said to Gabriel. 'I'd say
+good morning -- you needn't spend a hapeth of meaning
+upon it, and yet keep the man civil.'
+Gabriel soon decided too that, since the deed was
+done, to put the best face upon the matter would be the
+greatest kindness to her he loved.
+'Good morning, Sergeant Troy,' he returned, in a
+ghastly voice.
+'A rambling, gloomy house this,' said Troy, smiling.
+<P 295>
+' Why -- they may not be married .! ' suggested Coggan.
+' Perhaps she's not there.'
+Gabriel shook his head. The soldier turned a little
+towards the east, and the sun kindled his scarlet coat
+to an orange glow.
+'But it is a nice old house,' responded Gabriel.
+'Yes-i suppose so; but I feel like new wine in an
+old bottle here. My notion is that sash-windows should
+be put throughout, and these old wainscoted walls
+brightened up a bit ; or the oak cleared quite away, and
+the walls papered.'
+'It would be a pity, I think.'
+'Well, no. A philosopher once said in my hearing
+that the old builders, who worked when art was a living
+thing, had no respect for the work of builders who went
+before them, but pulled down and altered as they
+thought fit; and why shouldn't we ? ''Creation and
+preservation don't do well together,'' says he, ''and a
+million of antiquarians can't invent a style.'' My mind
+exactly. I am for niaking this place more modern, that
+we may be cheerful whilst we can.'
+The military man turned and surveyed the interior
+of the room, to assist his ideas of improvement in this
+direction. Gabriel and Coggan began to move on.
+' Oh, Coggan,' said Troy, as if inspired by a recollec+
+tion ' do you know if insanity has ever appeared in Mr.
+Boldwood's family ? '
+Jan reflected for a moment.
+'I once heard that an uncle of his was queer in his
+head, but I don't know the rights o't,' he said.
+'It is of no importance,' said Troy, lightly. 'Well,
+I shall be down in the fields with you some time this
+week ; but I have a few matters to attend to first. So
+good-day to you. We shall, of course, keep on just as
+friendly terms as usual. I'm not a proud man : nobody
+is ever able to say that of Sergeant Troy. However,
+what is must be, and here's half-a-crown to drink my
+health, men.'
+Troy threw the coin dexterously across the front plot
+and over the fence towards Gabriel, who shunned it in
+its fall, his face turning to an angry red. Coggan
+twirled his eye, edged
+<P 296>
+forward, and caught the money
+in its ricochet upon the road.
+' very weli-you keep it, Coggan,' said Gabriel with
+disdain and almost fiercely. 'As for me, I'll do with+
+out gifts from him !'
+'Don't show it too much,' said Coggan, musingly.
+'For if he's married to her, mark my words, he'll buy
+his discharge and be our master here. Therefore 'tis
+well to say '' Friend '' outwardly, though you say
+''Troublehouse '' within. '
+' Weli-perhaps it is best to be silent; but I can't
+go further than that. I can't flatter, and if my place
+here is only to be kept by smoothing him down, my
+place must be lost.'
+A horseman, whom they had for some time seen in
+the distance, now appeared close beside them.
+' There's Mr. Boldwood,' said Oak. ' I wonder what
+Troy meant by his question.'
+Coggan and Oak nodded respectfully to the farmer,
+just checked their paces to discover if they were wanted,
+and finding they were not stood back to let him pass on.
+The only signs of the terrible sorrow Boldwood had
+been combating through the night, and was combating
+now, were the want of colour in his welidefined face,
+the enlarged appearance of the veins in his forehead
+and temples, and the sharper lines about his mouth.
+The horse bore him away, and the very step of the
+animal seemed significant of dogged despair. Gabriel, for
+a minute, rose above his own grief in noticing Boldwood's.
+He saw the square figure sitting erect upon the horse,
+the head turned to neither side, the elbows steady by
+the hips, the brim of the hat level and undisturbed in
+its onward glide, until the keen edges of Boldwood's
+shape sank by degrees over the hill. To one who knew
+the man and his story there was something more striking
+in this immobility than in a collapse. The clash of
+discord between mood and matter here was forced
+painfully home to the heart ; and, as in laughter there are
+more dreadful phases than in tears, so was there in the
+steadiness of this agonized man an expression deeper
+than a cry.
+<C xxxvi>
+<P 297>
+WEALTH IN JEOPARDY -- THE RVEEL
+ONE night, at the end of August, when Bathsheba's
+experiences as a married woman were still new, and
+when the weather was yet dry and sultry, a man stood
+motionless in the stackyard of Weatherbury Upper
+Farm, looking at the moon and sky.
+The night had a sinister aspect. A heated breeze
+from the south slowly fanned the summits of lofty
+objects, and in the sky dashes of buoyant cloud were
+sailing in a course at right angles to that of another
+stratum, neither of them in the direction of the breeze
+below. The moon, as seen through these films, had
+a lurid metallic look. The fields were sallow with the
+impure light, and all were tinged in monochrome, as
+if beheld through stained glass. The same evening
+the sheep had trailed homeward head to tail, the
+behaviour of the rooks had heen confused, and the
+horses had moved with timidity and caution.
+Thunder was imminent, and, taking some secondary
+appearances into consideration, it was likely to be
+followed by one of the lengthened rains which mark
+the close of dry weather for the season. Before twelve
+hours had passed a harvest atmosphere would be a
+bygone thing.
+Oak gazed with misgiving at eight naked and un'
+protected ricks, massive and heavy with the rich
+produce of one-half the farm for that year. He went
+on to the barn.
+This was the night which had been selected by
+Sergeant Troy -- ruling now in the room of his wife --
+for giving the harvest supper and dance. As Oak
+approached the building the sound of violins and a
+tambourine, and the regular jigging of many feet, grew
+more distinct. He came close to the large doors, one
+of which stood slightly ajar, and looked in.
+The central space, together with the recess at one
+end, was
+<P 298>
+emptied of all incumbrances, and this area,
+covering about two-thirds of the whole, was appropriated
+for the gathering, the remaining end, which was piled
+to the ceiling with oats, being screened off with sail'
+cloth. Tufts and garlands of green foliage decomted
+the walls, beams, and extemporized chandeliers, and
+immediately opposite to Oak a rostrum had been
+erected, bearing a table and chairs. Here sat three
+fiddlers, and beside them stood a frantic man with his
+hair on end, perspiration streaming down his cheeks,
+and a tanabourine quivering in his hand.
+The dance ended, and on the black oak floor in the
+midst a new row of couples formed for another.
+'Now, ma'am, and no offence I hope, I ask what
+dance you would like next ?' said the first violin.
+'Really, it makes no difference,' said the clear voice
+of Bathsheba, who stood at the inner end of the build+
+ing, observing the scene from behind a table covered
+with cups and viands. Troy was lolling beside her.
+'Then,' said the fiddler, 'I'll venture to name that
+the right and proper thing is ''The Soldier's Joy'' --
+there being a gallant soldier married into the farm --
+hey, my sonnies, and gentlemen all ? '
+'It shall be ''The Soldier's Joy,''' exclaimed a
+chorus.
+'Thanks for the compliment,' said the sergeant
+THE REVEL
+gaily, taking Bathsheba by the hand and leading her
+to the top of the dance. 'For though I have pur+
+chased my discharge from Her Most Gracious Majesty's
+regiment of cavalry the 11th Dragoon Guards, to attend
+to the new duties awaiting me here, I shall continue a
+soldier in spirit and feeling as long as I live.'
+So the dance began. As to the merits of 'The
+Soldier's Joy,' there cannot be, and never were, two
+opinions. It has been observed in the musical circles
+of Weatherbury and its vicinity that this melody, at
+the end of three-quarters of an hour of thunderous
+footing, still possesses more stimulative properties for
+the heel and toe than the majority of other dances at
+their first opening. 'The Soldier's Joy' has, too, an
+additional charm, in being so admirably adapted to
+the tambourine aforesaid -- no mean instrument in the
+hands of a performer
+<P 299>
+who understands the proper
+convulsions, spasms, St. vitus's dances, and fearful
+frenzies necessary when exhibiting its tones in their
+highest perfection.
+The immortal tune ended, a fine DD rolling forth
+from the bass-viol with the sonorousness of a cannonade,
+and Gabriel delayed his entry no longer. He avoided
+Bathsheba, and got as near as possible to the platform,
+where Sergeant Troy was now seated, drinking brandy+
+and-water, though the others drank without exception
+cider and ale. Gabriel could not easily thrust himself
+within speaking distance of the sergeant, and he sent
+a message, asking him to come down for a moment.
+'The sergeant said he could not attend.
+'Will you tell him, then,' said Gabriel, 'that I only
+stepped ath'art to say that a heavy rain is sure to fall
+soon, and that something should be done to protect
+the ricks ?'
+'M. Troy says it will not rain,' returned the
+messenger, 'and he cannot stop to talk to you about
+such fidgets.'
+In Juxtaposition with Troy, Oak had a melancholy
+tendency to look like a candle beside gas, and ill at
+ease, he went out again, thinking he would go home ;
+for, under the circumstances, he had no heart for the
+scene in the barn. At the door he paused for a
+moment : Troy was speaking.
+'Friends, it is not only the harvest home that we
+are celebrating to-night; but this is also a Wedding
+Feast. A short time ago I had the happiness to lead
+to the altar this lady, your mistress, and not until now
+have we been able to give any public flourish to the
+event in Weatherbury. That it may be thoroughly
+well done, and that every man may go happy to bed,
+I have ordered to be brought here some bottles of
+brandy and kettles of hot water. A treble-strong
+goblet will he handed round to each guest.'
+Bathsheba put her hand upon his arm, and, with
+upturned pale face, said imploringly, ' No -- don't give
+it to them -- pray don't, Frank .! It will only do them
+harm : they have had enough of everything.'
+'True -- we don't wish for no more, thank ye,' said
+one or two.
+'Pooh .! ' said the sergeant contemptuously, and
+raised his
+<P 300>
+voice as if lighted up by a new idea.
+' Friends,' he said, ' we'll send the women-folk home .!
+'Tis time they were in bed. Then we cockbirds will
+have a jolly carouse to ourselves .! If any of the men
+show the white feather, let them look elsewhere for a
+winter's work.'
+Bathsheba indignantly left the barn, followed by
+all the women and children. The musicians, not
+looking upon themselves as ' company,' slipped quietly
+away to their spring waggon and put in the horse.
+Thus Troy and the men on the farm were left sole
+occupants of the place. Oak, not to appear unneces+
+sarily disagreeable, stayed a little while ; then he, too,
+arose and quietly took his departure, followed by a
+friendly oath from the sergeant for not staying to a
+second round of grog.
+Gabriel proceeded towards his home. In approach+
+ing the door, his toe kicked something which felt and
+sounded soft, leathery, and distended, like a boxing+
+glove. It was a large toad humbly travelling across
+the path. Oak took it up, thinking it might be better
+to kill the creature to save it from pain; but finding
+it uninjured, he placed it again among the grass. He
+knew what this direct message from the Great Mother
+meant. And soon came another.
+When he struck a light indoors there appeared upon
+the table a thin glistening streak, as if a brush of varnish
+had been lightly dragged across it. Oak's eyes followed
+the serpentine sheen to the other side, where it led up
+to a huge brown garden-slug, which had come indoors
+to-night for reasons of its own. It was Nature's second
+way of hinting to him that he was to prepare for foul
+weather.
+Oak sat down meditating for nearly an hour.
+During this time two black spiders, of the kind common
+in thatched houses, promenaded the ceiling, ultimately
+dropping to the floor. This reminded him that if there
+was one class of manifestation on this matter that he
+thoroughly understood, it was the instincts of sheep.
+He left the room, ran across two or three fields towards
+the flock, got upon a hedge, and looked over among
+them.
+They were crowded close together on the other side
+around some
+<P 301>
+furze bushes, and the first peculiarity ob+
+servable was that, on the sudden appearance of Oak's
+head over the fence, they did not stir or run away.
+They had now a terror of something greater than their
+terror of man. But this was not the most noteworthy
+feature : they were all grouped in such a way that their
+tails, without a single exception, were towards that half
+of the horizon from which the storm threatened. There
+was an inner circle closely huddled, and outside these
+they radiated wider apart, the pattern formed by the
+flock as a whole not being unlike a vandyked lace
+collar, to which the clump of furze-bushes stood in the
+position of a wearer's neck.
+opinion. He knew now that he was right, and that
+Troy was wrong. Every voice in nature was unanimous
+in bespeaking change. But two distinct translations
+attached to these dumb expressions. Apparently there
+was to be a thunder-storm, and afterwards a cold con+
+tinuous rain. The creeping things seemed to know all
+about the later rain, hut little of the interpolated
+thunder-storm ; whilst the sheep knew all about the
+thunder-storm and nothing of the later rain.
+This complication of weathers being uncommon,
+was all the more to be feared. Oak returned to the
+stack-yard. All was silent here, and the conical tips of
+the ricks jutted darkly into the sky. There were five
+wheat-ricks in this yard, and three stacks of barley.
+The wheat when threshed would average about thirty
+quarters to each stack ; the barley, at least forty. Their
+value to Bathsheba, and indeed to anybody, Oak
+mentally estimated by the following simple calcula+
+tion : --
+5 x 30 = 150 quarters= 500fl.
+3 x 40=120 quarters= 250l.
+Total . . 750l.
+Seven hundred and fifty pounds in the divinest form
+that money can wear -- that of necessary food for man
+and beast : should the risk be run cf deteriorating this
+bulk of corn to less than half its value, because of the
+instability of a woman ? 'Never, if I can prevent it.! '
+said Gabriel.
+<P 302>
+Such was the argument that Oak set outwardly before
+him. But man, even to himself, is a palimpsest, having
+an ostensible writing, and another beneath the lines.
+It is possible that there was this golden legend under
+the utilitarian one: 'I will help to my last effort the
+woman I have loved so dearly.'
+He went back to the barn to endeavour to obtain
+assistance for covering the ricks that very
+<P 303>
+night. All
+was silent within, and he would have passed on in the
+belief that the party had broken up, had not a dim
+light, yellow as saffron by contrast with the greenish
+whiteness outside, streamed through a knot-hole in the
+folding doors.
+Gabriel looked in. An unusual picture met his
+eye.
+The candles suspended among the evergreens had
+burnt down to their sockets, and in some cases the
+leaves tied about them were scorched. Many of the
+lights had quite gone out, others smoked and stank,
+grease dropping from them upon the floor. Here,
+under the table, and leaning against forms and chairs
+in every conceivable attitude except the perpendicular, !'
+were the wretched persons of all the work-folk, the hair
+of their heads at such low levels being suggestive of
+mops and brooms. In the midst of these shone red
+and distinct the figure of Sergeant Troy, leaning back
+in a chair. Coggan was on his back, with his mouth
+open, huzzing forth snores, as were several others ; the
+united breathings of the horizonal assemblage forming
+a subdued roar like London from a distance. Joseph
+Poorgrass was curled round in the fashion of a hedge+
+hog, apparently in attempts to present the least possible
+portion of his surface to the air; and behind him was
+dimly visible an unimportant remnant of William Smali
+bury. The glasses and cups still stood upon the table,
+a water-jug being overturned, from which a small rill,
+after tracing its course with marvellous precision down
+the centre of the long table, fell into the neck of the
+unconscious Mark Clark, in a steady, monotonous drip,
+like the dripping of a stalactite in a cave.
+Gabriel glanced hopelessly at the group, which, with
+one or two exceptions, composed all the able-bodied
+men upon the farm. He saw at once that if the ricks
+were to be saved that night, or even the next morning,
+he must save them with his own hands.
+A faint ' ting-ting ' resounded from under Coggan's
+waistcoat. It was Coggan's watch striking the hour of
+two.
+Oak went to the recumbent form of Matthew Moon,
+who usually undertook the rough thatching of the home+
+stead, and shook him. The shaking was without effect.
+Gabriel shouted in his ear, ' where's your thatching+
+beetle and rick-stick and spars ? '
+' Under the staddles,' said Moon, mechanically, with
+the unconscious promptness of a medium.
+Gabriel let go his head, and it dropped upon the
+floor like a bowl. He then went to Susan Tall's
+husband.
+' where's the key of the granary ? '
+No answer. The question was repeated, with the
+same result. To be shouted to at night was evidently
+less of a novelty to Susan Tall's husband than to
+Matthew Moon. Oak flung down Tall's head into the
+corner again and turned away.
+To be just, the men were not greatly to blame for
+this painful and demoralizing termination to the
+evening's entertainment. Sergeant Troy had so strenu+
+ously insisted, glass in hand, that drinking should be
+the bond of their union, that those who wished to refuse
+hardly liked to be so unmannerly under the circum+
+stances. Having from their youth up been entirely un+
+accustomed to any liquor stronger than cider or mild
+ale, it was no wonder that they had succumbed, one
+and all, with extraordinary uniformity, after the lapse of
+about an hour.
+Gabriel was greatly depressed. This debauch boded
+ill for that wilful and fascinating mistress whom the
+faithful man even now felt within him as the embodi+
+ment of all that was sweet and bright and hopeless.
+He put out the expiring lights, that the barn might
+not be endangered, closed the door upon the men in
+their deep and oblivious sleep, and went again into the
+lone night. A hot breeze, as if breathed from the
+parted lips of some dragon about to swallow the globe,
+fanned him from the south, while directly opposite in
+the north rose a grim misshapen body of
+<P 304>
+cloud, in the
+very teeth of the wind. So unnaturally did it rise that
+one could fancy it to be lifted by machinery from below.
+Meanwhile the faint cloudlets had flown back into the
+south-east corner of the sky, as if in terror of the large
+cloud, like a young brood gazed in upon by some
+monster.
+Going on to the village, Oak flung a small stone
+against the window of Laban Tall's bedroom, expecting
+Susan to open it ; but nobody stirred. He went round
+to the back door, which had been left unfastened for
+Laban's entry, and passed in to the foot of the stair+
+case.
+'Mrs. Tall, I've come for the key of the granary,
+to get at the rick-cloths,' said Oak, in a stentorian
+voice.
+'Is that you ? ' said Mrs. Susan Tall, half awake.
+' Yes,' said Gabriel.
+'Come along to bed, do, you drawlatching rogue --
+keeping a body awake like this .'
+'It isn't Laban -- 'tis Gabriel Oak. I want the key
+of the granary.'
+'Gabriel. what in the name of fortune did you
+pretend to be Laban for ?'
+' I didn't. I thought you meant --  -- '
+'yes you did !. what do you want here ?'
+'The key of the granary.'
+"Take it then. 'Tis on the nail. People coming
+disturbing women at this time of night ought --  -- '
+Gabriel took the key, without waiting to hear the
+conclusion of the tirade. Ten minutes later his lonely
+figure might have been seen dragging four large water+
+proof coverings across the yard, and soon two of these
+heaps of treasure in grain were covered snug -- two cloths
+to each. Two hundred pounds were secured. Three
+wheat-stacks remained open, and there were no more
+cloths. Oak looked under the staddles and found a
+fork. He mounted the third pile of wealth and began
+operating, adopting the plan of sloping the upper
+sheaves one over the other; and, in addition, filling
+the interstices with the material of some untied sheaves.
+So far all was well. By this hurried contrivance
+Bathsheba's
+<P 305>
+property in wheat was safe for at any rate
+a week or two, provided always that there was not
+much wind.
+Next came the barley. This it was only possible to
+protect by systematic thatching. Time went on, and
+the moon vanished not to reappear. It was the
+farewell of the ambassador previous to war. The
+night had a haggard look, like a sick thing; and there
+came finally an utter expiration of air from the whole
+heaven in the form of a slow breeze, which might have
+been likened to a death. And now nothing was heard
+in the yard but the dull thuds of the beetle which drove
+in the spars, and the rustle of thatch in the intervals.
+THE STORM
+<C xxxvii>
+<P 306>
+THE STORM -- THE TWO TOGETHER
+A LIGHT flapped over the scene, as if reflected from
+phosphorescent wings crossing the sky, and a rumble
+filled the air. It was the first move of the approaching
+storm.
+The second peal was noisy, with comparatively little
+visible lightning. Gabriel saw a candle shining in Bath+
+sheba's bedroom, and soon a shadow swept to and fro
+upon the blind.
+Then there came a third flash. Manoeuvres of a
+most extraordinary kind were going on in the vast
+firmamental hollows overhead. The lightning now was
+the colour of silver, and gleamed in the heavens like a
+mailed army. Rumbles became rattles. Gabriel from
+his elevated position could see over the landscape at
+least half-a-dozen miles in front. Every hedge, bush,
+and tree was distinct as in a line engraving. In a
+paddock in the same direction was a herd of heifers,
+and the forms of these were visible at this moment in
+the act of galloping about in the wildest and maddest
+confusion, flinging their heels and tails high into the air,
+their heads to earth. A poplar in the immediate fore+
+ground was like an ink stroke on burnished tin. Then
+the picture vanished, leaving the darkness so intense
+that Gabriel worked entirely by feeling with his hands.
+He had stuck his ricking-rod, or poniard, as it was
+indifferently called -- a long iron lance, polished by
+handling -- into the stack, used to support the sheaves
+instead of the support called a groom used on houses,
+A blue light appeared in the zenith, and in some in+
+describable manner flickered down near the top of the
+rod. It was the fourth of the larger flashes. A moment
+later and there was a smack -- smart, clear, and short,
+Gabriel felt his position to be anything but a safe one,
+and he resolved to descend.
+Not a drop of rain had fallen as yet. He wiped his
+weary brow, and looked again at the black forms of
+the unprotected
+<P 307>
+stacks. Was his life so valuable to
+him after all? What were his prospects that he
+should be so chary of running risk, when important
+and urgent labour could not be carried on without
+such risk ? He resolved to stick to the stack. How+
+ever, he took a precaution. Under the staddles was
+a long tethering chain, used to prevent the escape of
+errant horses. This he carried up the ladder, and
+sticking his rod through the clog at one end, allowed
+the other end of the chain to trail upon the ground
+The spike attached to it he drove in. Under the
+shadow of this extemporized lightning-conductor he
+felt himself comparatively safe.
+Before Oak had laid his hands upon his tools again
+out leapt the fifth flash, with the spring of a serpent
+and the shout of a fiend. It was green as an
+emerald, and the reverberation was stunning. What
+was this the light revealed to him? In the open
+ground before him, as he looked over the ridge of
+the rick, was a dark and apparently female form.
+Could it be that of the only venturesome woman in
+the parish -- Bathsheba ? The form moved on a step :
+then he could see no more.
+"Is that you, ma'am ? ' said Gabriel to the darkness.
+"Who is there ?' said the voice of Bathsheba,
+THE TWO TOGETHER
+"Gabriel. I am on the rick, thatching.'
+"O, Gabriel ! -- and are you ? I have come about
+them. The weather awoke me, and I thought of the
+corn. I am so distressed about it -- can we save it any+
+how ? I cannot find my husband. Is he with you ?'
+"He is not here.'
+"Do you know where he is ?'
+"Asleep in the barn.'
+"He promised that the stacks should be seen to,
+and now they are all neglected ! Can I do anything
+to help ? Liddy is afraid to come out. Fancy finding
+you here at such an hour ! Surely I can do something ? '
+"You can bring up some reed-sheaves to me, one by
+one, ma'am; if you are not afraid to come up the ladder
+in the dark,' said Gabriel. "Every moment is precious
+now, and that would save a good deal of time. It is
+not very dark when the lightning has been gone a bit.'
+<P 308>
+"I'll do anything ! ' she said, resolutely. She instantly
+took a sheaf upon her shoulder, clambered up close to
+his heels, placed it behind the rod, and descended for
+another. At her third ascent the rick suddenly brightened
+with the brazen glare of shining majolica -- every knot
+in every straw was visible. On the slope in front of him
+appeared two human shapes, black as jet. The rick
+lost its sheen -- -the shapes vanished. Gabriel turned his
+head. It had been the sixth flash which had come from
+the east behind him, and the two dark forms on the
+slope had been the shadows of himself and Bathsheba.
+Then came the peal. It hardly was credible that
+such a heavenly light could be the parent of such a
+diabolical sound.
+"How terrible ! ' she exclaimed, and clutched him by
+the sleeve. Gabriel turned, and steadied her on her
+aerial perch by holding her arm. At the same moment,
+while he was still reversed in his attitude, there was
+more light, and he saw, as it were, a copy of the tall
+poplar tree on the hill drawn in black on the wall of
+the barn. It was the shadow of that tree, thrown across
+by a secondary flash in the west.
+The next flare came. Bathsheba was on the ground
+now, shouldering another sheaf, and she bore its dazzle
+without flinching -- thunder and ali-and again ascended
+with the load. There was then a silence everywhere
+for four or five minutes, and the crunch of the spars,
+as Gabriel hastily drove them in, could again be distinctly
+heard. He thought the crisis of the storm had passed.
+But there came a burst of light.
+"Hold on ! ' said Gabriel, taking the sheaf from her
+shoulder, and grasping her arm again.
+Heaven opened then, indeed. The flash was almost
+too novel for its inexpressibly dangerous nature to be
+at once realized, and they could only comprehend the
+magnificence of its beauty. It sprang from east, west,
+north, south, and was a perfect dance of death. The
+forms of skeletons appeared in the air, shaped with
+blue fire for bones -- dancing, leaping, striding, racing
+around, and mingling altogether in unparalleled con+
+fusion. With these were intertwined undulating snakes of
+green, and behind these was a broad mass of lesser light.
+Simultaneously came from every part of the tumbling
+<P 309>
+sky what may be called a shout ; since, though no shout
+ever came near it, it was more of the nature of a shout
+than of anything eise earthly. In the meantime one of
+the grisly forms had alighted upon the point of Gabriel's
+rod, to run invisibly down it, down the chain, and into
+the earth. Gabriel was almost blinded, and he could
+feel Bathsheba's warm arm tremble in his hand -- a
+sensation novel and thrilling enough ; but love, life,
+everything human, seemed small and trifling in such
+close juxtaposition with an infuriated universe.
+Oak had hardly time to gather up these impressions
+into a thought, and to see how strangely the red feather
+of her hat shone in this light, when the tall tree on the
+hill before mentioned seemed on fire to a white heat,
+and a new one among these terrible voices mingled with
+the last crash of those preceding. It was a stupefying
+blast, harsh and pitiless, and it fell upon their ears in a
+dead, flat blow, without that reverberation which lends
+the tones of a drum to more distant thunder. By the
+lustre reflected from every part of the earth and from the
+wide domical scoop above it, he saw that the tree was
+sliced down the whole length of its tall, straight stem, a
+huge riband of bark being apparently flung off. The
+other portion remained erect, and revealed the bared
+surface as a strip of white down the front. The
+lightning had struck the tree. A sulphurous smell
+filled the air; then all was silent, and black as a cave
+in Hinnom.
+" We had a narrow escape ! ' said Gabriel, hurriedly.
+" You had better go down.'
+Bathsheba said nothing ; but he could distinctly hear
+her rhythmical pants, and the recurrent rustle of the
+sheaf beside her in response to her frightened pulsations.
+She descended the ladder, and, on second thoughts, he
+followed her. The darkness was now impenetrable by
+the sharpest vision. They both stood still at the
+bottom, side by side. Bathsheba appeared to think
+only of the weather -- Oak thought only of her just then.
+At last he said --
+"The storm seems to have passed now, at any
+rate.'
+" I think so too,' said Bathsheba. " Though there
+are multitudes of gleams, look ! '
+<P 310>
+The sky was now filled with an incessant light,
+frequent repetition melting into complete continuity, as
+an unbroken sound results from the successive strokes
+on a gong.
+" Nothing serious,' said he. " I cannot understand
+no rain falling. But Heaven be praised, it is all the
+better for us. I am now going up again.'
+" Gabriel, you are kinder than I deserve ! I will stay
+and help you yet. O, why are not some of the others
+here ! '
+" They would have been here if they could,' said Oak,
+in a hesitating way.
+'O, I know it ali-all,' she said, adding slowly :
+" They are all asleep in the barn, in a drunken sleep, and
+my husband among them. That's it, is it not ? Don't
+think I am a timid woman and can't endure things.'
+"I am not certain,' said Gabriel. 'I will go and see,'
+He crossed to the barn, leaving her there alone. He
+looked through the chinks of the door. All was in
+total darkness, as he had left it, and there still arose, as
+at the former time, the steady buzz of many snores.
+He felt a zephyr curling about his cheek, and turned.
+It was Bathsheba's breath -- she had followed him, and
+was looking into the same chink.
+He endeavoured to put off the immediate and pain+
+ful subject of their thoughts by remarking gently, "lf
+you'll come back again, miss -- ma'am, and hand up a
+few more; it would save much time.'
+Then Oak went back again, ascended to the top,
+stepped off the ladder for greater expedition, and went
+on thatching. She followed, but without a sheaf
+" Gabriel,' she said, in a strange and impressive voice.
+Oak looked up at her. She had not spoken since
+he left the barn. The soft and continual shimmer of
+the dying lightning showed a marble face high against
+the black sky of the opposite quarter. Bathsheba was
+sitting almost on the apex of the stack, her feet gathered
+up beneath her, and resting on the top round of the
+ladder.
+" Yes, mistress,' he said.
+<P 311>
+"I suppose you thought that when I galloped away
+to Bath that night it was on purpose to be married ?"
+'I did at last -- not at first,' he answered, somewhat
+surprised at the abruptness with which this new subject
+was broached.
+" And others thought so, too ? '
+" Yes.'
+"And you blamed me for it ?'
+" Weli-a little.'
+"I thought so. Now, I care a little for your good
+opinion, and I want to explain something-i have
+longed to do it ever since I returned, and you looked so
+gravely at me. For if I were to die -- and I may die
+soon -- it would be dreadful that you should always think
+mistakenly of me. Now, listen.'
+Gabriel ceased his rustling.
+'I went to Bath that night in the full intention of
+breaking off my engagement to Mr. Troy. It was owing
+to circumstances which occurred after I got there that
+ -- that we were married. Now, do you see the matter
+in a new light?'
+" I do -- somewhat.'
+" I must, I suppose, say more, now that I have
+begun. And perhaps it's no harm, for you are certainly
+under no delusion that I ever loved you, or that I can
+have any object in speaking, more than that object I
+have mentioned. Well, I was alone in a strange city,
+and the horse was lame. And at last I didn't know
+what to do. I saw, when it was too late, that scandal
+might seize hold of me for meeting him alone in that
+way. But I was coming away, when he suddenly said
+he had that day seen a woman more beautiful than I,
+and that his constancy could not be counted on unless
+I at once became his.... And I was grieved and
+troubled --  -- ' She cleared her voice, and waited a
+moment, as if to gather breath. " And then, between
+jealousy and distraction, I married him ! ' she whispered
+with desperate impetuosity.
+Gabriel made no reply.
+"He was not to blame, for it was perfectly true about
+ -- about his seeing somebody else,' she quickly added.
+"And now I don't wish for a single remark from you
+upon the subject --
+<P 312>
+indeed, I forbid it. I only wanted
+you to know that misunderstood bit of my history before
+a time comes when you could never know it. -- You want
+some more sheaves ? '
+She went down the ladder, and the work proceeded.
+Gabriel soon perceived a languor in the movements of
+his mistress up and down, and he said to her, gently as
+a mother --
+"I think you had better go indoors now, you are
+tired. I can finish the rest alone. If the wind does
+not change the rain is likely to keep off.'
+"If I am useless I will go,' said Bathsheba, in a
+flagging cadence. 'But O, if your life should be lost !'
+" You are not useless; but I would rather not tire
+you longer. You have done well.'
+"And you better ! ' she said, gratefully. ! Thank you
+for your devotion, a thousand times, Gabriel ! Good+
+night-i know you are doing your very best for me.'
+She diminished in the gloom, and vanished, and he
+heard the latch of the gate fall as she passed through.
+He worked in a reverie now, musing upon her story, and
+upon the contradictoriness of that feminine heart which
+had caused her to speak more warmly to him to-night
+than she ever had done whilst unmarried and free to
+speak as warmly as she chose.
+He was disturbed in his meditation by a grating
+noise from the coach-house. It was the vane on the
+roof turning round, and this change in the wind was the
+signal for a disastrous rain.
+RAIN
+<C xxxviii>
+<P 313>
+RAIN -- ONE SOLITARY MEETS ANOTHER
+IT was now five o'clock, and the dawn was promising
+to break in hues of drab and ash.
+The air changed its temperature and stirred itself
+more vigorously. Cool breezes coursed in transparent
+eddies round Oak's face. The wind shifted yet a point
+or two and blew stronger. In ten minutes every wind
+of heaven seemed to be roaming at large. Some of the
+thatching on the wheat-stacks was now whirled fantas+
+tically aloft, and had to be replaced and weighted with
+some rails that lay near at hand. This done, Oak slaved
+away again at the barley. A huge drop of rain smote
+his face, the wind snarled round every corner, the trees
+rocked to the bases of their trunks, and the twigs clashed
+in strife. Driving in spars at any point and on any
+system, inch by inch he covered more and more safely
+from ruin this distracting impersonation of seven hundred
+pounds. 'The rain came on in earnest, and Oak soon felt
+the water to be tracking cold and clammy routes down
+his back. Ultimately he was reduced welinigh to a
+homogeneous sop, and the dyes of his clothes trickled
+down and stood in a pool at the foot of the ladder.
+The rain stretched obliquely through the dull atmo+
+sphere in liquid spines, unbroken in continuity between
+their beginnings in the clouds and their points in him.
+Oak suddenly remembered that eight months before
+this time he had been fighting against fire in the same
+spot as desperately as he was fighting against water
+now -- and for a futile love of the same woman. As for
+her --  --  But Oak was generous and true, and dis+
+missed his reflections.
+It was about seven o'clock in the dark leaden
+morning when Gabriel came down from the last stack,
+and thankfully exclaimed, "It is done .! ' He was
+<P 314>
+drenched, weary, and sad, and yet not so sad as drenched
+and weary, for he was cheered by a sense of success in
+a good cause.
+Faint sounds came from the barn, and he looked
+that way. Figures stepped singly and in pairs through
+the doors -- all walking awkwardly, and abashed, save
+the foremost, who wore a red jacket, and advanced
+with his hands in his pockets, whistling. The others
+shambled after with a conscience-stricken air : the whole
+procession was not unlike Flaxman's group of the suitors
+tottering on towards the infernal regions under the
+conduct of Mercury. The gnarled shapes passed into
+the village, Troy, their leader, entering the farmhouse.
+Not a single one of them had turned his face to the
+ricks, or apparently bestowed one thought upon their
+condition.
+Soon Oak too went homeward, by a different route
+from theirs. In front of him against the wet glazed
+surface of the lane he saw a person walking yet more
+slowly than himself under an umbrella. The man
+turned and plainly started; he was Boldwood.
+" How are you this morning, sir ?' said Oak.
+"Yes, it is a wet day. -- Oh, I am well, very well, I
+thank you ; quite well.'
+"I am glad to hear it, sir.'
+Boldwood seemed to awake to the present by degrees.
+" You look tired and ill, Oak,' he said then, desultorily
+regarding his companion.
+" I am tired. You look strangely altered, sir.'
+"I? Not a bit of it : I am well enough. What put
+that into your head ?'
+"I thought you didn't look quite so topping as you
+used to, that was all.'
+" Indeed, then you are mistaken,' said Boldwood,
+shortly. "Nothing hurts me. My constitution is an
+iron one.'
+"I've been working hard to get our ricks covered,
+and was barely in time. Never had such a struggle in
+my life.... Yours of course are safe, sir.'
+" O yes.' Boldwood added, after an interval of
+silence : " What did you ask, Oak ? '
+" Your ricks are all covered before this time ? '
+<P 315>
+"No.'
+" At any rate, the large ones upon the stone staddles ?'
+" They are not.'
+"Them under the hedge ?'
+" No. I forgot to tell the thatcher to set about it.'
+" Nor the little one by the stile ?'
+"Nor the little one by the stile. I overlooked the
+ricks this year.'
+'Then not a tenth of your corn will come to measure,
+sir.'
+" Possibly not.
+" Overlooked them,' repeated Gabriel slowly to him+
+self. It is difficult to describe the intensely dramatic
+effect that announcement had upon Oak at such a
+moment. All the night he had been feeling that the
+neglect he was labouring to repair was abnormal and
+isolated -- the only instance of the kind within the circuit
+of the county. Yet at this very time, within the same
+parish, a greater waste had been going on, uncomplained
+of and disregarded. A few months earlier Boldwood's
+forgetting his husbandry would have been as preposter+
+ous an idea as a sailor forgetting he was in a ship. Oak
+was just thinking that whatever he himself might have
+suffered from Bathsheba's marriage, here was a man
+who had suffered more, when Boldwood spoke in a
+changed voice -- that of one who yearned to make a
+confidence and relieve his heart by an outpouring.
+"Oak, you know as well as I that things have gone
+wrong with me lately. I may as well own it. I was
+going to get a little settled in life; but in some way my
+plan has come to nothing.'
+"I thought my mistress would have married you,'
+said Gabriel, not knowing enough of the full depths of
+Boldwood's love to keep silence on the farmer's account,
+and determined not to evade discipline by doing so on
+his own. 'However, it is so sometimes, and nothing
+happens that we expect,' he added, with the repose of
+a man whom misfortune had inured rather than sub+
+dued.
+'I daresay I am a joke about the parish,' said Bold+
+wood, as if the subject came irresistibly to his tongue,
+and with a miserable lightness meant to express his
+indifference.
+<P 316>
+" O no -- I don't think that.'
+ -- But the real truth of the matter is that there was
+not, as some fancy, any jilting on -- her part. No
+engagement ever existed between me and Miss Ever+
+dene. People say so, but it is untrue: she never
+promised me .! ' Boldwood stood still now and turned
+his wild face to Oak. 'O, Gabriel,' he continued, "I
+am weak and foolish, and I don't know what, and I
+can't fend off my miserable grief ! ... I had some faint
+belief in the mercy of God till I lost that woman. Yes,
+He prepared a gourd to shade me, and like the prophet
+I thanked Him and was glad. But the next day He
+prepared a worm to smite the gourd and wither it; and
+I feel it is better to die than to live.!"
+A silence followed. Boldwood aroused himself from
+the momentary mood of confidence into which he had
+drifted, and walked on again, resuming his usual reserve,
+" No, Gabriel,' he resumed, with a carelessness which
+was like the smile on the countenance of a skull: "it
+was made more of by other people than ever it was by
+us. I do feel a little regret occasionally, but no woman
+ever had power over me for any length of time. Well,
+good morning ; I can trust you not to mention to others
+what has passed between us two here.'
+<C xxxix>
+<P 317>
+COMING HOME -- A CRY
+ON the turnpke road, between Casterbridge and
+Weatherbury, and about three miles from the former
+which pervade the highways of this undulating part of
+South Wessex. I returning from market it is usual
+for the farmers and other gig-gentry to alight at the
+bottom and walk up.
+One Saturday evening in the month of October
+Bathsheba's vehicle was duly creeping up this incline.
+She was sitting listlessly in the second seat of the gig,
+whilst walking beside her in farmer's marketing suit
+of unusually fashionable cut was an erect, welimade
+young man. Though on foot, he held the reins and
+whip, and occasionally aimed light cuts at the horse's
+ear with the end of the lash, as a recreation. This
+man was her husband, formerly Sergeant Troy, who,
+having bought his discharge with Bathsheba's money,
+was gradually transforming himself into a farmer of a
+spirited and very modern school. People of unalter+
+able ideas still insisted upon calling him 'Sergeant'
+when they met him, which was in some degree owing
+to his having still retained the welishaped moustache
+of his military days, and the soldierly bearing insepar+
+able from his form and training.
+"Yes, if it hadn't been for that wretched rain I
+should have cleared two hundred as easy as looking,
+my love,' he was saying. "Don't you see, it altered
+all the chances? To speak like a book I once read,
+wet weather is the narrative, and fine days are the
+episodes, of our country's history; now, isn't that
+true?'
+' But the time of year is come for changeable weather.'
+"Well, yes. The fact is, these autumn races are the
+ruin of everybody. Never did I see such a day as 'twas .!
+'Tis a wild open place, just out of Budmouth, and a
+drab sea rolled in
+<P 318>
+towards us like liquid misery. Wind
+and rain -- good Lord !. Dark ? Why, 'twas as black
+as my hat before the last race was run. 'Twas five
+o'clock, and you couldn't see the horses till they were
+almost in, leave alone colours. The ground was as
+heavy as lead, and all judgment from a fellow's experi+
+ence went for nothing. Horses, riders, people, were
+all blown about like ships at sea. Three booths were
+blown over, and the wretched folk inside crawled out
+upon their hands and knees; and in the next field
+were as many as a dozen hats at one time. Aye,
+Pimpernel regularly stuck fast, when about sixty yards
+off, and when I saw Policy stepping on, it did knock
+my heart against the lining of my ribs, I assure you,
+my love.!'
+" And you mean, Frank,' said Bathsheba, sadly --
+her voice was painfully lowered from the fulness and
+vivacity of the previous summer -- "that you have lost
+more than a hundred pounds in a month by this
+dreadful horse-racing ? O, Frank, it is cruel; it is
+foolish of you to take away my money so. We shall
+have to leave the farm; that will be the end of it !.'
+' Humbug about cruel. Now, there 'tis again --
+turn on the waterworks ; that's just like you.'
+"But you'll promise me not to go to Budmouth
+second meeting, won't you ? ' she implored. Bathsheba
+was at the full depth for tears, but she maintained a
+dry eye.
+"I don't see why I should; in fact, if it turns out to
+be a fine day, I was thinking of taking you.'
+"Never, never.! I'll go a hundred miles the other
+way first. I hate the sound of the very word.!'
+"But the question of going to see the race or staying
+at home has very little to do with the matter. Bets are
+all booked safely enough before the race begins, you
+may depend. Whether it is a bad race for me or a
+good one, will have very little to do with our going
+there next Monday.'
+"But you don't mean to say that you have risked
+anything on this one too .! ' she exclaimed, with an
+agonized look.
+"There now, don't you be a little fool. Wait till you
+are told. Why, Bathsheba, you have lost all the pluck
+and sauciness you formerly had, and upon my life if I
+had known what a
+<P 319>
+chicken-hearted creature you were
+under all your boldness, I'd never have-i know what.'
+A flash of indignation might have been seen in
+Bathsheba's dark eyes as she looked resolutely ahead
+after this reply. They moved on without further
+speech, some early-withered leaves from the trees which
+hooded the road at this spot occasionally spinning
+downward across their path to the earth.
+A woman appeared on the brow of the hill. The
+ridge was in a cutting, so that she was very near the
+husband and wife before she became visible. Troy had
+turned towards the gig to remount, and whilst putting
+his foot on the step-the woman passed behind him.
+Though the overshadowing trees and the approach
+of eventide enveloped them in gloom, Bathsheba could
+see plainly enough to discern the extreme poverty of
+the woman's garb, and the sadness of her face.
+"Please, sir, do you know at what time Casterbridge
+Union-house closes at night ? '
+A CRY
+The woman said these words to Troy over his
+shoulder.
+Troy started visibly at the sound of the voice; yet
+he seemed to recover presence of mind sufficient to
+prevent himself from giving way to his impulse to
+suddenly turn and face her. He said, slowly --
+" I don't know."
+The woman, on hearing him speak, quickly looked
+up, examined the side of his face, and recognized the
+soldier under the yeoman's garb. Her face was drawn
+into an expression which had gladness and agony both
+among its elements. She uttered an hysterical cry,
+and fell down.
+" O, poor thing.!' exclaimed Bathsheba, instantly
+preparing to alight.
+"Stay where you are, and attend to the horse!'
+said Troy, peremptorily throwing her the reins and
+the whip. "Walk the horse to the top: I'll see to
+the woman.'
+" But i -- -'
+" Do you hear? Clk -- Poppet.!'
+<P 320>
+The horse, gig, and Bathsheba moved on.
+"How on earth did you come here? I thought
+you were miles away, or dead.! Why didn't you
+write to me?' said Troy to the woman, in a strangely
+gentle, yet hurried voice, as he lifted her up.
+" I feared to."
+'Have you any money?'
+"None."
+"Good Heaven -- I wish I had more to give you!.
+Here's  --  wretched  --  the merest trifle. It is every
+farthing I have left. I have none but what my wife
+gives me, you know, and I can't ask her now.'
+The woman made no answer.
+"I have only another moment,' continued Troy;
+'and now listen. Where are you going to-night?
+Casterbridge Union?'
+"Yes; I thought to go there.'
+" You shan't go there; yet, wait. Yes, perhaps for
+to-night ; I can do nothing better -- worse luck.! Sleep
+there to-night, and stay there to-morrow. Monday is
+the first free day I have; and on Monday morning,
+at ten exactly, meet me on Grey's Bridge just out of the
+town. I'll bring all the money I can muster. You
+shan't want-i'll see that, Fanny; then I'll get you a
+lodging somewhere. Good-bye till then. I am a brute
+ -- but good-bye.!'
+After advancing the distance which completed the
+ascent of the hill, Bathsheba turned her head. The
+woman was upon her feet, and Bathsheba saw her
+withdrawing from Troy, and going feebly down the
+hill by the third milestone from Casterbridge. Troy
+then came on towards his wife, stepped into the gig,
+took the reins from her hand, and without making any
+observation whipped the horse into a trot. He was
+rather agitated.
+"Do you know who that woman was?' said Bath+
+sheba, looking searchingly into his face.
+"I do,' he said, looking boldly back into hers.
+"I thought you did,' said she, with angry hauteur,
+and still regarding him. " Who is she?'
+<P 321>
+He suddenly seemed to think that frankness would
+benefit neither of the women.
+'Nothing to either of us,' he said. "I know her
+by sight."
+'What is her name?'
+"How should I know her name ?'
+"I think you do.'
+"Think if you will, and be --  -- " The sentence was
+completed by a smart cut of the whip round Poppet's
+flank, which caused the animal to start forward at a
+wild pace. No more was said.
+ON CASTERBRIDGE HIGHWAY
+<C xl>
+<P 322>
+FOR a considerable time the woman walked on. Her
+steps became feebler, and she strained her eyes to look
+afar upon the naked road, now indistinct amid the
+penumbrae of night. At length her onward walk
+dwindled to the merest totter, and she opened a gate
+within which was a haystack. Underneath this she sat
+down and presently slept.
+When the woman awoke it was to find herself in the
+depths of a moonless and starless night. A heavy un+
+broken crust of cloud stretched across the sky, shutting
+out every speck of heaven ; and a distant halo which
+hung over the town of Casterbridge was visible against
+the black concave, the luminosity appearing the
+brighter by its great contrast with the circumscribing
+darkness. Towards this weak, soft glow the woman
+turned her eyes.
+"If I could only get there.!' she said. "Meet him
+the day after to-morrow: God help me! Perhaps I
+shall be in my grave before then.'
+A manor-house clock from the far depths of shadow
+struck the hour, one, in a small, attenuated tone. After
+midnight the voice of a clock seems to lose in breadth
+as much as in length, and to diminish its sonorousness
+to a thin falsetto.
+Afterwards a light -- two lights -- arose frona the re+
+mote shade, and grew larger. A carriage rolled along
+the toad, and passed the gate. It probably contained
+some late diners-out. The beams from one lamp shone
+for a moment upon the crouching woman, and threw
+her face into vivid relieff. The face was young in the
+groundwork, old in the finish ; the general contours
+were flexuous and childlike, but the finer lineaments
+had begun to be sharp and thin.
+The pedestrian stood up, apparently with revived
+determination, and looked around. The road appeared
+to be
+<P 323>
+familiar to her, and she carefully scanned the fence
+as she slowly walked along. Presently there became
+visible a dim white shape; it was another milestone.
+She drew her fingers across its face to feel the marks.
+"Two more!' she said.
+She leant against the stone as a means of rest for a
+ short interval, then bestirred herself, and again pursued
+her way. For a slight distance she bore up bravely,
+afterwards flagging as before. This was beside a lone
+copsewood, wherein heaps of white chips strewn upon
+the leafy ground showed that woodmen had been
+faggoting and making hurdles during the day. Now
+there was not a rustle, not a breeze, not the faintest
+clash of twigs to keep her company. The woman
+looked over the gat, opened it, and went in. Close
+to the entrance stood a row of faggots, bound and un+
+bound, together with stakes of all sizes.
+For a few seconds the wayfarer stood with that tense
+stillness which signifies itself to be not the end but
+merely the suspension, of a previous motion. Her
+attitude was that of a person who listens, either to the
+external world of sound, or to the imagined discourse of
+thought. A close criticism might have detected signs
+proving that she was intent on the latter alternative.
+Moreover, as was shown by what followed, she was
+oddly exercising the faculty of invention upon the spe+
+ciality of the clever Jacquet Droz, the designer of auto+
+matic substitutes for human limbs.
+By the aid of the Casterbridge aurora, and by feeling
+with her hands, the woman selected two sticks from the
+heaps. These sticks were nearly straight to the height
+of three or four feet, where each branched into a fork
+like the letter Y. She sat down, snapped off the small
+upper twigs, and carried the remainder with her into
+the road. She placed one of these forks under each
+arm as a crutch, tested them, timidly threw her whole
+weight upon them -- so little that it was -- and swung
+herself forward. The girl had made for herself a
+material aid.
+The crutches answered well. The pat of her feet,
+and the tap of her sticks upon the highway, were all the
+sounds that
+<P 324>
+came from the traveller now. She had
+passed the last milestone by a good long distance, and
+began to look wistfully towards the bank as if calculating
+upon another milestone soon. The crutches, though
+so very useful, had their limits of power. Mechanism
+only transfers labour, being powerless to supersede it,
+and the original amount of exertion was not cleared
+away; it was thrown into the body and arms. She was
+exhausted, and each swing forward became fainter. At
+last she swayed sideways, and fell.
+Here she lay, a shapeless heap, for ten minutes and
+more. The morning wind began to boom dully over
+the flats, and to move afresh dead leaves which had
+lain still since yesterday. The woman desperately
+turned round upon her knees, and next rose to her
+feet. Steadying herself by the help of one crutch, she
+essayed a step, then another, then a third, using the
+crutches now as walking-sticks only. Thus she pro+
+gressed till descending Mellstock Hill another milestone
+appeared, and soon the beginning of an iron-railed fence
+came into view. She staggered across to the first post,
+clung to it, and looked around.
+The Casterbridge lights were now individually visible,
+It was getting towards morning, and vehicles might be
+hoped for, if not expected soon. She listened. There
+was not a sound of life save that acme and sublimation
+of all dismal sounds, the hark of a fox, its three hollow
+notes being rendered at intervals of a minute with the
+precision of a funeral bell.
+Less than a mile.!' the woman murmured. "No;
+more,' she added, after a pause. 'The mile is to the
+county hall, and my resting-place is on the other side
+Casterbridge. A little over a mile, and there I am! '
+After an interval she again spoke. "Five or six steps to
+a yard -- six perhaps. I have to go seventeen hundred
+yards. A hundred times six, six hundred. Seventeen
+times that. O pity me, Lord.!'
+Holding to the rails, she advanced, thrusting one
+hand forward upon the rail, then the other, then leaning
+over it whilst she dragged her feet on beneath.
+This woman was not given to soliloquy; but ex,
+tremity of feeling lessens the individuality of the weak,
+as it increases
+<P 325>
+that of the strong. She said again in the
+same tone, "I'll believe that the end lies five posts for+
+ward, and no further, and so get strength to pass them.'
+This was a practical application of the principle that
+a half-feigned and fictitious faith is better than no faith
+at all.
+She passed five posts and held on to the fifth.
+"I'll pass five more by believing my longed-for spot
+is at the next fifth. I can do it.'
+she passed five more.
+"It lies only five further.'
+she passed five more.
+"But it is five further.'
+She passed them.
+'That stone bridge is the end of my journey,' she
+said, when the bridge over the Froom was in view.
+She crawled to the bridge. During the effort each
+breath of the woman went into the air as if never to
+return again.
+"Now for the truth of the matter,' she said, sitting
+down. "The truth is, that I have less than half a mile.'
+Self-beguilement with what she had known all the time
+to be false had given her strength to come over half
+a mile that she would have been powerless to face in
+the lump. The artifice showed that the woman, by
+some mysterious intuition, had grasped the paradoxical
+truth that blindness may operate more vigorously than
+prescience, and the short-sighted effect more than the
+far-seeing ; that limitation, and not comprehensiveness,
+is needed for striking a blow.
+The half-mile stood now before the sick and weary
+woman like a stolid Juggernaut. It was an impassive
+King of her world. The road here ran across Durnover
+Moor, open to the road on either side. She surveyed
+the wide space, the lights, herself, sighed, and lay down
+against a guard-stone of the bridge.
+Never was ingenuity exercised so sorely as the
+traveller here exercised hers. Every conceivable aid,
+m&thod, stratagem, mechanism, by which these last
+desperate eight hundred yards could be overpasscd by a
+human being unperceived, was revolved in her busy
+brain, and dismissed as impracticable. She thought of
+<P 326>
+sticks, wheels, crawling -- she even thought of rolling.
+But the exertion demanded by either of these latter two
+was greater than to walk erect. The faculty of con+
+trivance was worn out, Hopelessness had come at
+last.
+" No further.!' she whispered, and closed her eyes.
+From the stripe of shadow on the opposite side of
+the bridge a portion of shade seemed to detach itself
+and move into isolation upon the pale white of the road.
+It glided noiselessly towards the recumbent woman.
+She became conscious of something touching her
+hand; it was softness and it was warmth. She
+opened her eye's, and the substance touched her face.
+A dog was licking her cheek.
+He was huge, heavy, and quiet creature, standing
+darkly against the low horizon, and at least two feet
+higher than the present position of her eyes. Whether
+Newfoundland, mastiff, bloodhound, or what not, it was
+impossible to say. He seemed to be of too strange and
+mysterious a nature to belong to any variety among those
+of popular nomenclature. Being thus assignable to no
+breed, he was the ideal embodiment of canine greatness
+ -- a generalization from what was common to all. Night,
+in its sad, solemn, and benevolent aspect, apart from its
+stealthy and cruel side, was personified in this form
+Darkness endows the small and ordinary ones among
+mankind with poetical power, and even the suffering
+woman threw her idea nto figure.
+In her reclining position she looked up to him just
+as in earlier times she had, when standing, looked up
+to a man. The animal, who was as homeless as she,
+respectfully withdrew a step or two when the woman
+moved, and, seeing that she did not repulse him, he
+licked her hand again.
+A thought moved within her like lightning. "Perhaps
+I can make use of him-i might do it then!'
+She pointed in the direction of Casterbridge, and
+the dog seemed to misunderstand : he trotted on. Then,
+finding she could not follow, he came back and whined.
+The ultimate and saddest singularity of woman's effort
+and invention was reached when, with a quickened breath+
+ing, she rose to a stooping posture, and, resting her two
+little arms
+<P 327>
+upon the shoulders of the dog, leant firmly
+thereon, and murmured stimulating words. Whilst she
+sorrowed in her heart she cheered with her voice, and
+what was stranger than that the strong should need
+encouragement from the weak was that cheerfulness
+should be so well stimulated by such utter dejection.
+Her friend moved forward slowly, and she with small
+mincing steps moved forward beside him, half her
+weight being thrown upon the animal. Sometimes
+she sank as she had sunk from walking erect, from
+the crutches, from the rails. The dog, who now
+thoroughly understood her desire and her incapacity,
+was frantic in his distress on these occasions ; he would
+tug at her dress and run forward. She always called
+him back, and it was now to be observed that the
+woman listened for human sounds only to avoid them.
+It was evident that she had an object in keeping her
+presence on the road and her forlorn state unknown.
+Their progress was necessarily very slow. They
+reached the bottom of the town, and the Casterbridge
+lamps lay before them like fallen Pleiads as they turned
+to the left into the dense shade of a deserted avenue of
+chestnuts, and so skirted the borough. Thus the town
+was passed, and the goal was reached.
+On this much-desired spot outside the town rose a
+picturesque building. Originally it had been a mere
+case to hold people. The shell had been so thin, so
+devoid of excrescence, and so closely drawn over the
+accommodation granted, that the grim character of
+what was beneath showed through it, as the shape of
+a body is visible under a winding-sheet.
+Then Nature, as if offended, lent a hand. Masses
+of ivy grew up, completely covering the walls, till the
+place looked like an abbey; and it was discovered that
+the view from the front, over the Casterbridge chimneys,
+was one of the most magnificent in the county. A
+neighbouring earl once said that he would give up a
+year's rental to have at his own door the view enjoyed
+by the inmates from theirs -- and very probably the
+inmates would have given up the view for his year's
+rental.
+This stone edifice consisted of a central mass and
+<P 328>
+two wings, whereon stood as sentinels a few slim
+chimneys, now gurgling sorrowfully to the slow wind.
+In the wall was a gate, and by the gate a belipull
+formed of a hanging wire. The woman raised herself
+as high as possible upon her knees, and could just
+reach the handle. She moved it and fell forwards in
+a bowed attitude, her face upon her bosom.
+It was getting on towards six o'clock, and sounds of
+movement were to be heard inside the building which
+was the haven of rest to this wearied soul. A little door
+by the large one was opened, and a man appeared inside.
+He discerned the panting heap of clothes, went back
+for a light, and came again. He entered a second
+time, and returned with two women.
+These lifted the prostrate figure and assisted her in
+through the doorway. The man then closed the door.
+How did she get here ?" said one of the women.
+"The Lord knows,' said the other.
+There is a dog outside," murmured the overcome
+traveller. " Where is he gone ? He helped me.'
+I stoned him away,' said the man.
+The little procession then moved forward -- the man
+in front bearing the light, the two bony women next,
+supporting between them the small and supple one.
+Thus they entered the house and disappeared.
+SUSPICION
+<C xli>
+<P 329>
+SUSPICION -- FANNY IS SENT FOR
+BATHSHEBA said very little to her husband all that
+evening of their return from market, and he was not
+disposed to say much to her. He exhibited the un+
+pleasant combination of a restless condition with a
+silent tongue. The next day, which was Sunday, passed
+nearly in the same manner as regarded their taciturnity,
+Bathsheba going to church both morning and afternoon.
+This was the day before the Budmouth races. In the
+evening Troy said, suddenly --
+" Bathsheba, could you let me have twenty pounds ?"
+Her countenance instantly sank. ' Twenty pounds ?
+she said.
+'The fact is, I want it badly.' The anxiety upon
+Troy's face was unusual and very marked. lt was a
+culmination of the mood he had been in all the day.
+"Ah !. for those races to-morrow.'
+Troy for the moment made no reply. Her mistake
+had its advantages to a man who shrank from having
+his mind inspected as he did now. "Well, suppose I
+do want it for races ?' he said, at last.
+"O, Frank.!' Bathsheba replied, and there was such
+a volume of entreaty in the words. "Only such a few
+weeks ago you said that I was far sweeter than all your
+other pleasures put together, and that you would give
+them all up for me; and now, won't you give up this
+one, which is more a worry than a pleasure? Do,
+Frank. Come, let me fascinate you by all I can do
+ -- by pretty words and pretty looks, and everything I
+can think of -- to stay at home. Say yes to your wife --
+say yes.!'
+The tenderest and softest phases of Bathsheba's
+nature were prominent now -- advanced impulsively for
+his acceptance, without any of the disguises and defences
+which the wariness of her character when she was cool
+too frequently threw
+<P 330>
+over them. Few men could have
+resisted the arch yet dignified entreaty of the beautiful
+face, thrown a little back and sideways in the weli
+known attitude that expresses more than the words it
+accompanies, and which seems to have heen designed
+for these special occasions. Had the woman not been
+his wife, Troy would have succumbed instantly ; as it
+was, he thought he would not deceive her longer.
+"The money is not wanted for racing debts at all,'
+he said.
+" What is it for ?' she asked. " You worry me a great
+deal by these mysterious responsibilities, Frank."
+Troy hesitated. He did not now love her enough
+to allow himself to be carried too far by her ways. Yet
+it was necessary to be civil. "You wrong me by such
+a suspicious manner, he said. " Such strait-waistcoating
+as you treat me to is not becoming in you at so early a
+date.'
+"I think that I have a right to grumble a little if I
+pay,' she said, with features between a smile and a
+pout.
+Exactly; and, the former being done, suppose we
+proceed to the latter. Bathsheba, fun is all very well,
+but don't go too far, or you may have cause to regret
+something.'
+She reddened. " I do that already,' she said, quickly
+" What do you regret ? '
+SUSPICION
+"That my romance has come to an end.'
+" All romances end at marriage.'
+'I wish you wouldn't talk like that. You grieve me
+to my soul by being smart at my expense.'
+" You are dull enough at mine. I believe you hate
+me.'
+" Not you -- only your faults. I do hate them.'
+"'Twould be much more becoming if you set your+
+self to cure them. Come, let's strike a balance with
+the twenty pounds, and be friends.'
+She gave a sigh of resignation. 'I have about that
+sum here for household expenses. If you must have it,
+take it.'
+"Very good. Thank you. I expect I shall have
+gone away before you are in to breakfast to-morrow.'
+"And must you go ? Ah !. there was a time, Frank,
+when it would have taken a good many promises to
+other people to drag you away from me. You used to
+call me darling, then.
+<P 331>
+But it doesn't matter to you how
+my days are passed now.'
+"I must go, in spite of sentiment.' Troy, as he
+spoke, looked at his watch, and, apparently actuated by
+<1non lucendo>1 principles, opened the case at the back,
+revealing, snugly stowed within it, a small coil of hair.
+Bathsheba's eyes had been accidentally lifted at that
+moment, and she saw the action and saw the hair. She
+flushed in pain and surprise, and some words escaped
+her before she had thought whether or not it was wise
+to utter them. "A woman's curl of hair !' she said.
+"O, Frank, whose is that ?'
+Troy had instantly closed his watch. He carelessly
+replied, as one who cloaked some feelings that the sight
+had stirred. ' Why, yours, of course. Whose should it
+be ? I had quite forgotten that I had it.'
+' What a dreadful fib, Frank.!'
+" I tell you I had forgotten it.!' he said, loudly.
+'I don't mean that -- it was yellow hair.'
+"Nonsense.'
+"That's insulting me. I know it was yellow. Now
+whose was it ? I want to know.'
+"Very welii'll tell you, so make no more ado. It
+is the hair of a young woman I was going to marry
+before I knew you.'
+" You ought to tell me her name, then.'
+"I cannot do that.'
+"Is she married yet?'
+"No.'
+"Is she alive?'
+" Yes.'
+"Is she pretty ?'
+" Yes.'
+'It is wonderful how she can be, poor thing, under
+such an awful affliction!'
+" Affliction -- what affliction ? ' he inquired, quickly.
+" Having hair of that dreadful colour.'
+" Oh -- ho-i like that.!' said Troy, recovering him+
+self. "Why, her hair has been admired by everybody
+who has seen her since she has worn it loose, which has
+not been long. It is
+<P 332>
+beautiful hair. People used to
+turn their heads to look at it, poor girl.!'
+"Pooh! that's nothing -- that's nothing!' she ex+
+claimed, in incipient accents of pique. 'If I cared for
+your love as much as I used to I could say people had
+turned to look at mine.'
+"Bathsheba, don't be so fitful and jealous. You
+knew what married life would be like, and shouldn't
+have entered it if you feared these contingencies.'
+Troy had by this time driven her to bitterness: her
+heart was big in her throat, and the ducts to her eyes
+were painfully full. Ashamed as she was to show
+emotion, at last she burst out: --
+"This is all I get for loving you so well! Ah! when
+I married you your life was dearer to me than my own.
+I would have died for you -- how truly I can say that I
+would have died for you.! And now you sneer at my
+foolishness in marrying you. O! is it kind to me to
+throw my mistake in my face ? Whatever opinion you
+may have of my wisdom, you should not tell me of it so
+mercilessly, now that I am in your power.'
+" I can't help how things fall out,' said Troy; "upon
+my heart, women will be the death of me.!'
+"Well you shouldn't keep people's hair. You'll
+burn it, won't you, Frank?'
+Frank went on as if he had not heard her. "There
+are considerations even before my consideration for you;
+reparations to be made -- ties you know nothing of If
+you repent of marrying, so do I.'
+Trembling now, she put her hand upon his arm,
+saying, in mingled tones of wretchedness and coaxing,
+"I only repent it if you don't love me better than any
+woman in the world.! I don't otherwise, Frank. You
+don't repent because you already love somebody better
+than you love me, do you ?'
+"I don't know. Why do you say that?'
+"You won't burn that curl. You like the woman
+who owns that pretty hair -- yes; it is pretty -- more
+beautiful than my miserable black mane! Well, it is
+no use; I can't help being ugly. You must like her
+best, if you will!'
+"Until to-day, when I took it from a drawer, I have
+<P 333>
+never looked upon that bit of hair for several months --
+that I am ready to swear.'
+"But just now you said "ties;" and then -- that
+woman we met?'
+"'Twas the meeting with her that reminded me of
+the hair.'
+"Is it hers, then ?'
+"Yes. There, now that you have wormed it out of
+me, I hope you are content.'
+"And what are the ties ?'
+"Oh! that meant nothing -- a mere jest.'
+"A mere jest ! ' she said, in mournful astonishment.
+"Can you jest when I am so wretchedly in earnest ?
+Tell me the truth, Frank. I am not a fool, you know,
+although I am a woman, and have my woman's moments.
+Come! treat me fairly,' she said, looking honestly and
+fearlessly into his face. "I don't want much; bare
+justice -- that's all! Ah! once I felt I could be content
+with nothing less than the highest homage from the
+husband I should choose. Now, anything short of
+cruelty will content me. Yes! the independent and
+spirited Bathsheba is come to this.!'
+"For Heaven's sake don't be so desperate! "Troy
+said, snappishly, rising as he did so, and leaving the
+room.
+Directly he had gone, Bathsheba burst into great
+sobs -- dry-eyed sobs, which cut as they came, without
+any softening by tears. But she determined to repress
+all evidences of feeling. She was conquered; but she
+would never own it as long as she lived. Her pride
+was indeed brought low by despairing discoveries of her
+spoliation by marriage with a less pure nature than her
+own. She chafed to and fro in rebelliousness, like a
+caged leopard; her whole soul was in arms, and the
+blood fired her face. Until she had met Troy, Bath+
+sheba had heen proud of her position as a woman; it
+had been a glory to her to know that her lips had been
+touched hy no man's on earth -- that her waist had
+never been encircled by a lover's arm. She hated
+herself now. In those earlier days she had always
+nourished a secret contempt for girls who were the
+slaves of the first goodiooking young fellow who should
+choose to salute them. She had never taken kindly to
+the idea of
+<P 334>
+marriage in the abstract as did the majority
+of women she saw about her. In the turmoil of her
+anxiety for her lover she had agreed to marry him; but
+the perception that had accompanied her happiest hours
+on this account was rather that of self-sacrifice than of
+promotion and honour. Although she scarcely knew
+the divinity's name, Diana was the goddess whom
+Bathsheba instinctively adored. That she had never,
+by look, word, or sign, encouraged a man to approach
+her -- that she had felt herself sufficient to herself, and
+had in the independence of her girlish heart fancied
+there was a certain degradation in renouncing the
+simplicity of a maiden existence to become the humbler
+half of an indifferent matrimonial whole -- were facts
+now bitterly remembered. O, if she had never
+stooped to folly of this kind, respectable as it was, and
+could only stand again, as she had stood on the hill at
+Norcombe, and dare Troy or any other man to pollute
+a hair of her head by his interference!.
+The next morning she rose earlier than usual, and
+had the horse saddled for her ride round the farm in
+the customary way. When she came in at half-past
+eight -- their usual hour for breakfasting -- she was in+
+formed that her husband had risen, taken his breakfast,
+and driven off to Casterbridge with the gig and Poppet.
+After breakfast she was cool and collected -- quite
+herself in fact -- and she rambled to the gate, intending
+to walk to another quarter of the farm, which she still
+personally superintended as well as her duties in the
+house would permit, continually, however, finding her+
+self preceded in forethought by Gabriel Oak, for whom
+she began to entertain the genuine friendship of a sister.
+Of course, she sometimes thought of him in the light of
+an old lover, and had momentary imaginings of what
+life with him as a husband would have been like; also
+of life with Boldwood under the same conditions. But
+Bathsheba, though she could feel, was not much given
+to futile dreaming, and her musings under this head
+were short and entirely confined to the times when
+Troy's neglect was more than ordinarily evident.
+She saw coming up the road a man like Mr. Boldwood.
+<P 335>
+It was Mr. Boldwood. Bathsheba blushed painfully,
+and watched. The farmer stopped when still a long
+way off, and held up his hand to Gabriel Oak, who was
+in a footpath across the field. The two men then
+approached each other and seemed to engage in
+earnest conversation.
+Thus they continued for a long time. Joseph Poor+
+grass now passed near them, wheeling a barrow of apples
+up the hill to Bathsheba's residence. Boldwood and
+Gabriel called to him, spoke to him for a few minutes,
+and then all three parted, Joseph immediately coming
+up the hill with his barrow.
+Bathsheba, who had seen this pantomime with some
+surprise, experienced great relief when Boldwood turned
+back again. 'Well, what's the message, Joseph ? ' she
+said.
+He set down his barrow, and, putting upon himself
+the refined aspect that a conversation with a lady re+
+quired, spoke to Bathsheba over the gate.
+"You'll never see Fanny Robin no more -- use nor
+principai-ma'am.'
+" Why ?'
+"Because she's dead in the Union.'
+" Fanny dead -- never.!'
+" Yes, ma'am.'
+" What did she die from ?"
+"I don't know for certain; but I should be inclined
+to think it was from general neshness of constitution.
+She was such a limber maid that 'a could stand no
+hardship, even when I knowed her, and 'a went like a
+candle-snoff, so 'tis said. She was took bad in the
+morning, and, being quite feeble and worn out, she
+died in the evening. She belongs by law to our parish;
+and Mr. Boldwood is going to send a waggon at three
+this afternoon to fetch her home here and bury her.'
+"Indeed I shall not let Mr. Boldwood do any such
+thing-i shall do it! Fanny was my uncle's servant,
+and, although I only knew her for a couple of days,
+FANNY IS SENT FOR
+she belongs to me. How very, very sad this is.! --
+the idea of Fanny being in a workhouse.' Bathsheba
+had begun to know what suffering was, and she spoke
+with real feeling.... "Send across to Mr. Boldwood's,
+and say that Mrs. Troy will take upon herself the duty
+<P 336>
+of fetching an old servant of the family.... We
+ought not to put her in a waggon; we'll get a hearse.'
+" There will hardly be time, ma'am, will there?'
+" Perhaps not,' she said, musingly. " When did you
+say we must be at the door -- three o'clock?'
+" Three o'clock this afternoon, ma'am, so to speak it.'
+"Very weli-you go with it. A pretty waggon is
+better than an ugly hearse, after all. Joseph, have the
+new spring waggon with the blue body and red wheels,
+and wash it very clean. And, Joseph --  -- '
+" Yes, ma'am.'
+' Carry with you some evergreens and flowers to put
+upon her coffin  -- indeed, gather a great many, and
+completely bury her in them. Get some boughs of
+laurustinus, and variegated box, and yew, and boy'siove;
+ay, and some hunches of chrysanthemum. And let old
+Pleasant draw her, because she knew him so well.'
+'I will, ma'am. I ought to have said that the
+Union, in the form of four labouring men, will meet me
+when I gets to our churchyard gate, and take her and
+bury her according to the rites of the Board of Guardians,
+as by law ordained.'
+" Dear me -- Casterbridge Union -- and is Fanny come
+to this?' said Bathsheba, musing. "I wish I had known
+of it sooner. I thought she was far away. How long
+has she lived there?'
+"On'y been there a day or two.'
+"Oh.! -- then she has not been staying there as a
+regular inmate?'
+" No. She first went to live in a garrison-town t'other
+side o' Wessex, and since then she's been picking up a
+living at seampstering in Melchester for several months,
+at the house of a very respectable widow-woman who
+takes in work of that sort. She only got handy the
+Union-house on Sunday morning 'a b'lieve, and 'tis sup+
+posed here and there that she had traipsed every step
+of the way from Melchester. Why she left her place,
+I can't say, for I don't know; and as to a lie, why, I
+wouldn't tell it. That's the short of the story, ma'am.'
+"Ah-h .! '
+<P 337>
+No gem ever flashed from a rosy ray to a white one
+more rapidly than changed the young wife's counten+
+ance whilst this word came from her in a long-drawn
+breath. "Did she walk along our turnpike-road?' she
+said, in a suddenly restless and eager voice.
+"I believe she did.... Ma'am, shall I call Liddy?
+You bain't well, ma'am, surely ? You look like a lily --
+so pale and fainty.!'
+"No; don't call her; it is nothing. When did she
+pass Weatherbury?'
+"Last Saturday night.'
+"That will do, Joseph; now you may go.'
+" Certainly, ma'am.'
+" Joseph, come hither a moment. What was the
+colour of Fanny Robin's hair?'
+"Really, mistress, now that 'tis put to me so judge+
+and-jury like, I can't call to mind, if ye'll believe me.!'
+"Never mind; go on and do what I told you. Stop
+ -- well no, go on.'
+She turned herself away from him, that he might no
+longer notice the mood which had set its sign so visibly
+upon her, and went indoors with a distress:ng sense of
+faintness and a beating brow. About an hour after, she
+heard the noise of the waggon and went out, still with a
+painful consciousness of her bewildered and troubled
+look. Joseph, dressed in his best suit of clothes, was
+putting in the horse to start. The shrubs and flowers
+were all piled in the waggon, as she had directed
+Bathsheba hardly saw them now.
+" Whose sweetheart did you say, Joseph?'
+'I don't know, ma'am.'
+"Are you quite sure?'
+" Yes, ma'am, quite sure.'
+"Sure of what?'
+"I'm sure that all I know is that she arrived in the
+morning and died in the evening without further parley.
+What Oak and Mr. Boldwood told me was only these
+few words. "Little Fanny Robin is dead, Joseph,'
+Gabriel said, looking in my face in his steady old way.
+I was very sorry, and I said, "Ah!. -- and how did she
+<P 338>
+come to die?' "Well, she's dead in Casterhridge
+Union," he said; "and perhaps 'tisn't much matter
+about how she came to die. She reached the Union
+early Sunday morning, and died in the afternoon -- that's
+clear enough." Then I asked what she'd been doing
+lately, and Mr. Boldwood turned round to me then, and
+left off spitting a thistle with the end of his stick. He
+told me about her having lived by seampstering in
+Melchester, as I mentioned to you, and that she walked
+therefrom at the end of last week, passing near here
+Saturday night in the dusk. They then said I had
+better just name a hent of her death to you, and away
+they went. Her death might have been brought on by
+biding in the night wind, you know, ma'am; for people
+used to say she'd go off in a decline: she used to cough
+a good deal in winter time. However, 'tisn't much
+odds to us about that now, for 'tis all over.'
+"Have you heard a different story at all?' She
+looked at him so intently that Joseph's eyes quailed.
+"Not a word, mistress, I assure 'ee.!" he said.
+"Hardly anybody in the parish knows the news yet.'
+"I wonder why Gabriel didn't bring the message to
+me himself. He mostly makes a point of seeing me
+upon the most trifling errand.' These words were
+merely murmured, and she was looking upon the ground.
+"Perhaps he was busy, ma'am,' Joseph suggested.
+"And sometimes he seems to suffer from things upon
+his mind, connected with the time when he was better
+off than 'a is now. 'A's rather a curious item, but a
+very understanding shepherd, and learned in books.'
+'Did anything seem upon his mind whilst he was
+speaking to you about this?'
+'I cannot but say that there did, ma'am. He was
+terrible down, and so was Farmer Boldwood.'
+'Thank you, Joseph. That will do. Go on now,
+or you'll be late.'
+Bathsheba, still unhappy, went indoors again. In
+the course of the afternoon she said to Liddy, Who had
+been informed of the occurrence, " What was the colour
+<P 339>
+of poor Fanny Robin's hair? Do you know? I cannot
+recollect-i only saw her for a day or two.'
+"It was light, ma'am; but she wore it rather short,
+and packed away under her cap, so that you would
+hardly notice it. But I have seen her let it down when
+she was going to bed, and it looked beautiful then.
+Real golden hair.'
+" Her young man was a soldier, was he not?'
+"Yes. In the same regiment as Mr. Troy. He says
+he knew him very well.'
+" What, Mr. Troy says so? How came he to say
+that?'
+"One day I just named it to him, and asked him if
+he knew Fanny's young man. He said, "O yes, he
+knew the young man as well as he knew himself, and
+that there wasn't a man in the regiment he liked
+better."'
+"Ah! Said that, did he ?'
+"Yes; and he said there was a strong likeness be+
+tween himself and the other young man, so that some+
+times people mistook them --  -- '
+' Liddy, for Heaven's sake stop your talking.!' said
+Bathsheba, with the nervous petulance that comes from
+worrying perceptions.
+JOSEPH AND HIS BURDEN
+<P 340>
+<C xlii>
+JOSEPH AND HIS BURDEN -- BUCK'S HEAD
+A WALL bounded the site of Casterbridge Union+
+house, except along a portion of the end. Here a high
+gable stood prominent, and it was covered like the front
+with a mat of ivy. In this gable was no window,
+chimney, ornament, or protuberance of any kind. The
+single feature appertaining to it, beyond the expanse of
+dark green leaves, was a small door.
+The situation of the door was peculiar. The sill
+was three or four feet above the ground, and for a
+moment one was at a loss for an explanation of this
+exceptional altitude, till ruts immediately beneath sug+
+gested that the door was used solely for the passage of
+articles and persons to and from the level of a vehicle
+standing on the outside. Upon the whole, the door
+seemed to advertise itself as a species of Traitor's Gate
+translated to another sphere. That entry and exit
+hereby was only at rare intervals became apparent on
+noting that tufts of grass were allowed to flourish undis+
+turbed in the chinks of the sill.
+As the clock over the South-street Alms-house pointed
+to five minutes to three, a blue spring waggon, picked
+out with red, and containing boughs and flowers, passed
+the end of the street, and up towards this side of the
+building. Whilst the chimes were yet stammering out
+a shattered form of "Malbrook,' Joseph Poorgrass rang
+the bell, and received directions to back his waggon
+against the high door under the gable. The door then
+opened, and a plain elm coffin was slowly thrust forth,
+and laid by two men in fustian along the middle of the
+vehicle.
+One of the men then stepped up beside it, took from
+his pocket a lump of chalk, and wrote upon the cover
+the name and a few other words in a large scrawling
+hand. (We believe that they do these things more
+tenderly now, and provide a
+<P 341>
+plate.) He covered the
+whole with a black cloth, threadbare, but decent, the
+taiiboard of the waggon was returned to its place, one
+of the men handed a certificate of registry to Poorgrass,
+and both entered the door, closing it hehind them.
+Their connection with her, short as it had been, was
+over for ever.
+Joseph then placed the flowers as enjoined, and the
+evergreens around the flowers, till it was difficult to
+divine what the waggon contained; he smacked his
+whip, and the rather pleasing funeral car crept down
+the hill, and along the road to Weatherbury.
+The afternoon drew on apace, and, looking to the
+right towards the sea as he walked beside the horse, Poor+
+grass saw strange clouds and scrolls of mist rolling over
+the long ridges which girt the landscape in that quarter.
+They came in yet greater volumes, and indolently crept
+across the intervening valleys, and around the withered
+papery flags of the moor and river brinks. Then their
+dank spongy forms closed in upon the sky. It was
+a sudden overgrowth of atmospheric fungi which had
+their roots in the neighbouring sea, and by the time
+that horse, man, and corpse entered Yalbury Great
+Wood, these silent workings of an invisible hand had
+reached them, and they were completely enveloped,
+this being the first arrival of the autumn fogs, and the
+first fog of the series.
+The air was as an eye suddenly struck blind. The
+waggon and its load rolled no longer on the horizontal
+division between clearness and opacity, but were
+imbedded in an elastic body of a monotonous pallor
+throughout. There was no perceptible motion in the
+air, not a visible drop of water fell upon a leaf of the
+beeches, birches, and firs composing the wood on either
+side. The trees stood in an attitude of intentness, as if
+they waited longingly for a wind to come and rock
+them. A startling quiet overhung all surrounding things
+ -- so completely, that the crunching of the waggon+
+wheels was as a great noise, and small rustles, which
+had never ohtained a hearing except by night, were dis+
+tinctly individualized.
+Joseph Poorgrass looked round upon his sad burden
+as it loomed faintly through the flowering laurustinus,
+then at the
+<P 342>
+unfathomable gloom amid the high trees on
+each hand, indistinct, shadowless, and spectreiike in
+their monochrome of grey. He felt anything but cheer+
+ful, and wished he had the company even of a child or
+dog. Stopping the home, he listened. Not a footstep
+or wheel was audible anywhere around, and the dead
+silence was broken only by a heavy particle falling from
+a tree through the evergreens and alighting with a smart
+rap upon the coffin of poor Fanny. The fog had by
+this time saturated the trees, and this was the first
+dropping of water from the overbrimming leaves. The
+hollow echo of its fall reminded the waggoner painfully
+of the grim Leveller. Then hard by came down another
+drop, then two or three. Presently there was a continual
+tapping of these heavy drops upon the dead leaves, the
+road, and the travellers. The nearer boughs were beadcd
+with the mist to the greyness of aged men, and the rusty+
+red leaves of the beeches were hung with similar drops,
+like diamonds on auburn hair.
+At the roadside hamlet called Roy-Town, just beyond
+this wood, was the old inn Buck's Head. It was about
+a mile and a half from Weatherbury, and in the meridian
+times of stage-coach travelling had been the place
+where many coaches changed and kept their relays
+of horses. All the old stabling was now pulled down,
+and little remained besides the habitable inn itself,
+which, standing a little way back from the road, sig+
+nified its existence to people far up and down the
+highway by a sign hanging from the horizontal bough
+of an elm on the opposite side of the way.
+Travellers  -- for the variety <1tourist>1 had hardly
+developed into a distinct species at this date -- some+
+times said in passing, when they cast their eyes up to
+the sign-bearing tree, that artists were fond of repre+
+senting the signboard hanging thus, but that they
+themselves had never before noticed so perfect an
+instance in actual working order. It was near this tree
+that the waggon was standing into which Gabriel Oak
+crept on his first journey to Weatherbury; but, owing
+to the darkness, the sign and the inn had been un+
+observed.
+The manners of the inn were of the old-established
+<P 343>
+type. Indeed, in the minds of its frequenters they
+existed as unalterable formule : <1e.g.>1 --
+Rap with the bottom of your pint for more liquor.
+For tobacco, shout.
+In calling for the girl in waiting, say, "Maid.!'
+Ditto for the landlady, 'Old Soul.!' etc., etc.
+It was a relief to Joseph's heart when the friendly
+signboard came in view, and, stopping his horse
+immediately beneath it, he proceeded to fulfil an
+intention made a long time before. His spirits were
+oozing out of him quite. He turned the horse's head
+to the green bank, and entered the hostel for a mug
+of ale.
+Going down into the kitchen of the inn, the floor
+of which was a step below the passage, which in its
+BUCK'S HEAD
+turn was a step below the road outside, what should
+Joseph see to gladden his eyes but two copper-coloured
+discs, in the form of the countenances of Mr. Jan
+Coggan and Mr. Mark Clark. These owners of the
+two most appreciative throats in the neighbourhood,
+within the pale of respectability, were now sitting face
+to face over a threeiegged circular table, having an
+iron rim to keep cups and pots from being accidentally
+elbowed off; they might have been said to resemble
+the setting sun and the full moon shining <1vis-a*-vis>1
+across the globe.
+" Why, 'tis neighbour Poorgrass.!' said Mark Clark.
+"I'm sure your face don't praise your mistress's table,
+Joseph.'
+"I've had a very pale companion for the last four
+miles,' said Joseph, indulging in a shudder toned
+down by resignation. 'And to speak the truth, 'twas
+beginning to tell upon me. I assure ye, I ha'n't seed
+the colour of victuals or drink since breakfast time
+this morning, and that was no more than a dew-bit
+afield.'
+"Then drink, Joseph, and don't restrain yourself!.'
+said Coggan, handing him a hooped mug three+
+quarters full.
+Joseph drank for a moderately long time, then for
+a longer time, saying, as he lowered the jug, "'Tis
+pretty drinking -- very
+<P 344>
+pretty drinking, and is more
+than cheerful on my melancholy errand, so to speak it.'
+"True, drink is a pleasant delight,' said Jan, as one
+who repeated a truism so familiar to his brain that he
+hardly noticed its passage over his tongue ; and,
+lifting the cup, Coggan tilted his head gradually
+backwards, with closed eyes, that his expectant soul
+might not be diverted for one instant from its bliss
+by irrelevant surroundings.
+"Well, I must be on again,' said Poorgmss. "Not
+but that I should like another nip with ye; but the
+parish might lose confidence in me if I was seed
+here.'
+" Where be ye trading o't to to-day, then, Joseph ?'
+"Back to Weatherbury. I've got poor little Fanny
+Robin in my waggon outside, and I must be at the
+churchyard gates at a quarter to five with her.'
+'Ay-i've heard of it. And so she's nailed up in
+parish boards after all, and nobody to pay the bell
+shilling and the grave half-crown.'
+"The parish pays the grave half-crown, but not the
+bell shilling, because the bell's a luxery: but 'a can
+hardly do without the grave, poor body. However, I
+expect our mistress will pay all.'
+"A pretty maid as ever I see.! But what's yer hurry,
+Joseph ? The pore woman's dead, and you can't bring
+her to life, and you may as well sit down comfortable,
+and finish another with us.'
+"I don't mind taking just the least thimbleful ye
+can dream of more with ye, sonnies. But only a few
+minutes, because 'tis as 'tis.'
+"Of course, you'll have another drop. A man's
+twice the man afterwards. You feel so warm and
+glorious, and you whop and slap at your work without
+any trouble, and everything goes on like sticks a+
+breaking. Too much liquor is bad, and leads us to
+that horned man in the smoky house ; but after all,
+many people haven't the gift of enjoying a wet, and
+since we be highly favoured with a power that way,
+we should make the most o't.'
+"True,' said Mark Clark. "'Tis a talent the Lord
+<P 345>
+has mercifully bestowed upon us, and we ought not
+to neglect it. But, what with the parsons and clerks
+and schooipeople and serious tea-parties, the merry
+old ways of good life have gone to the dogs -- upon
+my carcase, they have.!'
+" Well, really, I must be onward again now,' said
+Joseph.
+'Now, now, Joseph; nonsense.! The poor woman
+is dead, isn't she, and what's your hurry?'
+"Well, I hope Providence won't be in a way with
+me for my doings,' said Joseph, again sitting down.
+'I've been troubled with weak moments lately, 'tis
+true. I've been drinky once this month already, and
+I did not go to church a-Sunday, and I dropped a
+curse or two yesterday; so I don't want to go too far
+for my safety. Your next world is your next world,
+and not to be squandered offhand.'
+'I believe ye to be a chapeimember, Joseph. That
+I do.'
+'Oh, no, no.! I don't go so far as that.'
+" For my part,' said Coggan, "I'm staunch Church
+of England.'
+" Ay, and faith, so be I,' said Mark Clark.
+"I won't say much for myself; I don't wish to,'
+Coggan continued, with that tendency to talk on
+principles which is characteristic of the barley-corn.
+"But I've never changed a single doctrine : I've stuck
+like a plaster to the old faith I was born in. Yes;
+there's this to be said for the Church, a man can
+belong to the Church and bide in his cheerful old
+inn, and never trouble or worry his mind about
+doctrines at all. But to be a meetinger, you must
+go to chapel in all winds and weathers, and make
+yerself as frantic as a skit. Not but that chapei
+members be clever chaps enough in their way. They
+can lift up beautiful prayers out of their own heads, all
+about their families and shipwmcks in the newspaper.'
+"They can -- they can,' said Mark Clark, with cor+
+roborative feeling ; "but we Churchmen, you see, must
+have it all printed aforehand, or, dang it all, we should
+no more know what to say to a great gaffer like the
+Lord than babes unborn,'
+" Chapeifolk be more hand-in-glove with them above
+than we,' said Joseph, thoughtfully.
+" Yes,' said Coggan. " We know very well that if
+anybody do go to heaven, they will. They've worked
+hard for it, and they
+<P 346>
+deserve to have it, such as 'tis.
+I bain't such a fool as to pretend that we who stick
+to the Church have the same chance as they, because
+we know we have not. But I hate a feller who'll
+change his old ancient doctrines for the sake of getting
+to heaven. I'd as soon turn king's-evidence for the
+few pounds you get. Why, neighbours, when every
+one of my taties were frosted, our Parson Thirdly
+were the man who gave me a sack for seed, though
+he hardly had one for his own use, and no money to
+buy 'em. If it hadn't been for him, I shouldn't hae
+had a tatie to put in my garden. D'ye think I'd
+turn after that? No, I'll stick to my side; and if we
+be in the wrong, so be it : I'll fall with the fallen .! '
+" Well said -- very well said,' observed Joseph. --
+" However, folks, I must be moving now: upon my life
+I must. Pa'son Thirdly will be waiting at the church
+gates, and there's the woman a-biding outside in the
+waggon.'
+" Joseph Poorgmss, don't be so miserable.! Pa'son
+Thirdly won't mind. He's a generous man ; he's found
+me in tracts for years, and I've consumed a good many
+in the course of a long and shady life; but he's never
+been the man to cry out at the expense. Sit down.'
+The longer Joseph Poorgrass remained, the less his
+spirit was troubled by the duties which devolved upon
+him this afternoon. The minutes glided by uncounted,
+until the evening shades began perceptibly to deepen,
+and the eyes of the three were but sparkling points
+on the surface of darkness. Coggan's repeater struck
+six from his pocket in the usual still small tones.
+At that moment hasty steps were heard in the entry,
+and the door opened to admit the figure of Gabriel Oak,
+followed by the maid of the inn bearing a candle. He
+stared sternly at the one lengthy and two round faces
+of the sitters, which confronted him with the expressions
+of a fiddle and a couple of warming-pans. Joseph Poor+
+grass blinked, and shrank several inches into the back+
+ground.
+' Upon my soul, I'm ashamed of you ; 'tis disgraceful,
+Joseph, disgraceful!. " said Gabriel, indignantly. " Coggan,
+you call yourself a man, and don't know better than this.'
+<P 347>
+Coggan looked up indefinitely at Oak, one or other
+of his eyes occasionally opening and closing of its own
+accord, as if it were not a member, but a dozy individual
+with a distinct personality.
+" Don't take on so, shepherd!' said Mark Clark,
+looking reproachfully at the candle, which appeared
+to possess special features of interest for his eyes.
+'Nobody can hurt a dead woman,' at length said
+Coggan, with the precision of a machine. "All that
+could be done for her is done -- she's beyond us : and
+why should a man put himself in a tearing hurry for
+lifeless clay that can neither feel nor see, and don't
+know what you do with her at all? If she'd been
+alive, I would have been the first to help her. If she
+now wanted victuals and drink, I'd pay for it, money
+down. But she's dead, and no speed of ours will
+bring her to life. The woman's past us -- time spent
+upon her is throwed away: why should we hurry to
+do what's not required ? Drink, shepherd, and be
+friends, for to-morrow we may be like her.'
+" We may,' added Mark Clark, emphatically, at once
+drinking himself, to run no further risk of losing his
+chance by the event alluded to, Jan meanwhile merging
+his additional thoughts of to-morrow in a song : --
+To-mor-row, to-mor-row !
+And while peace and plen-ty I find at my board,
+With a heart free from sick-ness and sor-row,
+With my friends will I share what to-day may af-ford,
+And let them spread the ta-ble to-mor-row.
+To-mor -- row', to-mor -- +
+"Do hold thy horning, Jan.!' said Oak; and turning
+upon Poorgrass, " as for you, Joseph, who do your wicked
+deeds in such confoundedly holy ways, you are as drunk
+as you can stand.'
+"No, Shepherd Oak, no! Listen to reason, shepherd.
+All that's the matter with me is the affliction called a
+multiplying eye, and that's how it is I look double to
+you-i mean, you look double to me.'
+A multiplying eye is a very bad thing,' said Mark
+Clark.
+<P 348>
+It always comes on when I have been in a public --
+house a little time,' said Joseph Poorgrass, meekly.
+"Yes; I see two of every sort, as if I were some holy
+man living in the times of King Noah and entering
+into the ark.... Y-y-y-yes,' he added, becoming much
+affected by the picture of himself as a person thrown
+away, and shedding tears; "I feel too good for England :
+I ought to have lived in Genesis by rights, like the other
+men of sacrifice, and then I shouldn't have b-b-been
+called a d-d-drunkard in such a way.!'
+"I wish you'd show yourself a man of spirit, and not
+sit whining there.!'
+"Show myself a man of spirit ? ... Ah, well! let
+me take the name of drunkard humbly-iet me be a
+man of contrite knees-iet it be .! l know that I always
+do say "Please God' afore I do anything, from my
+getting up to my going down of the same, and I be
+willing to take as much disgrace as there is in that
+holy act. Hah, yes.! ... But not a man of spirit ?
+Have I ever allowed the toe of pride to be lifted
+against my hinder parts without groaning manfully that
+I question the right to do so? I inquire that query
+boldly?'
+" We can't say that you have, Hero Poorgrass,'
+admitted Jan.
+"Never have I allowed such treatment to pass un+
+questioned!. Yet the shepherd says in the face of that
+rich testimony that I be not a man of spirit! Well,
+let it pass by, and death is a kind friend !.'
+Gabriel, seeing that neither of the three was in a fit
+state to Cake charge of the waggon for the remainder of
+the journey, made no reply, but, closing the door again
+upon them, went across to where the vehicle stood, now
+getting indistinct in the fog and gloom of this mildewy
+time. He pulled the horse's head from the large patch
+of turf it had eaten bare, readjusted the boughs over
+the coffin, and drove along through the unwholesome
+night.
+It had gradually become rumoured in the village
+that the body to be brought and buried that day was
+all that was left of the unfortunate Fanny Robin who
+had followed the Eleventh from Casterbridge through
+Melchester and onwards. But,
+<P 349>
+thanks to Boldwood's
+reticence and Oak's generosity, the lover she had followed
+had never been individualized as Troy. Gabriel hoped
+that the whole truth of the matter might not be published
+till at any rate the girl had been in her grave for a few
+days, when the interposing barriers of earth and time,
+and a sense that the events had been somewhat shut
+into oblivion, would deaden the sting that revelation and
+invidious remark would have for Bathsheba just now.
+By the time that Gabriel reached the old manor+
+house, her residence, which lay in his way to the church,
+it was quite dark. A man came from the gate and said
+through the fog, which hung between them like blown
+flour --
+"Is that Poorgrass with the corpse?'
+Gabriel recognized the voice as that of the parson.
+" The corpse is here, sir,' said Gabriel.
+"I have just been to inquire of Mrs. Troy if she could
+tell me the reason of the delay. I am afraid it is too
+late now for the funeral to be performed with proper
+decency. Have you the registrar's certificate ? '
+" No,' said Gabriel. "I expect Poorgrass has that ;
+and he's at the Buck's Head. I forgot to ask him
+for it.'
+"Then that settles the matter. We'll put off the
+funeral till to-morrow morning. The body may be
+brought on to the church, or it may be left here at
+the farm and fetched by the bearers in the morning.
+They waited more than an hour, and have now gone
+home.'
+Gabriel had his reasons for thinking the latter a
+most objectionable plan, notwithstanding that Fanny
+had been an inmate of the farm-house for several years
+in the lifetime of Bathsheba's uncle. Visions of several
+unhappy contingencies which might arise from this delay
+flitted before him. But his will was not law, and he
+went indoors to inquire of his mistress what were her
+wishes on the subject. He found her in an unusual
+mood : her eyes as she looked up to him were suspicious
+and perplexed as with some antecedent thought. Troy
+had not yet returned. At first Bathsheba assented with
+a mien of indifference to his proposition that they should
+go on to the church at once with their burden; but
+immediately
+<P 350>
+afterwards, following Gabriel to the gate,
+she swerved to the extreme of solicitousness on Fanny's
+account, and desired that the girl might be brought into
+the house. Oak argued upon the convenience of leaving
+her in the waggon, just as she lay now, with her flowers
+and green leaves about her, merely wheeling the vehicle
+into the coach-house till the morning, but to no purpose,
+"It is unkind and unchristian,' she said, 'to leave the
+poor thing in a coach-house all night.'
+Very well, then,' said the parson. "And I will
+arrange that the funeral shall take place early to+
+morrow. Perhaps Mrs. Troy is right in feeling that we
+cannot treat a dead fellow-creature too thoughtfully
+We must remember that though she may have erred
+grievously in leaving her home, she is still our sister :
+and it is to be believed that God's uncovenanted
+mercies are extended towards her, and that she is a
+member of the flock of Christ.'
+The parson's words spread into the heavy air with a
+sad yet unperturbed cadence, and Gabriel shed an
+honest tear. Bathsheba seemed unmoved. Mr.
+Thirdly then left them, and Gabriel lighted a lantern.
+Fetching three other men to assist him, they bore the
+unconscious truant indoors, placing the coffin on two
+benches in the middle of a little sitting-room next the
+hall, as Bathsheba directed.
+Every one except Gabriel Oak then left the room.
+He still indecisively lingered beside the body. He was
+deeply troubled at the wretchedly ironical aspect that
+circumstances were putting on with regard to Troy's
+wife, and at his own powerlessness to counteract them,
+(n spite of his careful manoeuvring all this day, the very
+worst event that could in any way have happened in
+connection with the burial had happened now. Oak
+imagined a terrible discovery resulting from this after+
+noon's work that might cast over Bathsheba's life a shade
+which the interposition of many lapsing years might but
+indifferently lighten, and which nothing at all might
+altogether remove.
+Suddenly, as in a last attempt to save Bathsheba
+from, at any rate, immediate anguish, he looked again,
+as he had looked before, at the chalk writing upon the
+<P 351>
+coffinlid. The scrawl was this simple one, " Fanny
+Robin and child.' Gabriel took his handkerchief and
+carefully rubbed out the two latter words, leaving visible
+the inscription " Fanny' Robin ' only. He then left the
+room, and went out quietly by the front door.
+<C xliii>
+<P 352>
+FANNY'S REVENGE
+! DO you want me any longer ma'am ? " inquired Liddy,
+at a later hour the same evening, standing by the door
+with a chamber candlestick in her hand and addressing
+Bathsheba, who sat cheerless and alone in the large
+parlour beside the first fire of the season.
+" No more to-night, Liddy.'
+"l'll sit up for master if you like, ma'am. I am not
+at all afraid of Fanny, if I may sit in my own room and '
+have a candle. She was such a childlike, nesh young
+thing that her spirit couldn't appear to anybody if it
+tried, I'm quite sure.'
+"O no, no! You go to bed. I'll sit up for him
+myself till twelve o'clock, and if he has not arrived by
+that time, I shall give him up and go to bed too.'
+It is half-past ten now.'
+'Oh! is it?'
+Why don't you sit upstairs, ma'am ? '
+" Why don't I ? ' said Bathsheba, desultorily. 'It
+isn t worth while -- there's a fire here, Liddy.' She
+suddenly exclaimed in an impulsive and excited whisper,
+Have you heard anything strange said of Fanny?'
+The words had no sooner escaped her than an expres+
+sion of unutterable regret crossed her face, and she
+burst into tears.
+"No -- not a word !' said Liddy, looking at the
+weeping woman with astonishment. 'What is it makes
+you cry so, ma'am; has anything hurt you ? ' She came
+to Bathsheba's side with a face full of sympathy.
+" No, Liddy-i don't want you any more. I can
+hardly say why I have taken to crying lately: I never
+used to cry. Good-night.'
+Liddy then left the parlour and closed the door.
+<P 353>
+Bathsheba was lonely and miserable now ; not lone+
+lier actually than she had heen before her marriage;
+but her loneliness then was to that of the present time
+as the solitude of a mountain is to the solitude of a
+cave. And within the last day or two had come these
+disquieting thoughts about her husband's past. Her
+wayward sentiment that evening concerning Fanny's
+temporary resting-place had been the result of a strange
+complication of impulses in Bathsheba's bosom. Per+
+haps it would be more accurately described as a
+determined rebellion against her prejudices, a revulsion
+from a lower instinct of uncharitableness, which would
+have withheld all sympathy from the dead woman, be+
+cause in life she had preceded Bathsheba in the atten+
+tions of a man whom Bathsheba had by no means
+ceased from loving, though her love was sick to death
+just now with the gravity of a further misgiving.
+In five or ten minutes there was another tap at the
+door. Liddy reappeared, and coming in a little way
+stood hesitating, until at length she said, !Maryann has
+just heard something very strange, but I know it isn't
+true. And we shall be sure to know the rights of it in
+a day or two.'
+"What is it ?'
+" Oh, nothing connected with you or us, ma'am. It
+is about Fanny. That same thing you have heard.'
+"I have heard nothing.'
+"I mean that a wicked story is got to Weatherbury
+within this last hour -- that --  -- ' Liddy came close to
+her mistress and whispered the remainder of the sentence
+slowly into her ear, inclining her head as she spoke in
+the direction of the room where Fanny lay.
+Bathsheba trembled from head to foot.
+"I don't believe it ! ' she said, excitedly. 'And
+there's only one name written on the coffin-cover.'
+"Nor I, ma'am. And a good many others don't;
+for we should surely have been told more about it if it
+had been true -- don't you think so, ma'am ? '
+"We might or we might not.'
+Bathsheba turned and looked into the fire, that
+Liddy might not see her
+<P 354>
+face. Finding that her mistress
+was going to say no more, Liddy glided out, closed the
+door softly, and went to bed.
+Bathsheba's face, as she continued looking into the
+fire that evening, might have excited solicitousness on
+her account even among those who loved her least.
+The sadness of Fanny Robin's fate did not make Bath+
+sheba's glorious, although she was the Esther to this
+poor Vashti, and their fates might be supposed to stand
+in some respects as contrasts to each other. When
+Liddy came into the room a second time the beautiful
+eyes which met hers had worn a listless, weary look+
+When she went out after telling the story they had ex+
+pressed wretchedness in full activity. Her simple
+country nature, fed on old-fashioned principles, was
+troubled by that which would have troubled a woman
+of the world very little, both Fanny and her child, if she
+had one, being dead.
+Bathsheba had grounds for conjecturing a connection
+between her own history and the dimly suspected
+tragedy of Fanny's end which Oak and Boldwood never
+for a moment credited her with possessing. The
+meeting with the lonely woman on the previous Saturday
+night had been unwitnessed and unspoken of. Oak
+may have had the best of intentions in withholding for
+as many days as possible the details of what had
+happened to Fanny ; but had he known that Bathsheba's
+perceptions had already been exercised in the matter,
+he would have done nothing to lengthen the minutes of
+suspense she was now undergoing, when the certainty
+which must terminate it would be the worst fact suspected
+after all.
+She suddenly felt a longing desire to speak to some
+one stronger than herself, and so get strength to sustain
+her surmised position with dignity and her carking
+doubts with stoicism. Where could she find such a
+friend? nowhere in the house. She was by far the
+coolest of the women under her roof. Patience and
+suspension of judgement for a few hours were what she
+wanted to learn, and there was nobody to teach her.
+Might she but go to Gabriel Oak ! -- but that could not
+be. What a way Oak had, she thought, of enduring
+things. Boldwood, who seemed so much deeper and
+higher and stronger in
+<P 355>
+feeling than Gabriel, had not
+yet learnt, any more than she herself, the simple
+lesson which Oak showed a mastery of by every turn
+and look he gave -- that among the multitude of interests
+by which he was surrounded, those which affected his
+personal welibeing were not the most absorbing and
+important in his eyes. Oak meditatively looked upon
+the horizon of circumstances without any special regard
+to his own standpoint in the midst. That was how
+she would wish to be. But then Oak was not racked
+by incertitude upon the inmost matter of his bosom, as
+she was at this moment. Oak knew all about Fanny
+that he wished to know -- she felt convinced of that.
+If she were to go to him now at once and say no more
+than these few words, !What is the truth of the story?'
+he would feel bound in honour to tell her. It would
+be an inexpressible relief. No further speech would
+need to be uttered. He knew her so well that no
+eccentricity of behaviour in her would alarm him.
+She flung a cloak roundher, went to the door and
+opened it. Every blade, every twig was still. The air
+was yet thick with moisture, though somewhat less dense
+than during the afternoon, and a steady smack of drops
+upon the fallen leaves under the boughs was almost
+musical in its soothing regularity. lt seemed better to
+be out of the house than within it, and Bathsheba closed
+the door, and walked slowly down the lane till she came
+opposite to Gabriel's cottage, where he now lived alone,
+having left Coggan's house through being pinched for
+room. There was a light in one window only', and that
+was downstairs. The shutters were not closed, nor was
+any blind or curtain drawn over the window, neither
+robbery nor observation being a contingency which could
+do much injury to the occupant of the domicile. Yes,
+it was Gabriel himself who was sitting up : he was reading,
+From her standing-place in the road she could see him
+plainly, sitting quite still, his light curly head upon his
+hand, and only occasionally looking up to snuff the
+candle which stood beside him. At length he looked
+at the clock, seemed surprised at the lateness of the
+hour, closed his book, and arose. He was going to bed,
+she knew, and if she tapped it must be done at once.
+<P 356>
+Alas for her resolve ! She felt she could not do it,
+Not for worlds now could she give a hint about her
+misery to him, much less ask him plainly for information
+on the cause of Fanny's death. She must suspect, and
+guess, and chafe, and bear it all alone.
+Like a homeless wanderer she lingered by the bank,
+as if lulled and fascinated by the atmosphere of content
+which seemed to spread from that little dwelling, and
+was so sadly lacking in her own. Gabriel appeared in
+an upper room, placed his light in the window-bench,
+and then -- knelt down to pray. The contrast of the
+picture with her rebellious and agitated existence at this
+same time was too much for her to bear to look upon
+longer. It was not for her to make a truce with
+trouble by any such means. She must tread her giddy
+distracting measure to its last note, as she had begun it.
+With a swollen heart she went again up the lane, and
+entered her own door.
+More fevered now by a reaction from the first feelings
+which Oak's example had raised in her, she paused in
+the hall, looking at the door of the room wherein Fanny
+lay. She locked her fingers, threw back her head, and
+strained her hot hands rigidly across her forehead, saying,
+with a hysterical sob, 'Would to God you would speak
+and tell me your secret, Fanny .! . , . O, I hope, hope
+it is not true that there are two of you ! ... If I could
+only look in upon you for one little minute, I should
+know all !. '
+A few moments passed, and she added, slowly, 'And
+I will'
+Bathsheba in after times could never gauge the mood
+which carried her through the actions following this
+murmured resolution on this memorable evening of her
+life. She went to the lumber-closet for a screw-driver.
+At the end of a short though undefined time she found
+herself in the small room, quivering with emotion, a mist
+before her eyes, and an excruciating pulsation in her
+brain, standing beside the uncovered coffin of the girl
+whose conjectured end had so entirely engrossed her, and
+saying to herself in a husky voice as she gazed within --
+'It was best to know the worst, and I know it now.!'
+<P 357>
+She was conscious of having brought about this
+situation by a series of actions done as by one in an
+extravagant dream ; of following that idea as to method,
+which had burst upon her in the hall with glaring
+obviousness, by gliding to the top of the stairs, assuring
+herself by listening to the heavy breathing of her maids
+that they were asleep, gliding down again, turning the
+handle of the door within which the young girl lay, and
+deliberately setting herself to do what, if she had antici+
+pated any such undertaking at night and alone, would
+have horrified her, but which, when done, was not so
+dreadful as was the conclusive proof of her husband's
+conduct which came with knowing beyond doubt the
+last chapter of Fanny's story.
+Bathsheba's head sank upon her bosom, and the
+breath which had been bated in suspense, curiosity, and
+interest, was exhaled now in the form of a whispered
+wail: 'Oh-h-h!' she said, and the silent room added
+length to her moan.
+Her tears fell fast beside the unconscious pair in the
+coffin: tears of a complicated origin, of a nature inde+
+scribable, almost indefinable except as other than those
+of simple sorrow. Assuredly their wonted fires must
+have lived in Fanny's ashes when events were so shaped
+as to chariot her hither in this natural, unobtrusive, yet
+effectual manner. The one feat alone -- that of dying --
+by which a mean condition couId be resolved into a
+grand one, Fanny had achieved. And to that had
+destiny subjoined this rencounter to-night, which had,
+in Bathsheba's wild imagining, turned her companion's
+failure to success, her humiliation to triumph, her luck
+lessness to ascendency; et had thrown over herself a
+garish light of mockery, and set upon all things about
+her an ironical smile.
+Fanny's face was framed in by that yeIIow hair of
+hers; and there was no longer much room for doubt as
+to the origin of the curl owned by Troy. In Bath+
+sheba's heated fancy the innocent white countenance
+expressed a dim triumphant consciousness of the pain
+she was retaliating for her pain with all the merciless
+rigour of the Mosaic law: 'Burning for burning; wound
+for wound: strife for strife.
+Bathsheba indulged in contempIations of escape from
+her position by immediate death, which thought she,
+<P 358>
+though it was an inconvenient and awful way, had limits
+to its inconvenience and awfulness that could not be
+overpassed ; whilst the shames of life were measureless.
+Yet even this scheme of extinction by death was out
+FANNY'S REVENGE
+tamely copying her rival's method without the reasons
+which had glorified it in her rival's case. She glided
+rapidly up and down the room, as was mostly her habit
+hen excited, her hands hanging clasped in front of her,
+as she thought and in part expressed in brocken words :
+O, I hate her, yet I don't mean that I hate her, for
+it is grievous and wicked; and yet I hate her a little !
+yes, my flesh insists upon hating her, whether my spirit
+is willing or no !.... If she had only lived, I could
+ave been angry and cruel towards her with some justifi+
+cation ; but to be vindictive towards a poor dead woman
+recoils upon myself. O God, have mercy,! I am
+miserable at all this !. '
+Bathsheba became at this moment so terrified at her
+own state of mind that she looked around for some sort
+of refuge from herself. The vision of Oak kneeling
+down that night recurred to her, and with the imitative
+instinct which animates women she seized upon the idea,
+resolved to kneel, and, if possible, pray. Gabriel had
+prayed ; so would she.
+She knelt beside the coffin, covered her face with her
+hands, and for a time the room was silent as a tomb.
+whether from a purely mechanical, or from any other
+cause, when Bathsheba arose it was with a quieted spirit,
+and a regret for the antagonistic instincts which had
+seized upon her just before.
+In her desire to make atonement she took flowers
+from a vase by the window, and began laying them
+around the dead girl's head. Bathsheba knew no other
+way of showing kindness to persons departed than by
+giving them flowers. She knew not how long she
+remained engaged thus. She forgot time, life, where
+she was, what she was doing. A slamming together of
+the coach-house doors in the yard brought her to her+
+self again. An instant after, the front door opened and
+closed, steps crossed the hall, and her husband appeared
+at the entrance to the room, looking in upon her.
+He beheld it all by degrees, stared in stupefaction at
+the scene, as if he thought it an illusion raised by some
+fiendish
+<P 359>
+incantation. Bathsheba, pallid as a corpse on
+end, gazed back at him in the same wild way.
+So little are instinctive guesses the fruit of a legitimate
+induction, that at this moment, as he stood with the
+door in his hand, Troy never once thought of Fanny in
+connection with what he saw. His first confused idea
+was that somebody in the house had died.
+'Weli-what ? ' said Troy, blankly.
+'I must go ! I must go ! ' said Bathsheba, to herself
+more than to him. She came with a dilated eye towards
+the door, to push past him.
+' What's the matter, in God's name ? who's dead ?'
+said Troy.
+'I cannot say; let me go out. I want air.! ' she
+continued.
+'But no; stay, I insist ! ' He seized her hand, and
+then volition seemed to leave her, and she went off into
+a state of passivity. He, still holding her, came up the
+room, and thus, hand in hand, Troy and Bathsheba
+approached the coffin's side.
+The candle was standing on a bureau close by them,
+and the light slanted down, distinctly enkindling the
+cold features of both mother and babe. Troy looked
+in, dropped his wife's hand, knowledge of it all came
+over him in a lurid sheen, and he stood still.
+So still he remained that he could be imagined to
+have left in him no motive power whatever. The
+clashes of feeling in all directions confounded one
+another, produced a neutrality, and there was motion in
+none.
+'Do you know her?' said Bathsheba, in a small
+enclosed echo, as from the interior of a cell.
+'I do,' said Troy.
+'Is it she?'
+'It is.'
+He had originally stood perfectly erect. And now,
+in the welinigh congealed immobility of his frame
+could be discerned an incipient movement, as in the
+darkest night may be discerned light after a while.
+He was gradually sinking forwards. The lines of his
+features softened, and dismay modulated to illiimitable
+sadness. Bathsheba was regarding him from the other
+side, still with parted lips and distracted eyes.
+<P 360>
+Capacity
+for intense feeling is proportionate to the general
+intensity of the nature ,and perhaps in all Fanny's
+sufferings, much greater relatively to her strength, there
+never was a time she suffered in an absolute sense
+what Bathsheba suffered now.
+What Troy did was to sink upon  his knees with
+an indefinable union of remorse and reverence upon
+his face, and, bending over Fanny Robin, gently kissed
+her, as one would kiss an infant asleep to avoid
+awakening it.
+At the sight and sound of that, to her, unendurable
+act, Bathsheba sprang towards him. All the strong
+feelings which had been scattered over her existence
+since she knew what feeling was, seemed gathered
+together into one pulsation now. The revulsion from
+her indignant mood a little earlier, when she had
+meditated upon compromised honour, forestalment,
+eclipse in maternity by another, was violent and entire.
+All that was forgotten in the simple and still strong
+attachment of wife to husband. She had sighed for
+her self-completeness then, and now she cried aloud
+against the severance of the union she had deplored.
+She flung her arms round Troy's neck, exclaiming wildly
+from the deepest deep of her heart --
+' Don't -- don't kiss them !. O, Frank, I can"t bear
+it-i can't ! I love you better than she did: kiss me
+too, Frank -- kiss me ! You will, Frank, kiss me too !'
+There was something so abnormal and startling in
+the childlike pain and simplicity of this appeal from a
+woman of Bathsheba's calibre and independence, that
+Troy, loosening her tightly clasped arms from his neck,
+looked at her in bewilderment. It was such and unex+
+pected revelation of all women being alike at heart, even
+those so different in their accessories as Fanny and this
+one beside him, that Troy could hardly seem to believe
+her to be his proud wife Bathsheba. Fanny's own
+spirit seemed to be animating her frame. But this was
+the mood of a few instants only. When the momentary
+'I will not kiss you!' he said pushing her away.
+Had the wife now but gone no further. Yet,
+perhaps. under the harrowing circumstances, to speak
+out was the one wrong
+<P 361>
+act which can be better under+
+stood, if not forgiven in her, than the right and politic
+one, her rival being now but a corpse. All the feeling
+she had been betrayed into showing she drew back to
+herself again by a strenuous effort of self-command.
+'What have you to say as your reason ?' she asked
+her bitter voice being strangely low -- quite that of
+another woman now.
+'I have to say that I have been a bad, black-hearted
+man,' he answered.
+less than she.'
+'Ah! don't taunt me, madam. This woman is more
+to me, dead as she is, than ever you were, or are, or can
+be.  If Satan had not tempted me with that face of
+yours, and those cursed coquetries, I should have
+He turned to Fanny then. 'But never mind, darling,'
+wife.!'
+At these words there arose from Bathsheba's lips a
+long, low cry of measureless despair and indignation,
+such a wail of anguish as had never before been heard
+within those old-inhabited walls. It was the ??????????
+of her union with Troy.
+"If she's  --  that, -- what -- am I ? ' she added, as a
+continuation of the same cry, and sobbing pitifully:
+and the rarity with her of such abandonment only made
+the condition more dire.
+" You are nothing to me  --  nothing,' said Troy,
+heartlessly. 'A ceremony before a priest doesn't make
+a marriage. I am not morally yours.'
+A vehement impulse to flee from him, to run from
+this place, hide, and escape his words at any price, not
+stopping short of death itself, mastered Bathsheba now.
+She waited not an instant, but turned to the door and
+ran out.
+<C xliv>
+<P 362>
+UNDER A TREE -- REACTION
+BATHSHEBA went along the dark road, neither know'
+ing nor caring about the direction or issue of her flight.
+The first time that she definitely noticed her position
+was when she reached a gate leading into a thicket over+
+hung by some large oak and beech trees. On looking
+into the place, it occurred to her that she had seen it
+by daylight on some previous occasion, and that what
+appeared like an impassable thicket was in reality a
+brake of fern now withering fast. She could think of
+nothing better to do with her palpitating self than to go
+in here and hide; and entering, she lighted on a spot
+sheltered from the damp fog hy a reclining trunk, where
+she sank down upon a tangled couch of fronds and
+stems. She mechanically pulled some armfuls round
+her to keep off the breezes, and closed her eyes.
+Whether she slept or not that night Bathsheba was
+not clearly aware. But it was with a freshened exist+
+ence and a cooler brain that, a long time afterwards, she
+became conscious of some interesting proceedings which
+were going on in the trees above her head and around.
+A coarse-throated chatter was the first sound.
+It was a sparrow just waking.
+Next : ' Chee-weeze-weeze-weeze .! ' from another
+retreat.
+It was a finch.
+Third : ' Tink-tink-tink-tink-a-chink ! ' from the hedge,
+It was a robin.
+' Chuck-chuck-chuck !. ' overhead.
+A squirrel.
+Then, from the road, 'With my ra-ta-ta, and my
+rum-tum-tum ! '
+It was a ploughboy. Presently he came opposite,
+and she believed from his voice that he was one of
+the boys on her own farm. He was followed by a
+shambling tramp of heavy feet, and
+<P 363>
+looking through
+the ferns Bathsheba could just discern in the wan light
+of daybreak a team of her own horses. They stopped
+to drink at a pond on the other side of the way'. She
+watched them flouncing into the pool, drinking, tossing
+up their heads, drinking again, the water dribbling
+from their lips in silver threads. There was another
+flounce, and they came out of the pond, and turned
+back again towards the farm.
+She looked further around. Day was just dawning,
+and beside its cool air and colours her heated actions
+and resolves of the night stood out in lurid contrast.
+She perceived that in her lap, and clinging to her
+hair, were red and yellow leaves which had come
+down from the tree and settled silently upon her
+during her partial sleep. Bathsheba shook her dress to
+get rid of them, when multitudes of the same family lying
+round about her rose and fiuttered away in the breeze
+thus created, 'like ghosts from an enchanter fleeing.'
+There was an opening towards the east, and the
+glow from the as yet unrisen sun attracted her eyes
+thither. From her feet, and between the beautiful
+yellowing ferns with their feathery arms, the ground
+sloped downwards to a hollow, in which was a species
+of swamp, dotted with fungi. A morning mist hung
+over it now -- a fulsome yet magnificent silvery veil,
+full of light from the sun, yet semi-opaque -- the hedge
+behind it being in some measure hidden by its hazy
+luminousness. Up the sides of this depression grew
+sheaves of the common rush, and here and there a
+peculiar species of flag, the blades of which glistened
+in the enaerging sun, like scythes. But the general
+aspect of the swamp was malignant. From its moist
+and poisonous coat seemed to be exhaled the essences
+of evil things in the earth, and in the waters under
+the earth. The fungi grew in all manner of positions
+from rotting leaves and tree stumps, some exhibiting
+to her listless gaze their clammy tops, others their
+oozing gills. Some were marked with great splotches,
+red as arterial blood, others were saffron yellow, and
+others tall and attenuated, with stems like macaroni.
+Some were leathery and of richest browns. The
+hollow seemed a nursery of pestilences small and
+great, in the immediate neighbourhood of comfort
+and health, and Bathsheba arose with a tremor at the
+thought of having
+<P 364>
+passed the night on the brink of
+so dismal a place.
+'l'here were now other footsteps to be heard along
+the road. Bathsheba's nerves were still unstrung :
+she crouchcd down out of sight again, and the pedes+
+trian came into view. He was a schoolboy, with a
+bag slung over his shoulder containing his dinner,
+and a hook in his hand. He paused by the gate,
+and, without looking up, continued murmuring words
+in tones quite loud enough to reach her ears.
+'''O Lord, O Lord, O Lord, O Lord, O Lord'': --
+that I know out o' book. ''Give us, give us, give us,
+give us, give us '' : -- that I know. ''Grace that, grace that,
+grace that, grace that '' : -- that I know.' Other words
+followed to the same effect. The boy was of the
+dunce class apparently; the book was a psalter, and
+this was his way of learning the collect. In the worst
+attacks of trouble there appears to be always a super+
+ficial film of consciousness which is left disengaged
+and open to the notice of trifles, and Bathsheba was
+faintly amused at the boy's method, till he too passed on.
+By this time stupor had given place to anxiety, and
+anxiety began to make room for hunger and thirst.
+A form now appeared upon the rise on the other side
+of the swamp, half-hidden by the mist, and came
+towards Bathsheba. The woman -- for it was a woman
+ -- approached with her face askance, as if looking
+earnestly on all sides of her. When she got a little
+further round to the left, and drew nearer, Bathsheba
+could see the newcomer's profile ngainst the sunny
+sky', and knew the wavy sweep from forehead to chin,
+with neither angle nor decisive line anywhere about
+it, to be the familiar contour of Liddy Smallbury.
+Bathsheba's heart bounded with gratitude in the
+thought that she was not altogether deserted, and she
+jumped up. ' O, Liddy .! ' she said, or attempted to say;
+but the words had only been framed hy her lips; there
+came no sound. She had lost her voice by exposure
+to the clogged atmosphere all these hours of night.
+'O, ma'am.! I am so glad I have found you,' said
+the girl, as soon as she saw Bathsheba.
+' You can't come across,' Bathsheba said in a whisper,
+wihich she
+<P 365>
+vainly endeavoured to make loud enough to
+reach Liddy's ears. Liddy, not knowing this, stepped
+down upon the swamp, saying, as she did so, 'It will
+bear me up, I think.'
+Bathsheba never forgot that transient little picture
+of Liddy crossing the swamp to her there in the
+morning light. Iridescent bubbles of dank subter+
+ranean breath rose from the sweating sod beside the
+waiting maid's feet as she trod, hissing as they burst
+and expanded away to join the vapoury firmament above.
+Liddy did not sink, as Bathsheba had anticipated.
+She landed safely on the other side, and looked up
+at the beautiful though pale and weary face of her
+young mistress.
+'Poor thing ! ' said Liddy, with tears in her eyes,
+Do hearten yourself up a little, ma'am. However
+did --  -- '
+'I can't speak above a whisper -- my voice is gone
+for the present,' said Bathsheba, hurriedly. ' I suppose
+the damp air from that hollow has taken it away
+Liddy, don't question me, mind. Who sent you --
+anybody ? '
+' Nobody. I thought, when I found you were not
+at home, that something cruel had happened. I fancy
+I heard his voice late last night; and so, knowing
+something was wrong --  -- '
+'Is he at home?'
+'No ; he left just before I came out.'
+'Is Fanny taken away ? '
+' Not yet. She will soon be -- at nine o'clock.'
+'we won't go home at present, then. Suppose we
+walk about in this wood ?'
+Liddy, without exactly understanding everything, or
+anything, in this episode, assented, and they walked
+together further among the trees.
+'But you had better come in, ma'am, and have
+something to eat. You will die of a chill! '
+'I shall not come indoors yet -- perhaps never.'
+'Shall I get you something to eat, and something
+else to put over your head besides that little shawl?'
+'If you will, Liddy.'
+Liddy vanished, and at the end of twenty minutes
+returned with a cloak, hat, some slices of bread and
+butter, a tea-cup, and some hot tea in a little china jug
+<P 366>
+"Is Fanny gone ? ' said Bathsheba.
+' No,' said her companion, pouring out the tea.
+Bathsheba wrapped herself up and ate and drank
+sparingly. Her voice was then a little clearer, and
+trifling colour returned to her face. 'Now we'll walk
+about again,' she said.
+They wandered about the wood for nearly two
+REACTION
+hours, Bathsheba replying in monosyllables to Liddy's
+prattle, for her mind ran on one subject, and one only.
+She interrupted with --
+'l wonder if Fanny is gone by this time ? '
+'I will go and see.'
+She came back with the information that the
+men were just taking away the corpse; that Bathsheba
+had been inquired for; that she had replied to the
+effect that her mistress was unwell and could not be
+seen.
+'Then they think I am in my bedroom ?'
+' Yes.' Liddy then ventured to add: ' You said
+when I first found you that you might never go home
+again -- you didn't mean it, ma'am ? '
+'No; I've altered my mind. It is only women with
+no pride in them who run away from their husbands.
+There is one position worse than that of being found
+dead in your husband's house from his iliusage, and
+that is, to be found alive through having gone away to
+The house of somebody else. l've thought of it all this
+morning, and I've chosen my course. A runaway wife
+is an encumbrance to everybody, a burden to herself and
+a byword -- all of which make up a heap of misery
+greater than any that comes by staying at home --
+though this may include the trifling items of insult,
+beating, and starvation. Liddy, if ever you marry --
+God forbid that you ever should ! -- you'll find yourself
+in a fearful situation ; but mind this, don't you flinch.
+Stand your ground, and be cut to pieces. That's
+what I'm going to do.'
+' O, mistress, don't talk so .! ' said Liddy,-taking her
+hand; 'but I knew you had too much sense to bide
+away. May I ask what dreadful thing it is that has
+happened between you and him ?'
+' You may ask; but I may not tell.'
+In about ten minutes they returned to the house by
+a cimuitous route, entering at the rear. Bathsheba
+glided up the
+<P 367>
+back stairs to a disused attic, and her
+companion followed.
+'Liddy,' she said, with a lighter heart, for youth an
+hope had begun to reassert themselves; ' you are to b
+my confidante for the present -- somebody must be -- and
+I choose you. Well, I shall take up my abode here fo
+a while. Will you get a fire lighted, put down a piece
+of carpet, and help me to make the place comfortable.
+Afterwards, I want you and Maryann to bring up that
+little stump bedstead in the small room, and the be
+belonging to it, and a table, and some other things.
+What shall I do to pass the heavy time away ?'
+'Hemming handkerchiefs is a very good thing,' said
+Liddy.
+'O no, no .! I hate needlework-i always did.'
+'knitting ? '
+' And that, too.'
+'You might finish your sampler. Only the carn
+tions and peacocks want filling in; and then it could
+be framed and glazed, and hung beside your aunt'
+ma'am.'
+' Samplers are out of date -- horribly countrified. No
+Liddy, I'll read. Bring up some books -- not new ones.
+I haven't heart to read anything new.'
+'Some of your uncle's old ones, ma'am ? '
+' Yes. Some of those we stowed away in boxes.' ,
+faint gleam of humour passed over her face as she said:
+'Bring Beaumont and Fletcher's Mai'd's Tragedy,- an
+the Mourning Bride ,- and-iet me see -- Niht Thoghts,
+and the Vanity of Human Wishes.'
+'And that story of the black man, who murdered his
+wife Desdemona? It is a nice dismal one that would
+suit you excellent just now.'
+' Now, Liddy, you've been looking into my book
+without telling me; and I said you were not to ! How
+do you know it would suit me? It wouldn't suit me a
+all.'
+'But if the others do --  -- '
+' No, they don't ; and I won't read dismal books.
+Why should I read dismal books, indeed ? Bring me
+Love in a Village, and Maid of the Mill, and Doctor
+Syntax, and some volumes of the Spectator.'
+All that day Bathsheba and Liddy lived in the attic
+in a state of
+<P 368>
+barricade ; a precaution which proved to be
+needless as against Troy, for he did not appear in the
+neighbourhood or trouble them at all. Bathsheba sat
+at the window till sunset, sometimes attempting to read,
+at other times watching every movement outside without
+much purpose, and listening without much interest to
+every sound.
+The sun went down almost blood-red that night, and
+a livid cloud received its rays in the east. Up against
+this dark background the west front of the church
+tower -- the only part of the edifice visible from the
+farm-house windows -- rose distinct and lustrous, the
+vane upon the summit bristling with rays. Hereabouts,
+at six o'clock, the young men of the village gathered,
+as was their custom, for a game of Prisoners' base. The
+spot had been consecrated to this ancient diversion from
+time immemorial, the old stocks conveniently forming
+a base facing the boundary of the churchyard, in front
+of which the ground was trodden hard and bare as a
+pavement by the players. She could see the brown
+and black heads of the young lads darting about right
+and left, their white shirt-sleeves gleaming in the sun;
+whilst occasionally a shout and a peal of hearty laughter
+varied the stillness of the evening air. They continued
+playing for a quarter of an hour or so, when the game
+concluded abruptly, and the players leapt over the wall
+and vanished round to the other side behind a yew-tree,
+which was also half behind a beech, now spreading in
+one mass of golden foliage, on which the branches
+traced black lines.
+'Why did the base-players finish their game so
+suddenly?' Bathsheba inquired, the next time that
+Liddy entered the room.
+' I think 'twas because two men came just then from
+Casterbridge and began putting up grand carved
+tombstone,' said Liddy.  'The lads went to see whose
+it was.'
+' Do you know ? ' Bathsheba asked.
+' I don't,' said Liddy.
+<C xlv>
+<P 369>
+TROY'S ROMANTICISM
+WHEN Troy's wife had left the house at the previous
+midnight his first act was to cover the dead from sight.
+This done he ascended the stairs, and throwing himself
+down upon the bed dressed as he was, he waited miser+
+ably for the morning.
+Fate had dealt grimly with him through the last four+
+and-twenty hours. His day had been spent in a way
+which varied very materially from his intentions regard+
+ing it. There is always an inertia to be overcome in
+striking out a new line of conduct -- not more in our+
+selves, it seems, than in circumscribing events, which
+appear as if leagued together to allow no novelties in
+the way of amelioration.
+Twenty pounds having been secured from Bathsheba,
+he had managed to add to the sum every farthing he
+could muster on his own account, which had been seven
+pounds ten. With this money, twenty-seven pounds ten
+in all, he had hastily driven from the gate that morning
+to keep his appointment with Fanny Robin.
+On reaching Casterbridge he left the horse and trap
+at an inn, and at five minutes before ten came back to
+the bridge at the lower end of the town, and sat himself
+upon the parapet. The clocks struck the hour, and no
+Fanny appeared. In fact, at that moment she was being
+robed in her grave-clothes by two attendants at the
+Union poorhouse -- the first and last tiring-women the
+gentle creature had ever been honoured with. The
+quarter went, the half hour. A rush of recollection
+came upon Troy as he waited: this was the second
+time she had broken a serious engagement with him
+In anger he vowed it should be the last, and at eleven
+o'clock, when he had lingered and watched the stone
+of the bridge till he knew every lichen upon their face
+and heard the chink of the ripples underneath till they
+oppressed him, he jumped from his seat, went to the inn
+<P 370>
+for his gig, and in a bitter mood of indifference con+
+cerning the past, and recklessness about the future,
+drove on to Budmouth races.
+He reached the race-course at two o'clock, and re+
+mained either there or in the town till nine, But
+Fanny's image, as it had appeared to him in the sombre
+shadows of that Saturday evening, returned to his mind,
+backed up by Bathsheba's reproaches. He vowed he
+would not bet, and he kept his vow, for on leaving the
+town at nine o'clock in the evening he had diminish
+his cash only to the extent of a few shillings.
+He trotted slowly homeward, and it was now that
+was struck for the first time with a thought that Fanny
+had been really prevented by illness from keeping her
+promise. 'This time she could have made no mistake
+He regretted that he had not remained in Casterbridge
+and made inquiries. Reaching home he quietly un+
+harnessed the horse and came indoors, as we have seen,
+to the fearful shock that awaited him.
+As soon as it grew light enough to distinguish objects,
+Troy arose from the coverlet of the bed, and in a mood
+of absolute indifference to Bathsheba's whereabouts, a
+almost oblivious of her existence, he stalked downstairs
+and left the house by the back door. His walk was
+towards the churchyard, entering which he searched
+around till he found a newly dug unoccupied grave --
+the grave dug the day before for Fanny. The position
+of this having been marked, he hastened on to Caster+
+bridge, only pausing
+whereon he had last seen Fanny alive.
+Reaching the town, Troy descended into a side
+street and entered a pair of gates surmounted by a board
+bearing the words, 'Lester, stone and marble mason.'
+Within were lying about stones of all sizes and designs,
+inscribed as being sacred to the memory of unnamed
+persons who had not yet died.
+Troy was so unlike himself now in look, word, and
+deed, that the want of likeness was perceptible even to
+his own consciousness. His method of engaging himself
+in this business of purchasing a tomb was that of an
+absolutely unpractised man. He could not bring him+
+self to consider, calculate, or
+<P 371>
+economize. He waywardly
+wished for something, and he set about obtaining it like
+a child in a nursery. 'I want a good tomb,' he said to
+the man who stood in a little office within the yard.
+'I want as good a one as you can give me for twenty+
+seven pounds,'
+It was all the money he possessed.
+'That sum to include everything?'
+' Everything. Cutting the name, carriage to Weather+
+bury, and erection. And I want it now at once .'
+' We could not get anything special worked this
+week.
+'If you would like one of these in stock it could be
+got ready immediately.'
+'Very well,' said Troy, impatiently.  'Let's see what
+you have.'
+'The best I have in stock is this one, 'said the stone+
+cutter, going into a shed. ' Here's a marble headstone
+beautifully crocketed, with medallions beneath of typical
+subjects ; here's the footstone after the same pattern,
+and here's the coping to enclose the- grave. The
+slabs are the best of their kind, and I can warrant them
+'Well, I couId add the name, and put it up at
+visitor who wore not a shred of mourning. Troy then
+settled the account and went away. In the afternoon
+almost done. He waited in the yard till the tomb was
+way to Weatherbury, giving directions to the two men
+the grave of the person named in the inscription.
+bridge. He carried rather a heavy basket upon his
+occasionally at bridges and
+<P 372>
+gates, whereon he deposited
+returning in the darkness, the men and the waggon
+the work was done, and, on being assured that it was,
+Troy entered Weatherbury churchyard about ten
+had marked the vacant grave early in the morning. It
+extent from the view of passers along the road -- a spot
+and bushes of alder, but now it was cleared and made
+the ground elsewhere.
+Here now stood the tomb as the men had stated, snow+
+white and shapely in the gloom, consisting of head and
+foot-stone, and enclosing border of marble-work uniting
+them. In the midst was mould, suitable for plants.
+Troy deposited his basket beside the tomb, and
+vanished for a few minutes. When he returned he
+carried a spade and a lantern, the light of which he
+directed for a few moments upon the marble, whilst he
+read the inscription. He hung his lantern on the lowest
+bough of the yew-tree, and took from his basket flower+
+roots of several varieties. There were bundles of snow+
+drop, hyacinth and crocus bulbs, violets and double
+daisies, which were to bloom in early spring, and of
+carnations, pinks, picotees, lilies of the valley, forget-me+
+not, summer's-farewell, meadow-saffron and others, for
+the later seasons of the year.
+Troy laid these out upon the grass, and with an im+
+passive face set to work to plant them. The snowdrops
+were arranged in a line on the outside of the coping,
+the remainder within the enclosure of the grave. The
+crocuses and hyacinths were to grow in rows; some of
+the summer flowers he placed over her head and feet,
+the lilies and forget-me-nots over her heart. The
+remainder were dispersed in the spaces between these.
+Troy, in his prostration at this time, had no percep+
+tion that in the futility of these romantic doings, dictated
+by a remorseful reaction from previous indifference, there
+was any element
+<P 373>
+of absurdity. Deriving his idiosyn+
+crasies from both sides of the Channel, he showed at
+such junctures as the present the inelasticity of the
+Englishman, together with that blindness to the line
+where sentiment verges on mawkishness, characteristic
+of the French.
+lt was a cloudy, muggy, and very dark night, and
+the rays from Troy's lantern spread into the two old
+yews with a strange illuminating power, flickering, as it
+seemed, up to the black ceiling of cloud above. He
+felt a large drop of rain upon the back of his hand, and
+presently one came and entered one of the holes of the
+lantern, whereupon the candle sputtered and went out+
+Troy was weary and it being now not far from midnight,
+and the rain threatening to increase, he resolved to leave
+the finishing touches of his labour until the day should
+break. He groped along the wall and over the graves
+in the dark till he found himself round at the north side.
+Here he entered the porch, and, reclining upon the
+bench within, fell asleep.
+<C xlvi>
+<P 374>
+THE GURGOYLE : ITS DOINGS
+THE tower of Weatherbury Church was a square
+erection of fourteenth-century date, having two stone
+gurgoyles on each of the four faces of its parapet. Of
+these eight carved protuberances only two at this time
+continued to serve the purpose of their erection -- that
+of spouting the water from the lead roof within. One
+mouth in each front had been closed hy bygone church+
+wardens as superfluous, and two others were broken
+away and choked -- a matter not of much consequence
+to the welibeing of the tower, for the two mouths which
+still remained open and active were gaping enough to do
+all the work.
+It has been sometimes argued that there is no truer
+criterion of the vitality of any given art-period than the
+power of the master-spirits of that time in grotesque ;
+and certainly in the instance of Gothic art there is no
+disputing the proposition. Weatherbury tower was a
+somewhat early instance of the use of an ornamental
+parapet in parish as distinct from cathedral churches,
+and the gurgoyles, which are the necessary correlatives
+of a parapet, were exccptionally prominent -- of the
+boldest cut that the hand could shape, and of the most
+original design that a human brain could conceive.
+There was, so to speak, that symmetry in their distortion
+which is less the characteristic of British than of
+Continental grotesques of the period. All the eight
+were different from each other. A beholder was con+
+vinced that nothing on earth could be more hideous
+than those he saw on the north side until he went
+round to the south. Of the two on this latter face, only
+that at the south-eastern corner concerns the story. It
+was too human to be called like a dragon, too impish
+to be like a man, too animal to be like a fiend, and not
+enough like a bird to be called a griffin. This horrible
+stone entity was fashioned as if covered with a
+<P 375>
+wrinkled
+hide; it had short, erect ears, eyes starting from their
+sockets, and its fingers and hands were seizing the
+corners of its mouth, which they thus seemed to pull
+open to give free passage to the water it vomited. The
+lower row of teeth was quite washed away, though the
+upper still remained. Here and thus, jutting a couple
+of feet from the wall against which its feet rested as a
+support, the creature had for four hundred years
+laughed at the surrounding landscape, voicelessly in
+dry weather, and in wet with a gurgling and snorting
+sound.
+Troy slept on in the porch, and the rain increased
+outside. Presently the gurgoyle spat. In due time a
+small stream began to trickle through the seventy feet
+of aerial space between its mouth and the ground, which
+the water-drops smote like duckshot in their accelerated
+velocity. The stream thickened in substance, and in+
+creased in power, gradually spouting further and yet
+further from the side of the tower. When the rain fell
+in a steady and ceaseless torrent the stream dashed
+downward in volumes.
+We follow its course to the ground at this point of
+time. The end of the liquid parabola has come forward
+from the wall, has advanced over the plinth mouldings,
+over a heap of stones, over the marble border, into the
+midst of Fanny Robin's grave.
+The force of the stream had, until very lately, been
+received upon some loose stones spread thereabout,
+which had acted as a shield to the soil under the onset.
+These during the summer had been cleared from the
+ground, and there was now nothing to resist the down+
+fall but the bare earth. For several years the stream
+had not spouted so far from the tower as it was doing
+on this night, and such a contingency had been over+
+looked. Sometimes this obscure corner received no
+inhabitant for the space of two or three years, and
+then it was usually but a pauper, a poacher, or other
+sinner of undignified sins.
+The persistent torrent from the gurgoyle's jaws
+directed all its vengeance into the grave. The rich
+tawny mould was stirred into motion, and boiled like
+chocolate. The water accumulated and washed deeper
+down, and the roar of the pool thus formed spread into
+the night as the head and chief among other noises of
+<P 376>
+the kind created by the deluging rain. The flowers so
+carefully planted by Fanny's repentant lover began to
+move and writhe in their bed. The winter-violets
+turned slowly upside down, and became a mere mat of
+mud. Soon the snowdrop and other bulbs danced in
+the boiling mass like ingredients in a cauldron. Plants
+of the tufted species were loosened, rose to the surface,
+and floated of.
+Troy did not awake from his comfortless sleep till it
+was broad day. Not having been in bed for two nights
+his shouldrrs felt stiff his feet tender, and his head
+heavy. He remembered his position, arose, shivered,
+took the spade, and again went out.
+The rain had quite ceased, and the sun was shining
+through the green, brown, and yellow leaves, now
+sparkling and varnished by the raindrops to the bright+
+ness of similar effects in the landscapes of Ruysdael and
+Hobbema, and full of all those infinite beauties that
+arise from the union of water and colour with high
+lights. The air was rendered so transparent by the
+heavy fall of rain that the autumn hues of the middle
+distance were as rich as those near at hand, and the
+remote fields intercepted by the angle of the tower ap+
+peared in the same plane as the tower itself.
+He entered the gravel path which would take him
+behind the tower. The path, instead of being stony as
+it had been the night before, was browned over with a
+thin coating of mud. At one place in the path he saw
+a tuft of stringy roots washed white and clean as a
+bundle of tendons. He picked it up -- surely it could
+not be one of the primroses he had planted? He saw
+a bulb, another, and another as he advanced. Beyond
+doubt they were the crocuses. With a face of perplexed
+dismay Troy turned the corner and then beheld the
+wreck the stream had made.
+The pool upon the grave had soaked away into the
+ground, and in its place was a hollow. The disturbed
+earth was washed over the grass and pathway in the
+guise of the brown mud he had already seen, and it
+spotted the marble tombstone with the same stains.
+Nearly all the flowers were washed clean out of the
+ground, and they lay, roots upwards, on the spots whither
+they had been splashed by the stream.
+<P 377>
+Troy's brow became heavily contracted. He set his
+teeth closely, and his compressed lips moved as those of
+one in great pain. This singular accident, by a strange
+confluence of emotions in him, was felt as the sharpest
+sting of all. Troy's face was very expressive, and any
+observer who had seen him now would hardly have
+believed him to be a man who had laughed, and sung,
+and poured love-trifles into a woman's ear. To curse
+his miserable lot was at first his impulse, but even that
+lowest stage of rebellion needed an activity whose
+absence was necessarily antecedent to the existence of the
+morbid misery which wrung him. The sight, coming
+as it did, superimposed upon the other dark scenery of
+the previous days, formed a sort of climax to the whole
+panorama, and it was more than he could endure.
+Sanguine by nature, Troy had a power of eluding
+grief by simply adjourning it. He could put off the
+consideration of any particular spectre till the matter
+had become old and softened by time. The planting
+of flowers on Fanny's grave had been perhaps but a
+species of elusion of the primary grief, and now it was
+as if his intention had been known and circumvented.
+Almost for the first time in his life, Troy, as he stood
+by this dismantled grave, wished himself another man.
+lt is seldom that a person with much animal spirit does
+not feel that the fact of his life being his own is the one
+qualification which singles it out as a more hopeful life
+than that of others who may actually resemble him in
+every particular. Troy had felt, in his transient way,
+hundreds of times, that he could not envy other people
+their condition, because the possession of that condition
+would have necessitated a different personality, when he
+desired no other than his own. He had not minded
+the peculiarities of his birth, the vicissitudes of his life,
+the meteoriike uncertainty of all that related to him,
+because these appertained to the hero of his story,
+without whom there would have been no story at all for
+him; and it seemed to be only in the nature of things
+that matters would right themselves at some proper date
+and wind up well. This very morning the illusion
+completed its disappearance, and, as it were, all of a
+sudden, Troy hated himself. The suddenness was
+probably more
+<P 378>
+apparent than real. A coral reef which
+just comes short of the ocean surface is no more to the
+horizon than if it had never been begun, and the mere
+finishing stroke is what often appears to create an event
+which has long been potentially an accomplished thing.
+He stood and mediated -- a miserable man. Whither
+should he go ? " He that is accursed, let him be accursed
+still,' was the pitiless anathema written in this spoliated
+effort of his new-born solicitousness. A man who has
+spent his primal strength in journeying in one direction
+has not much spirit left for reversing his course. Troy
+had, since yesterday, faintly reversed his ; but the merest
+opposition had disheartened him. To turn about would
+have been hard enough under the greatest providential
+encouragement; but to find that Providence, far from
+helping him into a new course, or showing any wish
+that he might adopt one, actuallyjeered his first trembling
+and critical attempt in that kind, was more than nature
+could bear.
+He slowly withdrew from the grave. He did not
+attempt to fill up the hole, replace the flowers, or do
+anything at all. He simply threw up his cards and
+forswore his game for that time and always. Going out
+of the churchyard silently and unobserved -- none of the
+villagers having yet risen -- he passed down some fields
+at the back, and emerged just as secretly upon the high
+road. Shortly afterwards he had gone from the village.
+Meanwhile, Bathsheba remained a voluntary prisoner
+in the attic. The door was kept locked, except during
+the entries and exits of Liddy, for whom a bed had
+been arranged in a small adjoining room. The light
+of Troy's lantern in the churchyard was noticed about
+ten o'clock by the maid-servant, who casually glanced
+from the window in that direction whilst taking her
+supper, and she called Bathsheba's attention to it.
+They looked curiously at the phenomenon for a time,
+until Liddy was sent to bed.
+bathsheba did not sleep very heavily that night.
+When her attendant was unconscious and softly breath+
+ing in the next room, the mistress of the house was
+still looking out of the window at the faint gleam
+spreading from among the trees --
+<P 379>
+not in a steady shine,
+but blinking like a revolving coastiight, though this
+appearance failed to suggest to her that a person was
+passing and repassing in front of it. Bathsheba sat
+here till it began to rain, and the light vanished, when
+she withdrew to lie restlessly in her bed and re-enact
+in a worn mind the lurid scene of yesternight.
+Almost before the first faint sign of dawn appeared
+she arose again, and opened the window to obtain a full
+breathing of the new morning air, the panes being now
+wet with trembling tears left by the night rain, each
+one rounded with a pale lustre caught from primrose+
+hued slashes through a cloud low down in the awaken+
+ing sky. From the trees came the sound of steady
+dripping upon the drifted leaves under them, and from
+the direction of the church she could hear another noise
+ -- peculiar, and not intermittent like the rest, the purl
+of water falling into a pool.
+Liddy knocked at eight o'clock, and Bathsheba un+
+locked the door.
+" What a heavy rain we've had in the night, ma'am!.'
+said Liddy, when her inquiries about breakfast had been
+made.
+" Yes ; very heavy.'
+"Did you hear the strange noise from the church
+yard?'
+"I heard one strange noise. I've been thinking it
+must have been the water from the tower spouts.'
+"Well, that's what the shepherd was saying, ma'am.
+He's now gone on to see.
+"Oh!. Gabriel has been here this morning!.'
+"Only just looked in in passing -- quite in his old way,
+which I thought he had left off lately. But the tower
+spouts used to spatter on the stones, and we are puzzled,
+for this was like the boiling of a pot.'
+Not being able to read, think, or work, Bathsheba asked
+Liddy to stay and breakfast with her. The tongue of the
+more childish womian still ran upon recent events. "Are
+you going across to the church, ma'am?' she asked.
+"Not that I know of,' said Bathsheba.
+"I thought you might like to go and see where they
+have put Fanny. The trees hide the place from your
+window.'
+<P 380>
+Bathsheba had all sorts of dreads about meeting her
+husband. "Has Mr. Troy been in to-night?' she said
+" No, ma'am ; I think he's gone to Budmouth.
+Budmouth! The sound of the word carried with
+it a much diminished perspective of him and his deeds;
+there were thirteen miles interval betwixt them now.
+She hated questioning Liddy about her husband's
+movements, and indeed had hitherto sedulously avoided
+doing so; but now all the house knew that there had
+been some dreadful disagreement between them, and
+it was futile to attempt disguise. Bathsheba had
+reached a stage at which people cease to have any
+appreciative regard for public opinion.
+"What makes you think he has gone there?' she said.
+"Laban Tall saw him on the Budmouth road this
+morning before breakfast.'
+Bathsheba was momentarily relieved of that wayward
+heaviness of the past twenty-four hours which had
+quenched the vitality of youth in her without sub+
+stituting the philosophy of maturer years, and the
+resolved to go out and walk a little way. So when
+breakfast was over, she put on her bonnet, and took
+a direction towards the church. It was nine o'clock,
+and the men having returned to work again from their
+first meal, she was not likely to meet many of them in
+the road. Knowing that Fanny had been laid in the
+reprobates' quarter of the graveyard, called in the parish
+'behind church,' which was invisible from the road, it
+was impossible to resist the impulse to enter and look
+upon a spot which, from nameless feelings, she at the
+same time dreaded to see. She had been unable to
+overcome an impression that some connection existed
+between her rival and the light through the trees.
+Bathsheba skirted the buttress, and beheld the hole
+and the tomb, its delicately veined surface splashed and
+stained just as Troy had seen it and left it two hours
+earlier. On the other side of the scene stood Gabriel.
+His eyes, too, were fixed on the tomb, and her arrival
+having been noiseless, she had not as yet attracted his
+attention. Bathsheba did not at once perceive that the
+grand tomb and the disturbed grave were Fanny's, and
+she looked on both sides and around for some humbler
+mound,
+<P 381>
+earthed up and clodded in the usual way. Then
+her eye followed Oak's, and she read the words with
+which the inscription opened : --
+"Erected by Francis Troy in Beloved Memory of
+Fanny Robin.'
+Oak saw her, and his first act was to gaze inquiringly
+and learn how she received this knowledge of the
+authorship of the work, which to himself had caused
+considerable astonishment. But such discoveries did
+not much affect her now. Emotional convulsions seemed
+to have become the commonplaces of her history, and
+she bade him good morning, and asked him to fill in
+the hole with the spade which was standing by. Whilst
+Oak was doing as she desired, Bathsheba collected the
+flowers, and began planting them with that sympathetic
+manipulation of roots and leaves which is so conspicuous
+in a woman's gardening, and which flowers seem to
+understand and thrive upon. She requested Oak to
+get the churchwardens to turn the leadwork at the
+mouth of the gurgoyle that hung gaping down upon
+them, that by this means the stream might be directed
+sideways, and a repetition of the accident prevented.
+Finally, with the superfluous magnanimity of a woman
+whose narrower instincts have brought down bitterness
+upon her instead of love, she wiped the mud spots from
+the tomb as if she rather liked its words than otherwise,
+<C xlvii>
+<P 382>
+ADVENTURES BY THE SHORE
+TROY wandered along towards the south. A composite
+feeling, made up of disgust with the, to him, humdrum
+tediousness of a farmer's life, gloomly images of her who
+lay in the churchyard, remorse, and a general averseness
+to his wife's society, impelled him to seek a home in any
+place on earth save Weatherbury. The sad accessories
+of Fanny's end confronted him as vivid pictures which
+threatened to be indelible, and made life in Bathsheba's
+house intolerable. At three in the afternoon he found
+himself at the foot of a slope more than a mile in length,
+which ran to the ridge of a range of hills lying parallel
+with the shore, and forming a monotonous barrier between
+the basin of cultivated country inland and the wilder
+scenery of the coast. Up the hill stretched a road
+nearly straight and perfectly white, the two sides
+approaching each other in a gradual taper till they
+met the sky at the top about two miles off. Through+
+out the length of this narrow and irksome inclined plane
+not a sign of life was visible on this garish afternoon
+Troy toiled up the road with a languor and depression
+greater than any he had experienced for many a day
+and year before. The air was warm and muggy, and
+the top seemed to recede as he approached.
+At last he reached the summit, and a wide and
+novel prospect burst upon him with an effect almost like
+that of the Pacific upon Balboa's gaze. The broad
+steely sea, marked only by faint lines, which had a
+semblance of being etched thereon to a degree not deep
+enough to disturb its general evenness, stretched the
+whole width of his front and round to the right, where,
+near the town and port of Budmouth, the sun bristled
+down upon it, and banished all colour, to substitute in
+its place a clear oily polish. Nothing moved in sky,
+land, or sea, except a frill of milkwhite foam along the
+nearer angles of the
+<P 383>
+shore, shreds of which licked the
+contiguous stones like tongues.
+He descended and came to a small basin of sea
+enclosed by the cliffs. Troy's nature freshened within
+him ; he thought he would rest and bathe here before
+going farther. He undressed and plunged in. Inside
+the cove the water was uninteresting to a swimmer,
+being smooth as a pond, and to get a little of the ocean
+swell, Troy presently swam between the two projecting
+spurs of rock which formed the pillars of Hercules to
+this miniature Mediterranean. Unfortunately for Troy
+a current unknown to him existed outside, which, un+
+important to craft of any burden, was awkward for a
+swimmer who might be taken in it unawares. Troy
+found himself carried to the left and then round in a
+swoop out to sea.
+He now recollected the place and its sinister
+character. Many bathers had there prayed for a dry
+death from time to time, and, like Gonzalo also, had
+been unanswered ; and Troy began to deem it possible
+that he might be added to their number. Not a boat
+of any kind was at present within sight, but far in the
+distance Budmouth lay upon the sea, as it were quietly
+regarding his efforts, and beside the town the harbour
+showed its position by a dim meshwork of ropes and
+spars. After welinigh exhausting himself in attempts
+to get back to the mouth of the cove, in his weakness
+swimming several inches deeper than was his wont,
+keeping up his breathing entirely by his nostrils, turning
+upon his back a dozen times over, swimming <1en papillon>1
+and so on, Troy resolved as a last resource to tread
+water at a slight incline, and so endeavour to reach the
+shore at any point, merely giving himself a gentle
+impetus inwards whilst carried on in the general direc+
+tion of the tide. This, necessarily a slow process, he
+found to be not altogether so difficult, and though there
+was no choice of a landing-place -- the objects on shore
+passing by him in a sad and slow procession -- he per+
+ceptibly approached the extremity of a spit of land yet
+further to the right, now well defined against the sunny
+portion of the horizon- While the swimmer s eye's were
+fixed upon the spit as his only means of salvation on
+this side of the
+<P 384>
+Unknown, a moving object broke the
+outline of the extremity, and immediately a ship's boat
+appeared manned with several sailor lads, her bows
+towards the sea.
+All Troy's vigour spasmodically revived to prolong
+the struggle yet a little further. Swimming with his
+right arm, he held up his left to hail them, splashing
+upon the waves, and shouting with all his might. From
+the position of the setting sun his white form was
+distinctly visible upon the now deep-hued bosom of the
+sea to the east of the boat, and the men saw him at
+once. Backing their oars and putting the boat about,
+they pulled towards him with a will, and in five or six
+minutes from the time of his first halloo, two of the
+sailors hauled him in over the stern.
+They formed part of a brig's crew, and had come
+ashore for sand. Lending him what little clothing they
+could spare among them as a slight protection against
+late they made again towards the roadstead where their
+And now night drooped slowly upon the wide watery
+levels in front; and at no great distance from them,
+where the shoreiine curved round, and formed a long
+riband of shade upon the horizon, a series of points of
+yellow light began to start into existence, denoting the
+spot to be the site of Budmouth, where the lamps were
+being lighted along the parade. The cluck of their
+oars was the only sound of any distinctness upon the
+sea, and as they laboured amid the thickening shades
+the lampiights grew larger, each appearing to send a
+flaming sword deep down into the waves before it, until
+there arose, among other dim shapes of the kind, the
+form of the vessel for which they were bound.
+<C xlviii>
+<P 385>
+DOUBTS ARISE -- DOUBTS LINGER
+BATHSHEBA underwent the enlargement of her
+Husband's absence from hours to days with a slight
+feeling of suprise, and a slight feeling of relief; yet
+neither sensation rose at any time far above the level
+commonly designated as indifference. She belonged to
+him : the certiinties of that position were so well defined,
+and the reasonable probabilies of its issue so bounded
+that she could not speculate on contingenciezs. Taking
+no further interest in herself as a splendid woman, she
+acquired the indifferent feelings of an outsider in contem+
+plating her probable fate as a singular wretch ; for Bath+
+sheba drew herself and her future in colours that no
+reality could exceed for darkness. Her original vigorous
+pride of youth had sickened, and with it had declined
+all her anzieties about coming years, since anxiety
+recognizes a better and a worse alternative, and Bath+
+sheba had made up her mind that alternatives on any
+noteworthy scale had ceased for her. Soon, or later --
+and that not very late -- her husband would be home
+again. And then the days of their tenancy of the
+Upper Farm would be numbered. There had origin+
+ally been shown by the agent to the estate some distrust
+of Bathsheba's tenure as James Everdene's successor,
+on the score of her sex, and her youth, and her beauty ;
+but the peculiar nature of her uncle's will, his own
+frequent testimony before his death to her cleverness
+in such a pursuit, and her vigorous marshalling of the
+numerous flocks and herds which came suddenly into
+her hands before negotiations were concluded, had won
+confidence in her powers, and no further objections had
+been raised. She had latterly been in great doubt as
+to what the legal effects of her marriage would be upon
+her position; but no notice had been taken as yet of
+her change of name, and only one point was clear -- that
+in the event of her own or her husband's inability to
+meet the agent at the
+<P 386>
+forthcoming January rent-day,
+very little consideration would be shown, and, for that
+matter, very little would be deserved. Once out of the
+farm, the approach of poverty would be sure.
+Hence Bathsheba lived in a perception that her
+purposes were broken of. She was not a woman who
+could hope on without good materials for the process,
+differing thus from the less far-Sighted and energetic,
+though more petted ones of the sex, with whom hope
+goes on as a sort of clockwork which the merest food
+and shelter are sufficient to wind up; and perceiving
+clearly that her mistake had been a fatal one, she
+accepted her position, and waited coldly for the end.
+The first Saturday after Troy's departure she went
+to Casterbridge alone, a journey she had not before
+taken since her marriage. On this Saturday Bathsheba
+was passing slowly on foot through the crowd of rural
+business-men gathered as usual in front ot the market+
+house, who were as usual gazed upon by the burghers
+with feelings that those healthy lives were dearly paid
+for by exclusion from possible aldermanship, when a
+man, who had apparently been following her, said some
+words to another on her left hand. Bathsheba's ears
+were keen as those of any wild animal, and she dis+
+tinctly heard what the speaker said, though her back
+was towards him
+"I am looking for Mrs. Troy. Is that she there?'
+" Yes ; that's the young lady, I believe,' said the
+the person addressed.
+"I have some awkward news to break to her. Her
+husband is drowned.'
+As if endowed with the spirit of prophecy, Bathsheba
+gasped out, "No, it is not true; it cannot be true!'
+Then she said and heard no more. The ice of self+
+command which had latterly gathered over her was
+broken, and the currents burst forth again, and over
+whelmed her. A darkness came into her eyes, and she
+fell.
+But not to the ground. A gloomy man, who had
+been observing her from under the portico of the old
+corn-exchange when she passed through the group
+without, stepped quickly to her side at the moment of
+her exclamation, and caught her in his arms as she sank
+down.
+<P 387>
+"What is it?' said Boldwood, looking up at the
+bringer of the big news, as he supported her.
+"Her husband was drowned this week while bathing
+in Lulwind Cove. A coastguardsman found his clothes,
+and brought them into Budmouth yestersay.'
+Thereupon a strange fire lighted up Boldwood's eye,
+and his face flushed with the suppressed excitement of
+an unutterable thought. Everybody's glance was now
+centred upon him and the unconsious Bathsheba. He
+lifted her bodily off the ground, and smoothed down
+the folds of her dress as a child might have taken a
+storm-beaten bird and arranged its ruffled plumes, and
+bore her along the pavement to the King's Arms Inn.
+Here he passed with her under the archway into a
+private room; and by the time he had deposited -- so
+lothly -- the precious burden upon a sofa, Bathsheba had
+opened her eyes. Remembering all that had occurred,
+she murmured, 'I want to go home .! '
+Boldwood left the room. He stood for a moment in
+the passage to recover his senses. The experience had
+been too much for his consciousness to keep up with,
+and now that he had grasped it it had gone again. For
+those few heavenly, golden moments she had been in his
+arms. What did it matter about her not knowing it? She
+had been close to his breast ; he had been close to hers.
+He started onward again, and sending a woman to
+her, went out to ascertain all the facts of the case.
+These appeared to be limited to what he had already
+heard. He then ordered her horse to be put into the
+gig, and when all was ready returned to inform her.
+He found that, though still pale and unwell, she had in
+the meantime sent for the Budmouth man who brought
+the tidings, and learnt from him all there was to know.
+Being hardly in a condition to drive home as she
+had driven to town, Boldwood, with every delicacy of
+manner and feeling, offered to get her a driver, or to
+give her a seat in his phaeton, which was more com+
+fortable than her own conveyance. These proposals
+Bathsheba gently declined, and the farmer at once de+
+parted.
+About half-an-hour later she invigorated herself by
+an effort, and took her seat and the reins as usuai-in
+external
+<P 388>
+appearance much as if nothing had happened.
+She went out of the town by a tortuous back street, and
+drove slowly along, unconscious of the road and the
+scene. The first shades of evening were showing them+
+selves when Bathsheba reached home, where, silently
+alighting and leaving the horse in the hands of the boy,
+she proceeded at once upstairs. Liddy met her on the
+landing. The news had preceded Bathsheba to Weather+
+bury by half-an-hour, and Liddy looked inquiringly into
+her mistress's face. Bathsheba had nothing to say.
+She entered her bedroom and sat by the window, and
+thought and thought till night enveloped her, and the
+extreme lines only of her shape were visible. Somebody
+came to the door, knocked, and opened it.
+' Well, what is it, Liddy ? ' she said.
+'I was thinking there must be something got for you
+to wear,' said Liddy, with hesitation.
+'What do you mean ?'
+' Mourning.'
+' No, no, no,' said Bathsheba, hurriedly.
+'But I suppose there must be something done for
+poor --  -- '
+' Not at present, I think. It is not necessary.'
+' Why not, ma'am ? '
+' Because he's still alive.'
+' How do you know that ? ' said Liddy, amazed.
+' I don't know it. But wouldn't it have heen different,
+or shouldn't I have heard more, or wouldn't they have
+found him, Liddy ? -- or-i don't know how it is, but
+death would have been different from how this is. I am
+perfectly convinced that he is still alive .! '
+Bathsheba remained firm in this opinion till Monday,
+when two circumstances conjoined to shake it. The
+first was a short paragraph in the local newspaper, which,
+beyond making by a methodizing pen formidable pre+
+sumptive evidence of Troy's death by drowning, con+
+tained the important testimony of a young Mr. Barker,
+M.D., of Budmouth, who spoke to being an eyewitness
+of the accident, in a letter to the editor. In this he
+stated that he was passing over the cliff on the remoter
+side of the
+<P 389>
+cove just as the sun was setting. At that
+time he saw a bather carried along in the current outside
+the mouth of the cove, and guessed in an instant that
+there was but a poor chance for him unless he should
+be possessed of unusual muscular powers. He drifted
+behind a projection of the coast, and Mr. Barker followed
+along the shore in the same direction. But by the time
+that he could reach an elevation sufficiently great to
+command a view of the sea beyond, dusk had set in, and
+nothing further was to be seen.
+The other circumstance was the arrival of his clothes,
+when it became necessary for her to examine and identify
+them -- though this had virtually been done long before
+by those who inspected the letters in his pockets. It
+was so evident to her in the midst of her agitation that
+Troy had undressed in the full conviction of dressing
+again almost immediately, that the notion that anything
+but death could have prevented him was a perverse one
+to entertain.
+Then Bathsheba said to herself that others were
+assured in their opinion; strange that she should not
+be. A stmnge reflection occured to her, causing her
+face to flush. Suppose that Troy had followed Fanny
+into another world. Had he done this intentionally, yet
+contrived to make his death appear like an accident ?
+Nevertheless, this thought of how the apparent might
+differ from the reai-made vivid by her bygone jealousy
+of Fanny, and the remorse he had shown that night
+ -- did not blind her to the perception of a likelier
+difference, less tragic, but to herself far more disastrous.
+When alone late that evening beside a small fire, and
+much calmed down, Bathsheba took Troy's watch into
+her hand, which had been restored to her with the rest
+of the articles belonging to him. She opened the case
+as he had opened it before her a week ago. There was
+the little coil of pale hair which had been as the fuze to
+this great explosion.
+'He was hers and she was his; they should be gone
+together,' she said. 'I am nothing to either of them,
+and why should I keep her hair?' She took it in her
+hand, and held it over the fire. ' No-i'll not burn it
+-i'll keep it in memory of her, poor thing !. ' she added,
+snatching back her hand.
+<C xlix>
+<P 390>
+OAK'S ADVANCEMENY -- A GREAT HOPE
+THE later autumn and the winter drew on apace,
+and the leaves lay thick upon the turf of the glades
+and the mosses of the woods. Bathsheba, having
+previously been living in a state of suspended feeling
+which was not suspense, now lived in a mood of
+quietude which was not precisely peacefulness. While
+she had known him to be alive she could have thought
+of his death with equanimity; but now that it might be
+she had lost him, she regretted that he was not hers
+still. She kept the farm going, raked in her profits
+without caring keenly about them, and expended
+money on ventures because she had done so in bygone
+days, which, though not long gone by, seemed infinitely
+removed from her present. She looked back upon that
+past over a great gulf, as if she were now a dead person,
+having the faculty of meditation still left in her, by
+means of which, like the mouldering gentlefolk of the
+poet's story, she could sit and ponder what a gift life
+used to be.
+However, one excellent result of her general apathy
+was the long-delayed installation of Oak as bailiff; but
+he having virtually exercised that function for a long
+time already, the change, beyond the substantial in+
+crease of wages it brought, was little more than a
+nominal one addressed to the outside world.
+Boldwood lived secluded and inactive. Much of
+his wheat and all his barley of that season had been
+spoilt by the rain. It sprouted, grew into intricate
+mats, and was ultimately thrown to the pigs in armfuls.
+The strange neglect which had produced this ruin
+and waste became the subject of whispered talk among
+all the people round; and it was elicited from one of
+Boldwood's men that forgetfulness had nothing to do
+with it, for he had been reminded of the danger to
+his corn as many times and as persistently as inferiors
+dared to do. The sight of the
+<P 391>
+pigs turning in disgust
+from the rotten ears seemed to arouse Boldwood, and
+he one evening sent for Oak. Whether it was sug+
+gested by Bathsheba's recent act of promotion or not,
+the farmer proposed at the interview that Gabriel
+should undertake the superintendence of the Lower
+Farm as well as of Bathsheba's, because of the necessity
+Boldwood felt for such aid, and the impossibility of
+discovering a more trustworthy man. Gabriel's malig+
+nant star was assuredly setting fast.
+Bathsheba, when she learnt of this proposai-for
+Oak was obliged to consult her -- at first languidly
+objected. She considered that the two farms together
+were too extensive for the observation of one man.
+Boldwood, who was apparently determined by personal
+rather than commercial reasons, suggested that Oak
+should be furnished with a horse for his sole use,
+when the plan would present no difficulty, the two
+farms lying side by side. Boldwood did not directly
+communicate with her during these negotiations, only
+speaking to Oak, who was the go-between throughout.
+All was harmoniously arranged at last, and we now
+see Oak mounted on a strong cob, and daily trotting
+the length breadth of about two thousand acres
+in a cheerful spirit of surveillance, as if the crops
+belonged to him -- the actual mistress of the one-half
+and the master of the other, sitting in their respective
+homes in gloomy and sad seclusion.
+Out of this there arose, during the spring succeeding,
+a talk in the parish that Gabriel Oak was feathering his
+nest fast.
+' Whatever d'ye think,' said Susan Tall, ' Gable Oak
+is coming it quite the dand. He now wears shining
+boots with hardly a hob in 'em, two or three times
+a-week, and a tall hat a-Sundays, and 'a hardly knows
+the name of smockfrock. When I see people strut
+enough to he cut up into bantam cocks, I stand
+dormant with wonder, and says no more .! '
+It was eventually known that Gabriel, though paid
+a fixed wage by Bathslieba independent of the fluctua+
+tions of agricultural profits, had made an engagement
+with Boldwood by which Oak was to receive a share
+of the receipts -- a small share certainly, yet it was
+money of a higher quality than mere wages, and
+capable of expansion in a way that wages were not.
+<P 392>
+Some were beginning to consider Oak a 'near' man,
+for though his condition had thus far improved, he
+lived in no better style than hefore, occupying the
+same cottage, paring his own potatoes, mending his
+stockings, and sometimes even making his bed with
+his own hands. But as Oak was not only provokingly
+indifferent to public opinion, but a man who clung
+persistently to old habits and usages, simply because
+they were old, there was room for doubt as to his
+motives.
+A great hope had latterly germinated in Boldwood,
+whose unreasoning devotion to Bathsheba could only
+be characterized as a fond madness which neither
+time nor circumstance, evil nor good report, could
+weaken or destroy. This fevered hope had grown up
+again like a grain of mustard-seed during the quiet
+which followed the hasty conjecture that Troy was
+drowned. He nourished it fearfully, and almost
+shunned the contemplation of it in earnest, lest facts
+should reveal the wildness of the dream. Bathsheba
+having at last been persuaded to wear mourning, her
+appearance as she entered the church in that guise
+was in itself a weekly addition to his faith that a
+time was coming -- very far off perhaps, yet surely
+nearing -- when his waiting on events should have
+its reward. How long he might have to wait he had
+not yet closely considered. what he would try to
+recognize was that the severe schooling she had been
+subjected to had made Bathsheba much more con+
+siderate than she had formerly been of the feelings of
+others, and he trusted that, should she be willing at
+any time in the future to marry any man at all, that
+man would be himself. There was a substratum of
+good feeling in her: her self-reproach for the injury
+she had thoughtlessly done him might be depended
+upon now to a much greater extent than before her
+infatuation and disappointment. It would be possible
+to approach her by the channel of her good nature,
+and to suggest a friendly businessiike compact between
+them for fulfilment at some future day, keeping the
+passionate side of his desire entirely out of her sight.
+Such was Boldwood's hope.
+To the eyes of the middle-aged, Bathsheba was
+perhaps additionally charming just now. Her exuber+
+ance cf spirit was pruned down ; the original phantom
+of delight had shown
+<P 393>
+herself to be not too bright for
+human nature's daily food, and she had been able to
+enter this second poetical phase without losing much
+of the first in the process.
+Bathsheba's return from a two months' visit to her
+old aunt at Norcombe afforded the impassioned and
+yearning farmer a pretext for inquiring directly after
+her -- now possibly in the ninth month of her
+widowhood -- and endeavouring to get a notion of her
+middle of the haymaking, and Boldwood contrived to
+'I am glad to see you out of doors, Lydia,' he said
+She simpered, and wondered in her heart why he
+'I hope Mrs. Troy is quite well after her long
+the coldest-hearted neighbour could scarcely say less
+'She is quite well, sir.
+'Yes, cheerful.
+'Fearful, did you say?'
+'O no. I merely said she was cheerful.'
+'Tells you all her affairs?'
+'No, sir.
+'Some of them?'
+'Yes, sir.
+'Mrs Troy puts much confidence in you, Lydia;
+and very wisely, perhaps.'
+'She do, sir. I've been with her all through her
+troubles, and was with her at the time of Mr.Troy's
+going and all. And if she were to marry again I
+expect I should bide with her.'
+'She promises that you shali -- quite natural,' said
+the strategic lover, throbbing throughout him at the
+presumption which Liddy's words appeared to warrant
+ -- that his darling had thought of re-marriage.
+'No -- -she doesn't promise it exactly. I merely
+judge on my own account.
+'Yes       yes, I understand. When she alludes to the
+possibility of marrying again, you conclude --  -- '
+<P 394>
+'She never do allude to it, sir,' said Liddy, thinking
+how very stupid Mr. Boldwood was getting.
+'Of course not,' he returned hastily, his hope falling
+again. ' You needn't take quite such long reaches with
+your rake, Lydia -- short and quick ones are best. Well,
+perhaps, as she is absolute mistress again now, it is wise
+of her to resolve never to give up her freedom.'
+' My mistress did certainly once say, though not
+seriously, that she supposed she might marry again at
+the end of seven years from last year, if she cared to
+risk Mr. Troy's coming back and claiming her.'
+' Ah, six years from the present time. Said that she
+might. She might marry at once in every reasonable
+person's opinion, whatever the lawyers may say to the
+contrary.'
+'Have you been to ask them?' said Liddy, innocently.
+' Not I,' said Boldwood, growing red. ' Liddy, you
+needn't stay here a minute later than you wish, so Mr,
+Oak says. I am now going on a little farther. Good'
+afternoon.'
+He went away vexed with himself, and ashamed of
+having for this one time in his life done anything which
+could be called underhand. Poor Boldwood had no
+more skill in finesse than a battering-ram, and he was
+uneasy with a sense of having made himself to appear
+stupid and, what was worse, mean. But he had, after
+all, lighted upon one fact by way of repayment. It was
+a singularly fresh and fascinating fact, and though not
+without its sadness it was pertinent and real. In little
+more than six years from this time Bathsheba might
+certainly marry him. There was something definite in
+that hope, for admitting that there might have been no
+deep thought in her words to Liddy about marriage,
+they showed at least her creed on the matter.
+This pleasant notion was now continually in his mind.
+Six years were a long time, but how much shorter than
+never, the idea he had for so long been obliged to
+endure .! Jacob had served twice seven years for
+Rachel: what were six for such a woman as this ? He
+tried to like the notion of waiting for her better than
+that of winning her at once. Boldwood felt his love
+to be so deep and strong and eternal, that it was pos+
+sible she
+<P 395>
+had never yet known its full volume, and this
+patience in delay would afford him an opportunity of
+giving sweet proof on the point. He would annihilate
+the six years of his life as if they were minutes -- so little
+did he value his time on earth beside her love. He
+would let her see, all those six years of intangible ether+
+eal courtship, how little care he had for anything but as
+it bore upon the consummation.
+Meanwhile the early and the late summer brought
+round the week in which Greenhill Fair was held.
+This fair was frequently attended by the folk of Weather+
+bury.
+<C l>
+<P 396>
+THE SHEEP FAIR -- TROY TOUCHES HIS WIFE'S HAND
+GREENHILL was the Nijni Novgorod of South
+Wessex; and the busiest, merriest, noisiest day of the
+whole statute number was the day of the sheep fair.
+This yearly gathering was upon the summit of a hill
+which retained in good preservation the remains of an
+ancient earthwork, consisting of a huge rampart and
+entrenchnaent of an oval form encircling the top of
+the hill, though somewhat broken down here and there.
+To each of the two chief openings on opposite sides a
+winding road ascended, and the level green space of
+ten or fifteen acres enclosed by the bank was the
+site of the fair. A few permanent erections dotted the
+spot, but the majority of visitors patronized canvas alone
+for resting and feeding under during the time of their
+sojourn here.
+Shepherds who attended with their flocks from long
+distances started from home two or three days, or even
+a week, before the fair, driving their charges a few miles
+each day -- not more than ten or twelve -- and resting
+them at night in hired fields by the wayside at pre+
+viously chosen points, where they fed, having fasted since
+morning. The shepherd of each flock marched behind,
+a bundle containing his kit for the week strapped upon
+his shoulders, and in his hand his crook, which he used
+as the staff of his pilgrimage. Several of the sheep
+would get worn and lame, and occasionally a lambing
+occurred on the road. To meet these contingencies,
+there was frequently provided, to accompany the flocks
+from the remoter points, a pony and waggon into which
+the weakly ones were taken for the remainder of the
+journey.
+The Weatherbury Farms, however, were no such
+long distance from the hill, and those arrangements
+were not necessary in their case. But the large united
+flocks of Bathsheba and Farmer Boldwood formed a
+valuable and imposing multitude which
+<P 397>
+demanded much
+attention, and on this account Gabriel, in addition to
+Boldwood's shepherd and Cain Ball, accompanied them
+along the way, through the decayed old town of Kings'
+bere, and upward to the plateau, -- old George the dog
+of course behind them.
+When the autumn sun slanted over Greenhill this
+morning and lighted the dewy flat upon its crest, nebu+
+lous clouds of dust were to be seen floating between
+the pairs of hedges which streaked the wide prospect
+around in all directions. These gradually converged
+upon the base of the hill, and the flocks became
+individually visible, climbing the serpentine ways which
+led to the top. Thus, in a slow procession, they entered
+the opening to which the roads tended, multitude after
+multitude, horned and hornless -- blue flocks and red
+flocks, buff flocks and brown flocks, even green and
+salmon-tinted flocks, according to the fancy of the
+colourist and custom of the farm. Men were shouting,
+dogs were barking, with greatest animation, but the
+thronging travellers in so long a journey had grown
+nearly indifferent to such terrors, though they still
+bleated piteously at the unwontedness of their experi+
+ences, a tall shepherd rising here and there in the midst
+of them, like a gigantic idol amid a crowd of prostrate
+devotees.
+The great mass of sheep in the fair consisted of
+South Downs and the old Wessex horned breeds, to
+the latter class Bathsheba's and Farmer Boldwood's
+mainly belonged. These filed in about nine o'clock,
+their vermiculated horns lopping gracefully on each side
+of their cheeks in geometrically perfect spirals, a small
+pink and white ear nestling under each horn. Before
+and behind came other varieties, perfect leopards as to
+the full rich substance of their coats, and only lacking the
+spots. There were also a few of the Oxfordshire breeed,
+whose wool was beginning to curl like a child's flaxen
+hair, though surpassed in this respect by the effeminate
+Leicesters, which were in turn less curly than the Cots+
+wolds. But the most picturesque by far was a small
+flock of Exmoors, which chanced to be there this year.
+Their pied faces and legs, dark and heavy horns, tresses
+of wool hanging round their swarthy
+<P 398>
+foreheads, quite
+relieved the monotony of the flocks in that quarter.
+All these bleating, panting, and weary thousands had
+entered and were penned before the morning had far
+advanced, the dog belonging to each flock being tied to
+the corner of the pen containing it. Alleys for pedes+
+trians intersected the pens, which soon became crowded
+with buyers and sellers from far and near.
+In another part of the hill an altogether different
+scene began to force itself upon the eye towards mid+
+day. A circular tent, of exceptional newness and size,
+was in course of erection here. As the day drew on,
+the flocks began to change hands, lightening the shep+
+herd's responsibilities ; and they turned their attention
+to this tent and inquired of a man at work there, whose
+soul seemed concentrated on tying a bothering knot in
+no time, what was going on.
+' The Royal Hippodrome Performance of Turpin's
+Ride to York and the Death of Black Bess,' replied the
+man promptly, without turning his eyes or leaving off
+tying.
+As soon as the tent was completed the band struck
+up highly stimulating harmonies, and the announce+
+ment was publicly made, Black Bess standing in a con+
+spicuous position on the outside, as a living proof, If
+proof were wanted, of the truth of the oracular utterances
+from the stage over which the people were to enter.
+These were so convinced by such genuine appeals to
+heart and understanding both that they soon began to
+crowd in abundantly, among the foremost being visible
+Jan Coggan and Joseph Poorgrass, who were holiday
+keeping here to-day,
+''That's the great ruffen pushing me .! ' screamed a
+woman in front of Jan over her shoulder at him when
+the rush was at its fiercest.
+'How can I help pushing ye when the folk behind
+push me ?' said Coggan, in a deprecating tone, turning
+without turning his body, which was jammed as in a vice.
+Tjere was a silence ; then the drums and trumpets
+again sent forth their echoing notes. The crowd was
+again ectasied,
+<P 399>
+and gave another lurch in which Coggan
+and Poorgrass were again thrust by those behind upon
+the women in front.
+'O that helpless feymels should be at the mercy of
+she swayed like a reed shaken by the wind.
+Now,' said Coggan, appealing in an earnest voice
+to the public at large as it stood clustered about his
+shoulder-blades,'ded ye ever hear such onreasonable
+woman as that ? Upon my carcase, neighbours, if I
+could onlyu get out of this cheesewring, the damn women
+might eat the show for me.! '
+'Don't ye lose yer temper, Jan!' implored Joseph
+Poorgrass, in a whisper. ' They might get their men to
+murder us, for I think by the shine of their eyes that
+they be a sinful form of womankind.'
+Jan held his tongue, as if he had no objection to be
+pacified to please a friend, and they gradually reached
+the foot of the ladder, Poorgrass being flattened like a
+jumping-jack, and the sixpence, for admission, which he
+had got ready half-an-hour earlier, having become so
+reeking hot in the tight squeeze of his excited hand that
+the woman in spangles, brazen rings set with glass
+diamonds, and with chalked face and shoulders, who
+took the money of him, hastily dropped it again from
+a fear that some trick had been played to burn her
+fingers. So they all entered, and the cloth of the
+tent, to the eyes of an observer on the outside, became
+bulged into innumerable pimples such as we observe on
+a sack of potatoes, caused by the various human heads,
+backs, and elbows at high pressure within.
+At the rear of the large tent there were two small
+dressing-tents. One of these, alloted to the male per+
+formers, was partitioned into halves by a cloth ; and in
+one of the divisions there was sitting on the grass, puli
+ing on a pair of jack-boots, a young man whom we
+instantly recognise as Sergeant Troy.
+Troy's appearance in this position may be briefly
+accounted for. The brig aboard which he was taken in
+Budmouth Roads was about to start on a voyage, though
+somewhat short of hands. Troy read the articles and
+joined, but before they sailed a boat was despatched
+across the bay to Lulwind cove; as he
+<P 400>
+had half expected,
+his clothes were gone. He ultimately worked his passage
+to the United States, where he made a precarious living
+in various towns as Professor of Gymnastics, Sword
+Exercise, Fencing, and Pugilism. A few months were
+sufficient to give him a distaste for this kind of life.
+There was a certain animal form of refinement in his
+nature; and however pleasant a strange condition might
+be whilst privations were easily warded off, it was dis+
+advantageously coarse when money was short. There
+was ever present, too, the idea that he could claim a
+home and its comforts did he but chose to return to
+England and Weatherbury Farm. Whether Bathsheba
+thought him dead was a frequent subject of curious
+conjecture. To England he did return at last ; but the
+but the fact of drawing nearer to Weatherbury abstracted its
+fascinations, and his intention to enter his old groove at
+the place became modified. It was with gloom he con+
+sidered on landing at Liverpool that if he were to go home
+his reception would be of a kind very unpleasant to con+
+template ; for what Troy had in the way of emotion was
+an occasional fitful sentiment which sometimes caused
+him as much inconvenience as emotion of a strong and
+healthy kind. Bathsheba was not a women to be made
+a fool of, or a woman to suffer in silence; and how
+could he endure existence with a spirited wife to whom
+at first entering he would be beholden for food and
+lodging ? Moreover, it was not at all unlikely that his
+wife would fail at her farming, if she had not already
+done so; and he would then become liable for her
+maintenance : and what a life such a future of poverty
+with her would be, the spectre of Fanny constantly be+
+tween them, harrowing his temper and embittering her
+words! Thus, for reasons touching on distaste, regret,
+and shame commingled, he put off his return from day
+to day, and would have decided to put it off altogether
+if he could have found anywhere else the ready-made
+establishment which existed for him there.
+At this time -- the July preceding the September in
+which we find at Greenhill Fair -- he fell in with a
+travelling circus which was performing in the outskirts of
+a northern town. Troy introduced himself to the
+manager by taming a restive horse of the troupe, hitting
+a suspended apple with pistol-+
+<P 401>
+bullet fired from the
+animal's back when in full gallop, and other feats. For
+his merits in these -- all more or less based upon his ex+
+periences as a dragoon-guardsman -- Troy was taken into
+the company, and the play of Turpin was prepared with
+a view to his personation of the chief character. Troy
+was not greatly elated by the appreciative spirit in which
+he was undoubtedly treated, but he thought the engage+
+ment might afford him a few weeks for consideration.
+It was thus carelessly, and without having formed any
+definite plan for the future, that Troy found himself
+at Greenhill Fair with the rest of the company on this
+day.
+And now the mild autumn sun got lower, and in
+front of the pavilion the following incident had taken
+place. Bathsheba -- who was driven to the fair that day
+by her odd man Poorgrass -- had, like every one else,
+read or heard the announcement that Mr. Francis, the
+Great Cosmopolitan Equestrian and Roughrider, would
+enact the part of Turpin, and she was not yet too old
+and careworn to be without a little curiosity to see him.
+This particular show was by far the largest and grandest
+in the fair, a horde of little shows grouping themselves
+under its shade like chickens around a hen. The crowd
+had passed in, and Boldwood, who had been watching
+all the day for an opportunity of speaking to her, seeing
+her comparatively isolated, came up to her side.
+"I hope the sheep have done well to-day, Mrs. Troy?'
+he said, nervously.
+"O yes, thank you,' said Bathsheba, colour springing
+up in the centre of her cheeks. "I was fortunate
+enough to sell them all just as we got upon the hill, so
+we hadn't to pen at all.'
+"And now you are entirely at leisure ?'
+"Yes, except that I have to see one more dealer in
+two hours' time : otherwise I should be going home.
+was looking at this large tent and the announcement.
+Have you ever seen the play of "Turpin's Ride to
+York?" Turpin was a real man, was he not ?'
+"O yes, perfectly true -- all of it. Indeed, I think
+I've heard Jan Coggan say that a relation of his knew
+Tom King, Turpin's friend, quite well.'
+<P 402>
+"Coggan is rather given to strange stories connected
+with his relations, we must remember. I hope they
+can all be believed.'
+"Yes, yes; we know Coggan. But Turpin is true
+enough. You have never seen it played, I suppose?'
+"Never. I was not allowed to go into these places
+when I was young. Hark.! What's that prancing?
+How they shout!'
+"Black Bess just started off, I suppose. Am I right
+in supposing you would like to see the performance,
+Mrs. Troy ? Please excuse my mistake, if it is one;
+but if you would like to, I'll get a seat for you with
+pleasure.' Perceiving that she hesitated, he added, 'I
+myself shall not stay to see it: I've seen it before.'
+Now Bathsheba did care a little to see the show, and
+had only withheld her feet from the ladder because she
+feared to go in alone. She had been hoping that Oak
+might appear, whose assistance in such cases was always
+accepted as an inalienable right, but Oak was nowhere
+to be seen; and hence it was that she said, "Then if
+you will just look in first, to see if there's room, I think
+I will go in for a minute or two.'
+And so a short time after this Bathsheba appeared
+in the tent with Boldwood at her elbow, who, taking
+her to a " reserved ' seat, again withdrew.
+This feature consisted of one raised bench in very
+conspicuous part of the circle, covered with red cloth,
+and floored with a piece of carpet, and Bathsheba
+immediately found, to her confusion, that she was the
+single reserved individual in the tent, the rest of the
+crowded spectators, one and all, standing on their legs
+on the borders of the arena, where they got twice as
+good a view of the performance for half the money.
+Hence as many eyes were turned upon her, enthroned
+alone in this place of honour, against a scarlet back+
+ground, as upon the ponies and clown who were
+engaged in preliminary exploits in the centre, Turpin
+not having yet appeared. Once there, Bathsheba was
+forced to make the best of it and remain: she sat
+down, spreading her skirts with some dignity over the
+unoccupied space on each side of her, and giving a
+new and feminine aspect to the pavilion. In a few
+minutes she noticed the fat red nape of Coggan's neck
+among those standing just
+<P 403>
+below her, and Joseph Poor+
+grass's saintly profile a little further on.
+The interior was shadowy with a peculiar shade.
+The strange luminous semi-opacities of fine autumn
+afternoons and eves intensified into Rembrandt effects
+the few yellow sunbeams which came through holes
+and divisions in the canvas, and spirted like jets of
+gold-dust across the dusky blue atmosphere of haze
+pervading the tent, until they alighted on inner surfaces
+of cloth opposite, and shone like little lamps suspended
+there.
+Troy, on peeping from his dressing-tent through a
+slit for a reconnoitre before entering, saw his unconscious
+wife on high before him as described, sitting as queen
+of the tournament. He started back in utter confusion,
+for although his disguise efectually concealed his person+
+ality, he instantly felt that she would be sure to recognize
+his voice. He had several times during the day thought
+of the possibility of some Weatherbury person or other
+appearing and recognizing him; but he had taken the
+risk carelessly. If they see me, let them, he had said.
+But here was Bathsheba in her own person; and the
+reality of the scene was so much intenser than any of
+his prefigurings that he felt he had not half enough
+considered the point.
+She looked so charming and fair that his cool mood
+about Weatherbury people was changed. He had not
+expected her to exercise this power over him in the
+twinkling of an eye. Should he go on, and care nothing ?
+He could not bring himself to do that. Beyond a politic
+wish to remain unknown, there suddenly arose in him
+now a sense of shame at the possibility that his
+attractive young wife, who already despised him, should
+despise him more by discovering him in so mean a
+condition after so long a time. He actually blushed
+at the thought, and was vexed beyond measure that
+his sentiments of dislike towards Weatherbury should
+have led him to dally about the country in this way.
+But Troy was never more clever than when absolutely
+at his wit's end. He hastily thrust aside the curtain
+dividing his own little dressing space from that of the
+manager and proprietor, who now appeared as the
+individual called Tom King as far
+<P 404>
+down as his waist, and
+as the aforesaid respectable manager thence to his toes.
+"Here's the devil to pay!' said Troy.
+"How's that ?'
+"Why, there's a blackguard creditor in the tent I don't
+want to see, who'll discover me and nab me as sure as
+Satan if I open my mouth. What's to be done?'
+You must appear now, I think.'
+"I can't.'
+But the play must proceed.'
+"Do you give out that Turpin has got a bad cold,
+and can't speak his part, but that he'll perform it just
+the same without speaking.'
+The proprietor shook his head.
+"Anyhow, play or no play, I won't open my mouth,
+said Troy, firmly.
+"Very well, then let me see. I tell you how we'll
+manage,' said the other, who perhaps felt it would be
+extremely awkward to offend his leading man just at
+this time. "I won't tell 'em anything about your
+keeping silence; go on with the piece and say nothing,
+doing what you can by a judicious wink now and then,
+and a few indomitable nods in the heroic places, you
+know. They'll never find out that the speeches are
+omitted.'
+This seemed feasible enough, for Turpin's speeches
+were not many or long, the fascination of the piece
+lying entirely in the action ; and accordingly the play
+began, and at the appointed time Black Bess leapt
+into the grassy circle amid the plaudits of the spectators.
+At the turnpike scene, where Bess and Turpin are hotly
+pursued at midnight by the officers, and half-awake
+gatekeeper in his tasselled nightcap denies that any
+horseman has passed, Coggan uttered a broad-chested
+"Well done!' which could be heard all over the fair
+above the bleating, and Poorgrass smiled delightedly
+with a nice sense of dramatic contrast between our
+hero, who coolly leaps the gate, and halting justice in
+the form of his enemies, who must needs pull up
+cumbersomely and wait to be let through. At the
+death of Tom King, he could not refrain from seizing
+Coggan by the hand, and whispering, with tears in his
+eyes, "Of
+<P 405>
+course he's not really shot, Jan  --  only
+seemingly!' And when the last sad scene came on,
+and the body of the gallant and faithful Bess had to
+be carried out on a shutter by twelve volunteers from
+among the spectators, nothing could restrain Poorgrass
+from lending a hand, exclaiming, as he asked Jan to
+join him, "Twill be something to tell of at Warren's in
+future years, Jan, and hand down to our children.' For
+many a year in Weatherbury, Joseph told, with the air
+of a man who had had experiences in his time, that he
+touched with his own hand the hoof of Bess as she lay
+upon the board upon his shoulder. If, as some thinkers
+hold, immortality consists in being enshrined in others'
+memories, then did Black Bess become immortal that
+day if she never had done so before.
+Meanwhile Troy had added a few touches to his
+ordinary make-up for the character, the more effectually
+to disguise himself, and though he had felt faint qualms
+on first entering, the metamorphosis effected by judici+
+ously "lining' his face with a wire rendered him safe from
+the eyes of Bathsheba and her men. Nevertheless, he
+was relieved when it was got through.
+There a second performance in the evening, and
+the tent was lighted up. Troy had taken his part very
+quietly this time, venturing to indroduce a few speeches
+on occasion ; and was just concluding it when, whilst
+standing at the edge of the circle contiguous to the first
+row of spectators, he observed within a yard of him the
+eye of a man darted keenly into his side features. Troy
+hastily shifted his position, after having recognized in
+sworn enemy, who still hung about the outskirts of
+At first Troy resolved to take no notice and abide
+by circumstances. That he had been recongnized by
+this man was highly probable; yet there was room for
+a doubt. Then the great objection he had felt to
+allowing news of his proximity to precede him to
+Weatherbury in the event of his return, based on a
+feeling that knowledge of his present occupation would
+discredit him still further in his wife's eyes, returned
+in full force. Moreover, should he resolve not to
+return at all, a tale of his being alive and being in
+the neighbourhood would be
+<P 406>
+awkward ; and he was
+anxious to acquire a knowledge of his wife's temporal
+affairs before deciding which to do.
+In this dilemma Troy at once went out to recon+
+noitre. It occurred to him that to find Pennyways, and
+make a friend of him if possible, would be a very wise
+act. He had put on a thick beard borrowed from the
+establishment, and this he wandered about the fair+
+field. It was now almost dark, and respectable people
+were getting their carts and gigs ready to go home
+The largest refreshment booth in the fair was provided
+by an innkeeper from a neighbouring town. This was
+considered an unexceptionable place for obtaining the
+necessary food and rest: Host Trencher (as he was
+jauntily called by the local newspaper) being a sub+
+stantial man of high repute for catering through all the
+county round. The tent was divided into first and
+second-class compartments, and at the end of the first+
+class division was a yet further enclosure for the most
+exclusive, fenced of from the body of the tent by a
+luncheon-bar, behind which the host himself stood
+bustling about in white apron and shirt-sleeves, and look+
+ing as if he had never lived anywhere but under canvas
+all his life. In these penetralia were chairs and a table,
+which, on candles being lighted, made quite a cozy and
+luxurious show, with an urn, plated tea and coffee pots,
+china teacups, and plum cakes.
+Troy stood at the entrance to the booth, where a
+gipsy-woman was frying pancakes over a little fire of
+sticks and selling them at a penny a-piece, and looked
+over the heads of the people within. He could see
+nothing of Pennyways, but he soon discerned Bathsheba
+through an opening into the reserved space at the
+further end. Troy thereupon retreated, went round the
+tent into the darkness, and listened. He could hear
+Bathsheba's voice immediately inside the canvas ; she
+was conversing with a man. A warmth overspread his
+face: surely she was not so unprincipled as to flirt in
+a fair! He wondered if, then, she reckoned upon his
+death as an absolute certainty. To get at the root of
+the matter, Troy took a penknife from his pocket and
+softly made two little cuts crosswise in the cloth, which,
+by folding back the corners left a hole the size of a
+<P 407>
+wafer. Close to this he placed his face, withdrawing
+it again in a movement of surprise; for his eye had
+been within twelve inches of the top of Bathsheba's
+head. lt was too near to be convenient. He made
+another hole a little to one side and lower down, in a
+shaded place beside her chair, from which it was easy
+and safe to survey her by looking horizontally'.
+Troy took in the scene completely now. She was
+leaning back, sipping a cup of tea that she held in her
+hand, and the owner of the male voice was Boldwood,
+who had apparently just brought the cup to her,
+Bathsheba, being in a negligent mood, leant so idly
+against the canvas that it was pressed to the shape of
+her shoulder, and she was, in fact, as good as in 'rioy's
+arms; and he was obliged to keep his breast carefully
+backward that she might not feel its warmth through the
+cloth as he gazed in.
+Troy found unexpected chords of feeling to be stirred
+again within him as they had been stirred earlier in the
+day. She was handsome as ever, and she was his. It
+was some minutes before he could counteract his sudden
+wish to go in, and claim her. Then he thought how
+the proud girl who had always looked down upon him
+even whilst it was to love him, would hate him on dis+
+covering him to be a strolling player. Were he to make
+himself known, that chapter of his life must at all risks
+be kept for ever from her and from the Weatherbury
+people, or his name would be a byword throughout the
+parish. He would be nicknamed 'Turpin' as long as
+he lived. Assuredly before he could claim her these few
+past months of his existence must be entirely blotted out.
+"Shall I get you another cup before you start,
+ma'am?' said Farmer Boldwood.
+I thank you," said Bathsheba. " But I must be going
+at once. It was great neglect in that man to keep me
+waiting here till so late. I should have gone two hours
+ago, if it had not been for him. I had no idea of
+coming in here; but there's nothing so refreshing as a
+cup of tea, though I should never have got one if you
+hadn't helped me.'
+Troy scrutinized her cheek as lit by the candles,
+and watched each varying shade thereon, and the
+white shell-like sinuosities
+<P 408>
+of her little ear. She took
+out her purse and was insisting to Boldwood on paying
+for her tea for herself, when at this moment Pennyways
+entered the tent. Troy trembled : here was his scheme
+for respectability endangered at once. He was about
+to leave his hole of espial, attempt to follow Pennyways,
+and find out if the ex-bailiff had recognized him, when
+he was arrested by the conversation, and found he was
+too late.
+"Excuse me, ma'am,' said Pennyways ; "I've some
+private information for your ear alone.'
+"I cannot hear it now,' she said, coldly. That
+Bathsheba could not endure this man was evident; in
+fact, he was continually coming to her with some tale
+or other, by which he might creep into favour at the
+expense of persons maligned.
+"I'll write it down,' said Pennyways, confidently. He
+stooped over the table, pulled a leaf from a warped
+pocket-book, and wrote upon the paper, in a round
+hand --
+" <1Your husband is here. I've seen him. Who's the fool
+now?'
+This he folded small, and handed towards her.
+Bathsheba would not read it ; she would not even put
+out her hand to take it. Pennyways, then, with a laugh
+of derision, tossed it into her lap, and, turning away,
+left her.
+From the words and action of Pennyways, Troy,
+though he had not been able to see what the ex-bailiff
+wrote, had not a moment's doubt that the note referred
+to him. Nothing that he could think of could be done
+to check the exposure. " Curse my luck.!' he whispered,
+and added imprecations which rustled in the gloom like
+a pestilent wind. Meanwhile Boldwood said, taking up
+the note from her lap --
+"Don't you wish to read it, Mrs. Troy? If not,
+I'll destroy it."
+" Oh, well,' said Bathsheba, carelessly, "perhaps it is
+unjust not to read it; but I can guess what it is about.
+He wants me to recommend him, or it is to tell me of
+some little scandal or another connected with my work+
+people. He's always doing that.'
+Bathsheba held the note in her right hand. Bold+
+wood handed towards her a plate of cut bread-and+
+butter; when, in order to take a slice, she put the note
+into her left hand, where she was still holding the purse,
+and then allowed her hand to drop
+<P 409>
+beside her close to
+the canvas. The moment had come for saving his game,
+and Troy impulsively felt that he would play the card,
+For yet another time he looked at the fair hand, and
+saw the pink finger-tips, and the blue veins of the
+wrrist, encircled by a bracelet of coral chippings which
+she wore: how familiar it all was to him.! Then, with
+the lightning action in which he was such an adept, he
+noiselessly slipped his hand under the bottom of the
+tent-cloth, which was far from being pinned tightly down,
+lifted it a little way, keeping his eye to the hole,
+snatched the note from her fingers, dropped the canvas,
+and ran away in the gloom towards the bank and ditch,
+smiling at the scream of astonishment which burst from
+her. Troy then slid down on the outside of the rampart,
+hastened round in the bottom of the entrenchment to
+a distance of a hundred yards, ascended again, and
+crossed boldly in a slow walk towards the front entrance
+of the tent. His object was now to get to Pennyways,
+and prevent a repetition of the announcement until
+such time as he should choose.
+Troy reached the tent door, and standing among the
+groups there gathered, looked anxiously for Pennyways,
+evidently not wishing to make himself prominent by
+inquiring for him. One or two men were speaking of
+a daring attempt that had just been made to rob a
+young lady by lifting the canvas of the tent beside her.
+It was supposed that the rogue had imagined a slip of
+paper which she held in her hand to he a bank note,
+for he had seized it, and made off with it, leaving her
+purse behind. His chagrin and disappointment at dis+
+covering its worthlessness would be a good joke, it was
+said. However, the occurrence seemed to have become
+known to few, for it had not interrupted a fiddler, who
+had lately begun playing by the door of the tent, nor
+the four bowed old men with grim countenances and
+walking-sticks in hand, who were dancing "Major
+Malley's Reel' to the tune. Behind these stood
+Pennyways. Troy glided up to him, beckoned, and
+whispered a few words ; and with a mutual glance of
+concurrence the two men went into the night together.
+<C li>
+<P 410>
+BATHSHEBA TALKS WITH HER OUTRIDER
+THE arrangement for getting back again to Weather+
+bury had been that Oak should take the place of Poor+
+grass in Bathsheba's conveyance and drive her home,
+it being discovered late in the afternoon that Joseph
+was suffering from his old complaint, a multiplying eye,
+and was, therefore, hardly trustworthy as coachman and
+protector to a woman. But Oak had found himself so
+occupied, and was full of so many cares relative to
+those portions of Boldwood's flocks that were not
+disposed of, that Bathsheba, without telling Oak or
+anybody, resolved to drive home herself, as she had
+many times done from Casterbridge Market, and trust
+to her good angel for performing the journey un+
+molested. But having fallen in with Farmer Boldwood
+accidentally (on her part at least) at the refreshment+
+tent, she found it impossible to refuse his offer to ride
+on horseback beside her as escort. It had grown
+twilight before she was aware, but Boldwood assured
+her that there was no cause for uneasiness, as the
+moon would be up in half-an-hour.
+Immediately after the incident in the tent, she had
+risen to go -- now absolutely alarmed and really grateful
+for her old lover's protection -- though regretting Gabriel's
+absence, whose company she would have much preferred,
+as being more proper as well as more pleasant, since he
+was her own managing-man and servant. This, how+
+ever, could not be helped; she would not, on any
+consideration, treat Boldwood harshly, having once
+already iliused him, and the moon having risen, and
+the gig being ready, she drove across the hilitop in
+the wending way's which led downwards -- to oblivious
+obscurity, as it seemed, for the moon and the hill it
+flooded with light were in appearance on a level, the
+rest of the world lying as a vast shady concave between
+them. Boldwood mounted his horse, and
+<P 411>
+followed in
+close attendance behind. Thus they descended into
+the lowlands, and the sounds of those left on the
+hill came like voices from the sky, and the lights were
+as those of a camp in heaven. They soon passed the
+merry stragglers in the immediate vicinity of the hill,
+traversed Kingsbere, and got upon the high road.
+The keen instincts of Bathsheba had perceived that
+the farmer's staunch devotion to herself was still un+
+diminished, and she sympathized deeply. The sight
+had quite depressed her this evening; had reminded
+her of her folly; she wished anew, as she had wished
+many months ago, for some means of making repara+
+tion for her fault. Hence her pity for the man who
+so persistently loved on to his own injury and per+
+manent gloom had betrayed Bathsheba into an injudi+
+cious considerateness of manner, which appeared
+almost like tenderness, and gave new vigour to the
+exquisite dream of a Jacob's seven years service in
+poor Boldwood's mind.
+He soon found an excuse for advancing from his
+position in the rear, and rode close by her side. They
+had gone two or three miles in the moonlight, speaking
+desultorily across the wheel of her gig concerning the
+fair, farming, Oak's usefulness to them both, and other
+indifferent subjects, when Boldwood said suddenly
+and simply --
+"Mrs. Troy, you will marry again some day?'
+This point-blank query unmistakably confused her,
+it was not till a minute or more had elapsed that
+she said, "I have not seriously thought of any such
+subject.'
+"I quite understand that. Yet your late husband
+has been dead nearly one year, and -- '
+" You forget that his death was never absolutely
+proved, and may not have taken place; so that I may
+not be really a widow,' she said, catching at the straw of
+escape that the fact afforded
+"Not absolutely proved, perhaps, but it was proved
+circumstantially. A man saw him drowning, too. No
+reasonable person has any doubt of his death; nor
+have you, ma'am, I should imagine.
+"O yes I have, or I should have acted differently,'
+she said, gently. "From the first, I have had a strange
+uaccountable
+<P 412>
+feeling that he could not have perished,
+but I have been able to explain that in several ways
+since. Even were I half persuaded that I shall see
+him no more, I am far from thinking of marriage with
+another. I should be very contemptible to indulge in
+such a thought.'
+They were silent now awhile, and having struck into
+an unfrequented track across a common, the creaks of
+Boldwood's saddle and gig springs were all the
+sounds to be heard. Boldwood ended the pause.
+"Do you remember when I carried you fainting in
+my arms into the King's Arms, in Casterbridge? Every
+dog has his day: that was mine.'
+"I know-i know it all,' she said, hurriedly.
+"I, for one, shall never cease regretting that events
+so fell out as to deny you to me.'
+"I, too, am very sorry,' she said, and then checked
+herself. "I mean, you know, I am sorry you thought
+i -- '
+"I have always this dreary pleasure in thinking over
+those past times with you -- that I was something to
+you before <1he>1 was anything, and that you belonged
+<1almost>1 to me. But, of course, that's nothing. You
+never liked me.'
+" I did ; and respected you, too.'
+"Do you now?'
+"Yes.'
+"Which?'
+"How do you mean which?'
+"Do you like me, or do you respect me?'
+"I don't know -- at least, I cannot tell you. It is
+difficult for a woman to define her feelings in language
+which is chiefly made by men to express theirs. My
+treatment of you was thoughtless, inexcusable, wicked.!
+I shall eternally regret it. If there had been anything
+I could have done to make amends I would most
+gladly have done it -- there was nothing on earth I so
+longed to do as to repair the error. But that was not
+possible.'
+"Don't blame yourself -- you were not so far in the
+wrong as you suppose. Bathsheba, suppose you had
+real complete proof
+<P 413>
+that you are what, in fact, you are
+ -- a widow -- would you repair the old wrong to me by
+marrying me?'
+"I cannot say. I shouldn't yet, at any rate.'
+"But you might at some future time of your life?'
+"O yes, I might at some time.'
+"Well, then, do you know that without further proof
+of any kind you may marry again in about six years
+from the present -- subject to nobody's objection or
+blame?'
+"O yes,' she said, quickly. " I know all that. But
+don't talk of it -- seven or six years -- where may we all
+be by that time?'
+"They will soon glide by, and it will seem an
+astonishingly short time to look back upon when they
+are past -- much less than to look forward to now.'
+"Yes, yes; I have found that in my own experience.'
+" Now listen once more,' Boldwood pleaded. "If I
+wait that time, will you marry me? You own that you
+owe me amends-iet that be your way of making them.'
+"But, Mr. Boldwood -- six years -- '
+"Do you want to be the wife of any other man?'
+"No indeed! I mean, that I don't like to talk
+about this matter now. Perhaps it is not proper, and
+I ought not to allow it. Let us drop it. My husband
+may be living, as I said.'
+"Of course, I'll drop the subject if you wish. But
+propriety has nothing to do with reasons. I am a
+middle-aged man, willing to protect you for the
+remainder of our lives. On your side, at least, there
+is no passion or blamable haste -- on mine, perhaps,
+there is. But I can't help seeing that if you choose
+from a feeling of pity, and, as you say, a wish to make
+amends, to make a bargain with me for a far-ahead
+time -- an agreement which will set all things right
+and make me happy, late though it may be -- there is
+no fault to be found with you as a woman. Had'nt
+I the first place beside you? Haven't you been
+almost mine once already? Surely you can say to
+me as much as this, you will have me back again
+should circumstances permit ? Now, pray speak ! O
+Bathsheba, promise -- it is only a little promise -- that
+if you marry again, you will marry me.!'
+His tone was so excited that she almost feared him
+at this
+<P 414>
+moment, even whilst she sympathized. It was
+a simple physical fear -- the weak of the strong; there
+no emotional aversion or inner repugnance. She
+said, with some distress in her voice, for she remembered
+vividly his outburst on the Yalbury Road, and shrank
+from a repetition of his anger: --
+"I will never marry another man whilst you wish me
+to be your wife, whatever comes -- but to say more -- you
+have taken me so by surprise -- -'
+"But let it stand in these simple words -- that in six
+years' time you will be my wife ? Unexpected accidents
+we'll not mention, because those, of course, must be
+given way to. Now, this time I know you will keep
+your word.'
+"That's why I hesitate to give it.'
+"But do give it ! Remember the past, and be kind.'
+She breathed; and then said mournfully : "O what
+shall I do ? I don't love you, and I much fear that I
+never shall love you as much as a woman ought to love
+a husband. If you, sir, know that, and I can yet give
+you happiness by a mere promise to marry at the end of
+six years, if my husband should not come back, it is a
+great honour to me. And if you value such an act of
+friendship from a woman who doesn't esteem her+
+self as she did, and has little love left, why it
+wili -- '
+"Promise!.'
+" -- Consider, if I cannot promise soon.'
+"But soon is perhaps never?'
+"O no, it is not.! I mean soon. Christmas, we'll
+say.'
+"Christmas.!' He said nothing further till he
+added : "Well, I'll say no more to you about it till that
+time.'
+Bathsheba was in a very peculiar state of mind,
+which showed how entirely the soul is the slave of the
+body, the ethereal spirit dependent for its quality upon
+the tangible flesh and blood. It is hardly too much to
+say that she felt coerced by a force stronger than her
+own will, not only into the act of promising upon this
+singularly remote and vague matter, but into the emo+
+tion of fancying that she ought to promise. When the
+weeks intervening between the night of this conversa+
+<P 415>
+tion and Christmas day began perceptibly to diminish,
+her anxiety and perplexity increased.
+One day she was led by an accident into an oddly
+confidential dialogue with Gabriel about her difficulty
+It afforded her a little relief -- of a dull and cheerless
+kind. They were auditing accounts, and something
+occurred in the course of their labours which led Oak
+to say, speaking of Boldwood, " He'll never forget you,
+ma'am, never.'
+Then out came her trouble before she was aware ;
+and she told him how she had again got into the toils;
+what Boldwood had asked her, and how he was ex+
+pecting her assent. "The most mournful reason of all
+for my agreeing to it,' she said sadly, 'and the true
+reason why I think to do so for good or for evil, is this
+ -- it is a thing I have not breathed to a living soul as
+yet-i believe that if I don't give my word, he'll go out
+of his mind.'
+"Really, do ye?' said Gabriel, gravely.
+'I believe this,' she continued, with reckless frank+
+ness; "and Heaven knows I say it in a spirit the very
+reverse of vain, for I am grieved and troubled to my
+soul about it-i believe I hold that man's future in my
+hand. His career depends entirely upon my treatment
+of him. O Gabriel, I tremble at my responsibility, for
+it is terrible.!'
+"Well, I think this much, ma'am, as I told you years
+ago,' said Oak, 'that his life is a total blank whenever
+he isn't hoping for 'ee; but I can't suppose-i hope
+that nothing so dreadful hangs on to it as you fancy.
+His natural manner has always been dark and strange,
+you know. But since the case is so sad and oddiike,
+why don't ye give the conditional promise? I think I
+would.'
+"But is it right? Some rash acts of my past life
+have taught me that a watched woman must have very
+much circumspection to retain only a very little credit,
+and I do want and long to be discreet in this! And
+six years -- why we may all be in our graves by that
+BATHSHEBA TALKS WITH OAK
+time, even if Mr. Troy does not come back again, which
+he may not impossibly do.! Such thoughts give a sort
+of absurdity to the scheme. Now, isn't it preposterous,
+<P 416>
+Gabriel? However he came to dream of it, I cannot think.
+But is it wrong? You know -- you are older than I.'
+"Eight years older, ma'am.'
+"Yes, eight years -- and is it wrong?'
+"Perhaps it would be an uncommon agreement for a
+man and woman to make : I don't see anything really
+wrong about it,' said Oak, slowly. "In fact the very
+thing that makes it doubtful if you ought to marry en
+under any condition, that is, your not caring about him
+ -- for I may suppose --  -- '
+"Yes, you may suppose that love is wanting,' she
+said shortly. "Love is an utterly bygone, sorry, worn+
+out, miserable thing with me -- for him or any one else.'
+"Well, your want of love seems to me the one thing
+that takes away harm from such an agreement with him.
+If wild heat had to do wi' it, making ye long to over+
+come the awkwardness about your husband's vanishing,
+it mid be wrong ; but a cold-hearted agreement to oblige
+a man seems different, somehow. The real sin, ma'am
+in my mind, lies in thinking of ever wedding wi' a man
+you don't love honest and true.'
+"That I'm willing to pay the penalty of,' said Bath+
+sheba, firmly. " You know, Gabriel, this is what I can+
+not get off my conscience -- that I once seriously injured
+him in sheer idleness. If I had never played a trick
+upon him, he would never have wanted to marry me.
+O if I could only pay some heavy damages in money
+to him for the harm I did, and so get the sin off my
+soul that way!... Well, there's the debt, which can
+only be discharged in one way, and I believe I am
+bound to do it if it honestly lies in my power, without
+any consideration of my own future at all. When a
+rake gambles away his expectations, the fact that it is
+an inconvenient debt doesn't make him the less liable.
+I've been a rake, and the single point I ask you is, con+
+sidering that my own scruples, and the fact that in the
+eye of the law my husband is only missing, will keep
+any man from marrying me until seven years have
+passed -- am I free to entertain such an idea, even
+though 'tis a sort of penance -- for it will be that? I
+hate the act of marriage under such circumstances, and
+the class of women I should seem to belong to by doing
+it!'
+<P 417>
+"It seems to me that all depends upon whe'r you
+think, as everybody else do, that your husband is
+dead.'
+"I shall get to, I suppose, because I cannot help
+feeling what would have brought him back long before
+this time if he had lived.'
+"Well, then, in religious sense you will be as free
+to <1think>1 o' marrying again as any real widow of one
+year's standing. But why don't ye ask Mr. Thirdly's
+advice on how to treat Mr. Boldwood?'
+"No. When I want a broad-minded opinion for
+general enlightenment, distinct from special advice, I
+never go to a man who deals in the subject pro+
+fessionally. So I like the parson's opinion on law, the
+lawyer's on doctoring, the doctor's on business, and my
+business-man's -- that is, yours -- on morals.'
+'And on love --  -- '
+"My own.'
+"I'm afraid there's a hitch in that argument,' said
+Oak, with a grave smile.
+She did not reply at once, and then saying, 'Good
+evening Mr. Oak,' went away.
+She had spoken frankly, and neither asked nor ex+
+pected any reply from Gabriel more satisfactory than
+that she had obtained. Yet in the centremost parts of
+her complicated heart there existed at this minute a
+little pang of disappointment, for a reason she would
+not allow herself to recognize. Oak had not once
+wished her free that he might marry her himself -- had
+not once said, "I could wait for you as well as he.'
+That was the insect sting. Not that she would have
+listened to any such hypothesis. O no -- for wasn't
+she saying all the time that such thoughts of the future
+were improper, and wasn't Gabriel far too poor a man
+to speak sentiment to her? Yet he might have just
+hinted about that old love of his, and asked, in a playful
+off-hand way, if he might speak of it. It would have
+seemed pretty and sweet, if no more; and then she
+would have shown how kind and inoffensive a woman's
+"No' can sometimes be. But to give such cool advice
+ -- the very advice she had asked for -- it ruffled our
+heroine all the afternoon.
+<C lii>
+<P 418>
+CONVERGING COURSES
+        I
+CHRISTMAS-EVE came, and a party that Boldwood
+was to give in the evening was the great subject of talk
+in Weatherbury. It was not that the rarity of Christmas
+parties in the parish made this one a wonder, but that
+Boldwood should be the giver. The announcement
+had had an abnormal and incongruous sound, as if one
+should hear of croquet-playing in a cathedral aisle, or
+that some much-respected judge was going upon the
+stage. That the party was intended to be a truly jovial
+one there was no room for doubt. A large bough of
+mistletoe had been brought from the woods that day, and
+suspended in the hall of the bachelor's home. Holly
+and ivy had followed in armfuls. From six that morning
+till past noon the huge wood fire in the kitchen roared
+and sparkled at its highest, the kettle, the saucepan, and
+the threeiegged pot appearing in the midst of the flames
+like Shadrach, Meshach, and Abednego ; moreover,
+roasting and basting operations were continually
+carried on in front of the genial blaze.
+As it grew later the fire was made up in the large
+long hall into which the staircase descended, and all
+encumbrances were cleared out for dancing. The log
+which was to form the back-brand of the evening fire
+was the uncleft trunk of a tree, so unwieldy that it could
+be neither brought nor rolled to its place ; and accord+
+ingly two men were to be observed dragging and heaving
+it in by chains and levers as the hour of assembly drew
+near.
+In spite of all this, the spirit of revelry was wanting
+In the atmosphere of the house. Such a thing had
+never been attempted before by its owner, and it was
+now done as by a wrench. Intended gaieties would
+insist upon appearing like solemn grandeurs, the organ+
+ization of the whole effort was
+<P 419>
+carried out coldly,by
+hirelings, and a shadow seemed to move about the
+rooms, saying that the proceedings were unnatural to
+the place and the lone man who lived therein, and hence
+not good.
+Bathsheba was at this time in her room, dressing for
+the event. She had called for candles, and Liddy
+entered and placed one on each side of her mistress's
+glass.
+"Don't go away, Liddy,' said Bathsheba, almost
+timidly.' I am foolishly agitated-i cannot tell why.
+I wish I had not been obliged to go to this dance; but
+there's no escaping now. I have not spoken to Mr.
+Boldwood since the autumn, when I promised to see
+him at Christmas on business, but I had no idea there
+was to be anything of this kind.'
+"But I would go now,' said Liddy, who was going
+with her; for Boldwood had been indiscriminate in his
+invitations.
+"Yes, I shall make my appearance, of course,' said
+Bathsheba. ' But I am <1the cause>1 of the party, and that
+upsets me! -- Don't tell, Liddy.'
+"O no, ma'am, You the cause of it, ma'am ?'
+"Yes. I am the reason of the party-i. If it had
+not been for me, there would never have been one. I
+can't explain any more -- there's no more to be explained.
+I wish I had never seen Weatherbury.'
+"That's wicked of you -- to wish to be worse off than
+you are.'
+"No, Liddy. I have never been free from trouble
+since I have lived here, and this party is likely to bring
+me more. Now, fetch my black silk dress, and see how
+it sits upon me.'
+"But you will leave off that, surely, ma'am? You
+have been a widowiady fourteen months, and ought to
+brighten up a little on such a night as this.'
+"Is it necessary? No; I will appear as usual, for if
+I were to wear any light dress people would say things
+about me, and I should seem to he rejoicing when I am
+solemn all the time. The party doesn't suit me a bit;
+but never mind, stay and help to finish me off.'
+                     III
+<P 420>
+Boldwood was dressing also at this hour. A tailor
+from Casterbridge was with him, assisting him in the
+operation of trying on a new coat that had just beem
+brought home.
+Never had Boldwood been so fastidious, unreasonable
+about the fit, and generally difficult to please. The
+tailor walked round and round him, tugged at the waist,
+pulled the sleeve, pressed out the collar, and for the
+first time in his experience Boldwood was not bored+
+Times had been when the farmer had exclaimed against
+all such niceties as childish, but now no philosophic or
+hasty rebuke whatever was provoked by this man for
+attaching as much importance to a crease in the coat
+as to an earthquake in South America. Boldwood at
+last expressed himself nearly satisfied, and paid the bill,
+the tailor passing out of the door just as Oak came in
+to report progress for the day.
+"Oh, Oak,' said Boldwood. "I shall of course see
+you here to-night. Make yourself merry. I am deter+
+mined that neither expense nor trouble shall be spared.'
+"I'll try to be here, sir, though perhaps it may not
+be very early,' said Gabriel, quietly. "I am glad indeed
+to see such a change in 'ee from what it used to be.'
+" Yes-i must own it-i am bright to-night : cheerful
+and more than cheerfui-so much so that I am almost
+sad again with the sense that all of it is passing away.
+And sometimes, when I am excessively hopeful and
+blithe, a trouble is looming in the distance : so that I
+often get to look upon gloom in me with content, and
+to fear a happy mood. Still this may be absurd-i feel
+that it is absurd. Perhaps my day is dawning at last.'
+"I hope it 'ill be a long and a fair one.'
+"Thank you -- thank you. Yet perhaps my cheerfui
+mess rests on a slender hope. And yet I trust my hope.
+It is faith, not hope. I think this time I reckon with
+my host. -- Oak, my hands are a little shaky, or some+
+thing; I can't tie this neckerchief properly. Perhaps
+you will tie it for me. The fact is, I have not been well
+lately, you know.'
+"I am sorry to hear that, sir.'
+<P 421>
+"Oh, it's nothing. I want it done as well as you can,
+please. Is there any late knot in fashion, Oak?'
+"I don't know, sir,' said Oak. His tone had sunk to
+sadness.
+Boldwood approached Gabriel, and as Oak tied the
+neckerchief the farmer went on feverishly --
+"Does a woman keep her promise, Gabriel?'
+"If it is not inconvenient to her she may.'
+" -- Or rather an implied promise.'
+"I won't answer for her implying,' said Oak, with
+faint bitterness. "That's a word as full o' holes as a
+sieve with them.'
+"Oak, don't talk like that. You have got quite
+cynical lately -- how is it? We seem to have shifted our
+positions: I have become the young and hopeful man,
+and you the old and unbelieving one. However, does
+a woman keep a promise, not to marry, but to enter on
+an engagement to marry at some time? Now you
+know women better than i-tell me.'
+"I am afeard you honour my understanding too much.
+However, she may keep such a promise, if it is made
+with an honest meaning to repair a wrong.'
+"It has not gone far yet, but I think it will soon --
+yes, I know it will,' he said, in an impulsive whisper.
+"I have pressed her upon the subject, and she inclines
+to be kind to me, and to think of me as a husband at
+a long future time, and that's enough for me. How
+can I expect more? She has a notion that a woman
+should not marry within seven years of her husband's
+disappearance -- that her own self shouldn't, I mean --
+because his body was not found. It may be merely
+this legal reason which influences her, or it may be a
+religious one, but she is reluctant to talk on the point+
+Yet she has promised -- implied -- that she will ratify an
+engagement to-night.'
+"Seven years,' murmured Oak.
+"No, no -- it's no such thing!' he said, with im+
+patience. Five years, nine months, and a few days.
+Fifteen months nearly have passed since he vanished,
+and is there anything so wonderful in an engagement of
+little more than five years?'
+"It seems long in a forward view. Don't build too
+much upon such promises, sir. Remember, you have
+once be'n deceived. Her meaning may be good; but
+there -- she's young yet.'
+<P 422>
+"Deceived? Never! ' said Boldwood, vehemently.
+"She never promised me at that first time, and hence
+she did not break her promise! If she promises me,
+she'll marry me, Bathsheba is a woman to her word.'
+                     IV
+Troy was sitting in a corner of The White Hart
+tavern at Casterbridge, smoking and drinking a steaming
+mixture from a glass. A knock was given at the door,
+and Pennyways entered.
+"Well, have you seen him?' Troy inquired, pointing
+to a chair.
+"Boldwood?'
+"No -- Lawyer Long.'
+"He wadn' at home. I went there first, too.'
+"That's a nuisance.'
+"'Tis rather, I suppose.'
+"Yet I don't see that, because a man appears to be
+drowned and was not, he should be liable for anything.
+I shan't ask any lawyer -- not I.'
+"But that's not it, exactly. If a man changes his
+name and so forth, and takes steps to deceive the world
+and his own wife, he's a cheat, and that in the eye of
+the law is ayless a rogue, and that is ayless a lammocken
+vagabond; and that's a punishable situation.'
+"Ha-ha! Well done, Pennyways.' Troy had laughed,
+but it was with some anxiety that he said, "Now, what
+I want to know is this, do you think there's really
+anything going on between her and Boldwood? Upon
+my soul, I should never have believed it! How she.
+must detest me! Have you found out whether she
+has encouraged him?'
+"I haen't been able to learn. There's a deal of
+feeling on his side seemingly, but I don't answer for
+her. I didn't know a word about any such thing till
+yesterday, and all I heard then was that she was gwine
+to the party at his house to-night. This is the first
+time she has ever gone there, they say. And they say
+that she've not so much as spoke to him since they were
+at Greenhill Fair: but what can folk believe o't ? How+
+ever, she's not fond of him -- quite offish and quite care
+less, I know.'
+<P 423>
+"I'm not so sure of that.... She's a handsome
+woman, Pennyways, is she not? Own that you never
+saw a finer or more splendid creature in your life.
+Upon my honour, when I set eyes upon her that day
+I wondered what I could have been made of to be able
+to leave her by herself so long. And then I was
+hampered with that bothering show, which I'm free of
+at last, thank the stars.' He smoked on awhile, and
+then added, "How did she look when you passed by
+yesterday?'
+"Oh, she took no great heed of me, ye may well
+fancy; but she looked well enough, far's I know. Just
+flashed her haughty eyes upon my poor scram body, and
+then let them go past me to what was yond, much as if
+I'd been no more than a leafless tree. She had just got
+off her mare to look at the last wring-down of cider for
+the year; she had been riding, and so her colours were
+up and her breath rather quick, so that her bosom
+plimmed and feli-plimmed and feli-every time plain
+to my eye. Ay, and there were the fellers round her
+wringing down the cheese and bustling about and
+saying, Ware o' the pommy, ma'am : 'twill spoil yer
+gown. "Never mind me," says she. Then Gabe
+brought her some of the new cider, and she must
+needs go drinking it through a strawmote, and not in
+a nateral way at all. "Liddy," says she, "bring indoors
+a few gallons, and I'll make some cider-wine." Sergeant,
+I was no more to her than a morsel of scroffin the fuei
+house!'
+"I must go and find her out at once -- O yes, I see
+that-i must go. Oak is head man still, isn't he?'
+"Yes, 'a b'lieve. And at Little Weatherbury Farm
+too. He manages everything.'
+"Twill puzzle him to manage her, or any other man
+of his compass!'
+"I don't know about that. She can't do without
+him, and knowing it well he's pretty independent.
+And she've a few soft corners to her mind, though
+I've never been able to get into one, the devil's in't!'
+"Ah baily she's a notch above you, and you must
+own it: a higher class of animai-a finer tissue. How+
+ever, stick to me, and neither this haughty goddess,
+dashing piece of womanhood, Juno-wife of mine (Juno
+was a goddess, you know), nor
+<P 424>
+anybody else shall hurt
+you. But all this wants looking into, I perceive.
+What with one thing and another, I see that my work
+is well cut out for me.'
+                    v
+"How do I look to-night, Liddy?' said Bathsheba,
+giving a final adjustment to her dress before leaving the
+glass.
+"I never saw you look so well before. Yes-i'll tell
+you when you looked like it -- that night, a year and a
+half ago, when you came in so wildiike, and scolded us
+for making remarks about you and Mr. Troy.'
+"Everybody will think that I am setting myself to
+captivate Mr. Boldwood, I suppose,' she murmured.
+"At least they'll say so. Can't my hair be brushed
+down a little flatter? I dread going -- yet I dread the
+risk of wounding him by staying away.'
+"Anyhow, ma'am, you can't well be dressed plainer
+than you are, unless you go in sackcloth at once. 'Tis
+your excitement is what makes you look so noticeable
+to-night.'
+"I don't know what's the matter, I feel wretched at
+one time, and buoyant at another. I wish I could have
+continued quite alone as I have been for the last year
+or so, with no hopes and no fears, and no pleasure and
+no grief.
+"Now just suppose Mr. Boldwood should ask you
+ -- only just suppose it -- to run away with him, what
+would you do, ma'am?'
+"Liddy -- none of that,' said Bathsheba, gravely.
+"Mind, I won't hear joking on any such matter. Do
+you hear?'
+"I beg pardon, ma'am. But knowing what rum
+things we women be, I just said -- however, I won't
+speak of it again.'
+"No marrying for me yet for many a year; if ever,
+'twill be for reasons very, very different from those you
+think, or others will believe! Now get my cloak, for it
+is time to go.'
+                        VI
+"Oak, said Boldwood, "before you go I want to
+mention what has been passing in my mind lately --
+that little arrangement we made about your share in the
+farm I mean. That share is small, too small, consider+
+ing how little I attend to business now, and how much
+time and thought you give to it. Well,
+<P 425>
+since the world
+is brightening for me, I want to show my sense of it
+by increasing yopur proportion in the partnership. I'll
+make a memorandum of the arrangement which struck
+me as likely to be convenient, for I haven't time to talk
+about it now; and then we'll discuss it at our leisure.
+My intention is ultimately to retire from the manage+
+ment altogether, and until you can take all the expendi+
+ture upon your shoulders, I'll be a sleeping partner in
+the stock. Then, if I marry her -- and I hope-i feel I
+shall, why --  -- '
+"Pray don't speak of it, sir,' said Oak, hastily. "We
+don't know what may happen. So many upsets may
+befall 'ee. There's many a slip, as they say -- and I
+would advise you-i know you'll pardon me this once --
+not to be <1too sure>1.'
+"I know, I know. But the feeling I have about in+
+creasing your share is on account of what I know of you
+Oak, I have learnt a little about your secret: your
+interest in her is more than that of bailiff for an em+
+ployer. But you have behaved like a man, and I, as a
+sort of successful rivai-successful partly through your
+goodness of heart -- should like definitely to show my
+sense of your friendship under what must have been a
+great pain to you.'
+"O that's not necessary, thank 'ee,' said Oak,
+hurriedly. "I must get used to such as that; other
+men have, and so shall I.'
+Oak then left him. He was uneasy on Boldwood's
+account, for he saw anew that this constant passion
+of the farmer made him not the man he once had
+been.
+As Boldwood continued awhile in his room alone --
+ready and dressed to receive his company -- the mood of
+anxiety about his appearance seemed to pass away, and
+to be succeeded by a deep solemnity. He looked out
+of the window, and regarded the dim outline of the trees
+upon the sky, and the twilight deepening to darkness.
+Then he went to a locked closet, and took from
+a locked drawer therein a small circular case the size of
+a pilibox, and was about to put it into his pocket. But
+he lingered to open the cover and take a momentary
+glance inside. It contained a woman's finger-ring, set
+all the way round with small
+<P 426>
+diamonds, and from its
+appearance had evidently been recently purchased.
+Boldwood's eyes dwelt upon its many sparkles a long
+time, though that its material aspect concerned him
+little was plain from his manner and mien, which were
+those of a mind following out the presumed thread of
+that jewel's future history.
+The noise of wheels at the front of the house became
+audible. Boldwood closed the box, stowed it away
+carefully in his pocket, and went out upon the landing.
+The old man who was his indoor factotum came at the
+same moment to the foot of the stairs.
+"They be coming, sir-iots of 'em -- a-foot and a+
+driving!'
+"I was coming down this moment. Those wheels I
+heard -- is it Mrs. Troy?'
+"No, sir -- 'tis not she yet.'
+A reserved and sombre expression had returned to
+Boldwood's face again, but it poorly cloaked his feei
+ings when he pronounced Bathsheba's name; and his
+feverish anxiety continued to show its existence by a
+galloping motion of his fingers upon the side of his thigh
+as he went down the stairs.
+                   VII
+"How does this cover me?' said Troy to Pennyways,
+"Nobody would recognize me now, I'm sure.'
+He was buttoning on a heavy grey overcoat of
+Noachian cut, with cape and high collar, the latter being
+erect and rigid, like a girdling wall, and nearly reaching
+to the verge of travelling cap which was pulled down
+over his ears.
+Pennyways snuffed the candle, and then looked up
+and deliberately inspected Troy
+"You've made up your mind to go then?' he
+said.
+"Made up my mind? Yes; of course I have.'
+"Why not write to her? 'Tis a very queer corner
+that you have got into, sergeant. You see all these things
+will come to light if you go back, and they won't sound
+well at all. Faith, if I was you I'd even bide as you be
+ -- a single man of the name of Francis. A good wife is
+good, but the best wife is not so good
+<P 427>
+as no wife at all.
+Now that's my outspoke mind, and I've been called a
+long-headed feller here and there.'
+"All nonsense!' said Troy, angrily. "There she is
+with plenty of money, and a house and farm, and
+horses, and comfort, and here am I living from hand to
+mouth -- a needy adventurer. Besides, it is no use
+talking now; it is too late, and I am glad of it ; I've been
+seen and recognized here this very afternoon. I should
+have gone back to her the day after the fair, if it hadn't
+been for you talking about the law, and rubbish about
+getting a separation; and I don't put it off any longer.
+What the deuce put it into my head to run away at all,
+I can't think! Humbugging sentiment -- that's what it
+was. But what man on earth was to know that his wife
+would be in such a hurry to get rid of his name!'
+"I should have known it. She's bad enough for
+anything.'
+"Pennyways, mind who you are talking to.'
+"Well, sergeant, all I say is this, that if I were you I'd
+go abroad again where I came from -- 'tisn't too late to do
+it now. I wouldn't stir up the business and get a bad
+name for the sake of living with her -- for all that about
+your play-acting is sure to come out, you know, although
+you think otherwise. My eyes and limbs, there'll be a
+racket if you go back just now -- in the middle of Bold+
+wood's Christmasing!'
+"H'm, yes. I expect I shall not be a very welcome
+guest if he has her there,' said the sergeant, with a slight
+laugh. "A sort of Alonzo the Brave; and when I go in
+the guests will sit in silence and fear, and all laughter
+and pleasure will be hushed, and the lights in the
+chamber burn blue, and the worms -- Ugh, horrible! --
+Ring for some more brandy, Pennyways, I felt an
+awful shudder just then! Well, what is there besides?
+A stick-i must have a walking-stick.'
+Pennyways now felt himself to be in something of a
+difficulty, for should Bathsheba and Troy become recon+
+ciled it would be necessary to regain her good opinion
+if he would secure the patronage of her husband. I
+sometimes think she likes you yet, and is a good woman
+at bottom,' he said, as a saving sentence. "But there's
+no telling to a certainty from a body's outside. Well,
+<P 428>
+you'll do as you like about going, of course, sergeant,
+and as for me, I'll do as you tell me.'
+"Now, let me see what the time is,' said Troy, after
+emptying his glass in one draught as he stood. 'Half+
+past six o'clock. I shall not hurry along the road, and
+shall be there then before nine.'
+CONCURRITUR
+<C liii>
+<P 429>
+CONCURRITUR -- HORAE MOMENTO
+OUTSIDE the front of Boldwood's house a group of
+men stood in the dark, with their faces towards the door,
+which occasionally opened and closed for the passage of
+some guest or servant, when a golden rod of light would
+stripe the ground for the moment and vanish again,
+leaving nothing outside but the glowworm shine of the
+pale lamp amid the evergreens over the door.
+"He was seen in Casterbridge this afternoon -- so the
+boy said,' one of them remarked in a whisper. "And l
+for one believe it. His body was never found, you know.'
+"'Tis a strange story,' said the next. "You may
+depend upon't that she knows nothing about it.'
+"Not a word.'
+"Perhaps he don't mean that she shall,' said another
+man.
+"If he's alive and here in the neighbourhood, he
+means mischief,' said the first. "Poor young thing:
+I do pity her, if 'tis true. He'll drag her to the dogs.'
+"O no; he'll settle down quiet enough,' said one
+disposed to take a more hopeful view of the case.
+"What a fool she must have been ever to have had
+anything to do with the man! She is so self-willed and
+independent too, that one is more minded to say it
+serves her right than pity her.'
+"No, no. I don't hold with 'ee there. She was no
+otherwise than a girl mind, and how couid she tell what
+the man was made of? If 'tis really true, 'tis too hard
+a punishment, and more than she ought to hae. -- Hullo,
+who's that?' This was to some footsteps that were
+heard approaching.
+"William Smallbury,' said a dim figure in the shades,
+coming up and joining them. 'Dark as a hedge, to+
+night, isn't it? I all but missed the plank over the river
+ath'art there in the bottom --
+<P 430>
+never did such a thing
+before in my life. Be ye any of Boldwood's workfolk?'
+He peered into their faces.
+"Yes -- all o' us. We met here a few minutes ago.'
+"Oh, I hear now -- that's Sam Samway : thought I
+knowed the voice, too. Going in?'
+"Presently. But I say, William,' Samway whispered,
+"have ye heard this strange tale?'
+"What -- that about Sergeant Troy being seen, d'ye
+mean, souls?' said Smallbury, also lowering his voice.
+"Ay: in Casterbridge.'
+"Yes, I have. Laban Tall named a hint of it to me
+but now -- but I don't think it. Hark, here Laban
+comes himself, 'a b'lieve.' A footstep drew near.
+"Laban?'
+"Yes, 'tis I,' said Tall.
+"Have ye heard any more about that?'
+"No,' said Tall, joining the group. "And I'm in+
+clined to think we'd better keep quiet. If so be 'tis not
+true, 'twill flurry her, and do her much harm to repeat
+it; and if so be 'tis true, 'twill do no good to forestall
+her time o' trouble. God send that it mid be a lie, for
+though Henery Fray and some of 'em do speak against
+her, she's never been anything but fair to me. She's
+hot and hasty, but she's a brave girl who'll never tell a
+lie however much the truth may harm her, and I've no
+cause to wish her evil.'
+"She never do tell women's little lies, that's true ; and
+'tis a thing that can be said of very few. Ay, all the
+harm she thinks she says to yer face: there's nothing
+underhand wi' her.'
+They stood silent then, every man busied with his
+own thoughts, during which interval sounds of merri+
+ment could be heard within. Then the front door again
+opened, the rays streamed out, the weliknown form of
+Boldwood was seen in the rectangular area of light, the
+door closed, and Boldwood walked slowly down the path.
+"'Tis master,' one of the men whispered, as he neared
+them. "We'd better stand quiet -- he'll go in again
+directly. He would think it unseemly o' us to be
+loitering here.
+Boldwood came on, and passed by the men without
+<P 431>
+seeing them, they being under the bushes on the grass.
+He paused, leant over the gate, and breathed a long
+breath. They heard low words come from him.
+"I hope to God she'll come, or this night will be
+nothing but misery to me! O my darling, my darling,
+why do you keep me in suspense like this?'
+He said this to himself, and they all distinctly heard
+it. Boldwood remained silent after that, and the noise
+from indoors was again just audible, until, a few minutes
+later, light wheels could be distinguished coming down
+the hill. They drew nearer, and ceased at the gate.
+Boldwood hastened back to the door, and opened it;
+and the light shone upon Bathsheba coming up the
+path.
+Boldwood compressed his emotion to mere welcome:
+the men marked her light laugh and apology as she met
+him: he took her into the house; and the door closed
+again.
+"Gracious heaven, I didn't know it was like that with
+him!' said one of the men. "I thought that fancy of
+his was over long ago.
+"You don't know much of master, if you thought
+that,' said Samway.
+"I wouldn't he should know we heard what 'a said
+for the world,' remarked a third.
+"I wish we had told of the report at once,' the first
+uneasily continued. "More harm may come of this than
+we know of. Poor Mr. Boldwood, it will, be hard upon
+en. I wish Troy was in  --  --  Well, God forgive me
+for such a wish! A scoundrel to play a poor wife such
+tricks. Nothing has prospered in Weatherbury since he
+came here. And now I've no heart to go in. Let's
+look into Warren's for a few minutes first, shall us,
+neighbours?'
+Samway, Tall, and Smallbury agreed to go to Warren's,
+and went out at the gate, the remaining ones entering
+the house. The three soon drew near the malt-house,
+approaching it from the adjoining orchard, and not by
+way of the street. The pane of glass was illuminated
+as usual. Smallbury was a little in advance of the rest
+when, pausing, he turned suddenly to his companions
+and said, "Hist! See there.'
+<P 432>
+The light from the pane was now perceived to be
+shining not upon the ivied wall as usual, but upon some
+object close to the glass. It was a human face.
+"Let's come closer,' whispered Samway; and they
+approached on tiptoe. There was no disbelieving the
+report any longer. Troy's face was almost close to the
+pane, and he was looking in. Not only was he looking in,
+but he appeared to have been arrested by a conversation
+which was in progress in the malt-house, the voices of
+the interlocutors being those of Oak and the maltster.
+"The spree is all in her honour, isn't it -- hey?' said
+the old man. "Although he made believe 'tis only
+keeping up o' Christmas?'
+"I cannot say,' replied Oak.
+"O 'tis true enough, faith. I cannot understand
+Farmer Boldwood being such a fool at his time of life
+as to ho and hanker after thik woman in the way 'a do,
+and she not care a bit about en.'
+The men, after recognizing Troy's features, withdrew
+across the orchard as quietly as they had come. The
+air was big with Bathsheba's fortunes to-night : every
+word everywhere concerned her. When they were quite
+out of earshot all by one instinct paused.
+"It gave me quite a turn -- his face,' said Tall,
+breathing.
+"And so it did me,' said Samway. "What's to be
+done?'
+"I don't see that 'tis any busincss of ours,' Smallbury
+murmured dubiously.
+"But it is! 'Tis a thing which is everybody's business,
+said Samway. "We know very well that master's on a
+wrong tack, and that she's quite in the dark, and we
+should let 'em know at once. Laban, you know her
+best -- you'd better go and ask to speak to her.'
+"I bain't fit for any such thing,' said Laban, nervously.
+"I should think William ought to do it if anybody. He's
+oldest.'
+"I shall have nothing to do with it,' said Smallbury.
+"'Tis a ticklish business altogether. Why, he'll go on
+to her himself in a few minutes, ye'll see.'
+"We don't know that he will. Come, Laban.'
+<P 433>
+"Very well, if I must I must, I suppose,' Tall reluct+
+antly answered. "What must I say?'
+"Just ask to see master.'
+"O no; I shan't speak to Mr. Boldwood. If I tell
+anybody, 'twill be mistress.'
+"Very well,' said Samway.
+Laban then went to the door. When he opened it
+the hum of bustle rolled out as a wave upon a still
+strand -- the assemblage being immediately inside the
+hali-and was deadened to a murmur as he closed it
+again. Each man waited intently, and looked around at
+the dark tree tops gently rocking against the sky and
+occasionally shivering in a slight wind, as if he took
+interest in the scene, which neither did. One of them
+began walking up and down, and then came to where
+he started from and stopped again, with a sense that
+walking was thing not worth doing now.
+"I should think Laban must have seen mistress by
+this time,' said Smallbury, breaking the silence. "Per+
+haps she won't come and speak to him.'
+The door opened. Tall appeared, and joined them
+"Well?' said both.
+"I didn't like to ask for her after all,' Laban faltered
+out. "They were all in such a stir, trying to put a little
+spirit into the party. Somehow the fun seems to hang
+fire, though everything's there that a heart can desire,
+and I couldn't for my soul interfere and throw damp
+upon it -- if 'twas to save my life, I couldn't!'
+"I suppose we had better all go in together,' said
+Samway, gloomily. "Perhaps I may have a chance of
+saying a word to master.'
+So the men entered the hall, which was the room
+sellected and arranged for the gathering because of its
+size. The younger men and maids were at last just
+beginning to dance. Bathshesba had been perplexed
+how to act, for she was not much more than a slim
+young maid herself, and the weight of stateliness sat
+heavy upon her. Sometimes she thought she ought
+not to have come under any circumstances; then she
+considered what cold unkindness that would have been,
+and finally resolved
+<P 434>
+upon the middle course of staying
+for about an hour only, and gliding off unobserved,
+having from the first made up her mind that she could
+on no account dance, sing, or take any active part in
+the proceedings.
+Her allotted hour having been passed in chatting
+and looking on, Bathsheba told Liddy not to hurry her+
+self, and went to the small parlour to prepare for
+departure, which, like the hall, was decorated with holly
+and ivy, and well lighted up.
+Nobody was in the room, but she had hardly
+HORAE MOMENTO
+been there a moment when the master of the house
+entered.
+"Mrs. Troy -- you are not going?' he said. "We've
+hardly begun!'
+"If you'll excuse me, I should like to go now.' Her
+manner was restive, for she remembered her promise,
+and imagined what he was about to say. "But as it is
+not late,' she added, "I can walk home, and leave my
+man and Liddy to come when they choose.'
+"I've been trying to get an opportunity of speaking
+to you,' said Boldwood. "You know perhaps what I
+long to say?'
+Bathsheba silently looked on the floor.
+"You do give it?' he said, eagerly.
+"What?' she whispered.
+"Now, that's evasion! Why, the promise. I don't
+want to intrude upon you at all, or to let it become
+known to anybody. But do give your word! A
+mere business compact, you know, between two people
+who are beyond the influence of passicn.' Boldwood
+knew how false this picture was as regarded himself;
+but he had proved that it was the only tone in which
+she would allow him to approach her. "A promise to
+marry me at the end of five years and three-quarters.
+You owe it to me!'
+"I feel that I do,' said Bathsheba ; "that is, if you
+demand it. But I am a changed woman -- an unhappy
+woman -- and not -- not --  -- "
+" You are still a very beautiful woman, said Boldwood.
+Honesty and pure conviction suggested the remark,
+unaccompanied by any perception that it might have
+been adopted by blunt flattery to soothe and win her.
+However, it had not much effect now, for for she said,
+in a
+<P 435>
+passionless murmur which was in itself a proof of
+her words: "I have no feeling in the matter at all.
+And I don't at all know what is right to do in my
+diddicult Position, and I have nobody to advise me. But
+I give my promise, if I must. I give it as the rendering of
+a debt, conditionally, of course, on my being a widow.'
+"You'll marry me between five and six years hence ? '
+"Don't press me too hard. I'll marry nobody
+else.'
+" But surely you will name the time, or there's nothing
+in the promise at all?'
+"O, I don't know, pray let me go!' she said, her
+bosom beginning to rise. "I am afraid what to do.!
+want to be just to you, and to be that seems to be wrong+
+ing myself, and perhaps it is breaking the commandments.
+There is considerable doubt of his death, and then it
+is dreadful; let me ask a solicitor, Mr. Boldwood, if I
+ought or no!'
+"Say the words, dear one, and the subject shall be
+dismissed ; a blissrul loving intimacy of six years, and
+then marriage -- O Bathsheba, say them!' he begged in
+a husky voice, unable to sustain the forms of mere
+friendship any longer. "Promise yourself to me; I
+deserve it, indeed I do, for I have loved you more than
+anybody in the world! And if I said hasty words and
+showed uncalled-for heat of manner towards you, believe
+me, dear, I did not mean to distress you ; I was in
+agony, Bathsheba, and I did not know what I said.
+You wouldn't let a dog suffer what I have suffered,
+could you but know it! Sometimes I shrink from your
+knowing what I have felt for you, and sometimes I am
+distressed that all of it you never will know. Be
+gracious, and give up a little to me, when I would give
+up mylife for you!'
+The trimmings of her dress, as they quivered against
+the light, showed how agitated she was, and at last she
+burst out crying. 'And you'll not -- press me -- about
+anything more -- if I say in five or six years?' she
+sobbed, when she had power to frame the words.
+"Yes, then I'll leave it to time.'
+"Very well. If he does not return, I'll marry you
+in six years from this day, if we both live,' she said
+solemnly.
+<P 436>
+"And you'll take this as a token from me.'
+Boldwood had come close to her side, and now he
+clasped one of her hands in both his own, and lifted it
+to his breast.
+"What is it? Oh I cannot wear a ring!' she ex+
+claimed, on seeing what he held; "besides, I wouldn't
+have a soul know that it's an engagement! Perhaps it
+is improper? Besides, we are not engaged in the usual
+sense, are we ? Don't insist, Mr. Boldwood -- don't!'
+In her trouble at not being able to get her hand away
+from him at once, she stamped passionately on the floor
+with one foot, and tears crowded to her eyes again.
+"It means simply a pledge -- no sentiment -- the seal
+of a practical compact,' he said more quictly, but still
+retaining her hand in his firm grasp. "Come, now!'
+And Boldwood slipped the ring on her finger.
+"I cannot wear it,' she said, weeping as if her heart
+would break. " You frighten me, almost. So wild a
+scheme! Please let me go home!'
+" Only to-night : wear it just to-night, to please me!.'
+Bathsheba sat down in a chair, and buried her face
+in her handkerchief, though Boldwood kept her hand
+yet. At length she said, in a sort of hopeless whisper --
+"Very well, then, I will to-night, if you wish it so
+earnestly. Now loosen my hand; I will, indeed I will
+wear it to-night.'
+"And it shall be the beginning of a pleasant secret
+courtship of six years, with a wedding at the end?'
+"It must be, I suppose, since you will have it so!'
+she said, fairly beaten into non-resistance.
+Boldwood pressed her hand, and allowed it to drop
+in her lap. "I am happy now,' he said. "God bless
+you!'
+He left the room, and when he thought she might
+be sufficiently composed sent one of the maids to her
+Bathsheba cloaked the effects of the late scene as she
+best could, followed the girl, and in a few moments
+came downstairs with her hat and cloak on, ready to go.
+To get to the door it was necessary to pass through the
+hall, and before doing so she paused on the bottom of
+the staircase which descended into one corner, to take
+a last look at the gathering.
+There was no music or dancing in progress just now.
+At the
+<P 437>
+lower end, which had been arranged for the work+
+folk specially, a group conversed in whispers, and with
+clouded looks. Boldwood was standing by the fireplace,
+and he, too, though so absorbed in visions arising from
+her promise that he scarcely saw anything, seemed at
+that moment to have observed their peculiar manner,
+and their looks askance.
+"What is it you are in doubt about, men?' he said.
+One of them turned and replied uneasily: 'It was
+something Laban heard of, that's all, sir.'
+"News? Anybody married or engaged, born or
+dead?' inquired the farmer, gaily. "Tell it to us, Tall.
+One would think from your looks and mysterious ways
+that it was something very dreadful indeed.'
+"O no, sir, nobody is dead,' said Tall.
+"I wish somebody was,' said Samway, in a whisper.
+"What do you say, Samway?' asked Boldwood, some+
+what sharply. "If you have anything to say, speak out;
+if not, get up another dance.'
+"Mrs. Troy has come downstairs,' said Samway to
+Tall. "If you want to tell her, you had better do it now.'
+"Do you know what they mean?' the farmer asked
+Bathsheba, across the room.
+"I don't in the least," said Bathsheba.
+There was a smart rapping at the door. One of
+the men opened it instantly, and went outside.
+"Mrs. Troy is wanted,' he said, on returning.
+"Quite ready,' said Bathsheba. "Though I didn't
+tell them to send.'
+"It is a stranger, ma'am,' said the man by the door.
+"A stranger?' she said.
+"Ask him to come in,' said Boldwood.
+The message was given, and Troy, wrapped up to
+his eyes as we have seen him, stood in the doorway.
+There was an unearthly silence, all looking towards
+the newcomer. Those who had just learnt that he
+was in the neighbourhood recognized him instantly;
+those who did not were perplexed. Nobody noted
+Bathsheba. She was leaning on the stairs. Her brow
+had heavily contracted; her whole face was
+<P 438>
+pallid, her
+lips apart, her eyes rigidly staring at their visitor.
+Boldwood was among those who did not notice that
+he was Troy. "Come in, come in!' he repeated,
+cheerfully, "and drain a Christmas beaker with us,
+stranger!'
+Troy next advanced into the middle of the room,
+took off his cap, turned down his coat-collar, and looked
+Boldwood in the face. Even then Boldwood did not
+recognize that the impersonator of Heaven's persistent
+irony towards him, who had once before broken in
+upon his bliss, scourged him, and snatched his delight
+away, had come to do these things a second time.
+Troy began to laugh a mechanical laugh: Boldwood
+recognized him now.
+Troy turned to Bathsheba. The poor girl's wretched+
+ness at this time was beyond all fancy or narration.
+She had sunk down on the lowest stair; and there
+she sat, her mouth blue and dry, and her dark eyes
+fixed vacantly upon him, as if she wondered whether it
+were not all a terrible illusion.
+Then Troy spoke. "Bathsheba, I come here for
+you!'
+She made no reply.
+" Come home with me: come!
+Bathsheba moved her feet a little, but did not rise.
+Troy went across to her.
+"come, madam, do you hear what I say?' he said,
+peremptorily.
+A strange voice came from the fireplace -- a voice
+sounding far off and confined, as if from a dungeon.
+Hardly a soul in the assembly recognized the thin tones
+to be those of Boldwood. Sudden dispaire had trans+
+formed him.
+"Bathsheba, go with your husband!'
+Nevertheless, she did not move. The truth was
+that Bathsheba was beyond the pale of activity -- and
+yet not in a swoon. She was in a state of mental <1gutta>1
+<1serena>1; her mind was for the minute totally deprived of
+light at the same time no obscuration was apparent
+from without.
+Troy stretched out his hand to pull her her towards him,
+when she quickly shrank back. This visible dread of
+him seemed to irritate Troy, and he seized her arm and
+pulled it sharply.
+<P 439>
+Whether his grasp pinched her, or
+whether his mere touch was the ccause, was never known,
+but at the moment of his seizure she writhed, and gave
+a quick, low scream.
+The scream had been heard but a few seconds When
+it was followed by sudden deafening report that
+echoed through the room and stupefied them all. The
+oak partition shook with the concussion, and the place
+was filled with grey smoke.
+In bewilderment they turned their eyes to Boldwood.
+at his back, as stood before the fireplace, was a gun+
+rack, as is usual in farmhouses, constructed to hold two
+guns. When Bathsheba had cried out in her husband's
+grasp, Boldwood's face of gnashing despair had changed.
+The veins had swollen, and a frenzied look had gleamed
+in his eye. He had turned quickly, taken one of the
+guns, cocked it, and at once discharged it at Troy.
+Troy fell. The distance apart of the two men was
+so small that the charge of shot did not spread in the
+least, but passed like a bullet into his body. He uttered
+a long guttural sigh -- there was a contraction -- an exten+
+sion -- then his muscles relaxed, and he lay still.
+Boldwood was seen through the smoke to be now
+again engaged with the gun. It was double-barrelled,
+and he had, meanwhile, in some way fastened his hand+
+kerchief to the trigger, and with his foot on the other
+end was in the act of turning the second barrel upon
+himself. Samway his man was the first to see this, and
+in the midst of the general horror darted up to him.
+Boldwood had already twitched the handkerchief, and
+the gun exploded a second time, sending its contents,
+by a timely blow from Samway, into the beam which
+crossed the ceiling.
+"Well, it makes no difference!' Boldwood gasped.
+"There is another way for me to die.'
+Then he broke from Samway, crossed the room to
+Bathsheba, and kissed her hand. He put on his hat,
+opened the door, and went into the darkness, nobody
+thinking of preventing him.
+<C liv>
+<P 440>
+AFTER THE SHOCK
+BOLDWOOD passed into the high road and turned
+in the direction of Casterbridge. Here he walked at
+an even, steady pace over Yalbury Hill, along the dead
+level beyond, mounted Mellstock Hill, and between
+eleven and twelve o'clock crossed the Moor into the town.
+The streets were nearly deserted now, and the waving
+lamp-flames only lighted up rows of grey shop-shutters,
+and strips of white paving upon which his step echoed
+as his passed along. He turned to the right, and halted
+before an archway of heavy stonework, which was closed
+by an iron studded pair of doors. This was the entrance
+to the gaol, and over it a lamp was fixed, the light en+
+abling the wretched traveller to find a belipull.
+The small wicket at last opened, and a porter
+appeared. Boldwood stepped forward, and said some+
+thing in a low tone, when, after a delay, another man
+came. Boldwood entered, and the door was closed
+behind him, and he walked the world no more.
+Long before this time Weatherbury had been
+thoroughly aroused, and the wild deed which had ter+
+minated Boldwood's merrymaking became known to
+all. Of those out of the house Oak was one of the
+first to hear of the catastophe, and when he entered
+the room, which was about five minutes after Boldwood's
+exit, the scene was terrible. All the female guests were
+huddled aghast against the walls like sheep in a storm,
+and the men were bewildered as to what to do. As for
+Bathsheba, she had changed. She was sitting on the
+floor beside the body of Troy, his head pillowed in her
+lap, where she had herself lifted it. With one hand she
+held her handkerchief to his breast and covered the
+wound, though scarcely a single drop of blood had
+flowed, and with the other she tightly clasped one of
+his. The household convulsion had made her herself
+again. The
+<P 441>
+temporary coma had ceased, and activity
+had come with the necessity for it. Deeds of endur+
+ance, which seem ordinary in philosophy, are rare in
+conduct, and Bathsheba was astonishing all around her
+now, for her philosophy was her conduct, and she
+seldom thought practicable what she did not practise.
+She was of the stuff of which great men's mothers
+are made. She was indispensable to high generation,
+hated at tea parties, feared in shops, and loved at crises.
+Troy recumbent in his wife's lap formed now the sole
+spectacle in the middle of the spacious room.
+"Gabriel,' she said, automatically, when he entered,
+turning up a face of which only the weliknown lines
+remained to tell him it was hers, all else in the picture
+having faded quite. "Ride to Casterbridge instantly
+for a surgeon. It is, I believe, useless, but go. Mr.
+Boldwood has shot my husband.'
+Her statement of the fact in such quiet and simple
+words came with more force than a tragic declamation,
+and had somewhat the effect of setting the distorted
+images in each mind present into proper focus. Oak,
+almost before he had comprehended anything beyond
+the briefest abstract of the event, hurried out of the
+room, saddled a horse and rode away. Not till he had
+ridden more than a mile did it occur to him that he
+would have done better by sending some other man
+on this errand, remaining himself in the house. What
+had become of Boldwood? He should have been
+looked after. Was he mad -- had there been a quarrel?
+Then how had Troy got there? Where had he come
+from? How did this remarkable reappearance effect
+itself when he was supposed by many to be at the
+bottom of the sea? Oak had in some slight measure
+been prepared for the presence of Troy by hearing a
+rumour of his return just before entering Boldwood's
+house ; but before he had weighed that information, this
+fatal event had been superimposed. However, it was too
+late now to think of sending another messenger, and
+he rode on, in the excitement of these self-inquiries
+not discerning, when about three miles from Caster+
+bridge, a square-figured pedestrian passing along
+under the dark hedge in the same direction as his
+own.
+The miles necessary to be traversed, and other
+hindrances
+<P 442>
+incidental to the lateness of the hour and
+the darkness of the night, delayed the arrival of Mr,
+Aldritch, the surgeon ; and more than three hours
+passed between the time at which the shot was fired
+and that of his entering the house. Oak was addition+
+ally detained in Casterbridge through having to give
+notice to the authorities of what had happened; and
+he then found that Boldwood had also entered the
+town, and delivercd himself up.
+In the meantime the surgeon, having hastened into
+the hall at Boldwood's, found it in darkness and quite
+deserted. He went on to the back of the house,
+where he discovered in the kitchen an old man, of
+whom he made inquiries.
+"She's had him took away to her own house, sir,'
+said his informant.
+"Who has?' said the doctor.
+"Mrs. Troy. 'A was quite dead, sir.'
+This was astonishing information. "She had no
+right to do that,' said the doctor. "There will have
+to be an inquest, and she should have waited to know
+what to do.'
+"Yes, sir; it was hinted to her that she had better
+wait till the law was known. But she said law was
+nothing to her, and she wouldn't let her dear husband's
+corpse bide neglected for folks to stare at for all the
+crowners in England.'
+Mr. Aldritch drove at once back again up the
+hill to Bathsheba's. The first person he met was
+poor Liddy, who seemed literally to have dwindled
+smaller in these few latter hours. "What has been
+done?' he said.
+"I don't know, sir,' said Liddy, with suspended
+breath. "My mistress has done it all.'
+"Where is she?'
+" Upstairs with him, sir. When he was brought
+home and taken upstairs, she said she wanted no
+further help from the men. And then she called me,
+and made me fill the bath, and after that told me I
+had better go and lie down because I looked so ill.
+Then she locked herself into the room alone with him,
+and would not let a nurse come in, or anybody at all.
+But I thought l'd wait in the next room in case she
+should want me. I heard her moving about inside
+for more than an 
+<P 443>
+hour, but she only came out once,
+and that was for more candles, because hers had burnt
+down into the socket. She said we were to let her
+know when you or Mr. Thirdly came, sir.'
+Oak entered with the parson at this moment, and
+they all went upstairs together, preceded by Liddy
+Smallbury. Everything was silent as the grave when
+they paused on the landing. Liddy knocked, and
+Bathsheba's dress was heard rustling across the room:
+the key turned in the lock, and she opened the door.
+Her looks were calm and nearly rigid, like a slightly
+animated bust of Melpomene.
+"Oh, Mr. Aldritch, you have come at last,' she
+murmured from her lips merely, and threw back the
+door. "Ah, and Mr. Thirdly. Well, all is done, and
+anybody in the world may see him now.' She then
+passed by him, crossed the landing, and entered
+another room.
+Looking into the chamber of death she had vacated
+they saw by the light of the candles which were on the
+drawers a tall straight shape lying at the further end
+of the bedroom, wrapped in white. Everything around
+was quite orderly. The doctor went in, and after a
+few minutes returned to the landing again, where
+Oak and the parson still waited.
+"It is all done, indeed, as she says,' remarked Mr.
+Aldritch, in a subdued voice. "The body has been
+undressed and properly laid out in grave clothes.
+Gracious Heaven -- this mere girl! She must have the
+nerve of a stoic!'
+"The heart of a wife merely,' floated in a whisper
+about the ears of the three, and turning they saw
+Bathsheba in the midst of them. Then, as if at that
+instant to prove that her fortitude had been more of
+will than of spontaneity, she silently sank down between
+them and was a shapeless heap of drapery on the floor.
+The simple consciousness that superhuman strain was
+no longer required had at once put a period to her
+power to continue it.
+They took her away into a further room, and the
+medical attendance which had been useless in Troy's
+case was invaluable in Bathsheba's, who fell into a
+series of fainting-fits that had a serious aspect for a
+time. The sufferer was got to bed, 
+<P 444>
+and Oak, finding
+from the bulletins that nothing really dreadful was to
+be apprehended on her score, left the house. Liddy
+kept watch in Bathsheba's chamber, where she heard
+her mistress, moaning in whispers through the dull
+slow hours of that wretched night: "O it is my fault
+ -- how can I live! O Heaven, how can I live!'
+<C lv>
+<P 445>
+THE MARCH FOLLOWING -- "BATHSHEBA BOLDWOOD'
+WE pass rapidly on into the month of March, to a
+breezy day without sunshine, frost, or dew. On Yai
+bury Hill, about midway between Weatherbury and
+Casterbridge, where the turnpike road passes over
+the crest, a numerous concourse of people had
+gathered, the eyes of the greater number being fre+
+quently stretched afar in a northerly direction. The
+groups consisted of a throng of idlers, a party of
+javelin-men, and two trumpeters, and in the midst
+were carriages, one of which contained the high
+sheriff. With the idlers, many of whom had mounted
+to the top of a cutting formed for the road, were several
+Weatherbury men and boys -- among others Poorgrass,
+Coggan, and Cain Ball.
+At the end of half-an-hour a faint dust was seen in
+the expected quarter, and shortly after a travelling+
+carriage, bringing one of the two judges on the Western
+Circuit, came up the hill and halted on the top. The
+judge changed carriages whilst a flourish was blown
+by the big-cheeked trumpeters, and a procession being
+formed of the vehicles and javelin-men, they all pro+
+ceeded towards the town, excepting the Weatherbury
+men, who as soon as they had seen the judge move
+off returned home again to their work.
+" Joseph, I zeed you squeezing close to the carriage,"
+said Coggan, as they walked. "Did ye notice my lord
+judge's face ?'
+"I did,' said Poorgrass. "I looked hard at en, as
+if I would read his very soul; and there was mercy
+in his eyes -- or to speak with the exact truth required
+of us at this solemn time, in the eye that was towards
+me.'
+"Well, I hope for the best,' said Coggan, though
+bad that must be. However, I shan't go to the trial,
+and I'd advise the rest of ye that bain't wanted to bide
+away. 'Twill disturb his 
+<P 446>
+mind more than anything to
+see us there staring at him as if he were a show.'
+" The very thing I said this morning,' observed Joseph,
+"Justice is come to weigh him in the balances," I said
+in my reflectious way, "and if he's found wanting, so
+be it unto him," and a bystander said "Hear, hear,
+A man who can talk like that ought to be heard.'
+But I don't like dwelling upon it, for my few words
+are my few words, and not much; though the speech
+of some men is rumoured abroad as though by nature
+formed for such.'
+"So 'tis, Joseph. And now, neighbours, as I said,
+every man bide at home.'
+The resolution was adhered to ; and all waited
+anxiously for the news next day. Their suspense
+was diverted, however, by a discovery which was made
+in the afternoon, throwing more light on Boldwood's
+conduct and condition than any details which had
+preceded it.
+That he had been from the time of Greenhill Fair
+until the fatal Christmas Eve in excited and unusual
+moods was known to those who had been intimate
+with him; but nobody imagined that there had shown
+in him unequivocal symptoms of the mental derange+
+ment which Bathsheha and Oak, alone of all others
+and at different times, had momentarily suspected.
+In a locked closet was now discovered an extraordinary
+collection of articles. There were several sets of ladies'
+dresses in the piece, of sundry expensive materials;
+silks and satins, poplins and velvets, all of colours
+which from Bathsheba's style of dress might have been
+judged to be her favourites. There were two muffs,
+sable and ermine. Above all there was a case of
+jewellery, containing four heavy gold bracelets and
+several lockets and rings, all of fine quality and manu+
+facture. These things had been bought in Bath and
+other towns from time to time, and brought home by
+stealth. They were all carefully packed in paper, and
+each package was labelled " Bathsheba Boldwood,' a
+date being subjoined six years in advance in every
+instance.
+These somewhat pathetic evidences of a mind crazed
+with care and love were the subject of discourse in
+<P 447>
+Warren's malt-house when Oak entered from Caster+
+bridge with tidings of the kiln glow shone upon
+it, told the tale sufficiently well. Boldwood, as every
+one supposed he would do, had pleaded guilty, and
+had been sentenced to death.
+The conviction that Boldwood had not been morally
+responsible for his later acts now becam general. Facts
+elicited previous to the trial had pointed strongly in the
+same direction, but they had not been of sufficient weight
+to lead to an order for an examination into the state
+of Boldwood's mind. It was astonishing, now that a
+presumption of insanity was raised, how many collateral
+circumstances were remembered to which a condition
+of mental disease seemed to afford the only explanation
+ -- among others, the unprecedented neglect of his corn
+stacks in the previous summer.
+A petition was addressed to the Home Secretary,
+advancing the circumstances which appeared to justify
+a request for a reconsideration of the sentence. It was
+not "numerously signed ' by the inhabitants of Caster+
+bridge, as is usual in such cases, for Boldwood had
+never made many friends over the counter. The shops
+thought it very natural that a man who, by importing
+direct from the producer, had daringly set aside the
+first great principle of provincial existence, namely
+that God made country villages to supply customers
+to county towns, should have confused ideas about
+the Decalogue. The prompters were a few merciful
+men who had perhaps too feelingly considered the
+facts latterly unearthed, and the result was that evidence
+was taken which it was hoped might remove the crime
+in a moral point of view, out of the category of wilful
+murder, and lead it to be regarded as a sheer outcome
+of madness.
+The upshot of the petition was waited for in Weather+
+bury with solicitous interest. The execution had been
+fixed for eight o'clock on a Saturday morning about a
+fortnight after the sentence was passed, and up to
+Friday afternoon no answer had been recieved. At
+that time Gabriel came from Casterbridge Gaol, whither
+he had been to wish Boldwood good-bye, and turned
+down a by-street to avoid the town. When past the last
+<P 448>
+house he heard a hammering, and lifting his bowed
+head he looked back for a moment. Over the chimneys
+he could see the upper part of the gaol entrance, rich
+and glowing in the afternoon sun, and some moving
+figures were there. They were carpenters lifting a post
+into a vertical position within the parapet. He with+
+drew his eyes quickly, and hastened on.
+It was dark when he reached home, and half the
+village was out to meet him.
+"No tidings,' Gabriel said, wearily. "And I'm afraid
+there's no hope. I've been with him more than two
+hours.'
+"Do ye think he <1really>1 was out of his mind when he
+did it?' said Smallbury.
+" I can't honestly say that I do,' Oak replied. " How+
+ever, that we can talk of another time. Has there been
+any change in mistress this afternoon?'
+"None at all.'
+"Is she downstairs?'
+"No. And getting on so nicely as she was too.
+She's but very little better now again than she was at
+Christmas. She keeps on asking if you be come, and
+if there's news, till one's wearied out wi' answering her.
+Shall I go and say you've come?'
+"No,' said Oak. "There's a chance yet; but I
+couldn't stay in town any longer -- after seeing him too,
+So Laban -- Laban is here, isn't he ? '
+" Yes,' said Tall.
+"What I've arranged is, that you shall ride to town
+the last thing to-night ; leave here about nine, and wait
+a while there, getting home about twelve. If nothing
+has been received by eleven to-night, they say there's
+no chance at all.'
+"I do so hope his life will be spared,' said Liddy.
+"If it is not, she'll go out of her mind too. Poor thing;
+her sufferings have been dreadful; she deserves any+
+body's pity.'
+"Is she altered much ? ' said Coggan.
+"If you haven't seen poor mistress since Christmas,
+you wouldn't know her,' said Liddy. " Her eyes are so
+miserable that she's not the same woman. Only two
+years ago she was a romping girl, and now she's this!'
+Laban departed as directed, and at eleven o'clock
+that night 
+<P 449>
+several of the villagers strolled along the
+road to Casterbridge and awaited his arrivai-among
+them Oak, and nearly all the rest of Bathsheba's men.
+Gabriel's anxiety was great that Boldwood might be
+saved, even though in his conscience he felt that he
+ought to die; for there had been qualities in the farmer
+which Oak loved. At last, when they all were weary
+the tramp of a horse was heard in the distance --
+First dead, as if on turf it trode,
+Then, clattering  on the village road
+In other pace than forth he yode.
+'We shall soon know now, one way or other,' said
+Coggan, and they all stepped down from the bank on
+which they had been standing into the road, and the
+rider pranced into the midst of them.
+"Is that you, Laban ? ' said Gabriel.
+"Yes -- 'tis come. He's not to die. 'Tis confine+
+ment during her Majesty's pleasure.'
+"Hurrah!' said Coggan, with a swelling heart. "God's
+above the devil yet!'
+<C lvi>
+<P 450>
+BEAUTY IN LONELINESS -- AFTER ALL
+BATHSHEBA revived with the spring. The utter
+prostration that had followed the low fever from which
+she had sufered diminished perceptibly when all un+
+certainty upon every subject had come to an end.
+But she remained alone now for the greater part of
+her time, and stayed in the house, or at furthest went
+into the garden. She shunned every one, even Liddy,
+and could be brought to make no confidences, and to
+ask for no sympathy.
+As the summer drew on she passed more of her time
+in the open air, and began to examine into farming
+matters from sheer necessity, though she never rode
+out or personally superintended as at former times.
+One Friday evening in August she walked a little way
+along the road and entered the village for the first time
+since the sombre event of the preceding Christmas.
+None of the old colour had as yet come to her cheek,
+and its absolute paleness was heightened by the jet black
+of her gown, till it appeared preternatural. When she
+reached a little shop at the other end of the place,
+which stood nearly opposite to the churchyard, Bath+
+sheba heard singing inside the church, and she knew
+that the singers were practising. She crossed the road,
+opened the gate, and entered the graveyard, the high
+sills of the church windows effectually screening her
+from the eyes of those gathered within. Her stealthy
+walk was to the nook wherein Troy had worked at
+planting flowers upon Fanny Robin's grave, and she
+came to the marble tombstone.
+A motion of satisfaction enlivened her face as she
+read the complete inscription. First came the words of
+Troy himself: --
+<P 451>
+ERECTED BY FRANCIS TROY
+IN BELOVEO MEMORY OF
+FANNY ROBIN,
+WHO DIED OCTOBER 9, 18 -- ,
+AGED 20 YEARS.
+Unerneath this was now inscribed in new letters: --
+IN THE SAME GRAVE LIE
+THE REMAINS OF THE AFORESAID
+FRANCIS TROY,
+WHO DIED DECEMBER 24TH, 18 -- ,
+Whilst she stood and read and meditated the tones of
+the organ began again in the church, and she went
+with the same light step round to the porch and listened.
+The door was closed, and the coir was learning a new
+hymn. Bathsheba was stirred by emotions which
+latterly she had assumed to be altogether dead within
+her. The little attenuated voices of the children
+brought to her ear in destinct utterance the words they
+sang without thought or comprehension --
+Lead, kindly Light, amid the encircling gloom,
+Lead Thou me on.
+Bathsheba's feeling was always to some extent de+
+pendent upon her whim, as is the case with many other
+women. Something big came into her throat and an
+uprising to her eyes -- and she thought that she would
+allow the imminent tears to flow if they wished. They
+did flow and plenteously, and one fell upon the stone
+bench beside her. Once that she had begun to cry for
+she hardly knew what, she could not leave off for crowd+
+ing thoughts she knew too well. She would have given
+anything in the world to be, as those children were, un+
+concerned at the meaning of their words, because too
+innocent to feel the necessity for any such expression.
+All the impassioned scenes of her brief expenence
+seemed to revive with added emotion at that moment,
+and those scenes which had been without emotion
+<P 452>
+during enactment had emotion then. Yet grief came
+to her rather as a luxury than as the scourge of former
+times.
+Owing to Bathsheba's face being buried in her hands
+she did not notice a form which came quietly into the
+porch, and on seeing her, first moved as if to retreat,
+then paused and regarded her. Bathsheba did not raise
+her head for some time, and when she looked round
+her face was wet, and her eyes drowned and dim. "Mr.
+Oak,' exclaimed she, disconcerted, " how long have you
+been here ?'
+"A few minutes, ma'am,' said Oak, respectfully.
+"Are you going in?' said Bathsheba; and there came
+from within the church as from a prompter --
+l loved the garish day, and, spite of fears,
+pride ruled my will: remember not past years.
+"I was,' said Gabriel. " I am one of the bass singers,
+you know. I have sung bass for several months.
+"Indeed: I wasn't aware of that. I'll leave you, then.'
+Which I have loved long since, and lost awhile,
+sang the children.
+"Don't let me drive you away, mistress. I think I
+won't go in to-night.'
+"O no -- you don't drive me away.
+Then they stood in a state of some embarrassment
+Bathsheba trying to wipe her dreadfully drenched and
+inflamed face without his noticing her. At length Oak
+said, I've not seen you-i mean spoken to you -- since
+ever so long, have I?' But he feared to bring distress+
+ing memories back, and interrupted himself with: "Were
+you going into church ?'
+"No,' she said. I came to see the tombstone
+privately -- to see if they had cut the inscription as I
+wished Mr. Oak, you needn't mind speaking to me, if
+you wish to, on the matter which is in both our minds
+at this moment.'
+"And have they done it as you wished ?' said Oak.
+"Yes. Come and see it, if you have not already.'
+So together they went and read the tomb. "Eight
+months 
+<P 453>
+ago!' Gabriel murmured when he saw the date.
+'It seems like yesterday to me.'
+And to me as if it were years ago-iong years, and
+I had been dead between. And now I am going home,
+Mr. Oak.'
+Oak walked after her. 'I wanted to name a small
+matter to you as soon as I could,' he said, with hesitation.
+"Merrly about business, and I think I may just mention it
+now, if you'll allow me.'
+" O yes, certainly.'
+It is that I may soon have to give up the manage+
+ment of your farm, Mrs. Troy. The fact is, I am think+
+ing of leaving England -- not yet, you know -- next
+spring. '
+"Leaving England!' she said, in surprise and
+genuine disappointment.' Why, Gabriel, what are you
+going to do that for?'
+"Well, I've thought it best,' Oak stammered out.
+"California is the spot I've had in my mind to try.'
+"But it is understood everywhere that you are going
+to take poor Mr. Boldwood's farm on your own account.'
+"I've had the refusal o' it 'tis true; but nothing is
+settled yet, and I have reasons for gieing up. I shall
+finish out my year there as manager for the trustees,
+but no more.'
+"And what shall I do without you? Oh, Gabriel, I
+don't think you ought to go away. You've been with
+me so long -- through bright times and dark times -- such
+old friends that as we are -- that it seems unkind almost. I
+had fancied that if you leased the other farm as master,
+you might still give a helping look across at mine. And
+now going away!'
+"I would have willingly.'
+" Yet now that I am more helpless than ever you go
+away!'
+"Yes, that's the ill fortune o' it,' said Gabriel, in a
+distressed tone. "And it is because of that very help+
+lessness that I feel bound to go. Good afternoon,
+ma'am ' he concluded, in evident anxiety to get
+away, and at once went out of the churchyard by a
+path she could follow on no pretence whatever.
+Bathsheba went home, her mind occupied with a
+new trouble, which being rather harassing than deadly
+was calculated to do good by diverting her from the
+chronic gloom of 
+<P 454>
+her life. She was set thinking a great
+deal about Oak and of his wich to shun her; and there
+occurred to Bathsheba several incidents of latter in+
+tercourse with him, which, trivial when singly viewed
+amounted together to a perceptible disinclination for
+her society. It broke upon her at length as a great
+pain that her last old disciple was about to forsake her
+and flee. He who had believed in her and argued on
+her side when all the rest of the world was against her,
+had at last like the others become weary and neglectful
+of the old cause, and was leaving her to fight her battles
+alone.
+Three weeks went on, and more evidence of his
+want of interest in her was forthcoming. She noticed
+that instead of entering the small parlour or office
+where the farm accounts were kept, and waiting, or
+leaving a memorandum as he had hitherto done during
+her seclusion, Oak never came at all when she was likely
+to be there, only entering at unseasonable hours when
+her presence in that part of the house was least to be
+expected. Whenever he wanted directions he sent a
+message, or note with neither heading nor signature, to
+which she was obliged to reply in the same off-hand
+style. Poor Bathsheba began to suffer now from the
+most torturing sting of ali-a sensation that she was
+despised.
+The autumn wore away gloomily enough amid these
+melancholy conjectures, and Christmas-day came, com+
+pleting a year of her legal widowhood, and two years
+and a quarter of her life alone. On examining her
+heart it appeared beyond measure strange that the sub+
+ject of which the season might have been supposed
+suggestive -- the event in the hall at Boldwood's -- was
+not agitating her at all; but instead, an agonizing con+
+viction that everybody abjured her -- for what she could
+not teli-and that Oak was the ringleader of the
+recusants. Coming out of church that day she looked
+round in hope that Oak, whose bass voice she had
+heard rolling out from the gallery overhead in a most
+unconcerned manner, might chance to linger in her path
+in the old way. There he was, as usual, coming down
+the path behind her. But on seeing Bathsheba turn, he
+looked aside, and as soon as he got beyond the gate,
+<P 455>
+and there was the barest excuse for a divergence, he
+made one, and vanished.
+The next morning brought the culminating stroke;
+she had been expecting it long. It was a formal notice
+by letter from him that he should not renew his engage+
+ment with her for the following Lady-day.
+Bathsheba actually sat and cried over this letter most
+bitterly. She was aggrieved and wounded that the
+possession of hopeless love from Gabriel, which she had
+AFTER ALL
+grown to regard as her inalienable right for life, should
+have been withdrawn just at his own pleasure in this
+way. She was bewildered too by the prospect of having
+to rely on her own resources again: it seemed to herself
+that she never could again acquire energy sufficient to
+go to market, barter, and sell. Since Troy's death Oak
+had attended all sales and fairs for her, transacting her
+business at the same time with his own. What should
+she do now? Her life was becoming a desolation.
+So desolate was Bathsheba this evening, that in an
+absolute hunger for pity and sympathy, and miserable in
+that she appeared to have outlived the only true friend+
+ship she had ever owned, she put on her bonnet and
+cloak and went down to Oak's house just after sunset,
+guided on her way by the pale primrose rays of a
+crescent moon a few days old.
+A lively firelight shone from the window, but nobody
+was visible in the room. She tapped nervously, and
+then thought it doubtful if it were right for a single
+woman to call upon a bachelor who lived alone, although
+he was her manager, and she might be supposed to call
+on business without any real impropriety. Gabriel
+opened the door, and the moon shone upon his fore+
+haad.
+"Mr. Oak,' said Bathsheba, faintly.
+"Yes; I am Mr. Oak,' said Gabriel. "Who have I
+the honour -- O how stupid of me, not to know you,
+mistress!'
+"I shall not be your mistress much longer, shall I
+Gabriel?' she said, in pathetic tones.
+"Well, no. I suppose -- But come in, ma'am. Oh --
+and I'll get a light,' Oak replied, with some awkwardness.
+<P 456>
+"No; not on my account.'
+"It is so seldom that I get a lady visitor that I'm
+afraid I haven't proper accommodation. Will you sit
+down, please ? Here's a chair, and there's one, too.
+I am sorry that my chairs all have wood scats, and are
+rather hard, but i-was thinging of getting some new
+ones.' Oak placed two or three for her.
+"They are quite easy enough for me.'
+So down she sat, and down sat he, the fire dancing
+in their faces, and upon the old furniture
+all a-sheenen
+Wi' long years o' handlen,
+that formed Oak's array of household possessions, which
+sent back a dancing reflection in reply. It was very
+odd to these two persons, who knew each other passing
+well, that the mere circumstance of their meeting in a
+new place and in a new way should make them so
+awkward and constrained. In the fields, or at her house,
+there had never been any embarrassment; but now that
+Oak had become the entertainer their lives seemed to be
+moved back again to the days when they were strangers.
+"You'll think it strange that I have come, but -- -'
+"O no; not at all.'
+"But I thought -- Gabriel, I have been uneasy in the
+belief that I have offended you, and that you are going
+away on that account. It grieved me very much and
+I couldn't help coming.'
+"Offended me! As if you could do that, Bathsheba!'
+"Haven't I?' she asked, gladly. " But, what are you
+going away for else?'
+"I am not going to emigrate, you know; I wasn't
+aware that you would wish me not to when I told 'ee or I
+shouldn't ha' thought of doing it,' he said, simply. "I
+have arranged for Little Weatherbury Farm and shall
+have it in my own hands at Lady-day. You know I've
+had a share in it for some time. Still, that wouldn't
+prevent my attending to your business as before, hadn't
+it been that things have been said about us.'
+<P 457>
+"What?' said Bathsheba, in surprise. "Things said
+about you and me! What are they?'
+"I cannot tell you.'
+"It would be wiser if you were to, I think. You have
+played the part of mentor to me many times, and I don't
+see why you should fear to do it now.'
+"It is nothing that you have done, this time. The
+top and tail o't is this -- that I am sniffing about here,
+and waiting for poor Boldwood's farm, with a thought
+of getting you some day.'
+"Getting me! What does that mean?'
+"Marrying o' 'ee, in plain British. You asked me to
+tell, so you mustn't blame me.'
+Bathsheba did not look quite so alarmed as if a
+cannon had been discharged by her ear, which was what
+Oak had expected. "Marrying me! I didn't know it
+was that you meant,' she said, quietly. "Such a thing
+as that is too absurd -- too soon -- to think of, by far!'
+"Yes; of course, it is too absurd. I don't desire any
+such thing; I should think that was plain enough by
+this time. Surely, surely you be the last person in the
+world I think of marrying. It is too absurd, as you say
+""Too -- s-s-soon" were the words I used.'
+"I must beg your pardon for correcting you, but you
+said, ""too absurd,"' and so do I.'
+"I beg your pardon too! she returned, with tears
+in her eyes. """Too soon"' was what I said. But it
+doesn't matter a bit -- not at ali-but I only meant,
+""too soon"' Indeed, I didn't, Mr. Oak, and you must
+believe me!'
+Gabriel looked her long in the face, but the firelight
+being faint there was not much to be seen. " Bathsheba,'
+he said, tenderly and in surprise, and coming closer:
+"if I only knew one thing -- whether you would allow me
+to love you and win you, and marry you after ali-if I
+only knew that!'
+"But you never will know,' she murmured.
+"Why?'
+"Because you never ask.
+"Oh -- Oh!' said Gabriel, with a low laugh of joyous+
+ness. "My own dear -- -'
+<P 458>
+"You ought not to have sent me that harsh letter
+this morning,' she interrupted. "It shows you didn't
+care a bit about me, and were ready to desert me like
+all the rest of them! It was very cruel of you, consider+
+ing I was the first sweetheart that you ever had, and
+you were the first I ever had; and I shall not forget it!'
+"Now, Bathsheba, was ever anybody so provoking
+he said, laughing. " You know it was purely that I, as
+an unmarried man, carrying on a business for you as a
+very taking young woman, had a proper hard part to
+play -- more particular that people knew I had a sort
+of feeling for'ee; and I fancied, from the way we were
+mentioned together, that it might injure your good name.
+Nobody knows the heat and fret I have been caused
+by it.'
+"And was that all?'
+"All.'
+"Oh, how glad I am I came!' she exclaimed, thank+
+fully, as she rose from her seat. "I have thought so
+much more of you since I fancied you did not want
+even to see me again. But I must be going now, or I
+shall be missed. Why Gabriel,' she said, with a slight
+laugh, as they went to the door, "it seems exactly as if
+I had come courting you -- how dreadful!'
+"And quite right too,' said Oak. "I've danced at
+your skittish heels, my beautiful Bathsheba, for many a
+long mile, and many a long day; and it is hard to be+
+grudge me this one visit.'
+He accompanied her up the hill, explaining to her
+the details of his forthcoming tenure of the other farm.
+They spoke very little of their mutual  feeling; pretty
+phrases and warm expressions being probably un+
+necessary between such tried friends. Theirs was that
+substantial affection which arises (if any arises at all)
+when the two who are thrown together begin first by
+knowing the rougher sides of each other's character,
+and not the best till further on, the romance growing
+up in the interstices of a mass of hard prosaic reality.
+This good-fellowship -- <1camaraderie>1 --  usually occurring
+through similarity of pursuits, is unfortunately seldom
+superadded to love between the sexes, because men and
+women associate, not in their lahours, but in their
+pleasures merely. Where, however, happy circumstance
+<P 459>
+permits its development, the compounded feeling proves
+itself to be the only love which is strong as death -- that
+love which many waters cannot quench, nor the floods
+drown, beside which the passion usually called by the
+name is evanescent as steam.
+<C lvii>
+<P 460>
+A FOGGY NIGHT AND MORNING -- CONCLUSION
+"THE most private, secret, plaines wedding that it is
+possible to have.'
+Those had been Bathsheba's words to Oak one
+evening, some time after the event of the preceding
+chapter, and he meditated a full hour by the clock upon
+how to carry out her wishes to the letter.
+"A licence -- O yes, it must be a licence,' he said
+to himself at last. "Very well, then; first, a license.'
+On a dark night, a few days later, Oak came with
+mysterious steps from the surrogate's door, in Caster+
+bridge. On the way home he heard a heavy tread in
+front of him, and, overtaking the man, found him to be
+Coggan. They walked together into the village until
+they came to a little lane behind the church, leading
+down to the cottage of Laban Tall, who had lately been
+installed as clerk of the parish, and was yet in mortal
+terror at church on Sundays when he heard his lone
+voice among certain hard words of the Psalms, whither
+no man ventured to follow him.
+"Well, good-night, Coggan,' said Oak, "I'm going
+down this way.'
+"Oh!' said Coggan, surprised; "what's going on to+
+night then, make so bold Mr. Oak?'
+It seemed rather ungenerous not to tell Coggan,
+under the circumstances, for Coggan had been true as
+steel all through the time of Gabriel's unhappiness about
+Bathsheba, and Gabriel said, " You can keep a secret,
+Coggan?'
+"You've proved me, and you know.'
+"Yes, I have, and I do know. Well, then, mistress
+and I mean to get married to-morrow morning.'
+"Heaven's high tower! And yet I've thought of
+such a thing 
+<P 461>
+from time to time; true, I have. But
+keeping it so close! Well, there, 'tis no consarn of
+amine, and I wish 'ee joy o' her.'
+"Thank you, Coggan. But I assure 'ee that this
+great hush is not what I wished for at all, or what
+either of us would have wished if it hadn't been for
+certain things that would make a gay wedding seem
+hardly the thing. Bathsheba has a great wish that all
+the parish shall not be in church, looking at her -- she's
+shyiike and nervous about it, in fact -- so I be doing
+this to humour her.'
+"Ay, I see: quite right, too, I suppose I must say.
+And you be now going down to the clerk.'
+"Yes; you may as well come with me.'
+"I am afeard your labour in keeping it close will be
+throwed away,' said Coggan, as they walked along.
+"Labe Tall's old woman will horn it all over parish in
+half-an-hour. '
+"So she will, upon my life; I never thought of
+that,' said Oak, pausing. "Yet I must tell him to+
+night, I suppose, for he's working so far off, and leaves
+early.'
+"I'll tell 'ee how we could tackle her,' said Coggan.
+"I'll knock and ask to speak to Laban outside the door,
+you standing in the background. Then he'll come out,
+and you can tell yer tale. She'll never guess what I
+want en for; and I'll make up a few words about the
+farm-work, as a blind.'
+This scheme was considered feasible; and Coggan
+advanced boldly, and rapped at Mrs. Tall's door. Mrs.
+Tall herself opened it.
+"I wanted to have a word with Laban.'
+"He's not at home, and won't be this side of eleven
+o'clock. He've been forced to go over to Yalbury since
+shutting out work. I shall do quite as well.'
+"I hardly think you will. Stop a moment;' and
+Coggan stepped round the corner of the porch to consult
+Oak.
+"Who's t'other man, then?' said Mrs. Tall.
+"Only a friend,' said Coggan.
+"Say he's wanted to meet mistress near church-hatch
+to-morrow morning at ten,' said Oak, in a whisper.
+"That he must come without fail, and wear his best
+clothes.'
+<P 462>
+"The clothes will floor us as safe as houses!' said
+Coggan.
+"It can't be helped said Oak. "Tell her.'
+So Coggan delivered the message. "Mind, het or
+wet, blow or snow, he must come, added Jan. "'Tis
+very particular, indeed. The fact is, 'tis to witness her
+sign some law-work about taking shares wi' another
+farmer for a long span o' years. There, that's what 'tis,
+and now I've told 'ee, Mother Tall, in a way I shouldn't
+ha' done if I hadn't loved 'ee so hopeless well.'
+Coggan retired before she could ask any further;
+and next they called at the vicar's in a manner which
+excited no curiosity at all. Then Gabriel went home,
+and prepared for the morrow.
+"Liddy,' said Bathsheba, on going to bed that night,
+"I want you to call me at seven o'clock to-morrow, In
+case I shouldn't wake.'
+"But you always do wake afore then, ma'am.'
+"Yes, but I have something important to do, which
+I'll tell you of when the time comes, and it's best to
+make sure.'
+CONCLUSION
+Bathsheba, however, awoke voluntarily at four, nor
+could she by any contrivance get to sleep again. About
+six, being quite positive that her watch had stopped
+during the night, she could wait no longer. She went
+and tapped at Liddy's door, and after some labour awoke
+her.
+"But I thought it was I who had to call you?' said
+the bewildered Liddy. "And it isn't six yet.'
+"Indeed it is; how can you tell such a story, Liddy?
+I know it must be ever so much past seven. Come to
+my room as soon as you can; I want you to give my
+hair a good brushing.'
+When Liddy came to Bathsheba's room her mistress
+was already waiting. Liddy could not understand
+this extraordinary promptness. " Whatever <1is>1 going on,
+ma'am?' she said.
+"Well, I'll tell you,' said Bathsheba, with a mischiev+
+ous smile in her bright eyes. "Farmer Oak is coming
+here to dine with me to-day!'
+"Farmer Oak -- and nobody else ? -- you two alone?'
+"Yes.'
+<P 463>
+"But is it safe, ma'am, after what's been said?' asked
+her companion, dubiously. "A woman's good name is
+such a perishable article that --  -- '
+Bathsheba laughed with a flushed cheek, and
+whispered in Liddy's ear, although there was nobody
+present. Then Liddy stared and exclaimcd, " Souls
+alive, what news! It makes my heart go quite
+bumpity-bump"
+"It makes mine rather furious, too,' said Bathsheba.
+"However, there's no getting out of it now!'
+It was a damp disagreeable morning. Nevertheless,
+at twenty minutes to ten o'clock, Oak came out of his
+house, and
+Went up the hill side
+With that sort of stride
+A man puts out when walking in search of a bride,
+and knocked Bathsheba's door. Ten minutes later
+a large and a smaller umbrella might have been seen
+moving from the same door, and through the mist along
+the road to the church. The distance was not more
+than a quarter of a mile, and these two sensible persons
+deemed it unnecessary to drive. An observer must have
+been very close indeed to discover that the forms under
+the umbrellas were those of Oak and Bathsheba, arm-in+
+arm for the first time in their lives, Oak in a greatcoat
+extending to his knees, and Bathsheba in a cloak that
+reached her clogs. Yet, though so plainly dressed
+there was a certain rejuvenated appearance about her : --
+  As though a rose should shut and be a bud again.
+Repose had again incarnadined her cheeks; and having,
+at Gabriel's request, arranged her hair this morning as
+she had worn it years ago on Norcombe Hill, she seemed
+in his eyes remarkably like a girl of that fascinating
+dream, which, considering that she was now only three
+or four-and-twenty, was perhaps not very wonderful. In
+the church were Tall, Liddy, and the parson, and in a
+remarkably short space of time the deed was done.
+The two sat down very quietly to tea in Bathsheba's
+parlour in the evening of the same day, for it had been
+arranged that 
+<P 464>
+Farmer Oak should go there to live, since
+he had as yet neither money, house, nor furniture worthy
+of the name, though he was on a sure way towards them,
+whilst Bathsheba was, comparatively, in a plethora of all
+three.
+Just as Bathsheba was pouring out a cup of tea,
+their ears were greeted by the firing of a cannon,
+followed by what seemed like a tremendous blowing of
+trumpets, in the front of the house.
+"There!' said Oak, laughing, "I knew those fellows
+were up to something, by the look on their face; '
+Oak took up the light and went into the porch,
+followed by Bathsheba with a shawl over her head. The
+rays fell upon a group of male figures gathered upon the
+gravel in front, who, when they saw the newly-married
+couple in the porch, set up a loud "Hurrah!' and at
+the same moment bang again went the cannon in the
+background, followed by a hideous clang of music from
+a drum, tambourine, clarionet, serpent, hautboy, tenor+
+viol, and double-bass -- the only remaining relics of the
+true and original Weatherbury band -- venerable worm+
+eaten instruments, which had celebrated in their own
+persons the victories of Marlhorough, under the fingers
+of the forefathers of those who played them now. The
+performers came forward, and marched up to the
+front.
+"Those bright boys, Mark Clark and Jan, are at the
+bottom of all this,' said Oak. " Come in, souls, and
+have something to eat and drink wi' me and my wife.'
+"Not to-night,' said Mr. Clark, with evident self+
+denial. "Thank ye all the same; but we'll call at a
+more seemly time. However, we couldn't think of
+letting the day pass without a note of admiration of
+some sort. If ye could send a drop of som'at down to
+Warren's, why so it is. Here's long life and happiness
+to neighbour Oak and his comely bride!'
+"Thank ye; thank ye all,' said Gabriel. "A bit and
+a drop shall be sent to Warren's for ye at once. I had
+a thought that we might very likely get a salute of some
+sort from our old friends, and I was saying so to my
+wife but now.'
+"Faith,' said Coggan, in a critical tone, turning to his
+companions, "the man hev learnt to say ""my wife"'
+in a wonderful 
+<P 465>
+naterel way, considering how very youth+
+ful he is in wedlock as yet -- hey, neighbours all?'
+"I never heerd a skilful old married feller of twenty
+years' standing pipe ""my wife"' in a more used note
+than 'a did,' said Jacob Smallbury. "It might have been
+a little more true to nater if't had been spoke a little
+chillier, but that wasn't to be expected just now.
+"That improvement will come wi' time,' said Jan,
+twirling his eye.
+Then Oak laughed, and Bathsheba smiled (for she
+never laughed readily now), and their friends turned to
+go.
+"Yes; I suppose that's the size o't,' said Joseph
+Poorgrass with a cheerful sigh as they moved away;
+"and I wish him joy o' her; though I were once or
+twice upon saying to-day with holy Hosea, in my
+scripture manner, which is my second nature. ""Ephraim
+is joined to idols: let him alone."' But since 'tis as 'tis
+why, it might have been worse, and I feel my thanks
+accordingly.'
+THE END
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/book2 b/src/test/java/org/xerial/snappy/testdata/calgary/book2
new file mode 100644
index 0000000..89f4204
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/book2
@@ -0,0 +1,15634 @@
+.EQ
+delim $$
+.EN
+.CH "1  WHY SPEECH OUTPUT?"
+.ds RT "Why speech output?
+.ds CX "Principles of computer speech
+.pp
+Speech is our everyday, informal, communication medium.  But although we use
+it a lot, we probably don't assimilate as much information through our
+ears as we do through our eyes, by reading or looking at pictures and diagrams.
+You go to a technical lecture to get the feel of a subject \(em the overall
+arrangement of ideas and the motivation behind them \(em and fill in the details,
+if you still want to know them, from a book.  You probably find out more about
+the news from ten minutes with a newspaper than from a ten-minute news broadcast.
+So it should be emphasized from the start that speech output from computers is
+not a panacea.  It doesn't solve the problems of communicating with computers;
+it simply enriches the possibilities for communication.
+.pp
+What, then, are the advantages of speech output?  One good reason for listening
+to a radio news broadcast instead of spending the time with a newspaper
+is that you can listen while shaving, doing the housework, or driving the car.
+Speech leaves hands and eyes free for other tasks.
+Moreover, it is omnidirectional, and does not require a free line of sight.
+Related to this is the
+use of speech as a secondary medium for status reports and warning messages.
+Occasional interruptions by voice do not interfere with other activities,
+unless they demand unusual concentration, and people can assimilate spoken messages
+and queue them for later action quite easily and naturally.
+.pp
+The second key feature of speech communication stems from the telephone.
+It is the universality of the telephone receiver itself that is important
+here, rather than the existence of a world-wide distribution network;
+for with special equipment (a modem and a VDU) one does not need speech to take advantage of
+the telephone network for information transfer.
+But speech needs no tools other than the telephone, and this gives
+it a substantial advantage.  You can go into a phone booth anywhere in the world,
+carrying no special equipment, and have access to your computer within seconds.
+The problem of data input is still there:  perhaps your computer
+system has a limited word recognizer, or you use the touchtone telephone
+keypad (or a portable calculator-sized tone generator).  Easy remote access
+without special equipment is a great, and unique, asset to speech communication.
+.pp
+The third big advantage of speech output is that it is potentially very cheap.
+Being all-electronic, except for the loudspeaker, speech systems are well
+suited to high-volume, low-cost, LSI manufacture.  Other computer output
+devices are at present tied either to mechanical moving parts or to the CRT.
+This was realized quickly by the computer hobbies market, where speech output
+peripherals have been selling like hot cakes since the mid 1970's.
+.pp
+A further point in favour of speech is that it is natural-seeming and
+somehow cuddly when compared with printers or VDU's.  It would have been much
+more difficult to make this point before the advent of talking toys like
+Texas Instruments' "Speak 'n Spell" in 1978, but now it is an accepted fact that friendly
+computer-based gadgets can speak \(em there are talking pocket-watches
+that really do "tell" the time, talking microwave ovens, talking pinball machines, and,
+of course, talking calculators.
+It is, however, difficult to assess whether the appeal stems from
+mechanical speech's novelty \(em it
+is still a gimmick \(em and also to what extent it is tied up with
+economic factors.
+After all, most of the population don't use high-quality VDU's, and their major
+experience of real-time interactive computing is through the very limited displays
+and keypads provided on video games and teletext systems.
+.pp
+Articles on speech communication with computers often list many more advantages of voice output
+(see Hill 1971, Turn 1974, Lea 1980).
+.[
+Hill 1971 Man-machine interaction using speech
+.]
+.[
+Lea 1980
+.]
+.[
+Turn 1974 Speech as a man-computer communication channel
+.]
+For example, speech
+.LB
+.NP
+can be used in the dark
+.NP
+can be varied from a (confidential) whisper to a (loud) shout
+.NP
+requires very little energy
+.NP
+is not appreciably affected by weightlessness or vibration.
+.LE
+However, these either derive from the three advantages we have discussed above,
+or relate
+mainly to exotic applications in space modules and divers' helmets.
+.pp
+Useful as it is at present, speech output would be even more attractive if it could
+be coupled with speech input.  In many ways, speech input is its "big brother".
+Many of the benefits of speech output are even more striking for speech input.
+Although people can assimilate information faster through the eyes than the
+ears, the majority of us can generate information faster with the mouth than
+with the hands.  Rapid typing is a relatively uncommon skill, and even high
+typing rates are much slower than speaking rates (although whether we can
+originate ideas quickly enough to keep up with fast speech is another matter!)  To
+take full advantage of the telephone for interaction with machines, machine
+recognition of speech is obviously necessary.  A microwave oven, calculator,
+pinball machine, or alarm clock that responds to spoken commands is certainly
+more attractive than one that just generates spoken status messages.  A book
+that told you how to recognize speech by machine would undoubtedly be more
+useful than one like this that just discusses how to synthesize it!  But the
+technology of speech recognition is nowhere near as advanced as that of
+synthesis \(em it's a much more difficult problem.  However, because speech input
+is obviously complementary to speech output, and even very limited input
+capabilities will greatly enhance many speech output systems, it is worth
+summarizing the present state of the art of speech recognition.
+.pp
+Commercial speech recognizers do exist.  Almost invariably, they accept
+words spoken in isolation, with gaps of silence between them, rather than
+connected utterances.
+It is not difficult to discriminate with high accuracy up to a hundred
+different words spoken by the same speaker, especially if the vocabulary
+is carefully selected to avoid words which sound similar.  If several
+different speakers are to be comprehended, performance can be greatly improved
+if the machine is given an opportunity to calibrate their voices in a training
+session, and is informed at recognition time which one is to speak.
+With a large population of unknown speakers, accurate recognition is difficult
+for vocabularies of more than a few carefully-chosen words.
+.pp
+A half-way house between isolated word discrimination and recognition of connected
+speech is the problem of spotting known words in continuous speech.  This
+allows much more natural input, if the dialogue is structured as keywords
+which may be
+interspersed by unimportant "noise words".  To speak in truly isolated
+words requires a great deal of self-discipline and concentration \(em it is
+surprising how much of ordinary speech is accounted for by vague sounds
+like um's and aah's, and false starts.  Word spotting disregards these and so
+permits a more relaxed style of speech.  Some progress has been made on it in
+research laboratories, but the vocabularies that can be accomodated are still
+very small.
+.pp
+The difficulty of recognizing connected speech depends crucially on what is
+known in advance about the dialogue:  its pragmatic, semantic, and syntactic
+constraints.  Highly structured dialogues constrain very heavily the choice of
+the next word.  Recognizers which can deal with vocabularies of over 1000 words
+have been built in research laboratories, but the structure of the input has
+been such that the average "branching factor" \(em the size of the set out of
+which the next word must be selected \(em is only around 10 (Lea, 1980).
+.[
+Lea 1980
+.]
+Whether such
+highly constrained languages would be acceptable in many practical applications
+is a moot point.  One commercial recognizer, developed in 1978, can cope with
+up to five words spoken continuously from a basic 120-word vocabulary.
+.pp
+There has been much debate about whether it will ever be possible for a speech
+recognizer to step outside rigid constraints imposed on the utterances it can
+understand, and act, say, as an automatic dictation machine.  Certainly the most
+advanced recognizers to date depend very strongly on a tight context being
+available.  Informed opinion seems to accept that in ten years' time,
+voice data entry in the office will be an important and economically feasible
+prospect, but that it would be rash to predict the appearance of unconstrained
+automatic dictation by then.
+.pp
+Let's return now to speech output and take a look at some systems which use it,
+to illustrate the advantages and disadvantages of speech in practical
+applications.
+.sh "1.1  Talking calculator"
+.pp
+Figure 1.1 shows a calculator that speaks.
+.FC "Figure 1.1"
+Whenever a key is pressed,
+the device confirms the action by saying the key's name.
+The result of any computation is also spoken aloud.
+For most people, the addition of speech output to a calculator is simply a
+gimmick.
+(Note incidentally that speech
+.ul
+input
+is a different matter altogether.  The ability to dictate lists of numbers and
+commands to a calculator, without lifting one's eyes from the page, would have
+very great advantages over keypad input.)  Used-car
+salesmen find that speech output sometimes helps to clinch a deal:  they key in
+the basic car price and their bargain-basement deductions, and the customer is so
+bemused by the resulting price being spoken aloud to him by a machine that he
+signs the cheque without thinking!  More seriously, there may be some small
+advantage to be gained when keying a list of figures by touch from having their
+values read back for confirmation.  For blind people, however, such devices
+are a boon \(em and there are many other applications, like talking elevators
+and talking clocks, which benefit from even very restricted voice output.
+Much more sophisticated is a typewriter with audio feedback, designed by
+IBM for the blind.  Although blind typists can remember where the keys on a
+typewriter are without difficulty, they rely on sighted proof-readers to help
+check
+their work.  This device could make them more useful as office typists and
+secretaries.  As well as verbalizing the material (including punctuation)
+that has been typed, either by attempting to pronounce the words or by spelling
+them out as individual letters, it prompts the user through the more complex action sequences
+that are possible on the typewriter.
+.pp
+The vocabulary of the talking calculator comprises the 24 words of Table 1.1.
+.RF
+.nr x1 2.0i+\w'percent'u
+.nr x1 (\n(.l-\n(x1)/2
+.in \n(x1u
+.ta 2.0i
+zero	percent
+one	low
+two	over
+three	root
+four	em (m)
+five	times
+six	point
+seven	overflow
+eight	minus
+nine	plus
+times-minus	clear
+equals	swap
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 1.1  Vocabulary of a talking calculator"
+This represents a total of about 13 seconds of speech.  It is stored
+electronically in read-only memory (ROM), and Figure 1.2 shows the circuitry
+of the speech module inside the calculator.
+.FC "Figure 1.2"
+There are three large integrated circuits.
+Two of them are ROMs, and the other is a special synthesis chip which decodes the
+highly compressed stored data into an audio waveform.
+Although the mechanisms used for storing speech by commercial devices are
+not widely advertised by the manufacturers, the talking calculator almost
+certainly uses linear predictive coding \(em a technique that we will examine
+in Chapter 6.
+The speech quality is very poor because of the highly compressed storage, and
+words are spoken in a grating monotone.
+However, because of the very small vocabulary, the quality is certainly good
+enough for reliable identification.
+.sh "1.2  Computer-generated wiring instructions"
+.pp
+I mentioned earlier that one big advantage of speech over visual output is that
+it leaves the eyes free for other tasks.
+When wiring telephone equipment during manufacture, the operator needs to use
+his hands as well as eyes to keep his place in the task.
+For some time tape-recorded instructions have been used for this in certain
+manufacturing plants.  For example, the instruction
+.LB
+.NI
+Red 2.5    11A terminal strip    7A tube socket
+.LE
+directs the operator to cut 2.5" of red wire, attach one end to a specified point
+on the terminal strip, and attach the other to a pin of the tube socket.  The
+tape recorder is fitted with a pedal switch to allow a sequence of such instructions
+to be executed by the operator at his own pace.
+.pp
+The usual way of recording the instruction tape is to have a human reader
+dictate them from a printed list.
+The tape is then checked against the list by another listener to ensure that
+the instructions are correct.  Since wiring lists are usually stored and
+maintained in machine-readable form, it is natural to consider whether speech
+synthesis techniques could be used to generate the acoustic tape directly by
+a computer (Flanagan
+.ul
+et al,
+1972).
+.[
+Flanagan Rabiner Schafer Denman 1972
+.]
+.pp
+Table 1.2 shows the vocabulary needed for this application.
+.RF
+.nr x1 2.0i+2.0i+\w'tube socket'u
+.nr x1 (\n(.l-\n(x1)/2
+.in \n(x1u
+.ta 2.0i +2.0i
+A	green	seventeen
+black	left	six
+bottom	lower	sixteen
+break	make	strip
+C	nine	ten
+capacitor	nineteen	terminal
+eight	one	thirteen
+eighteen	P	thirty
+eleven	point	three
+fifteen	R	top
+fifty	red	tube socket
+five	repeat coil	twelve
+forty	resistor	twenty
+four	right	two
+fourteen	seven	upper
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 1.2  Vocabulary needed for computer-generated wiring instructions"
+It is rather larger
+than that of the talking calculator \(em about 25 seconds of speech \(em but well
+within the limits of single-chip storage in ROM, compressed by the linear
+predictive technique.  However, at the time that the scheme was investigated
+(1970\-71) the method of linear predictive coding had not been fully developed,
+and the technology for low-cost microcircuit implementation was not available.
+But this is not important for this particular application, for there is
+no need to perform the synthesis on a miniature low-cost computer system,
+nor need it
+be accomplished in real time.  In fact a technique of concatenating
+spectrally-encoded words was used (described in Chapter 7), and it was
+implemented on a minicomputer.  Operating much slower than real-time, the system
+calculated the speech waveform and wrote it to disk storage.  A subsequent phase
+read the pre-computed messages and recorded them on a computer-controlled analogue
+tape recorder.
+.pp
+Informal evaluation showed the scheme to be quite successful.  Indeed, the
+synthetic speech, whose quality was not high, was actually preferred to
+natural speech in the noisy environment of the production line, for each
+instruction was spoken in the same format, with the same programmed pause
+between the items.
+A list of 58 instructions of the form shown above was recorded and used
+to wire several pieces of apparatus without errors.
+.sh "1.3  Telephone enquiry service"
+.pp
+The computer-generated wiring scheme illustrates how speech can be used to give
+instructions without diverting visual attention from the task at hand.
+The next system we examine shows how speech output can make the telephone
+receiver into a remote computer terminal for a variety of purposes
+(Witten and Madams, 1977).
+.[
+Witten Madams 1977 Telephone Enquiry Service
+.]
+The caller employs the touch-tone keypad shown in Figure 1.3 for input, and the
+computer generates
+a synthetic voice response.
+.FC "Figure 1.3"
+Table 1.3 shows the process of making
+contact with the system.
+.RF
+.fi
+.nh
+.na
+.in 0.3i
+.nr x0 \w'COMPUTER:  '
+.nr x1 \w'CALLER:  '
+.in+\n(x0u
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Dials the service.
+.ti-\n(x0u
+COMPUTER:  Answers telephone.
+"Hello, Telephone Enquiry Service.  Please
+enter your user number".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters user number.
+.ti-\n(x0u
+COMPUTER:  "Please enter your password".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters password.
+.ti-\n(x0u
+COMPUTER:  Checks validity of password.
+If invalid, the user is asked to re-enter
+his user number.
+Otherwise,
+"Which service do you require?"
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters service number.
+.in 0
+.nf
+.FG "Table 1.3  Making contact with the telephone enquiry system"
+.pp
+Advantage is taken of the disparate speeds of input (keyboard) and
+output (speech) to hasten the dialogue by imposing a question-answer structure
+on it, with the computer taking the initiative.  The machine can
+afford to be slightly verbose if by so doing it makes the caller's
+response easier, and therefore more rapid.  Moreover, operators who
+are experienced enough with the system to anticipate questions can
+easily forestall them just by typing ahead, for the computer is programmed
+to examine its input buffer before issuing prompts and to suppress them if
+input has already been provided.
+.pp
+An important aim of the system is to allow application programmers with no
+special knowledge of speech to write independent services for it.
+Table 1.4 shows an example of the use of one such application program,
+.RF
+.fi
+.nh
+.na
+.in 0.3i
+.nr x0 \w'COMPUTER:  '
+.nr x1 \w'CALLER:  '
+.in+\n(x0u
+.ti-\n(x0u
+COMPUTER:  "Stores Information Service.  Please enter
+component name".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "SN7406#".
+.ti-\n(x0u
+COMPUTER:  "The component name is SN7406.  Is this correct?"
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "*1#" (system convention for "yes").
+.ti-\n(x0u
+COMPUTER:  "This component is in stores".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "*7#" (command for "price").
+.ti-\n(x0u
+COMPUTER:  "The component price is 35 pence".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "*8#" (command for "minimum number").
+.ti-\n(x0u
+COMPUTER:  "The minimum number of this component kept
+in stores is 10".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "SN7417#".
+.ti-\n(x0u
+COMPUTER:  "The component name is SN7417.  Is this correct?"
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "*1#".
+.ti-\n(x0u
+COMPUTER:  "This component is not in stores".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "*9#" (command for "delivery time").
+.ti-\n(x0u
+COMPUTER:  "The expected delivery time is 14 days".
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Enters "*0#".
+.ti-\n(x0u
+COMPUTER:  "Which service do you require?"
+.in 0
+.nf
+.FG "Table 1.4  The Stores Information Service"
+the
+Stores Information Service, which permits enquiries to be made of a database
+holding information on electronic components kept in stock.
+This subsystem is driven by
+.ul
+alphanumeric
+data entered on the touch-tone keypad.  Two or three letters are associated
+with each digit, in a manner which is fairly standard in touch-tone telephone
+applications.  These are printed on a card overlay
+that fits the keypad (see Figure 1.3).  Although true alphanumeric data entry
+would require a multiple key press for each character,
+the ambiguity inherent in
+a single-key-per-character convention can usually be resolved by the computer,
+if it has a list of permissible entries.  For example, the component names
+SN7406 and ZTX300 are read by the machine as "767406" and "189300", respectively.
+Confusion rarely occurs if the machine is expecting a valid component code.
+The same holds true of people's names, and file names \(em although with these
+one must take care not to identify a series of files by similar names, like
+TX38A, TX38B, TX38C.  It is easy for the machine to detect the rare cases
+where ambiguity occurs, and respond by requesting further information:  "The
+component name is SN7406.  Is this correct?"  (In fact, the Stores Information
+Service illustrated in Table 1.4 is defective in that it
+.ul
+always
+requests confirmation of an entry, even when no ambiguity exists.)  The
+use of a telephone keypad for data entry will be taken up again in Chapter 10.
+.pp
+A distinction is drawn throughout the system between data entries and
+commands, the latter being prefixed by a "*".  In this example, the
+programmer chose to define a command for each possible question about a
+component, so that a new component name can be entered at any time
+without ambiguity.  The price paid for the resulting brevity of dialogue
+is the burden of memorizing the meaning of the commands.  This is an
+inherent disadvantage of a one-dimensional auditory display over the
+more conventional graphical output:   presenting menus by speech is tedious and
+long-winded.  In practice, however, for a simple task such as the
+Stores Information Service it is quite convenient for the caller to
+search for the appropriate command by trying out all possibilities \(em there
+are only a few.
+.pp
+The problem of memorizing commands is alleviated by establishing some
+system-wide conventions.  Each input is terminated by a "#", and
+the meaning of standard commands is given in Table 1.5.
+.RF
+.fi
+.nh
+.na
+.in 0.3i
+.nr x0 \w'# alone  '
+.nr x1 \w'\(em  '
+.ta \n(x0u +\n(x1u
+.nr x2 \n(x0+\n(x1
+.in+\n(x2u
+.ti-\n(x2u
+*#	\(em	Erase this input line, regardless of what has
+been typed before the "*".
+.ti-\n(x2u
+*0#	\(em	Stop.  Used to exit from any service.
+.ti-\n(x2u
+*1#	\(em	Yes.
+.ti-\n(x2u
+*2#	\(em	No.
+.ti-\n(x2u
+*3#	\(em	Repeat question or summarize state of current
+transaction.
+.ti-\n(x2u
+# alone	\(em	Short form of repeat.  Repeats or summarizes
+in an abbreviated fashion.
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.nf
+.FG "Table 1.5  System-wide conventions for the service"
+.pp
+A summary of services available on the system is given in
+Table 1.6.
+.RF
+.fi
+.na
+.in 0.3i
+.nr x0 \w'000  '
+.nr x1 \w'\(em  '
+.nr x2 \n(x0+\n(x1
+.in+\n(x2u
+.ta \n(x0u +\n(x1u
+.ti-\n(x2u
+\0\01	\(em	tells the time
+.ti-\n(x2u
+\0\02	\(em	Biffo (a game of NIM)
+.ti-\n(x2u
+\0\03	\(em	MOO (a game similar to that marketed under the name "Mastermind")
+.ti-\n(x2u
+\0\04	\(em	error demonstration
+.ti-\n(x2u
+\0\05	\(em	speak a file in phonetic format
+.ti-\n(x2u
+\0\06	\(em	listening test
+.ti-\n(x2u
+\0\07	\(em	music (allows you to enter a tune and play it)
+.ti-\n(x2u
+\0\08	\(em	gives the date
+.sp
+.ti-\n(x2u
+100	\(em	squash ladder
+.ti-\n(x2u
+101	\(em	stores information service
+.ti-\n(x2u
+102	\(em	computes means and standard deviations
+.ti-\n(x2u
+103	\(em	telephone directory
+.sp
+.ti-\n(x2u
+411	\(em	user information
+.ti-\n(x2u
+412	\(em	change password
+.ti-\n(x2u
+413	\(em	gripe (permits feedback on services from caller)
+.sp
+.ti-\n(x2u
+600	\(em	first year laboratory marks entering service
+.sp
+.ti-\n(x2u
+910	\(em	repeat utterance (allows testing of system)
+.ti-\n(x2u
+911	\(em	speak utterance (allows testing of system)
+.ti-\n(x2u
+912	\(em	enable/disable user 100 (a no-password guest user number)
+.ti-\n(x2u
+913	\(em	mount a magnetic tape on the computer
+.ti-\n(x2u
+914	\(em	set/reset demonstration mode (prohibits access by low-priority users)
+.ti-\n(x2u
+915	\(em	inhibit games
+.ti-\n(x2u
+916	\(em	inhibit the MOO game
+.ti-\n(x2u
+917	\(em	disable password checking when users log in
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.nf
+.FG "Table 1.6  Summary of services on a telephone enquiry system"
+They range from simple games and demonstrations, through serious database
+services, to system maintenance facilities.
+A priority structure is imposed upon them, with higher
+service numbers being available only to higher priority users.
+Services in the lowest range (1\-99) can be obtained by all, while
+those in the highest range (900\-999) are maintenance services,
+available only to the system designers.  Access to the lower-numbered
+"games" services can be inhibited by a priority user \(em this was
+found necessary to prevent over-use of the system!  Another advantage
+of telephone access to an information retrieval system is that some
+day-to-day maintenance can be done remotely, from the office telephone.
+.pp
+This telephone enquiry service, which was built in 1974, demonstrated that
+speech synthesis had moved from a specialist phonetic discipline into the
+province of engineering practicability.  The speech was generated "by rule"
+from a phonetic input (the method is covered in Chapters 7 and 8), which
+has very low data storage requirements of around 75\ bit/s of speech.
+Thus an enormous vocabulary and range of services could be accomodated on a
+small computer system.
+Despite the fairly low quality of the speech, the response from callers was
+most encouraging.  Admittedly the user population was a self-selected body of
+University staff, which one might suppose to have high tolerance to new ideas,
+and a system designed for the general public would require more effort to be
+spent on developing speech of greater intelligibility.  Although it was
+observed that some callers failed to understand parts of the responses, even
+after repetition, communication was largely unhindered in most cases; users
+being driven by a high motivation to help the system help them.
+.pp
+The use of speech output in conjunction with a simple input device requires
+careful thought for interaction to be successful and comfortable.  It is
+necessary that the computer direct the conversation as much as possible,
+without seeming to be taking charge.  Provision for eliminating prompts
+which are unwanted by sophisticated users is essential to avoid frustration.
+We will return to the topic of programming techniques for speech interaction
+in Chapter 10.
+.pp
+Making a computer system available over the telephone results in a sudden
+vast increase in the user population.  Although people's reaction to a new
+computer terminal in every office was overwhelmingly favourable, careful
+resource allocation was essential to prevent the service being hogged by a
+persistent few.  As with all multi-access computer systems, it is particularly
+important that error recovery is effected automatically and gracefully.
+.sh "1.4  Speech output in the telephone exchange"
+.pp
+The telephone enquiry service was an experimental vehicle for research on speech
+interaction, and was developed in 1974.
+Since then, speech has begun to be used in real commercial applications.
+One example is System\ X, the British Post Office's computer-controlled
+telephone exchange.  This incorporates many features
+not found in conventional telephone exchanges.
+For example, if a number is found to be busy, the call can be attempted
+again by a "repeat last call" command, without having to re-dial the full number.
+Alternatively, the last number can be stored for future re-dialling, freeing
+the phone for other calls.
+"Short code
+dialling" allows a customer to associate short codes with commonly-dialled
+numbers.
+Alarm calls can be booked at specified times, and are made automatically
+without human intervention.
+Incoming calls can be barred, as can outgoing ones.  A diversion service
+allows all incoming calls to be diverted to another telephone, either
+immediately, or if a call to the original number remains unanswered for
+a specified period of time, or if the original number is busy.
+Three-party calls can be set up automatically, without involving the
+operator.
+.pp
+Making use of these facilities presents the caller with something of a problem.
+With conventional telephone exchanges, feedback is provided on what is happening
+to a call by the use of four tones \(em the dial tone, the busy tone,
+the ringing tone, and the number unavailable tone.
+For the more sophisticated interaction which is expected on the advanced
+exchange, a much greater variety of status signals is required.
+The obvious solution is to use
+computer-generated spoken
+messages to inform the caller when these services are invoked, and to guide him
+through the sequences of actions needed to set up facilities like call
+re-direction.  For example, the messages used by the exchange when a user
+accesses the alarm call
+service are
+.LB
+.NI
+Alarm call service.
+Dial the time of your alarm call followed by square\u\(dg\d.
+.FN 1
+\(dg\d"Square" is the term used for the "#" key on the touch-tone telephone.\u
+.EF
+.NI
+You have booked an alarm call for seven thirty hours.
+.NI
+Alarm call operator.  At the third stroke it will be seven thirty.
+.LE
+.pp
+Because of the rather small vocabulary, the number of messages that can be
+stored in their entirety rather than being formed by concatenation of
+smaller units, and the short time which was available for development,
+System\ X stores speech as a time waveform, slightly compressed by a time-domain
+encoding operation (such techniques are described in Chapter 3).
+Utterances which contain variable parts, like the time of alarm in the messages
+above, are formed by inserting separately-recorded digits in a fixed 
+"carrier" message.  No attempt is made to apply uniform intonation
+contours to the synthetic utterances.  The resulting speech is of excellent
+quality (being a slightly compressed recording of a human voice), but sometimes
+exhibits somewhat anomalous pitch contours.
+For example, the digits comprising numbers often sound rather jerky and
+out-of-context \(em which indeed they are.
+.pp
+Even more advanced facilities can be expected on telephone exchanges in
+the future.  A message storage capability is one example.  Although
+automatic call recording machines have been available for years, a centralized
+facility could time and date a message, collect the caller's identity
+(using the telephone keypad), and allow the recipient to select messages left
+for him through an interactive dialogue so that he could control the order
+in which he listens to them.  He could choose to leave certain messages to be
+dealt with later, or re-route them to a colleague.  He may even wish to leave
+reminders for himself, to be dialled automatically at specified times (like
+alarm calls with user-defined information attached).  The sender of a message
+could be informed automatically by the system when it is delivered.  None of
+this requires speech recognition, but it does need economical speech
+.ul
+storage,
+and also speech
+.ul
+synthesis
+(for time and date tags).
+.sh "1.5  Travel consultant"
+.pp
+Some current research in speech communication with computers is aimed at
+embedding the dialogue in a task environment which provides it with an overall
+contextual framework.
+This in fact was the motivation for the experimental telephone enquiry service
+described above, and it was observed that people are able to tolerate rather
+low quality speech if they feel that the interaction is worthwhile.  One step
+further is the use of speech
+.ul
+input
+as well as output, and here the context of the conversation which is provided
+by the task environment can be used to improve recognition accuracy
+significantly.
+A system set up at Bell Telephone Laboratories indicates what we can expect
+to find operating commercially in the future (Levinson and Shipley, 1980).
+.[
+Levinson Shipley 1980
+.]
+It provides timetable information about airline flights, and allows the user
+to make reservations.
+.pp
+An example dialogue is given in Table 1.7.
+.RF
+.fi
+.nh
+.na
+.in 0.3i
+.nr x0 \w'COMPUTER:  '
+.nr x1 \w'CALLER:  '
+.in+\n(x0u
+.ti-\n(x0u
+COMPUTER:  This is the Bell Laboratories flight information system.  May I help you?
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  I would like to go to Chicago.
+.ti-\n(x0u
+COMPUTER:  Please specify the day of your departure.
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  I want to leave at four p.m..
+.ti-\n(x0u
+COMPUTER:  Please specify the day of your departure.
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  I want to depart on the two five May.
+.ti-\n(x0u
+COMPUTER:  Flight number nine two leaves New York at four p.m. arrives in Chicago at five twenty five p.m..
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  What plane is on the flight?
+.ti-\n(x0u
+COMPUTER:  The aircraft is a Boeing seven twenty seven.
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  How much is the fare?
+.ti-\n(x0u
+COMPUTER:  The round trip coach fare is one hundred forty two dollars.
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  I want a first class seat.
+.ti-\n(x0u
+COMPUTER:  One seat thank you.
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  What is the fare?
+.ti-\n(x0u
+COMPUTER:  The round trip first class fare is one hundred eighty four dollars.
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  Please repeat the arrival time.
+.ti-\n(x0u
+COMPUTER:  The arrival time is five twenty five p.m..
+.ti-\n(x0u
+CALLER:\h'\n(x0u-\n(x1u'  I will take the flight.
+.ti-\n(x0u
+COMPUTER:  Your reservation on flight number nine two to Chicago on Friday is confirmed.  Thank you.
+.in 0
+.nf
+.MT 2
+Table 1.7  A conversation with an airline flight information service
+(from Levinson and Shipley, 1980)
+.TE
+.[
+Levinson Shipley 1980
+.]
+The user dials the system from an
+ordinary telephone.  The recognition side must be trained by each user, and
+accepts isolated words spoken with brief pauses between them.
+The voice response unit has a vocabulary of around 200 words, and
+synthesizes its answers by slotting words into "templates" evoked by the speech
+understanding part in response to a query.  For example,
+.LB
+.NI
+This flight makes \(em stops
+.NI
+Flight number \(em leaves \(em at \(em , arrives in \(em at \(em
+.LE
+are templates which when called with specific slot fillers could produce the
+utterances
+.LB
+.NI
+This flight makes three stops
+.NI
+Flight number nine two leaves New York at four p.m.,
+arrives in Chicago at five twenty-five p.m.
+.LE
+The chief research interest of the system is in its speech understanding
+capabilities, and the method used for speech output is relatively
+straightforward.  The templates and words are recorded, digitized, compressed
+slightly, and stored on disk files (totalling a few hundred thousand bytes of
+storage), using techniques similar to those of System\ X.
+Again, no independent manipulation of pitch is possible, and so the utterances
+sound intelligible but the transition between templates and slot fillers is not
+completely fluent.  However, the overall context of the interaction means that
+the communication is not seriously disrupted even if the machine occasionally
+misunderstands the man or vice versa.  The user's attention is drawn away from
+recognition accuracy and focussed on the exchange of information with the machine.
+The authors conclude that progress in speech recognition can best be made by
+studying it in the context of communication rather than in a vacuum or as part
+of a one-way channel, and the same is undoubtedly true of speech synthesis as
+well.
+.sh "1.6  Reading machine for the blind"
+.pp
+Perhaps the most advanced attempt to provide speech output from a computer
+is the Kurzweil reading machine for the blind, first marketed in the late
+1970's (Figure 1.4).
+.FC "Figure 1.4"
+This device reads an ordinary book aloud.  Users adjust the reading
+speed according to the content of the material and their familiarity with
+it, and the maximum rate has recently been improved to around 225 words per
+minute \(em perhaps half as fast again as normal human speech rates.
+.pp
+As well as generating speech from text, the machine has to scan the document
+being read and identify the characters presented to it.  A scanning camera
+is used, controlled by a program which searches for and tracks the lines of
+text.  The output of the camera is digitized, and the image is enhanced
+using signal-processing techniques.  Next each individual letter must be
+isolated, and its geometric features identified and compared with a pre-stored
+table of letter shapes.  Isolation of letters is not at all trivial, for
+many type fonts have "ligatures" which are combinations of characters joined
+together (for example, the letters "fi" are often run together.)  The
+machine must cope with many printed type fonts, as well as typewritten ones.
+The text-recognition side of the Kurzweil reading machine is in fact one of
+its most advanced features.
+.pp
+We will discuss the problem of speech generation from text in Chapter 9.
+It has many facets.  First there is pronunciation, the
+translation of letters to sounds.  It is important to take into account
+the morphological structure of words, dividing them into "root" and "endings".
+Many words have concatenated suffixes (like "like-li-ness").  These are
+important to detect, because a final "e" which appears on a root word
+is not pronounced itself but affects the pronunciation of the previous
+vowel.  Then there is the difficulty that some words look the same
+but are pronounced differently, depending on their meaning or on the syntactic
+part that they play in the sentence.
+Appropriate intonation is extremely difficult to generate from a plain textual
+representation, for it depends on the meaning of the text and the way in which
+emphasis is given to it by the reader.  Similarly the rhythmic structure is
+important, partly for correct pronunciation and partly for purposes of
+emphasis.
+Finally the sounds that have been deduced from the text need to be synthesized
+into acoustic form, taking due account of the many and varied contextual effects
+that occur in natural speech.  This by itself is a challenging problem.
+.pp
+The performance of the Kurzweil reading machine is not good.  While it seems
+to be true that some blind people can make use of it, it is far from
+comprehensible to an untrained listener.  For example,
+it will miss out words and even whole phrases, hesitate in a
+stuttering manner, blatantly mis-pronounce many words, fail to detect
+"e"s which should be silent, and give completely wrong rhythms
+to words, making them impossible to understand.
+Its intonation is decidedly unnatural, monotonous, and often downright
+misleading.  When it reads completely new text to people unfamiliar with its
+quirks,
+they invariably fail to understand more than an odd word here and there,
+and do not improve significantly when the text is repeated more than once.
+Naturally performance improves if the material is familiar or expected
+in some way.
+One useful feature is the machine's ability to spell out difficult words
+on command from the user.
+.pp
+While not wishing to denigrate the Kurzweil machine, which is a remarkable
+achievement in that it integrates together many different advanced
+technologies, there is no doubt that the state of the art in speech synthesis
+directly from unadorned text is extremely primitive, at present.
+It is vital not to overemphasize the potential usefulness of abysmal speech,
+which takes a great deal of training on the part of the user before
+it becomes at all intelligible.  To make a rather extreme analogy,
+Morse code could be used as
+audio output, requiring a great deal of training, but capable of being understood
+at quite high rates by an expert.
+It could be generated very cheaply.
+But clearly the man in the street would find it quite unacceptable as
+an audio output medium, because of the excessive effort required to learn to use
+it.  In many applications, very bad synthetic speech is just as useless.
+However, the issue is complicated by the fact that for people who use
+synthesizers regularly, synthetic speech becomes quite easily comprehensible.
+We will return to the problem of evaluating the quality of artificial speech
+later in the book (Chapter 8).
+.sh "1.7  System considerations for speech output"
+.pp
+Fortunately, very many of the applications of speech output from computers
+do not need to read unadorned text.
+In all the example systems described above (except the reading machine),
+it is enough to be able to store utterances in some representation which can
+include pre-programmed cues for pronunciation, rhythm, and intonation in
+a much more explicit way than ordinary text does.
+.pp
+Of course, techniques
+for storing audio information have been in use for decades.
+For example, a domestic cassette tape recorder stores speech at much better
+than telephone quality at very low cost.  The method of direct
+recording of an analogue waveform is currently used for announcements in
+the telephone network to provide information such as the time, weather
+forecasts, and even bedtime stories.
+However, it is difficult to provide rapid access to messages stored in
+analogue form, and although some computer peripherals which use analogue
+recordings for voice-response applications have been marketed \(em they are
+discussed briefly at the beginning of Chapter 3 \(em they have been
+superseded by digital storage techniques.
+.pp
+Although direct storage of a digitized audio waveform is used in some
+voice-response systems, the approach has certain limitations.  The most
+obvious one is the large storage requirement:  suitable coding can reduce
+the data-rate of speech to as little as one hundredth of that needed by
+direct digitization, and textual representations reduce it by another factor
+of ten or twenty.  (Of course, the speech quality is inevitably compromised
+somewhat by data-compression techniques.)  However, the cost of storage is
+dropping so fast that this is not necessarily an overriding factor.
+A more fundamental limitation is that utterances stored directly cannot sensibly
+be modified in any way to take account of differing contexts.
+.pp
+If the results of certain kinds of analyses
+of utterances are stored, instead of simply the digitized waveform,
+a great deal more flexibility can be gained.
+It is possible to separate out the features of intonation and amplitude from
+the articulation of the speech, and this raises the attractive possibility
+of regenerating utterances with pitch contours different from those with which they were
+recorded.
+The primary analysis technique used for this purpose is
+.ul
+linear prediction
+of speech, and this is treated in some detail in Chapter 6.  It also reduces drastically the
+data-rate of speech, by a factor of around 50.
+It is likely that many voice-response systems in the short- and medium-term
+future will use linear predictive representations for utterance storage.
+.pp
+For maximum flexibility, however, it is preferable to store a textual
+representation of the utterance.
+There is an important distinction between speech
+.ul
+storage,
+where an actual human utterance is recorded, perhaps processed to lower
+the data-rate, and stored for subsequent regeneration when required,
+and speech
+.ul
+synthesis,
+where the machine produces its own individual utterances which are not based
+on recordings of a person saying the same thing.  The difference is summarized
+in Figure 1.5.
+.FC "Figure 1.5"
+In both cases something is stored:  for the first it is
+a direct representation of an actual human utterance, while for the second
+it is a typed
+.ul
+description
+of the utterance in terms of the sounds, or phonemes, which constitute it.
+The accent and tone of voice of the human speaker will be apparent in
+the stored speech output, while for synthetic speech the accent is the
+machine's and the tone of voice is determined by the synthesis program.
+.pp
+Probably the most attractive representation of utterances in man-machine
+systems is ordinary English text, as used by the Kurzweil reading machine.
+But, as noted above, this poses extraordinarily difficult problems for the
+synthesis procedure, and these inevitably result in severely degraded speech.
+Although in the very long term these problems may indeed be solved,
+most speech output systems can adopt as their representation of an utterance
+a description of it which explicitly conveys the difficult features of
+intonation, rhythm, and even pronunciation.
+In the kind of applications described above (barring the reading machine),
+input will be prepared by a
+programmer as he builds the software system which supports the interactive
+dialogue.
+Although it is important that the method of specifying utterances be easily
+learned, it is not necessary that plain English
+is used.  It should be simple for the programmer to enter new
+utterances and modify them on-line in cut-and-try attempts to render the
+man-machine dialogue as natural as possible.  A phonetic input
+can be quite adequate for this, especially if the system allows the
+programmer to hear immediately the synthesized version of the message
+he types.  Furthermore, markers which indicate rhythm and intonation can
+be added to the message so that the system does not have to deduce these features
+by attempting to "understand" the plain text.
+.pp
+This brings us to another disadvantage of speech storage as compared with
+speech synthesis.  To provide utterances for a voice response system using
+stored human speech, one must assemble together special input hardware,
+a quiet room, and (probably) a dedicated computer.  If the speech is to be
+heavily encoded, either expensive special hardware is required or the encoding
+process, if performed by software on a general-purpose computer, will take
+a considerable length of time (perhaps hundreds of times real-time).  In
+either case, time-consuming editing of the speech will be necessary, with
+follow-up recordings to clarify sections of speech which turn out to be
+unsuitable or badly recorded.  If at a later date the voice response
+system needs modification, it will be necessary to recall the same speaker,
+or re-record the entire utterance set.  This discourages the application
+programmer from adjusting his dialogue in the light of experience.
+Synthesizing from a textual representation, on the other hand, allows him
+to change a speech prompt as simply as he could a VDU one, and evaluate
+its effect immediately.
+.pp
+We will return to methods of digitizing and compacting speech in Chapters 3
+and 4, and carry on to consider speech synthesis in subsequent chapters.
+Firstly, however, it is necessary to take a look at what speech is and how
+people produce it.
+.sh "1.8  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "1.9  Further reading"
+.pp
+There are remarkably few general books on speech output, although a
+substantial specialist literature exists for the subject.
+In addition to the references listed above, I suggest that you look
+at the following.
+.LB "nn"
+.\"Ainsworth-1976-1
+.]-
+.ds [A Ainsworth, W.A.
+.ds [D 1976
+.ds [T Mechanisms of speech recognition
+.ds [I Pergamon
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+A nice, easy-going introduction to speech recognition, this book covers
+the acoustic structure of the speech signal in a way which makes
+it useful as background reading for speech synthesis as well.
+It complements Lea, 1980, cited above; which presents more recent results
+in greater depth.
+.in-2n
+.\"Flanagan-1973-2
+.]-
+.ds [A Flanagan, J.L.
+.as [A " and Rabiner, L.R. (Editors)
+.ds [D 1973
+.ds [T Speech synthesis
+.ds [I Wiley
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.in+2n
+This is a collection of previously-published research papers on speech
+synthesis, rather than a unified book.
+It contains many of the classic papers on the subject from 1940\ -\ 1972,
+and is a very useful reference work.
+.in-2n
+.\"LeBoss-1980-3
+.]-
+.ds [A LeBoss, B.
+.ds [D 1980
+.ds [K *
+.ds [T Speech I/O is making itself heard
+.ds [J Electronics
+.ds [O May\ 22
+.ds [P 95-105
+.nr [P 1
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+The magazine
+.ul
+Electronics
+is an excellent source of up-to-the-minute news, product announcements,
+titbits, and rumours in the commercial speech technology world.
+This particular article discusses the projected size of the voice
+output market and gives a brief synopsis of the activities of several
+interested companies.
+.in-2n
+.\"Witten-1980-5
+.]-
+.ds [A Witten, I.H.
+.ds [D 1980
+.ds [T Communicating with microcomputers
+.ds [I Academic Press
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+A recent book on microcomputer technology, this is unusual in that
+it contains a major section on speech communication
+with computers (as well as ones
+on computer buses, interfaces, and graphics).
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "2  WHAT IS SPEECH?"
+.ds RT "What is speech?
+.ds CX "Principles of computer speech
+.pp
+People speak by using their vocal cords as a sound source, and making rapid
+gestures of the articulatory organs (tongue, lips, jaw, and so on).
+The resulting changes in shape of the vocal tract allow production
+of the different sounds that we know as the vowels and consonants of
+ordinary language.
+.pp
+What is it necessary to learn about this process for the purposes of
+speech output from computers?
+That depends crucially upon how speech is represented in the system.
+If utterances are stored as time waveforms \(em and this is what we will be
+discussing in the next chapter \(em the structure of speech is not important.
+If frequency-related parameters of particular natural utterances are
+stored, then it is advantageous to take into account some of the
+acoustic properties of the speech waveform.
+.pp
+This point can be brought into focus by contrasting the transmission
+(or storage) of speech with that of real-life television pictures,
+as has been proposed for a videophone service.
+Massive data reductions, of the order of 50:1, can be achieved for speech,
+using techniques that are described in later chapters.  For pictures,
+data reduction is still an important issue \(em even more so for the
+videophone than for the telephone, because of the vastly higher
+information rates involved.
+Unfortunately, the potential for data reduction is much
+smaller \(em nothing like the 50:1 figure quoted above.
+This is because speech sounds have definite characteristics, imparted
+by the fact that they are produced by a human vocal tract, which
+can be exploited for data reduction.
+Television pictures have no equivalent generative structure, for
+they show just those things that the camera points at.
+.pp
+Moving up from frequency-related parameters of
+.ul
+particular
+utterances, it
+is possible to store such parameters in a
+.ul
+general
+form which characterizes the sound segments that appear in spoken language.
+This immediately raises the issue of
+.ul
+classification
+of sound segments, to form a basis for storing generalized acoustic
+information and for retrieval of the information needed to synthesize
+any particular utterance.
+Speech is by nature continuous, and any synthesis system based upon
+discrete classification must come to terms with this by tackling
+the problems of transition from one segment to another,
+and local modification of sound segments as a function of their context.
+.pp
+This brings us to another level of representation.
+So far we have talked of the
+.ul
+acoustic
+nature of speech, but when we have to cope with transitions between
+discrete sound segments it may be fruitful to consider
+.ul
+articulatory
+properties as well.
+Any model of the speech production process
+is in effect a model of the articulatory process that generates the speech.
+Some speech research is concerned with
+modelling
+the vocal tract directly, rather than modelling the acoustic output from it.
+One might specify, for example, position of tongue and posture of jaw and lips
+for a vowel, instead of giving frequency-related
+characteristics of it.  This is a potent
+tool in linguistic research, for it brings one closer to human production of
+speech \(em in particular to the connection between brain and articulators.
+.pp
+Articulatory
+synthesis holds a promise of high-quality speech, for the transitional
+effects caused by tongue and jaw inertia can be modelled directly.
+However, this potential has
+not yet been realized.
+Speech from current articulatory models is of much poorer quality than
+that from acoustically-based synthesis methods.
+The major problem is in gaining data about articulatory
+behaviour during running speech \(em it is much easier to perform acoustic
+analysis on the resulting sound than it is to examine the vocal organs in
+action.  Because of this, the subject is not treated in this book.
+We will only look at articulatory properties insofar as they help us
+to understand, in a qualitative way, the acoustic nature of speech.
+.pp
+Speech, however, is much more than mere articulation.
+Consider \(em admittedly a rather extreme and chauvinistic example \(em the
+number of ways a girl can say "yes".
+Breathy voice, slow tempo, low pitch \(em these are all characteristics which
+affect the utterance as a whole, rather than being classifiable into
+individual sound segments.  Linguists call them "prosodic" or
+"suprasegmental" features, for they relate to overall aspects of the
+utterance, and distinguish them from "segmental" ones which concern
+the articulation of individual segments of syllables.
+The most important prosodic features are pitch, or fundamental frequency
+of the voice, and rhythm.
+.pp
+This chapter provides a brief introduction to the nature of the speech
+signal.  Depending upon what speech output techniques we use, it may be
+necessary to understand something of the acoustic nature of the speech
+signal; the system that generates it (the vocal tract); commonly-used
+classifications of sound segments; and the prosodic aspects of speech.
+This material is little used in the early chapters of the book, but
+becomes increasingly important as the story unfolds.
+Hence you may skip the remainder of this chapter if you wish, but
+should return to it later to pick up more background whenever it
+becomes necessary.
+.sh "2.1  The anatomy of speech"
+.pp
+The so-called "voiced" sounds of speech \(em like the sound you make when
+you say "aaah" \(em are produced by passing air up from the lungs through
+the larynx or voicebox, which is situated just behind the Adam's apple.
+The vocal tract from the larynx to the lips acts as a resonant cavity,
+amplifying certain frequencies and attenuating others.
+.pp
+The waveform generated by the larynx, however, is not simply sinusoidal.
+(If it were, the vocal tract resonances would merely
+give a sine wave of the same frequency but amplified or
+attenuated according to how close it was to the nearest resonance.)  The
+larynx contains two folds of skin \(em the vocal cords \(em which blow apart and flap
+together again in each cycle of the pitch period.
+The pitch of a male voice in speech varies from as low as 50\ Hz
+(cycles per second) to perhaps
+250\ Hz, with a typical median value of 100\ Hz.
+For a female voice the range is higher, up to about 500\ Hz in speech.
+Singing can go much higher:  a top C sung by a soprano has a frequency
+of just over 1000\ Hz, and some opera singers can reach
+substantially higher than this.
+.pp
+The flapping action of the vocal cords
+gives a waveform which can be approximated by a
+triangular pulse (this and other approximations will be discussed in
+Chapter 5).
+It has a rich spectrum of harmonics,
+decaying at around 12\ dB/octave, and each harmonic is affected
+by the vocal tract resonances.
+.rh "Vocal tract resonances."
+A simple model of the vocal tract is an organ-pipe-like cylindrical tube
+(Figure 2.1),
+with a sound source at one end (the larynx) and open at the other (the lips).
+.FC "Figure 2.1"
+This has resonances at wavelengths $4L$, $4L/3$, $4L/5$, ..., where $L$
+is the length of the tube;
+and these correspond to frequencies $c/4L$, $3c/4L$, $5c/4L$, ...\ Hz, $c$
+being the speed of
+sound in air.
+Calculating these frequencies, using a typical figure for the
+distance between larynx and lips of 17\ cm,
+and $c = 340$\ m/s for the speed of sound, leads to resonances at
+approximately 500\ Hz, 1500\ Hz, 2500\ Hz, ... .
+.pp
+When excited by the harmonic-rich waveform of the larynx,
+the vocal tract resonances produce
+peaks known as
+.ul
+formants
+in the energy spectrum of the speech wave (Figure 2.2).
+.FC "Figure 2.2"
+The lowest formant, called formant one, varies from around 200\ Hz
+to 1000\ Hz during speech, the exact range depending on the size
+of the vocal tract.
+Formant two varies from around 500 to 2500\ Hz, and formant three
+from around 1500 to 3500\ Hz.
+.pp
+You can easily hear the lowest formant by whispering the vowels in
+the words "heed", "hid", "head", "had", "hod", "hawed", and "who'd".
+They appear to have a steadily descending pitch, yet since you are
+whispering there is no fundamental frequency.
+What you hear is the lowest resonance of the vocal tract \(em formant one.
+Some masochistic people can play simple tunes with this formant by putting
+their mouth in successive vowel shapes and knocking the top of their head
+with their knuckles \(em hard!
+.pp
+A difficulty occurs when trying to identify the lower formants for speakers
+with high-pitched voices.
+When a formant frequency falls below the fundamental excitation frequency
+of the voice, its effect is diminished \(em although it is still present.
+The vibrato used by opera singers provides a very low-frequency excitation
+(at the vibrato rate) which helps to illuminate the lower formants even
+when the pitch of the voice is very high.
+.pp
+Of course, speech is not a static phenomenon.
+The organ-pipe model describes the speech spectrum during a continuously
+held vowel with the mouth in a neutral position such as for "aaah".
+But in real speech the tongue and lips are in continuous motion,
+altering the shape of the vocal tract and hence the positions of the resonances.
+It is as if the organ-pipe were being squeezed and expanded in
+different places all the time.
+Say
+.ul
+ee
+as in "heed" and feel how close your tongue is to the roof of your mouth,
+causing a constriction near the front of the vocal cavity.
+.pp
+Linguists and speech engineers use a special frequency analyser called a
+"sound spectrograph" to make a three-dimensional plot of the variation
+of the speech energy spectrum with time.
+Figure 2.3 shows a spectrogram of the
+utterance "go away".
+.FC "Figure 2.3"
+Frequency is given on the vertical axis,
+and bands are shown at the beginning to indicate the scale.
+Time is plotted horizontally,
+and energy is given by the darkness of any particular area.
+The lower few formants can be seen as dark bands extending horizontally,
+and they are in continuous motion.
+In the neutral first vowel of "away", the formant frequencies
+pass through
+approximately the 500\ Hz, 1500\ Hz, and 2500\ Hz that we calculated earlier.
+(In fact, formants two and three are somewhat lower than these values.)
+.pp
+The
+fine vertical striations in the spectrogram correspond to single openings of the vocal cords.
+Pitch changes continuously throughout an utterance,
+and this can be seen on the spectrogram by the differences in spacing
+of the striations.
+Pitch change, or
+.ul
+intonation,
+is singularly important in
+lending naturalness to speech.
+.pp
+On a spectrogram, a continuously held vowel shows up as a static energy spectrum.
+But beware \(em what we call a vowel in everyday language is not the same thing as a
+"vowel" in phonetic terms.
+Say "I" and feel how the tongue moves continuously while you're speaking.
+Technically, this is a
+.ul
+diphthong
+or slide between two vowel positions,
+and not a single vowel.
+If you say
+.ul
+ar
+as in "hard",
+and change slowly to
+.ul
+ee
+as in "heed", you will obtain a diphthong not unlike that in "I".
+And there are many more phonetically different vowel sounds
+than the a, e, i, o, and u that we normally think of.
+The words "hood" and "mood" have different vowels, for example, as do "head" and "mead".
+The principal acoustic difference between the various vowel sounds
+is in the frequencies of the first two formants.
+.pp
+A further complication is introduced by the nasal tract.  This is
+a large cavity which is coupled to the oral tract by a passage at the
+back of the mouth.
+The passage is guarded by a flap of skin called the "velum".
+You know about this because inadvertent opening of the velum while
+swallowing causes food or drink to go up your nose.
+The nasal cavity is switched in and out of the vocal tract
+by the velum during speech.
+It is used for consonants
+.ul
+m,
+.ul
+n,
+and the
+.ul
+ng
+sound in the word
+"singing".
+Vowels are frequently nasalized too.
+A very effective demonstration of the amount of nasalization in ordinary
+speech can be obtained by cutting a nose-shaped hole in a large
+baffle which divides a room, speaking normally with one's nose in the hole,
+and having someone listen on the other side.
+The frequency of occurrence of
+nasal sounds, and the volume of sound that is emitted
+through the nose, are both surprisingly large.
+Interestingly enough, when we say in conversation that someone sounds
+"nasal", we usually mean "non-nasal".  When the nasal passages are
+blocked by a cold, nasal sounds are missing \(em
+.ul
+n\c
+\&'s turn into
+.ul
+d\c
+\&'s,
+and
+.ul
+m\c
+\&'s to
+.ul
+b\c
+\&'s.
+.pp
+When the nasal cavity is switched in to the vocal tract, it introduces
+formant resonances, just as the oral cavity does.
+Although we cannot
+alter the shape of the nasal tract significantly, the nasal formant
+pattern is not fixed, because the oral tract does play a part in nasal
+resonances.
+If you say
+.ul
+m,
+.ul
+n,
+and
+.ul
+ng
+continuously, you can hear the difference and feel how it is produced by
+altering the combined nasal/oral tract resonances with your tongue position.
+The nasal cavity operates in parallel with
+the oral one:  this causes the two resonance patterns to be summed
+together, with resulting complications which will be discussed in Chapter 5.
+.rh "Sound sources."
+Speech involves sounds other than those caused by regular vibration of
+the larynx.
+When you whisper, the folds of the larynx are held slightly
+apart so that the air passing between them becomes turbulent, causing a noisy excitation
+of the resonant cavity.
+The formant peaks are still present, superimposed on the noise.  Such
+"aspirated" sounds occur in the
+.ul
+h
+of "hello", and for a very short time
+after the lips are opened at the beginning of "pit".
+.pp
+Constrictions made in the mouth produce hissy noises such as
+.ul
+ss,
+.ul
+sh,
+and
+.ul
+f.
+For example, in
+.ul
+ss
+the tip of the tongue is high up,
+very close to the roof of the mouth.
+Turbulent air passing through this constriction causes a
+random noise excitation, known as "frication".
+Actually, the roof of the mouth is quite a complicated object.
+You can feel with your tongue a bony hump or ridge just behind the front
+teeth, and it is this that forms a constriction with the tongue for
+.ul
+s.
+In
+.ul
+sh,
+the tongue is flattened close to the roof of the mouth slightly farther back,
+in a position rather similar to that for
+.ul
+ee
+but with a narrower
+constriction,
+while
+.ul
+f
+is produced with the upper teeth and lower lip.
+Because they are made near the front of the mouth,
+the resonances of the vocal tract have little effect on these fricative
+sounds.
+.pp
+To distinguish them from aspiration and frication, the ordinary speech
+sounds (like "aaah") which have their source in larynx vibration are
+known technically as "voiced".  Aspirated and fricative sounds are called
+"unvoiced".  Thus the three different sound types can be classified as
+.LB
+.NP
+voiced
+.NP
+unvoiced (fricative)
+.NP
+unvoiced (aspirated).
+.LE
+Can any of these three types occur together?
+It would seem that voicing and aspiration can not, for the former requires
+the larynx to be vibrating regularly, but for the latter it must be
+generating turbulent noise.
+However, there is a condition known technically as "breathy voice"
+which occurs when the vocal cords are slightly apart, still vibrating,
+but with a large volume of air passing between to create turbulence.
+Voicing can easily occur in conjunction with frication.
+Corresponding to
+.ul
+s,
+.ul
+sh,
+and
+.ul
+f
+we get the
+.ul
+voiced
+fricatives
+.ul
+z,
+the sound in the middle of words like "vision" which I will call
+.ul
+zh,
+and
+.ul
+v.
+A simple illustration of voicing is to say "ffffvvvvffff\ ...".
+During the voiced part you can feel the larynx vibrations with a finger
+on your Adam's apple, and it can be heard quite clearly if you stop up
+your ears.
+Technically, there is nothing to prevent frication and aspiration
+from occurring together \(em they do, for example, when a voiced fricative
+is whispered \(em but the combination is not an important one.
+.pp
+The complicated acoustic effects of noisy excitations in speech can be
+seen in the spectrogram in Figure 2.4 of
+"high altitude jets whizz past screaming".
+.FC "Figure 2.4"
+.rh "The source-filter model of speech production."
+We have been talking in terms of a sound source (be it voiced or unvoiced)
+exciting the resonances of the oral (and possible the nasal) tract.
+This model, which is used extensively in speech analysis and synthesis,
+is known as
+the source-filter model of speech production.  The reason for its success
+is that the effect of the resonances can be modelled as a frequency-selective
+filter, operating on an input which is the source excitation.
+Thus the frequency spectrum of the source is modified by multiplying it
+by the frequency characteristic of the filter (or adding it, if amplitudes
+are expressed logarithmically).
+This can be seen in Figure 2.5, which shows a source
+spectrum and filter characteristic which combine to give the overall
+spectrum of Figure 2.2.
+.FC "Figure 2.5"
+.pp
+Although, as mentioned above, the various fricatives are not subjected
+to the resonances of the vocal tract to the same extent
+that voiced and aspirated
+sounds are, they can still be modelled as a noise source followed by
+a filter to give them their different sound qualities.
+.pp
+The source-filter model is an oversimplification of the actual speech
+production system.  There is inevitably some coupling between the vocal
+tract and the lungs, through the glottis, during the period when
+it is open.  This effectively makes the filter characteristics
+change during each individual cycle of the excitation.
+However, although the effect is of interest to speech researchers,
+it is probably not of great significance for practical speech output.
+.pp
+One very interesting implication of the
+source-filter model is that the prosodic features of
+pitch and amplitude are largely properties of the source; while
+segmental ones are introduced by the filter.  This makes it possible to
+separate some aspects of
+overall prosody from the actual segmental content of an
+utterance, so that, for example, a human utterance can be stored initially
+and then spoken by a machine with a variety of different intonations.
+.sh "2.2  Classification of speech sounds"
+.pp
+The need to classify sound segments as a basis for storing generalized acoustic
+information and retrieving it was mentioned earlier.  There is a real
+difficulty here because speech is by nature continuous and classifications are
+discrete.
+It is important to remember this difficulty because it is all too easy
+to criticize the complex and often confusing attempts of linguists to
+tackle the classification task.
+.pp
+Linguists call a written representation of the
+.ul
+sounds
+of an utterance a "phonetic
+transcription" of it.  The same utterance can be transcribed at
+different levels of detail:  simple transcriptions are called "broad"
+and more specific ones are called "narrow".
+Perhaps the most logically satisfying kind of transcription employs units
+termed "phonemes".  This is the broadest transcription,
+and is sometimes called a
+.ul
+phonemic
+transcription to emphasize that that it is in terms of phonemes.
+Unfortunately, the word "phoneme" is often used somewhat loosely.
+In its true sense, a phoneme is a
+.ul
+logical
+unit, rather than a physical, acoustic, one,
+and is defined in relation to a particular language by reference
+to its use in discriminating different words.
+Classifications of sounds which are based on their
+semantic
+role as word-discriminators are called
+.ul
+phonological
+classifications:  we could ensure that there is no ambiguity in the sense
+with which we use the term "phoneme" by calling it a phonological unit, and
+the phonemic transcription could be called a phonological one.
+.rh "Broad phonetic transcription."
+A phoneme is an abstract unit representing a set of different sounds.
+The issue is confused by the fact that the members of the set actually
+sound very similar, if not identical, to the untrained ear \(em precisely because
+the difference between them plays no part in distinguishing words from
+each other in the particular language concerned.
+.pp
+Take the words "key" and "caw", for example.  Despite the difference in
+spelling, both of them begin with a
+.ul
+k
+sound that belongs (in English)
+to the same phoneme set, called
+.ul
+k.
+However, say them two or three times each, concentrating on the position of
+the tongue during the
+.ul
+k.
+It is quite different in each case.  For "key", it
+is raised, close to the roof of the mouth, in preparation for the
+.ul
+ee,
+whereas in "caw" it is much lower down.
+The sound of the
+.ul
+k
+is actually quite different in the two cases.
+Yet they belong to the same phoneme, for there is no pair of words which
+relies on this difference to distinguish them \(em "key" and "caw" are
+obviously distinguished by their vowels, not by the initial
+consonant.
+You probably cannot hear clearly the difference between the two
+.ul
+k\c
+\&'s,
+precisely because they belong to the same phoneme and so the difference
+is not important (for English).
+.pp
+The point is sharpened by considering another language where we make a
+distinction \(em and hence can hear the difference \(em between two sounds
+that belong, in the language, to the same phoneme.
+Japanese does not distinguish
+.ul
+r
+from
+.ul
+l.
+Japanese people
+.ul
+do not hear
+the difference between "lice" and "rice", in the same way that you do
+not hear the difference between the two
+.ul
+k\c
+\&'s above.
+Cockneys do not hear, except with a special effort, the difference
+between "has" and "as", or "haitch" and "aitch", for the Cockney dialect
+does not recognize initial
+.ul
+h\c
+\&'s.
+.pp
+So what is a phoneme?  It is a set of sounds whose members do not
+discriminate between any words in the language under consideration.
+If you are mathematically minded you could think of it as an equivalence
+class of sounds, determined by the relationship
+.LB
+$sound sub 1$ is related to $sound sub 2$ if $sound sub 1$ and $sound sub 2$
+do not discriminate any pair of words in the language.
+.LE
+The
+.ul
+p
+and
+.ul
+d
+in
+"pig" and "dig" belong to different phonemes (in English),
+because they discriminate
+the two words.
+.ul
+b,
+.ul
+f,
+and
+.ul
+j
+belong to different phonemes again.
+.ul
+i
+and
+.ul
+a
+in "hid" and "had" belong to different phonemes too.
+Proceeding like this, a list of phonemes can be drawn up.
+.pp
+Such a list is shown in Table 2.1, for British English.
+(The layout of the list does have some significance in terms of different
+categories of phonemes, which will be explained later.)  In fact,
+linguists use an
+assortment of English letters, foreign letters, and special
+symbols to represent phonemes.  In this book we use one- or two-letter
+codes, partly because they are more mnemonic, and partly because
+they are more suitable for communication to computers using standard
+peripheral devices.
+They are
+a direct transliteration of linguists' standard International Phonetic
+Association symbols.
+.RF
+.nr x1 3m+1.0i+0.5i+0.5i+0.5i+\w'y'u
+.nr x1 (\n(.l-\n(x1)/2
+.in \n(x1u
+.ta 3m +1.0i +0.5i +0.5i +0.5i +0.5i +0.5i
+\fIuh\fR	(the)	\fIp\fR	\fIt\fR	\fIk\fR
+\fIa\fR	(bud)	\fIb\fR	\fId\fR	\fIg\fR
+\fIe\fR	(head)	\fIm\fR	\fIn\fR	\fIng\fR
+\fIi\fR	(hid)
+\fIo\fR	(hod)	\fIr\fR	\fIw\fR	\fIl\fR	\fIy\fR
+\fIu\fR	(hood)
+\fIaa\fR	(had)	\fIs\fR	\fIz\fR
+\fIee\fR	(heed)	\fIsh\fR	\fIzh\fR
+\fIer\fR	(heard)	\fIf\fR	\fIv\fR
+\fIuu\fR	(food)	\fIth\fR	\fIdh\fR
+\fIar\fR	(hard)	\fIch\fR	\fIj\fR
+\fIaw\fR	(hoard)	\fIh\fR
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 2.1 The phonemes of British English"
+.pp
+We will discuss the sounds which make up each of these phoneme classes
+shortly.  First, however, it is worthwhile pointing out some rather
+tricky points in the definition of these phonemes.
+.rh "Phonological difficulties."
+There are snags with phonological classification, as there are
+in any area where attempts are made to make completely logical
+statements about human activity.
+Consider
+.ul
+h
+and the
+.ul
+ng
+in "singing".
+(\c
+.ul
+ng
+is certainly not an
+.ul
+n
+sound followed by a
+.ul
+g
+sound, although
+it is true that in some English accents "singing" is rendered with
+the
+.ul
+ng
+followed by a
+.ul
+g
+at each of its two occurrences.)  No words
+end with
+.ul
+h,
+and none begin with
+.ul
+ng.
+(Notice that we are still talking about British English.
+In Chinese, the sound
+.ul
+ng
+is a word in its own right, and is a common
+family name.
+But we must stick with one language for phonological classification.)  Hence
+it follows that there is no pair of words which is distinguished
+by the difference between
+.ul
+h
+and
+.ul
+ng.
+Technically,
+they belong to the same phoneme.  However, technical considerations
+in this case must take second place to common sense!
+.pp
+The
+.ul
+j
+in "jig" is another interesting case.  It can be considered
+to belong to a
+.ul
+j
+phoneme, or to be a sequence of two
+phonemes,
+.ul
+d
+followed by
+.ul
+zh
+(the sound in "vision").  There is
+disagreement on this point in phonetics textbooks, and we do not
+have the time (nor, probably, the inclination!) to consider the
+pros and cons of this moot point.
+I have resolved the matter arbitrarily by writing it as a separate
+phoneme.  The
+.ul
+ch
+in "choose" is a similar case
+(\c
+.ul
+t
+followed by the
+.ul
+sh
+in "shoes").
+.pp
+Another difficulty, this time where Table 2.1 does not show how to
+distinguish between two sounds which
+.ul
+do
+discriminate words in many people's English, is the
+.ul
+w
+in "witch"
+and that in "which".  The latter is conventionally transcribed
+as a sequence of two phonemes,
+.ul
+h w.
+.pp
+The last few difficulties are all to do with deciding whether a
+sound belongs to a single phoneme class, or comprises a sequence
+of sounds each of which belongs to a phoneme.
+Are the
+.ul
+j
+in "jug", the
+.ul
+ch
+in "chug", and the
+.ul
+w
+in "which",
+single phonemes or not?  The definition above of a phoneme
+as a "set of sounds whose members do not discriminate any words
+in the language" does not help us to answer this question.
+As far as this definition is concerned, we could go so far as
+to call each and every word of the language an individual phoneme!
+It is clear that some acoustic evidence, and quite a lot of judgement,
+is being used when phonemes such as those of Table 2.1 are defined.
+.pp
+So much for the consonants.  This same problem occurs in vowel sounds,
+particularly in diphthongs, which are sequences of two vowel-like sounds.
+Do the vowels of "main" and "man" belong to different phonemes?
+Clearly so, if they are both transcribed as single units, for they
+distinguish the two words.
+Notwithstanding the fact that they are sequences of separate sounds,
+a logically consistent system could be constructed which gave separate,
+unitary, symbols to each diphthong.
+However, it is usual to employ a compound symbol which indicates explicitly
+the character of the two vowel-like sounds involved.
+We will transcribe the diphthong of "main" as a sequence of two
+vowels,
+.ul
+e
+(as in "head") and
+.ul
+i
+(as in "hid", not "I").
+This is done primarily for economy of symbols, choosing the constituent
+sounds on the basis of the closest match to existing vowel sounds.
+(Note that this again violates purely
+.ul
+logical
+criteria for identifying phonemes.)
+.rh "Categories of speech sounds."
+A phoneme is defined as a set of sounds whose members to not discriminate
+between any words in the language under consideration.
+The phonemes themselves can be classified into groups which reflect
+similarities between them.
+This can be done in many different ways, using various criteria
+for classification.  In fact, one branch of linguistic research
+is concerned with defining a set of "distinctive
+features" such that a phoneme class is uniquely identified by
+the values of the features.  Distinctive features are binary,
+and include such things as voiced\(emunvoiced, fricative\(emnot\ fricative,
+aspirated\(emunaspirated.  We will not be concerned here with such
+detailed classifications, but it is as well to know that they exist.
+.pp
+There is an everyday distinction between vowels and consonants.
+A vowel forms the nucleus of every syllable, and one or more consonants
+may optionally surround the vowel.
+But the distinction sometimes becomes a little ambiguous.
+Syllables like
+.ul
+sh
+are commonly uttered and certainly do not
+contain a vowel.  Furthermore, when we say "vowel" in everyday
+language we usually refer to the
+.ul
+written
+vowels a, e, i, o, and u; there are many more vowel sounds.
+A vowel in orthography is different to a vowel as a phoneme.
+Is a diphthong a phonetic vowel?  \(em certainly, by the syllable-nucleus
+criterion; but it is a little different from ordinary vowels because
+it is a changing sound rather than a constant one.
+.pp
+Table 2.2 shows one classification of the phonemes of Table 2.1, which
+will be useful in our later studies of speech synthesis from phonetics.
+It shows twelve vowels, including the rather peculiar one
+.ul
+uh
+(which corresponds to the first vowel in the word "above").
+This is the sound produced by the vocal tract when it is in a relaxed,
+neutral position; and it never occurs in prominent, stressed,
+syllables.  The vowels later in the list are almost always longer
+than the earlier ones.  In fact, the first six
+(\c
+.ul
+uh, a, e, i, o, u\c
+)
+are often called "short" vowels, and the last five
+(\c
+.ul
+ee, er, uu, ar, aw\c
+)
+"long" ones.  The shortness or longness of the one in the middle
+(\c
+.ul
+aa\c
+)
+is rather ambiguous.
+.RF
+.nr x0 \w'000unvoiced fricative    'u
+.nr x1 \n(x0+\w'[not classified as individual phonemes]'u
+.nr x1 (\n(.l-\n(x1)/2
+.in \n(x1u
+.ta \n(x0u
+.fi
+vowel	\c
+.ul
+uh  a  e  i  o  u  aa  ee  er  uu  ar  aw
+.br
+diphthong	[not classified as individual phonemes]
+.br
+glide (or liquid)	\c
+.ul
+r  w  l  y
+.br
+stop
+.br
+\0\0\0unvoiced stop	\c
+.ul
+p  t  k
+.br
+\0\0\0voiced stop	\c
+.ul
+b  d  g
+.br
+nasal	\c
+.ul
+m  n  ng
+.br
+fricative
+.br
+\0\0\0unvoiced fricative	\c
+.ul
+s  sh  f  th
+.br
+\0\0\0voiced fricative	\c
+.ul
+z  zh  v  dh
+.br
+affricate
+.br
+\0\0\0unvoiced affricate	\c
+.ul
+ch
+.br
+\0\0\0voiced affricate	\c
+.ul
+j
+.br
+aspirate	\c
+.ul
+h
+.nf
+.in 0
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.FG "Table 2.2 Phoneme categories"
+.pp
+Diphthongs pose no problem here because we have not classified them
+as single phonemes.
+.pp
+The remaining categories are consonants.  The glides are quite
+similar to vowels and diphthongs, though; for they are voiced,
+continuous sounds.  You can say them and prolong them.
+(This is also true of the fricatives.) 
+.ul
+r
+is interesting
+because it can be realized acoustically in very different ways.
+Some people curl the tip of the tongue
+back \(em a so-called retroflex action of the tongue.  Many people
+cannot do this, and their
+.ul
+r\c
+\&'s sound like
+.ul
+w\c
+\&'s.
+The stage Scotsman's
+.ul
+r
+is a trill where the tip of the tongue vibrates against the roof of the mouth.
+.ul
+l
+is also
+slightly unusual, for it is the only English phoneme which is "lateral" \(em
+air passes either side of it, in two separate passages.  Welsh
+has another lateral sound, a fricative, which is written "ll" as
+in "Llandudno".
+.pp
+The next category is the stops.  These are formed by stopping up
+the mouth, so that air pressure builds up behind the lips, and
+releasing this pressure suddenly.  The result is a little
+explosion (and the stops are often called "plosives"), which
+usually creates a very short burst of fricative noise (and, in some cases,
+aspiration as well).  They are further subdivided into voiced and
+unvoiced stops, depending upon whether voicing starts as soon as
+the plosion occurs (sometimes even before) or well after it.
+If you put your hand in front of your mouth when saying "pit" you
+can easily feel the puff of air that signals the plosion on the
+.ul
+p,
+and probably on the
+.ul
+t
+as well.
+.pp
+In a sense, nasals are really stops as well (and they are often
+called stops), for the oral tract is blocked although the nasal
+one is not.  The peculiar fact that the nasal
+.ul
+ng
+never occurs at the beginning of a word (in English) was mentioned
+earlier.  Notice that for stops and nasals there is a similarity in the
+.ul
+vertical
+direction of Table 2.2, between
+.ul
+p,
+.ul
+b,
+and
+.ul
+m;
+.ul
+t,
+.ul
+d,
+and
+.ul
+n;
+and
+.ul
+k,
+.ul
+g,
+and
+.ul
+ng.
+.ul
+p
+is an unvoiced version of
+.ul
+b
+(try saying them),
+and
+.ul
+m
+is a nasalized version (for
+.ul
+b
+is what you get when you
+have a cold and try to say
+.ul
+m\c
+).
+These three sounds are all made
+at the front of the mouth, while
+.ul
+t,
+.ul
+d,
+and
+.ul
+n,
+which bear the
+same resemblance to each other, are made in the middle; and
+.ul
+k,
+.ul
+g,
+and
+.ul
+ng
+are made at the back.  This introduces another
+possible classification, according to
+.ul
+place of articulation.
+.pp
+The unvoiced fricatives are quite straightforward, except perhaps
+for
+.ul
+th,
+which is the sound at the beginning of "thigh".
+They are paired with the voiced fricatives on the basis of place
+of articulation.  The voiced version of
+.ul
+th
+is the
+.ul
+dh
+at
+the beginning of "thy".
+.ul
+zh
+is a fairly rare phoneme, which
+is heard in the middle of "vision".  Affricates are similar to
+fricatives but begin with a stopped posture, and we mentioned earlier
+the controversy as to whether they should be considered to be
+single phonemes, or
+sequences of stop phonemes and fricatives.
+Finally comes the lonely aspirate,
+.ul
+h.
+Aspiration does occur
+elsewhere in speech, during the plosive burst of unvoiced stops.
+.rh "Narrow phonetic transcription."
+The phonological classification outlined above is based upon a clear
+rationale for distinguishing between sounds according to how
+they affect meaning \(em although the rationale does become
+somewhat muddied in difficult cases.
+Narrower transcriptions are not so systematic.
+They use units called
+.ul
+allophones,
+which are defined by reference to physical, acoustic, criteria rather
+than purely logical ones.
+("Phone" is a more old-fashioned term for the same thing,
+and the misused word "phoneme" is often employed where allophone is
+meant, that is, as a physical rather than a logical
+unit.)  Each phoneme has several allophones,
+more or less depending on how narrow or broad the transcription is,
+and the allophones are different acoustic realizations of the same
+logical unit.
+For example, the
+.ul
+k\c
+\&'s in "key" and "caw" may be considered as different
+allophones (in a slightly narrow transcription).
+Although we will not use symbols for allophones here,
+they are often indicated by diacritical marks in a text
+which modify the basic phoneme classes.
+For example, a tilde (~) over a vowel means that it is nasalized, while a small
+circle underneath a consonant means that it is devoiced.
+.pp
+Allophonic variation in speech is governed by a mechanism called
+.ul
+coarticulation,
+where a sound is affected by those that come either side of it.
+"Key"\-"caw" is a clear example of this, where the tongue
+position in the
+.ul
+k
+anticipates that of the following vowel \(em high
+in the first case, low in the second.
+Most allophonic variation in English is anticipatory, in that the sound
+is influenced by the following articulation rather than by
+preceding ones.
+.pp
+Nasalization is a feature which applies to vowels in English through
+anticipatory coarticulation.
+In many languages (for example, French) it is a
+.ul
+distinctive
+feature for vowels in that it serves to distinguish one vowel phoneme class
+from another.
+That this is not so in English sometimes tempts us to assume,
+incorrectly, that nasalization does not occur in vowels.
+It does, typically when the vowel is followed by a nasal consonant, and it is
+important for synthesis that nasalized vowel allophones are recognized and
+treated accordingly.
+.pp
+Coarticulation can be predicted by phonological rules, which show
+how a phonemic sequence will be realized by allophones.
+Such rules have been studied extensively by linguists.
+.pp
+The reason for coarticulation, and for the existence of allophones,
+lies in the physical constraints imposed by the motion
+of the articulatory organs \(em particularly their acceleration and deceleration.
+An immensely crude model is that the brain decides what phonemes to
+say (for it is concerned with semantic things, and the definition
+of a phoneme is a semantic one).
+It then takes this sequence and translates it into neural commands
+which actually move the articulators into target positions.
+However, other commands may be issued, and executed, before these targets
+are reached, and this accounts for coarticulation effects.
+Phonological rules for converting a phonemic sequence to an
+allophonic one are a sort of discrete model of the process.
+Particularly for work involving computers, it is possible that this
+rule-based approach will be overtaken by potentially more accurate
+methods which attempt to model the continuous articulatory phenomena
+directly.
+.sh "2.3  Prosody"
+.pp
+The phonetic classification introduced above divides speech into
+segments and classifies these into phonemes or allophones.
+Riding on top of this stream of segments are other, more global,
+attributes that dictate the overall prosody of the utterance.
+Prosody is defined by the Oxford English Dictionary as the
+"science of versification, laws of metre,"
+which emphasizes the aspects of stress and rhythm that are central
+to classical verse.
+There are, however, many other features which are more or less
+global.
+These are collectively called prosodic or, equivalently, suprasegmental,
+features, for they lie above the level of phoneme or syllable segments.
+.pp
+Prosodic features can be split into two basic categories:  features
+of voice quality and features of voice dynamics.
+Variations in voice quality, which are sometimes called
+"paralinguistic" phenomena, are accounted for by anatomical
+differences and long-term muscular idiosyncrasies (like a sore
+throat), and have little part to play in the kind of applications
+for speech output that have been sketched in Chapter 1.
+Variations in voice dynamics occur in three dimensions:  pitch
+or fundamental frequency of the voice, time, and amplitude.
+Within the first, the pattern of pitch variation, or
+.ul
+intonation,
+can be distinguished from the overall range within which that variation
+occurs.
+The time dimension encompasses the rhythm of the speech, pauses, and the
+overall tempo \(em whether it is uttered quickly or slowly.
+The third dimension, amplitude, is of relatively minor importance.
+Intonation and rhythm work together to produce an effect commonly called
+"stress", and we will elaborate further on the nature of stress and discuss
+algorithms for synthesizing intonation and rhythm in Chapter 8.
+.pp
+These features have a very important role to play in communicating meaning.
+They are not fancy, optional components.
+It is their neglect which is largely responsible for the layman's
+stereotype of computer speech,
+a caricature of living speech \(em abrupt, arhythmic, and in a grating
+monotone \(em
+which was well characterized by Isaac Asimov when he wrote of speaking
+"all in capital letters".
+.pp
+Timing has a syntactic function in that it sometimes helps to
+distinguish nouns from
+verbs
+(\c
+.ul
+ex\c
+tract versus ex\c
+.ul
+tract\c
+).
+and adjectives from verbs (app\c
+.ul
+rox\c
+imate versus approxi\c
+.ul
+mate\c
+) \(em although segmental aspects play a part here too, for the vowel
+qualities differ in each pair of words.
+Nevertheless, if you make a mistake when assigning stress to words
+like these in conversation you are very likely to be queried as
+to what you actually said.
+.pp
+Intonation has a big effect on meaning too.
+Pitch often \(em but by no means always \(em rises on a question,
+the extent and abruptness of the rise depending on features like whether
+a genuine information-bearing reply or merely confirmation is expected.
+A distinctive pitch pattern accompanies the introduction of a new topic.
+In conjunction with rhythm, intonation can be used to bring out contrasts
+as in
+.LB
+.NI
+"He didn't have a
+.ul
+red
+car, he had a
+.ul
+black
+one."
+.LE
+In general, the intonation patterns used by a reader depend not only on
+the text itself, but on his interpretation of it, and also on his
+expectation of the listener's interpretation of it.
+For example:
+.LB
+.NI
+"He had a
+.ul
+red
+car" (I think you thought it was black),
+.NI
+"He had a red
+.ul
+bi\c
+cycle" (I think you thought it was a car).
+.LE
+.pp
+In natural speech, prosodic features are significantly influenced by
+whether the utterance is generated spontaneously or read aloud.
+The variations in spontaneous speech are enormous.
+There are all sorts of emotions which are plainly audible in
+everyday speech:  sarcasm, excitement, rudeness, disagreement,
+sadness, fright, love.
+Variations in voice quality certainly play a part here.
+Even with "ordinary" cooperative friendly conversation, the need to find
+words and somehow fit them into an overall utterance produces great
+diversity of prosodic structures.
+Applications for speech output from computers do not, however, call for
+spontaneous conversation, but for a controlled delivery which is
+like that when reading aloud.
+Here, the speaker is articulating utterances which have been set out for
+him, reducing his cognitive load to one of understanding and interpreting
+the text rather than generating it.
+Unfortunately for us, linguists are (quite rightly)
+primarily interested in living,
+spontaneous speech rather than pre-prepared readings.
+.pp
+Nevertheless, the richness of prosody in speech even when reading from
+a book should not be underestimated.
+Read aloud to an audience and listen to the contrasts in voice dynamics
+deliberately introduced for variety's sake.
+If stories are to be read there is even a case for controlling voice
+.ul
+quality
+to cope with quotations and affective imitations.
+.pp
+We saw earlier that the source-filter model is particularly
+helpful in distinguishing prosodic features, which are largely
+properties of the source, from segmental ones, which belong to
+the filter.
+Pitch and amplitude are primarily source properties.
+Rhythm and speed of speaking are not, but neither are they filter
+properties, for they belong to the source-filter system as a whole
+and not specifically to either part of it.
+The difficult notion of stress is, from an acoustic point of view,
+a combination of pitch, rhythm, and amplitude.
+Even some features of voice quality can be attributed to the source
+(like laryngitis), although others \(em cleft palate, badly-fitting
+dentures \(em affect segmental features as well.
+.sh "2.4  Further reading"
+.pp
+This chapter has been no more than a cursory introduction to some
+of the difficult problems of linguistics and phonetics.
+Here are some readable books which discuss these problems further.
+.LB "nn"
+.\"Abercrombie-1967-1
+.ds [F 1
+.]-
+.ds [A Abercrombie, D.
+.ds [D 1967
+.ds [T Elements of general phonetics
+.ds [I Edinburgh Univ Press
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is an excellent book which covers all of the areas of this
+chapter, in much more detail than has been possible here.
+.in-2n
+.\"Brown-1980-2
+.ds [F 2
+.]-
+.ds [A Brown, Gill
+.as [A ", Currie, K.L.
+.as [A ", and Kenworthy, J.
+.ds [D 1980
+.ds [T Questions of intonation
+.ds [I Croom Helm
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+An intensive study of the prosodics of colloquial, living speech
+is presented, with particular reference to intonation.  Although
+not particularly relevant to speech output from computers,
+this book gives great insight into how conversational speech
+differs from reading aloud.
+.in-2n
+.\"Fry-1979-1
+.ds [F 1
+.]-
+.ds [A Fry, D.B.
+.ds [D 1979
+.ds [T The physics of speech
+.ds [I Cambridge University Press
+.ds [C Cambridge, England
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is a simple and readable account of speech science, with a good
+and completely non-mathematical introduction to frequency analysis.
+.in-2n
+.\"Ladefoged-1975-4
+.ds [F 4
+.]-
+.ds [A Ladefoged, P.
+.ds [D 1975
+.ds [T A course in phonetics
+.ds [I Harcourt Brace and Johanovich
+.ds [C New York
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Usually books entitled "A course on ..." are dreadfully dull, but
+this is a wonderful exception.  An exciting, readable, almost racy
+introduction to phonetics, full of little experiments you can try
+yourself.
+.in-2n
+.\"Lehiste-1970-5
+.ds [F 5
+.]-
+.ds [A Lehiste, I.
+.ds [D 1970
+.ds [T Suprasegmentals
+.ds [I MIT Press
+.ds [C Cambridge, Massachusetts
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This fairly comprehensive study of the prosodics of speech
+complements Ladefoged's book, which is mainly concerned with segmental
+phonetics.
+.in-2n
+.\"O'Connor-1973-1
+.ds [F 1
+.]-
+.ds [A O'Connor, J.D.
+.ds [D 1973
+.ds [T Phonetics
+.ds [I Penguin
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is another introductory book on phonetics.
+It is packed with information on all aspects of the subject.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "3  SPEECH STORAGE"
+.ds RT "Speech storage
+.ds CX "Principles of computer speech
+.pp
+The most familiar device that produces speech output is the ordinary tape
+recorder, which stores information in analogue form on magnetic tape.
+However, this is unsuitable for speech output from computers.
+One reason is that it is difficult to access different utterances quickly.
+Although random-access tape recorders do exist, they are expensive and
+subject to mechanical breakdown because of the stresses associated with
+frequent starting and stopping.
+.pp
+Storing speech on a rotating drum instead of
+tape offers the possibility of access to any track within one revolution time.
+For example, the IBM 7770 Audio Response Unit employs drums rotating twice
+a second which are able to store up to 32 500-msec words.  These can be accessed
+randomly, within half a second at most.
+Although one can
+arrange to store longer words by allowing overflow on to an adjacent track at
+the end of the rotation period, the discrete time-slots provided by this
+system make it virtually impossible for it to generate connected utterances
+by assembling appropriate words from the store.
+.pp
+The Cognitronics Speechmaker has a similar structure, but with
+the analogue speech waveform recorded on photographic film.
+Storing audio waveforms optically is not an unusual technique, for this is how
+soundtracks are recorded on ordinary movie films.  The original version of
+the "speaking clock" of the British Post Office used optical storage in
+concentric tracks on flat glass discs.
+It is described by Speight and Gill (1937),
+who include a fascinating account of how the utterances are synchronized.
+.[
+Speight Gill 1937
+.]
+A 4\ Hz signal from a pendulum clock was used to supply current to an electric
+motor, which drove a shaft equipped with cams and gears that rotated
+the glass discs containing utterances for seconds, minutes, and hours
+at appropriate speeds!
+.pp
+A second reason for avoiding analogue storage is price.  It is difficult to see how a random-access
+tape recorder could be incorporated into a talking pocket calculator or
+child's toy without considerably inflating the cost.
+Solid-state electronics is much cheaper than mechanics.
+.pp
+But the best reason is that, in many of the applications we have discussed,
+it is necessary to form utterances by concatenating separately-recorded
+parts.  It is totally infeasible, for example, to store each and every
+possible telephone number as an individual recording!  And
+utterances that are formed by concatenating individual words which were
+recorded in isolation, or in a different context, do not sound completely
+natural.  For example, in an early experiment, Stowe and Hampton (1961) recorded
+individual words on acoustic tape, spliced the tape with the words in a different
+order to make sentences, and played the result to subjects who were scored on
+the number of key words which they identified correctly.
+.[
+Stowe Hampton 1961
+.]
+The overall conclusion was that while embedding a word in normally-spoken sentences
+.ul
+increases
+the probability of recognition (because the extra context gives clues about the
+word), embedding a word in a constructed sentence, where intonation and rhythm
+are not properly rendered,
+.ul
+decreases
+the probability of recognition.  When the speech was uttered slowly,
+however, a considerable improvement was noticed, indicating that if the
+listener has more processing time he can overcome the lack of proper intonation
+and rhythm.
+.pp
+Nevertheless, many present-day voice response systems
+.ul
+do
+store what amounts to a direct recording of the acoustic wave.
+However, the storage medium is digital rather than analogue.
+This means that standard computer storage devices can be used, providing
+rapid access to any segment of the speech at relatively low cost \(em for
+the economics of mass-production ensures a low price for random-access
+digital devices compared with random-access analogue ones.
+Furthermore, it reduces the amount of special equipment needed for speech
+output.  One can buy very cheap speech input/output interfaces for home computers
+which connect to standard hobby buses.
+Another advantage of digital over analogue recording is that
+integrated circuit read-only memories (ROMs)
+can be used for hand-held devices which need small quantities of speech.
+Hence this chapter begins by showing how waveforms are stored digitally,
+and then describes some techniques for reducing the data needed for a given
+utterance.
+.sh "3.1  Storing waveforms digitally"
+.pp
+When an analogue signal is converted to digital form, it is made discrete
+both in time and in amplitude.  Discretization in time is the operation of
+.ul
+sampling,
+whilst in amplitude it is
+.ul
+quantizing.
+It is worth pointing out that the transmission of analogue information by
+digital means is called "PCM" (standing for "pulse code modulation") in
+telecommunications jargon.
+Much of the theory of digital signal processing investigates signals which
+are sampled but not quantized (or quantized into sufficiently many levels to
+avoid inaccuracies).  The operation of quantization, being non-linear,
+is not very amenable to theoretical analysis.  Quantization introduces issues
+such as accumulation of round-off noise in arithmetic operations,
+which, although they are very important in practical implementations, can only
+be treated theoretically under certain somewhat unrealistic assumptions
+(in particular, independence of the quantization error from sample to sample).
+.rh "Sampling."
+A fundamental theorem of telecommunications states that a signal can only be
+reconstructed accurately from a sampled version if it does not contain
+components whose frequency is greater than half the frequency at which the
+sampling takes place.  Figure 3.1(a) shows how a component of slightly greater
+than half the sampling frequency can masquerade, as far as an observer with
+access only to the sampled data can tell, as a component at slightly less
+than half the sampling frequency.
+.FC "Figure 3.1"
+Call the sampling interval $T$ seconds, so that the
+sampling frequency is $1/T$\ Hz.
+Then components at $1/2T+f$, $3/2T-f$, $3/2T+f$ and so on all masquerade
+as a component at $1/2T-f$.  Similarly, components at frequencies just under
+the sampling frequency masquerade as very low-frequency components, as shown
+in Figure 3.1(b).  This phenomenon is often called "aliasing".
+.pp
+Thus the continuous, infinite, frequency axis for the unsampled signal, where
+two components at different frequencies can always be distinguished, maps
+into a repetitive frequency axis when the signal is sampled.  As depicted
+in Figure 3.2, the frequency
+interval $[1/T,~ 2/T)$ \u\(dg\d
+.FN 3
+.sp
+\u\(dg\dIntervals are specified in brackets, with a square bracket representing
+a closed end of the interval and a round one representing an open one.
+Thus the interval $[1/T,~ 2/T)$ specifies the range $1/T ~ <= ~ frequency
+~ < ~ 2/T$.
+.EF
+is mapped back into the band $[0,~ 1/T)$, as are the
+intervals $[2/T,~ 3/T)$,  $[3/T,~ 4/T)$, and so on.
+.FC "Figure 3.2"
+Furthermore, the interval $[1/2T,~ 1/T)$ between half the sampling frequency and the sampling
+frequency, is mapped back into the interval
+below half the sampling frequency; but this time the mapping is backwards,
+with frequencies at just under $1/T$ being mapped to frequencies slightly greater
+than zero, and frequencies just over $1/2T$ being mapped to ones
+just under $1/2T$.
+The best way to represent a repeating frequency axis like this is as a circle.
+Figure 3.3 shows how the linear frequency axis for continuous systems maps
+on to a circular axis for sampled systems.
+.FC "Figure 3.3"
+For present purposes it is
+easiest to imagine the bottom half of the circle as being reflected into
+the top half, so that traversing the upper semicircle in the anticlockwise direction
+corresponds to frequencies increasing from 0 to $1/2T$ (half the sample frequency),
+and returning along the lower semicircle is actually the same as coming
+back round the upper one, and corresponds to frequencies from $1/2T$ to $1/T$
+being mapped into the range $1/2T$ to 0.
+.pp
+As far as speech is concerned, then, we must ensure that before sampling a
+signal no significant components at greater than half the sample frequency
+are present.  Furthermore, the sampled signal will only contain information
+about frequency components less than this, so the sample frequency must be
+chosen as twice the highest frequency of interest.
+For example, consider telephone-quality speech.
+Telephones provide a familiar standard of speech quality which,
+although it can only be an approximate "standard",
+will be much used throughout this book.
+The telephone network
+aims to transmit only frequencies lower than 3.4\ kHz.  We saw in the
+previous chapter that this region will contain the information-bearing formants,
+and some \(em but not all \(em of the fricative and aspiration energy.
+Actually, transmitting speech through the telephone system degrades its
+quality very significantly, probably more than you realize since everyone is
+so accustomed to telephone speech.  Try the dial-a-disc service and compare
+it with high-fidelity music for a striking example of the kind of degradation
+suffered.
+.pp
+For telephone speech, the sampling frequency must be chosen to be
+at least 6.8\ kHz.
+Since speech contains significant amounts of energy above 3.4\ kHz, it should be
+filtered before sampling to remove this; otherwise the higher components
+would be mapped back into the baseband and distort the low-frequency information.
+Because it is difficult to make filters that cut off very sharply, the
+sampling frequency is chosen rather greater than twice the highest frequency of
+interest.  For example, the digital telephone network samples at 8\ kHz.
+The pre-sampling filter should have a cutoff frequency of 4\ kHz; aim for
+negligible distortion below 3.4\ kHz; and transmit negligible components
+above 4.6\ kHz \(em for these are reflected back into the band of interest,
+namely 0 to 3.4\ kHz.  Figure 3.4 shows a block diagram for the input hardware.
+.FC "Figure 3.4"
+.rh "Quantization."
+Before considering specifications for the pre-sampling filter, let us turn
+from discretization in time to discretization in amplitude, that is,
+quantization.
+This is performed by an A/D converter (analogue-to-digital), which takes as input
+a constant analogue voltage (produced by the sampler) and generates a
+corresponding binary value as output.  The simplest correspondence is
+.ul
+uniform
+quantization, where the amplitude range is split into equal regions by points
+termed "quantization levels", and the output is a binary representation of
+the nearest quantization level to the input voltage.
+Typically, 11-bit conversion is used for speech, giving 2048 quantization
+levels, and the signal is adjusted to have zero mean so that half the
+levels correspond to negative input voltages and the other half to positive
+ones.
+.pp
+It is, at first sight, surprising that as many as 11 bits are needed for
+adequate representation of speech signals.  Research on the digital telephone
+network, for example, has concluded that a signal-to-noise ratio of
+some 26\-27\ dB is enough to avoid undue harshness of quality, loss
+of intelligibility, and listener fatigue for speech at a comfortable
+level in an otherwise reasonably good channel.
+Rabiner and Schafer (1978) suggest that about 36\ dB signal-to-noise ratio
+would "most likely provide adequate quality in a communications system".
+.[
+Rabiner Schafer 1978 Digital processing of speech signals
+.]
+But 11-bit quantization seems to give a very much better signal-to-noise
+ratio than these figures.  To estimate its magnitude, note that for N-bit quantization
+the error for each sample will lie between
+.LB
+$
+- ~ 1 over 2 ~. 2 sup -N$    and    $+ ~ 1 over 2 ~. 2 sup -N .
+$
+.LE
+Assuming that it is uniformly distributed in this range \(em an assumption
+which is likely to be justified if the number of levels is sufficiently
+large \(em leads to a mean-squared error of
+.LB
+.EQ
+integral from {-2 sup -N-1} to {2 sup -N-1} ~e sup 2 p(e) de,
+.EN
+.LE
+where $p(e)$, the probability density function of the error $e$, is a constant
+which satisfies the usual probability normalization constraint, namely
+.LB
+.EQ
+integral from {-2 sup -N-1} to {2 sup -N-1} ~ p(e) de ~~=~ 1.
+.EN
+.LE
+Hence $p(e)=2 sup N $, and so the mean-squared error is  $2 sup -2N /12$.
+This is  $10 ~ log sub 10 (2 sup -2N /12)$\ dB, or around \-77\ dB for 11-bit
+quantization.
+.pp
+This noise level is relative to the maximum amplitude range of the conversion.
+A maximum-amplitude sine wave has a power of \-9\ dB relative to the same
+reference, giving a signal-to-noise ratio of some 68\ dB.  This is far in excess
+of that needed for telephone-quality speech.  However, look at the very peaky
+nature of the typical speech waveform given in Figure 3.5.
+.FC "Figure 3.5"
+If clipping is to be avoided, the maximum amplitude level of the A/D converter
+must be set at a value which makes the power of the speech signal very much
+less than a maximum-amplitude sine wave.  Furthermore, different people
+speak at very different volumes, and the overall level fluctuates constantly
+with just one speaker.  Experience shows that while 8- or 9-bit quantization
+may provide sufficient signal-to-noise ratio to preserve telephone-quality
+speech if the overall speaker levels are carefully controlled, about 11 bits
+are generally required to provide high-quality representation of speech with
+a uniform quantization.  With 11 bits, a sine wave whose amplitude is only 1/32
+of the full-scale value would be digitized with a signal-to-noise ratio
+of around 36\ dB, the most pessimistic figure quoted above for adequate quality.
+Even then it is useful if the speaker is provided
+with an indication of the amplitude of his speech:  a traffic-light
+indicator with red signifying clipping overload, orange a suitable level,
+and green too low a value, is often convenient for this.
+.rh "Logarithmic quantization."
+For the purposes of speech
+.ul
+processing,
+it is essential to have the signal quantized uniformly.  This is because
+all of the theory applies to linear systems, and nonlinearities introduce
+complexities which are not amenable to analysis.
+Uniform quantization, although a nonlinear operation, is linear in the
+limiting case as the number of levels becomes large, and for most purposes
+its effect can be modelled by assuming that the quantized signal is obtained
+from the original analogue one by the addition of a small amount of
+uniformly-distributed quantizing noise, as in fact was done above.
+Usually the quantization noise is disregarded in subsequent analysis.
+.pp
+However, the peakiness of the speech signal illustrated in Figure 3.5 leads
+one to suspect that a non-linear representation, for example a logarithmic one,
+could provide a better signal-to-noise ratio over a wider range of input
+amplitudes, and hence be more useful than linear quantization \(em at least
+for speech storage (and transmission).
+And indeed this is the case.  Linear quantization has the unfortunate effect
+that the absolute noise level is independent of the signal level, so that an excessive
+number of bits must be used if a reasonable ratio is to be achieved for peaky
+signals.  It can be shown that a logarithmic representation like
+.LB
+.EQ
+y ~ = ~ 1 ~ + ~ k ~ log ~ x,
+.EN
+.LE
+where $x$ is the original signal and $y$ is the value which is to be quantized,
+gives a
+signal-to-noise
+.ul
+ratio
+which is independent of the input signal level.
+This relationship cannot be realized physically, for it is undefined when the signal
+is negative and diverges when it is zero.
+However, realizable approximations to it can be made which retain the advantages
+of constant signal-to-noise ratio within a useful range of signal amplitudes.
+Figure 3.6 shows the logarithmic relation with one widely-used approximation to it,
+called the A-law.
+.FC "Figure 3.6"
+The idea of non-linearly quantizing a signal to achieve adequate signal-to-noise
+ratios for a wide variety of amplitudes is called "companding", a contraction
+of "compressing-expanding".  The original signal can be retrieved from
+its A-law compression by antilogarithmic expansion.
+.pp
+Figure 3.6 also
+shows one common coding scheme which is a piecewise linear approximation
+to the A-law.  This provides an 8-bit code, and gives the equivalent
+of 12-bit linear quantization for small signal levels.  It approximates
+the A-law in 16 linear segments, 8 for positive and 8 for negative
+inputs.
+Consider the positive part of the curve.  The first two segments, which
+are actually collinear, correspond exactly to 12-bit linear conversion.
+Thus the output codes 0 to 31 correspond to inputs from 0 to 31/2048,
+in equal steps.  (Remember that both positive and negative signals
+must be converted, so a 12-bit linear converter will allocate 2048 levels
+for positive signals and 2048 for negative ones.)  The next
+segment provides 11-bit linear quantization,
+output codes 32 to 47 corresponding to inputs from 16/1024 to 31/1024.
+Similarly, the next segment corresponds to 10-bit quantization, covering
+inputs from 16/512 to 31/512.  And so on, the last section giving 6-bit
+quantization of inputs from 16/32 to 31/32, the full-scale positive value.
+Negative inputs are converted similarly.
+For signal levels of less than 32/2048, that is, $2 sup -8$, this implementation
+of the A-law provides full 12-bit precision.
+As the signal level increases, the precision decreases gradually to 6 bits
+at maximum amplitudes.
+.pp
+Logarithmic encoding provides what is in effect a floating-point representation
+of the input.  The conventional floating-point format, however, is not used
+because many different codes can represent the same value.  For example, with
+a 4-bit exponent preceding a 4-bit mantissa, the words 0000:1000,
+0001:0100, 0010:0010, and 0011:0001 represent the numbers
+$0.1 ~ times ~ 2 sup 0$,  $0.01 ~ times ~ 2 sup 1
+$,  $0.001 ~ times ~ 2 sup 2$,  \c
+and  $0.0001 ~ times ~ 2 sup 3$  respectively,
+which are the same.  (Some floating-point conventions assume that an unwritten
+"1" bit precedes the mantissa, except when the whole word is zero; but this
+gives decreased resolution around zero \(em which is exactly where we want the
+resolution to be greatest.)  Table 3.1 shows the 8-bit A-law codes,
+.RF
+.in+0.7i
+.ta 1.6i +\w'bits 1-3   'u
+8-bit codeword:	bit 0	sign bit
+	bits 1-3	3-bit exponent
+	bits 4-7	4-bit mantissa
+.sp2
+.ta 1.6i 3.5i
+.ul
+ codeword	   interpretation
+.sp
+0000 0000	\h'\w'\0-\0  +  'u'$.0000 ~ times ~ 2 sup -7$
+\0\0\0...	\0\0\0\0...
+0000 1111	\h'\w'\0-\0  +  'u'$.1111 ~ times ~ 2 sup -7$
+0001 0000	$2 sup -7 ~~ + ~~ .0000 ~ times ~ 2 sup -7$
+\0\0\0...	\0\0\0\0...
+0001 1111	$2 sup -7 ~~ + ~~ .1111 ~ times ~ 2 sup -7$
+0010 0000	$2 sup -6 ~~ + ~~ .0000 ~ times ~ 2 sup -6$
+\0\0\0...	\0\0\0\0...
+0010 1111	$2 sup -6 ~~ + ~~ .1111 ~ times ~ 2 sup -6$
+0011 0000	$2 sup -5 ~~ + ~~ .0000 ~ times ~ 2 sup -5$
+\0\0\0...	\0\0\0\0...
+0011 1111	$2 sup -5 ~~ + ~~ .1111 ~ times ~ 2 sup -5$
+0100 0000	$2 sup -4 ~~ + ~~ .0000 ~ times ~ 2 sup -4$
+\0\0\0...	\0\0\0\0...
+0100 1111	$2 sup -4 ~~ + ~~ .1111 ~ times ~ 2 sup -4$
+0101 0000	$2 sup -3 ~~ + ~~ .0000 ~ times ~ 2 sup -3$
+\0\0\0...	\0\0\0\0...
+0101 1111	$2 sup -3 ~~ + ~~ .1111 ~ times ~ 2 sup -3$
+0110 0000	$2 sup -2 ~~ + ~~ .0000 ~ times ~ 2 sup -2$
+\0\0\0...	\0\0\0\0...
+0110 1111	$2 sup -2 ~~ + ~~ .1111 ~ times ~ 2 sup -2$
+0111 0000	$2 sup -1 ~~ + ~~ .0000 ~ times ~ 2 sup -1$
+\0\0\0...	\0\0\0\0...
+0111 1111	$2 sup -1 ~~ + ~~ .1111 ~ times ~ 2 sup -1$
+
+1000 0000	\h'\w'\0-\0  'u'$- ~~ .0000 ~ times ~ 2 sup -7$	negative numbers treated as
+\0\0\0...	\0\0\0\0...	above, with a sign bit of 1
+1111 1111	\h'-\w'\- 'u'\- $2 sup -1 ~~ - ~~ .1111 ~ times ~ 2 sup -1$
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 3.1  8-bit A-law codes, with their floating-point equivalents"
+according
+to the piecewise linear approximation of Figure 3.6, written in a notation which
+suggests floating point.  Each linear segment has a different exponent except
+the first two segments, which as explained above are collinear.
+.pp
+Logarithmic encoders and decoders are available from many semiconductor
+manufacturers as single-chip devices
+called "codecs" (for "coder/decoder").  Intended for use on digital communication
+links, these generally provide a serial output bit-stream, which
+should be converted to parallel by a shift register if the data is intended
+for a computer.
+Because of the potentially vast market for codecs in telecommunications,
+they are made in great quantities and are consequently very cheap.
+Estimates of the speech quality necessary for telephone applications indicate
+that somewhat less than this accuracy is needed \(em 7-bit logarithmic encoding
+was used in early digital communications links, and it may be that even 6 bits
+are adequate.  However, during the transition period when digital
+networks must coexist with the present analogue one, it is anticipated that
+a particular telephone call may have to pass through several links, some
+using analogue technology and some being digital.  The possibility of
+several successive encodings and decodings has led telecommunications
+engineers to standardize on 8-bit representations, leaving some margin
+before additional degradation of signal quality becomes unduly distracting.
+.pp
+Unfortunately, world telecommunications authorities cannot agree on a single
+standard for logarithmic encoding.  The A-law, which we have described,
+is the European standard, but there is another system, called
+the $mu$-law, which is used universally in North America.  It also is available
+in single-chip form with an 8-bit code.  It has very similar
+quantization error characteristics to the A-law, and would be indistinguishable
+from it on the scale of Figure 3.6.
+.rh "The pre-sampling filter."
+Now that we have some idea of the accuracy requirements for quantization,
+let us discuss quantitative specifications for the pre-sampling filter.
+Figure 3.7 sketches the characteristics of this filter.
+.FC "Figure 3.7"
+Assume a
+sampling frequency of 8\ kHz and a range of interest from 0 to 3.4\ kHz.
+Although all components at frequencies above 4\ kHz will fold back into
+the 0\ \-\ 4\ kHz baseband, those below 4.6\ kHz fold back above 3.4\ kHz and are
+therefore outside the range of interest.  This gives a "guard band" between
+3.4 and 4.6\ kHz which separates the passband from the stopband.  The filter
+should transmit negligible components in the stopband above 4.6\ kHz.
+To reduce the harmonic distortion caused by aliasing to the same level
+as the quantization noise in 11-bit linear conversion, the stopband
+attenuation should be around \-68\ dB (the signal-to-noise ratio for a full-scale
+sine wave).  Passband ripple is not so critical,
+for two reasons.  Whilst the presence of aliased components means that
+information has been lost about the frequency components within the range of
+interest, passband ripple does not actually cause a loss of information but
+only a distortion, and could, if necessary, be compensated by a suitable
+filter acting on the digitized waveform.  Secondly, distortion of the
+passband spectrum is not nearly so audible as the frequency images caused
+by aliasing.  Hence one usually aims for a passband ripple of around 0.5\ dB.
+.pp
+The pass and stopband targets we have mentioned above can be achieved with
+a 9'th order elliptic filter.  While such a filter is often used in
+high-quality signal-processing systems, for telephone-quality speech
+much less stringent specifications seem to be sufficient.  Figure 3.8, for
+example, shows a template which has been recommended by telecommunications
+authorities.
+.FC "Figure 3.8"
+A 5'th order elliptic filter can easily meet this specification.
+Such filters, implemented by switched-capacitor means, are available in
+single-chip form.  Integrated CCD (charge-coupled device)
+filters which meet the same specification
+are also marketed.  Indeed, some codecs provide input filtering on the same
+chip as the A/D converter.
+.pp
+Instead of implementing a filter by analogue means to meet the aliasing
+specifications, digital filtering can be used.  A high sample-rate A/D
+converter, operating at, say, 32\ kHz, and preceded by a very simple low-pass
+pre-sampling filter, is followed by a digital filter which meets the
+desired specification, and its output is subsampled to provide an 8\ kHz sample
+rate.  While such implementations may be economic where a multichannel digitizing
+capability is required, as in local telephone exchanges where the subscriber
+connection is an analogue one, they are unlikely to prove cost-effective for
+a single channel.
+.rh "Reconstructing the analogue waveform."
+Having digitized and stored a signal, it needs to be passed though a D/A
+converter (digital-to-analogue) and low-pass filter when replayed.
+D/A converters are cheaper than A/D converters, and the characteristics of the
+low-pass filter for output can be the same as those for input.
+However, the desampling operation introduces an additional distortion, which
+has an effect on the component at frequency $f$ of
+.LB
+.EQ
+{ sin ( pi f/f sub s )} over { pi f/f sub s } ~ ,
+.EN
+.LE
+where $f sub s$ is the sampling frequency.  An "aperture correction" filter is
+needed to compensate for this, although many systems simply do without it.
+Such a filter is sometimes incorporated into the codec chip.
+.rh "Summary."
+For telephone-quality speech, existing codec chips,
+coupled if necessary with integrated pre-sampling filters, can
+be used, at a remarkably low cost.
+For higher-quality speech storage the analogue interface can become quite complex.
+A comprehensive study of the problems as they relate to digitization of audio,
+which demands much greater fidelity than speech, has been made by Blesser (1978).
+.[
+Blesser 1978
+.]
+He notes the following sources of error (amongst others):
+.LB
+.NP
+slew-rate distortion in the pre-sampling filter for signals at the upper end
+of the audio band;
+.NP
+insufficient filtering of high-frequency input signals;
+.NP
+noise generated by the sample-and-hold amplifier or pre-sampling filter;
+.NP
+acquisition errors because of the finite settling time of the sample-and-hold
+circuit;
+.NP
+insufficient settling time in the A/D conversion;
+.NP
+errors in the quantization levels of the A/D and D/A converters;
+.NP
+noise in the converters;
+.NP
+jitter on the clock used for timing input or output samples;
+.NP
+aperture distortion in the output sampler;
+.NP
+noise in the output filter as a result of limited dynamic range of the
+integrated circuits;
+.NP
+power-supply noise injection or ground coupling;
+.NP
+changes in characteristics as a result of temperature or ageing.
+.LE
+Care must be taken with the analogue interface to ensure that the precision
+implied by the resolution of the A/D and D/A converters is not compromised
+by inadequate analogue circuitry.  It is especially important to eliminate
+high-frequency noise caused by fast edges on nearby computer buses.
+.sh "3.2  Coding in the time domain"
+.pp
+There are several methods of coding the time waveform of a speech signal to
+reduce the data rate for a given signal-to-noise ratio, or alternatively to
+reduce the signal-to-noise ratio for a given data rate.  They almost all require
+more processing, both at the encoding (for storage) and decoding (for
+regeneration) ends of the digitization process.  They are sometimes used to
+economize on memory in systems using stored speech,
+for example the System\ X telephone exchange and the travel consultant described
+in Chapter 1, and so will be described here.  However, it is to be expected
+that simple time-domain coding techniques will be superseded by the more complex
+linear predictive method, which is covered in Chapter 6, because this
+can give a much more substantial reduction in the data rate for only a small
+degradation in speech quality.  Hence the aim of this section is to introduce
+the ideas in a qualitative way:  theoretical development and summaries of
+results of listening tests can be found elsewhere (eg Rabiner and Schafer, 1978).
+.[
+Rabiner Schafer 1978 Digital processing of speech signals
+.]
+The methods we will examine are summarized in Table 3.2.
+.RF
+.nr x0 \w'linear PCM      'u
+.nr x1 \n(x0+\w'    adaptive quantization, or adaptive prediction,'u
+.nr x2 (\n(.l-\n(x1)/2
+.in \n(x2u
+.ta \n(x0u
+\l'\n(x1u\(ul'
+.sp
+linear PCM	linearly-quantized pulse code modulation
+.sp
+log PCM	logarithmically-quantized pulse code modulation
+	    (instantaneous companding)
+.sp
+APCM	adaptively quantized pulse code modulation
+	    (usually syllabic companding)
+.sp
+DPCM	differential pulse code modulation
+.sp
+ADPCM	differential pulse code modulation with either
+	    adaptive quantization, or adaptive prediction,
+	    or both
+.sp
+DM	delta modulation (1-bit DPCM)
+.sp
+ADM	delta modulation with adaptive quantization
+\l'\n(x1u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 3.2  Time-domain encoding techniques"
+.rh "Syllabic companding."
+We have already studied one time-domain encoding technique, namely logarithmic
+quantization, or log PCM (sometimes called "instantaneous companding").  A more
+sophisticated encoder could track slowly varying trends in the overall amplitude
+of the speech signal and use this information to adjust the quantization
+levels dynamically.  Speech coding methods based on this principle are called
+adaptive pulse code modulation systems (APCM).  Because the overall amplitude
+changes slowly, it is sufficient to adjust the quantization relatively infrequently
+(compared with the sampling rate), and this is often done at rates approximating
+the syllable rate of running speech, leading to the term "syllabic companding".
+A block floating-point format can be used, with a common exponent being
+stored every M samples (with M, say, 125 for a 100\ msec block rate at 8\ kHz
+sampling), but the mantissa being stored at the regular sample rate.  The overall
+energy in the block,
+.LB
+$sum from n=h to h+M-1 ~x(n) sup 2$    ($M = 125$, say),
+.LE
+is used to determine a suitable exponent, and every sample
+in the block \(em namely
+$x(h)$, $x(h+1)$, ..., $x(h+M-1)$ \(em is scaled according to that exponent.
+Note that for speech transmission systems this method necessitates a delay of
+$M$ samples at the encoder, and indeed some methods base the exponent on the
+energy in the last block to avoid this.  For speech storage, however, the delay
+is irrelevant.  A rather different, nonsyllabic, method of adaptive PCM is
+continually to change the step size of a uniform quantizer, by multiplying it by
+a constant at each sample which is based on the magnitude of the previous code
+word.
+.pp
+Adaptive quantization exploits information about the amplitude of the signal,
+and, as a rough generalization, yields a reduction of one bit per sample
+in the data rate for telephone-quality speech over ordinary logarithmic
+quantization, for a given signal-to-noise ratio.  Alternatively, for the
+same data rate an improvement of 6\ dB in signal-to-noise ratio can be obtained.
+Some results for actual schemes are given by Rabiner and Schafer (1978).
+.[
+Rabiner Schafer 1978 Digital processing of speech signals
+.]
+However, there is other information in the time waveform of speech, namely, the
+sample-to-sample correlation, which can be exploited to give further reductions.
+.rh "Differential coding."
+Differential pulse code modulation (DPCM), in its simplest form, uses the
+present speech sample as a prediction of the next one,
+and stores the prediction error \(em that is, the sample-to-sample difference.
+This is a simple case of predictive encoding.
+Referring back to the speech waveform displayed in Figure 3.5,
+it seems plausible that the data rate can be reduced by transmitting the difference
+between successive samples instead of their absolute values:  less bits are
+required for the difference signal for a given overall accuracy because it
+does not assume such extreme values as the absolute signal level.
+Actually, the improvement is not all that great \(em about 4\ \-\ 5\ dB in
+signal-to-noise ratio, or just under one bit per sample for a given
+signal-to-noise ratio \(em for the difference signal can be nearly as large as
+the absolute signal level.
+.pp
+If DPCM is used in conjunction with adaptive quantization, giving one form of
+adaptive differential pulse code modulation (ADPCM), both the overall amplitude
+variation and the sample-to-sample correlation are exploited, leading to a
+combined gain of 10\ \-\ 11\ dB in signal-to-noise ratio (or just under two bits
+reduction per sample for telephone-quality speech).  Another form of adaptation
+is to alter the predictor by multiplying the previous sample value by a
+parameter which is adjusted for best performance.
+Then the transmitted signal at time $n$ is
+.LB
+.EQ
+e(n) ~~ = ~~ x(n)~ - ~ax(n-1),
+.EN
+.LE
+where the parameter $a$ is adapted (and stored) on a syllabic time-scale.  This
+leads to a slight improvement in signal-to-noise ratio, which can be combined
+with that achieved by adaptive quantization.  Much more substantial benefits
+can be realized by using a weighted sum of the past several (up to 15) speech
+samples, and adapting all the weights.  This is the basic idea of linear
+prediction, which is developed in Chapter 6.
+.rh "Delta modulation."
+The coding methods presented so far all increase the complexity of the
+analogue-to-digital interface (or, if the sampled waveform is coded
+digitally, they increase the processing required before and after storage).
+One method which considerably
+.ul
+simplifies
+the interface is the limiting case
+of DPCM with just 1-bit quantization.  Only the sign of the difference between
+the current and last values is transmitted.  Figure 3.9 shows the conversion
+hardware.
+.FC "Figure 3.9"
+The encoding part is essentially the same as a tracking D/A,
+where the value in a counter is forced to track the analogue input by
+incrementing or decrementing the counter according as the input exceeds or
+falls short of the analogue equivalent of the counter's contents.  However,
+for this encoding scheme, called "delta modulation", the increment-decrement
+signal itself forms the discrete representation of the waveform, instead of the counter's
+contents.  The analogue waveform can be reconstituted from the bit stream with
+another counter and D/A converter.  Alternatively, an all-analogue implementation
+can be used, both for the encoder and decoder, with a capacitor as integrator
+whose charging current is controlled digitally.  This is a much cheaper realization.
+.pp
+It is fairly obvious that the sampling frequency for delta modulation will need
+to be considerably higher than for straightforward PCM.  Figure 3.10 shows
+an effect called "slope overload" which occurs when the sampling rate is too low.
+.FC "Figure 3.10"
+Either a higher sample rate or a larger step size will reduce the overload;
+however, larger steps increase the noise level of the alternate 1's and \-1's
+that occur when no input is present \(em called "granular noise".  A compromise
+is necessary between slope overload and granular noise for a given bit rate.
+Delta modulation results in lower data rates than logarithmic quantization
+for a given signal-to-noise ratio if that ratio is low (poor-quality speech).
+As the desired speech quality is increased its data rate grows faster than
+that of logarithmic PCM.  The crossover point occurs at much lower than
+telephone quality speech, and so although delta modulation is used for some
+applications where the permissible data rate is severely constrained,
+it is not really suitable for speech output from computers.
+.pp
+It is profitable to adjust the step size, leading to
+.ul
+adaptive
+delta modulation.
+A common strategy is to increase or decrease the step size by a multiplicative
+constant, which depends on whether the new transmitted bit will be equal to
+or different from the last one.  That is,
+.LB "nnnn"
+.NI "nn"
+$stepsize(n+1)  =  stepsize(n) times 2$  if $x(n+1)<x(n)<x(n-1)$
+or $x(n+1)>x(n)>x(n-1)$
+.br
+(slope overload condition);
+.NI "nn"
+$stepsize(n+1) = stepsize(n)/2$  if $x(n+1),~x(n-1)<x(n)$
+or $x(n+1),~x(n-1)>x(n)$
+.br
+(granular noise condition).
+.LE "nnnn"
+Despite these adaptive equations, the step size should be constrained to
+lie between a predetermined fixed maximum and minimum, to prevent it from
+becoming so large or so small that rapid accomodation to changing input signals is
+impossible.
+Then, in a period of potential slope overload the step size will grow, preventing
+overload, possibly to its maximum value when overload may resume.  In a quiet
+period it will decrease to its minimum value which determines the granular
+noise in the idle condition.  Note that the step size need not be stored, for
+it can be deduced from the bit changes in the digitized data.  Although
+adaptation improves the performance of delta modulation, it is still inferior to
+PCM at telephone qualities.
+.rh "Summary."
+It seems that ADPCM, with
+adaptive quantization and adaptive prediction, can provide a worthwhile
+advantage for speech storage, reducing the number of bits needed per sample of
+telephone-quality speech from 7 for logarithmic PCM to perhaps 5, and the data
+rate from 56\ Kbit/s to 40\ Kbit/s.  Disadvantages are additional complexity
+in the encoding and decoding processes, and the fact that byte-oriented storage,
+with 8 bits/sample in logarithmic PCM, is more convenient for computer use.
+For low quality speech where hardware complexity is to be minimized,
+adaptive delta modulation could provide worthwhile \(em although the ready
+availability of PCM codec chips reduces the cost advantage.
+.sh "3.3  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "3.4  Further reading"
+.pp
+Probably the best single reference on time-domain coding of speech is
+the book by Rabiner and Schafer (1978), cited above.
+However, this does not contain a great deal of information on practical
+aspects of the analogue-to-digital conversion process; this is
+covered by Blesser (1978) above, who is especially interested in
+high-quality conversion for digital audio applications,
+and Garrett (1978) below.
+There are many textbooks in the telecommunications area which
+are relevant to the subject of the chapter,
+although they concentrate primarily on fundamental theoretical aspects rather
+than the practical application of the technology.
+.LB "nn"
+.\"Cattermole-1969-1
+.]-
+.ds [A Cattermole, K.W.
+.ds [D 1969
+.ds [T Principles of pulse code modulation
+.ds [I Iliffe
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is a standard, definitive, work on PCM, and provides a good grounding
+in the theory.
+It goes into the subject in much more depth than we have been able to here.
+.in-2n
+.\"Garrett-1978-1
+.]-
+.ds [A Garrett, P.H.
+.ds [D 1978
+.ds [T Analog systems for microprocessors and minicomputers
+.ds [I Reston Publishing Company
+.ds [C Reston, Virginia
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Garrett discusses the technology of data conversion systems, including
+A/D and D/A converters and basic analogue filter design, in a
+clear and practical manner.
+.in-2n
+.\"Inose-1979-2
+.]-
+.ds [A Inose, H.
+.ds [D 1979
+.ds [T An introduction to digital integrated communications systems
+.ds [I Peter Peregrinus
+.ds [C Stevenage, England
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Inose's book is a recent one which covers the whole area of digital
+transmission and switching technology.
+It gives a good idea of what is happening to the telephone networks
+in the era of digital communications.
+.in-2n
+.\"Steele-1975-3
+.]-
+.ds [A Steele, R.
+.ds [D 1975
+.ds [T Delta modulation systems
+.ds [I Pentech Press
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Again a standard work, this time on delta modulation techniques.
+Steele gives an excellent and exhaustive treatment of the subject from a
+communications viewpoint.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "4  SPEECH ANALYSIS"
+.ds RT "Speech analysis
+.ds CX "Principles of computer speech
+.pp
+Digital recordings of speech provide a jumping-off point for
+further processing of the audio waveform, which is usually necessary for
+the purpose of speech output.
+It is difficult to synthesize natural sounds by concatenating
+individually-spoken words.
+Pitch is perhaps the most perceptually significant contextual effect
+which must be
+taken into account when forming connected speech out of isolated words.
+The intonation of an utterance, which manifests itself as a
+continually changing pitch, is a holistic property of the utterance
+and not the sum of components determined by the individual words alone.
+Happily, and quite coincidentally, communications engineers in their quest
+for reduced-bandwidth telephony have invented methods of coding speech that
+separate the pitch information from that carried by the articulation.
+.pp
+Although these analysis techniques, which were first introduced in the late
+1930's (Dudley, 1939), were originally implemented by analogue means \(em and
+in many systems still are (Blankenship, 1978, describes a recent
+switched-capacitor realization) \(em there is a continuing trend
+towards digital implementations, particularly for the more sophisticated coding
+schemes.
+.[
+Dudley 1939
+.]
+.[
+Blankenship 1978
+.]
+It is hard to see how the technique of linear prediction of speech,
+which is described in detail in Chapter 6, could be accomplished in the
+absence of digital processing.
+Some groundwork is laid for the theory of digital signal analysis in this
+chapter.
+The ideas are not presented in a formal, axiomatic way; but are developed as
+and when they are needed to examine some of the structures that turn out to be
+useful in speech processing.
+.pp
+Most speech analysis views speech according to the source-filter model which
+was introduced in Chapter 2, and aims to separate the effects of the source from
+those of the filter.  The frequency spectrum of the vocal tract filter is of
+great interest, and the technique of discrete Fourier transformation is
+discussed in this chapter.  For many purposes it is better to extract the formant
+frequencies from the spectrum and use these alone (or in conjunction with their
+bandwidths) to characterize it.  As far as the signal source in the source-filter
+model is concerned, its most interesting features are pitch and amplitude \(em the
+latter being easy to estimate.  Hence we go on to look at pitch extraction.
+Related to this is the problem of deciding whether a segment of speech has
+voiced or unvoiced excitation, or both.
+.pp
+Estimating formant and pitch parameters is one of the messiest areas of
+speech processing.  There is a delightful paper which points this out
+(Schroeder, 1970), entitled "Parameter estimation in speech: a lesson in unorthodoxy".
+.[
+Schroeder 1970
+.]
+It emphasizes that the most successful estimation procedures "have often relied
+on intuition based on knowledge of speech signals and their production in the
+human vocal apparatus rather than routine applications of well-established
+theoretical methods".
+Fortunately, the emphasis of the present book is on speech
+.ul
+output,
+which involves parameter estimation only in so far as it is needed to produce
+coded speech for storage, and to illuminate the acoustic nature of speech
+for the development of synthesis by rule from phonetics or text.
+Hence the many methods of formant and pitch estimation are treated rather
+cursorily and qualitatively here:  our main interest is in how to
+.ul
+use
+such information for speech output.
+.pp
+If the incoming speech can be analysed into its formant frequencies, amplitude,
+excitation mode, and pitch (if voiced), it is quite easy to resynthesize
+it directly from these parameters.  Speech synthesizers are described in the
+next chapter.  They can be realized in either analogue or digital
+hardware, the former being predominant in production systems and the latter
+in research systems \(em although, as in other areas of electronics, the balance
+is changing in favour of digital implementations.
+.sh "4.1  The channel vocoder"
+.pp
+A direct representation of the frequency spectrum of a signal can be obtained
+by a bank of bandpass filters.  This is the basis of
+the
+.ul
+channel vocoder,
+which was the first device that attempted to take advantage of the source-filter
+model for speech coding (Dudley, 1939).
+.[
+Dudley 1939
+.]
+The word "vocoder" is a contraction
+of
+.ul
+vo\c
+ice
+.ul
+coder.
+The energy in each filter band is
+estimated by rectification and smoothing, and the resulting approximation to
+the frequency spectrum is transmitted or stored.  The source properties are
+represented by the type of excitation (voiced or unvoiced), and if voiced,
+the pitch.  It is not necessary to include the overall amplitude of the speech
+explicitly, because this is conveyed by the energy levels from the separate
+bandpass filters.
+.pp
+Figure 4.1 shows the encoding part of a channel vocoder which has been used
+successfully for many years (Holmes, 1980).
+.[
+Holmes 1980 JSRU channel vocoder
+.]
+.FC "Figure 4.1"
+We will discuss the block labelled "pre-emphasis" shortly.
+The shape of the spectrum is estimated by 19 bandpass filters, whose spacing
+and bandwidth decrease slightly with decreasing frequency to obtain the rather
+greater resolution that is needed in the lower frequency region,
+as shown in Table 4.1.
+.RF
+.nr x0 4n+2.6i+\w'\0\0'u+(\w'bandwidth'/2)
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta 4n +1.3i +1.3i
+\l'\n(x0u\(ul'
+.sp
+.nr x1 (\w'channel'/2)
+.nr x2 (\w'centre'/2)
+.nr x3 (\w'analysis'/2)
+	\0\h'-\n(x1u'channel	\0\h'-\n(x2u'centre	\0\0\h'-\n(x3u'analysis
+.nr x1 (\w'number'/2)
+.nr x2 (\w'frequency'/2)
+.nr x3 (\w'bandwidth'/2)
+	\0\h'-\n(x1u'number	\0\0\h'-\n(x2u'frequency	\0\0\h'-\n(x3u'bandwidth
+.nr x2 (\w'(Hz)'/2)
+		\0\h'-\n(x2u'(Hz)	\0\0\h'-\n(x2u'(Hz)
+\l'\n(x0u\(ul'
+.sp
+	\01	\0240	\0120
+	\02	\0360	\0120
+	\03	\0480	\0120
+	\04	\0600	\0120
+	\05	\0720	\0120
+	\06	\0840	\0120
+	\07	1000	\0150
+	\08	1150	\0150
+	\09	1300	\0150
+	10	1450	\0150
+	11	1600	\0150
+	12	1800	\0200
+	13	2000	\0200
+	14	2200	\0200
+	15	2400	\0200
+	16	2700	\0200
+	17	3000	\0300
+	18	3300	\0300
+	19	3750	\0500
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 4.1  Filter specifications for a vocoder analyser (after Holmes, 1980)"
+.[
+Holmes 1980 JSRU channel vocoder
+.]
+The 3\ dB points
+of adjacent filters are halfway between their centre frequencies, so that there
+is some overlap between bands.
+The filter characteristics do not need to have very sharp edges, because the energy
+in neighbouring bands is fairly highly correlated.  Indeed, there is a
+disadvantage in making them too sharp, because the phase delays associated
+with sharp cutoff filters induce "smearing" of the spectrum in the time domain.
+This particular channel vocoder uses second-order Butterworth bandpass filters.
+.pp
+For regenerating speech stored in this way, an excitation of unit impulses
+at the specified pitch period (for voiced sounds) or white noise (for unvoiced
+sounds) is produced and passed through a bank of bandpass filters similar
+to the analysis ones.  The excitation has a flat spectrum, for regular impulses
+have harmonics at multiples of the repetition frequency which are all of the
+same size, and so the spectrum of the output signal is completely determined
+by the filter bank.  The gain of each filter is controlled by the stored
+magnitude of the spectrum at that frequency.
+.pp
+The frequency spectrum and voicing pitch of speech change at much slower rates
+than the time waveform.  The changes are due to movements of the articulatory
+organs (tongue, lips, etc) in the speaker, and so are limited in their speed
+by physical constraints.  A typical rate of production of phonemes is 15 per
+second, but in fact the spectrum can change quite a lot within a single
+phoneme (especially a stop sound).
+Between 10 and 25\ msec (100\ Hz and 40\ Hz)
+is generally thought to be a satisfactory interval for transmitting or storing
+the spectrum, to preserve a reasonably faithful representation of the speech.
+Of course, the entire spectrum, as well as the source characteristics, must
+be stored at this rate.
+The channel vocoder described by Holmes (1980) uses 48 bits to encode
+the information.
+.[
+Holmes 1980 JSRU channel vocoder
+.]
+Repeated every 20\ msec, this gives a data rate of 2400\ bit/s \(em very
+considerably less than any of the time-domain encoding techniques.
+.pp
+It needs some care to encode the output of 19 filters, the excitation type,
+and the pitch into 48 bits of information.  Holmes uses 6 bits for pitch,
+logarithmically encoded,
+and one bit for excitation type.
+This leaves 41 bits to encode the output of the 19 filters, and so a differential
+technique is used which transmits just the difference between adjacent
+channels \(em for the spectrum does not change abruptly in the frequency domain.
+Three bits are used for the absolute level in channel 1, and two bits
+for each channel-to-channel difference, giving a total of 39 bits for the whole
+spectrum.  The remaining two bits per frame are reserved for signalling or
+monitoring purposes.
+.pp
+A 2400 bit/s channel vocoder degrades the speech in a telephone channel quite
+perceptibly.  It is sufficient for interactive communication, where
+if you do not understand something you can always ask for it to be repeated.
+It is probably not good enough for most voice response applications.
+However, the vocoder principle can be used with larger filter banks and much
+higher bit rates, and still reduce the data rate substantially below that
+required by log PCM.
+.sh "4.2  Pre-emphasis"
+.pp
+There is an
+overall \-6\ dB/octave trend in speech radiated from the lips,
+as frequency increases.
+We will discuss why this is so in the next chapter.
+Notice that this trend means that the signal power is reduced
+by a factor of 4, or the signal amplitude by a factor of 16, for each
+doubling in frequency.
+For vocoders, and indeed for other methods of spectral analysis of speech,
+it is usually desirable to equalize this by a +6\ dB/octave lift prior to
+processing, so that the channel outputs occupy a similar range of levels.
+On regeneration, the output speech is passed through an inverse filter which
+provides 6\ dB/octave of attenuation.
+.pp
+For a digital system, such pre-emphasis
+can either be implemented as an analogue circuit which precedes the presampling
+filter and digitizer, or as a digital operation on the sampled and quantized
+signal.  In the former case, the characteristic is usually flat up to a certain
+breakpoint, which occurs somewhere between 100\ Hz and 1\ kHz \(em the exact
+position does not seem to be critical \(em at which point the +6\ dB/octave lift
+begins.  Although de-emphasis on output ought to have an exactly inverse
+characteristic, it is sometimes modified or even eliminated altogether in an
+attempt to counteract approximately
+the  $sin( pi f/f sub s )/( pi f/f sub s )$  distortion
+introduced by the desampling operation, which was discussed in an earlier
+section.  Above half the sampling frequency, the characteristic of the
+pre-emphasis is irrelevant because any effect will be suppressed by the presampling
+filter.
+.pp
+The effect of a 6\ dB/octave lift can also be achieved digitally, by differencing
+the input.  The operation
+.LB
+.EQ
+y(n)~~ = ~~ x(n)~ -~ ax(n-1)
+.EN
+.LE
+is suitable, where the constant parameter $a$ is usually chosen between 0.9 and 1.
+The latter value gives straightforward differencing, and this amounts to
+creating a DPCM signal as input to the spectral analysis.  Figure 4.2 plots
+the frequency response of this operation, with a sample frequency of 8\ kHz,
+for two values of the parameter; together with that of a 6\ dB/octave lift
+above 100\ Hz.
+.FC "Figure 4.2"
+The vertical positions of the plots have been adjusted to give
+the same gain, 20\ dB, at 1\ kHz.
+The difference at 3.4\ kHz, the upper end of the telephone spectrum, is just
+over 2\ dB.  At frequencies below the breakpoint, in this case 100\ Hz, the
+difference between analogue and digital pre-emphasis can be very great.  For
+$a=0.9$ the attenuation at DC (zero frequency) is 18\ dB below that at 1\ kHz,
+which happens to be close to that of the analogue filter for frequencies below the
+breakpoint.  However, if the breakpoint had been at 1\ kHz there would have been
+20\ dB difference between the analogue and $a=0.9$ plots at DC.  And of course
+the $a=1$ characteristic has infinite attenuation at DC.
+In practice, however, the exact form of the pre-emphasis does not seem to be at all
+critical.
+.pp
+The above remarks apply only to voiced speech.  For unvoiced speech there appears
+to be no real need for pre-emphasis; indeed, it may do harm by reinforcing
+the already large high-frequency components.  There is a case for altering the
+parameter $a$ according to the excitation mode of the speech:  $a=1$ for voiced
+excitation and $a=0$ for unvoiced gives pre-emphasis just when it is needed.
+This can be achieved by expressing the parameter in terms of the autocorrelation
+of the incoming signal, as
+.LB
+.EQ
+a ~~ = ~~ R(1) over R(0) ~ ,
+.EN
+.LE
+where $R(1)$ is the correlation of the signal with itself delayed by one sample,
+and $R(0)$ is the correlation without delay (that is, the signal variance).
+This is reasonable intuitively because high sample-to-sample correlation
+is to be expected in voiced speech, so that $R(1)$ is very nearly as great as
+$R(0)$ and the ratio becomes 1; whereas little or no sample-to-sample correlation
+will be present in unvoiced speech, making the ratio close to 0.  Such a
+scheme is reminiscent of ADPCM with adaptive prediction.
+.pp
+However, this sophisticated pre-emphasis method does not seem to be worthwhile
+in practice.  Usually the breakpoint in an analogue pre-emphasis filter is
+chosen to be rather greater than 100\ Hz to limit the amplification of fricative
+energy.  In fact, the channel vocoder described by Holmes (1980) has the
+breakpoint at 1\ kHz, limiting the gain to 12\ dB at 4\ kHz, two octaves above.
+.[
+Holmes 1980 JSRU channel vocoder
+.]
+.sh "4.3  Digital signal analysis"
+.pp
+You may be wondering how the frequency response for the digital pre-emphasis
+filters, displayed in Figure 4.2, can be calculated.  Suppose a digitized
+sinusoid is applied as input to the filter
+.LB
+.EQ
+y(n) ~~ = ~~ x(n)~ - ~ax(n-1).
+.EN
+.LE
+A sine wave of frequency $f$ has equation  $x(t) ~ = ~ sin ~ 2 pi ft$, and when
+sampled at $t=0,~ T,~ 2T,~ ...$ (where $T$ is the sampling interval, 125\ msec for
+an 8\ kHz sample rate), this becomes  $x(n) ~ = ~ sin ~ 2 pi fnT.$  It is much
+more convenient to consider a complex exponential
+input,  $e sup { j2 pi fnT}$  \(em the response to a sinusoid can then be derived
+by taking imaginary parts, if necessary.  The output for this input is
+.LB
+.EQ
+y(n) ~~ = ~~ e sup {j2 pi fnT} ~~-~ae sup {j2 pi f(n-1)T} ~~ = ~~
+(1~-~ae sup {-j2 pi fT} )~e sup {j2 pi fnT} ,
+.EN
+.LE
+a sinusoid at the same frequency as the input.  The
+factor  $1~-~ae sup {-j2 pi fT}$  is complex, with both amplitude and phase
+components.  Thus the output will be a phase-shifted and amplified version
+of the input.  The amplitude response at frequency $f$ is therefore
+.LB
+.EQ
+|1~ - ~ ae sup {-j2 pi fT} | ~~ = ~~
+[1~ +~ a sup 2 ~-~ 2a~cos~2 pi fT ] sup 1/2 ,
+.EN
+.LE
+or
+.LB
+.EQ
+10 ~ log sub 10 (1~ +~ a sup 2 ~ - ~ 2a~ cos 2 pi fT)
+.EN
+dB.
+.LE
+Normalizing to 20\ dB at 1\ kHz, and assuming 8\ kHz sampling, yields
+.LB
+.EQ
+20~ + ~~ 10~ log sub 10 (1~ +~ a sup 2 ~-~ 2a~ cos ~ { pi f} over 4000 )
+~~ -~ 10~ log sub 10 (1~ +~ a sup 2 ~-~ 2a~ cos ~ pi over 4 )
+.EN
+dB.
+.LE
+With $a=0.9$ and 1 this gives the graphs of Figure 4.2.
+.pp
+Frequency responses for analogue filters are often plotted with a logarithmic
+frequency scale, as well as a logarithmic amplitude one, to bring out the
+asymptotes in dB/octave as straight lines.  For digital filters the response
+is usually drawn on a
+.ul
+linear
+frequency axis extending to half the sampling frequency.  The response is
+symmetric about this point.
+.pp
+Analyses like the above are usually expressed in terms of the $z$-transform.
+Denote the unit delay operation by $z sup -1$.  The choice of the inverse rather
+than $z$ itself is of course an arbitrary matter, but the convention has stuck.
+Then the filter can be characterized
+by Figure 4.3, which signifies that the output is the input minus a delayed
+and scaled version of itself.
+.FC "Figure 4.3"
+The transfer function of the filter is
+.LB
+.EQ
+H(z) ~~ = ~~ 1~ -~ az sup -1 ,
+.EN
+.LE
+and we have seen that the effect of the system on a (complex) exponential of
+frequency $f$ is to multiply it by
+.LB
+.EQ
+1~ -~ ae sup {-j2 pi fT}.
+.EN
+.LE
+To get the frequency response from the transfer function, replace $z sup -1$
+by $e sup {-j2 pi fT}$.  Amplitude and phase responses can then be found by
+taking the modulus and angle of the complex frequency response.
+.pp
+If $z sup -1$ is treated as an
+.ul
+operator,
+it is quite in order to summarize the action of the filter by
+.LB
+.EQ
+y(n) ~~ = ~~ x(n)~ - ~az sup -1 x(n) ~~ = ~~ (1~ -~ az sup -1 )x(n).
+.EN
+.LE
+However, it is usual to derive from the sequence $x(n)$ a
+.ul
+transform
+$X(z)$ upon which $z sup -1$ acts as a
+.ul
+multiplier.
+If the transform of $x(n)$ is defined as
+.LB
+.EQ
+X(z) ~~ = ~~ sum from {n=- infinity} to infinity ~x(n) z sup -n ,
+.EN
+.LE
+then on multiplication by $z sup -1$ we get a new transform, say $V(z)$:
+.LB
+.EQ
+V(z) ~~ = ~~ z sup -1 X(z) ~~ =
+~~ z sup -1 sum from {n=- infinity} to infinity ~x(n) z sup -n ~~ =
+~~ sum ~x(n)z sup -n-1 ~~ =
+~~ sum ~x(n-1)z sup -n .
+.EN
+.LE
+$V(z)$ can also be expressed as the transform of a new sequence, say $v(n)$, by
+.LB
+.EQ
+V(z) ~~ = ~~ sum from {n=- infinity} to infinity ~v(n) z sup -n ,
+.EN
+.LE
+from which it becomes apparent that
+.LB
+.EQ
+v(n) ~~ = ~~ x(n-1).
+.EN
+.LE
+Thus $v(n)$ is a delayed version of $x(n)$, and we have accomplished what we
+set out to do, namely to show that the delay
+.ul
+operator
+$z sup -1$ can be treated as an ordinary
+.ul
+multiplier
+in the $z$-transform domain, where $z$-transforms are defined as the infinite
+sums given above.
+.pp
+In terms of $z$-transforms, the filter can be written
+.LB
+.EQ
+Y(z) ~~ = ~~ (1~ -~ az sup -1 )X(z),
+.EN
+.LE
+where $z sup -1$ is now treated as a multiplier.
+The transfer function of the filter is
+.LB
+.EQ
+H(z) ~~ = ~~ Y(z) over X(z) ~~ = ~~ 1 - az sup -1 ,
+.EN
+.LE
+the ratio of the output to the input transform.
+.pp
+It may seem that little has been gained by inventing this rather abstract
+notion of transform, simply to change an operator to a multiplier.  After
+all, the equation of the filter is no simpler in the transform domain than
+it was in the time domain using $z sup -1$ as an operator.  However, we will
+need to go on to examine more complex filters.  Consider, for example, the
+transfer function
+.LB
+.EQ
+H(z) ~~ = ~~ {1~+~az sup -1 ~+~bz sup -2} over {1~+~cz sup -1 ~+~dz sup -2} ~ .
+.EN
+.LE
+If $z sup -1$ is treated as an operator, it is not immediately obvious how
+this transfer function can be realized by a time-domain recurrence relation.
+However, with $z sup -1$ as an ordinary multiplier in the transform domain, we can
+make purely mechanical manipulations with infinite sums to see what the transfer
+function means as a recurrence relation.
+.pp
+It is worth noting the similarity between the $z$-transform in the discrete
+domain and the Fourier and Laplace transforms in the continuous domains.
+In fact, the $z$-transform plays an analogous role in digital signal processing
+to the Laplace transform in continuous theory, for the delay operator
+$z sup -1$
+performs a similar service to the differentiation operator $s$.
+Recall first the continuous Fourier transform,
+.LB
+$
+G(f) ~~ = ~~
+integral from {- infinity} to infinity ~g(t)~e sup {-j2 pi ft} dt
+$,    where $f$ is real,
+.LE
+and the Laplace transform,
+.LB
+$
+F(s) ~~ = ~~
+integral from 0 to infinity ~f(t)~e sup -st dt
+$,    where $s$ is complex.
+.LE
+The main difference between these two transforms is that the range of integration
+begins at -$infinity$ for the Fourier transform and at 0 for the Laplace.
+Advocates of the Fourier transform, which typically include people involved with
+telecommunications, enjoy the freedom from initial conditions which is bestowed
+by an origin way back in the mists of time.  Advocates of Laplace, including
+most analogue filter theorists, invariably
+consider systems where all is quiet before $t=0$ \(em altering the origin
+of measurement of time to achieve this if necessary \(em and welcome the opportunity
+to include initial conditions explicitly
+.ul
+without
+having to worry about what happens in the mists of time.
+Although there is a two-sided Laplace transform where the integration begins
+at -$infinity$, it is not generally used because it causes some convergence
+complications.  Ignoring this difference between the transforms (by considering
+signals which are zero when $t<0$), the Fourier spectrum can be found from the
+Laplace transform by writing  $s=j2 pi f$; that is, by considering values
+of $s$ which lie on the imaginary axis.
+.pp
+The $z$-transform is
+.LB
+$
+H(z) ~~ = ~~ sum from n=0 to infinity ~h(n)~z sup -n
+$,    or    $
+H(z) ~~ = ~~ sum from {n=- infinity} to infinity ~h(n)~z sup -n ,
+$
+.LE
+depending on whether a one-sided or two-sided transform is used.  The advantages
+and disadvantages of one- and two-sided transforms are the same as in the
+analogue case.
+$z$ plays the role of $e sup sT $, and so it is not surprising that the response
+to a (sampled) sinusoid input can be found by setting
+.LB
+.EQ
+z ~~ = ~~ e sup {j2 pi fT}
+.EN
+.LE
+in $H(z)$, as we proved explicitly above for the pre-emphasis filter.
+.pp
+The above relation between $z$ and $f$ means that real-valued frequencies correspond
+to points where $|z|=1$, that is, the unit circle in the complex $z$-plane.
+As you travel anticlockwise around this unit circle, starting from the
+point $z=1$, the corresponding frequency increases from 0, to $1/2T$ half-way
+round ($z=-1$), to $1/T$ when you get back to the beginning ($z=1$) again.
+Frequencies greater than the sampling frequency are aliased back into the
+sampling band, corresponding to further circuits of $|z|=1$ with frequency
+going from $1/T$ to $2/T$, $2/T$ to $3/T$, and so on.  In fact, this is the circle
+of Figure 3.3 which was used earlier to explain how sampling affects the frequency
+spectrum!
+.sh "4.4  Discrete Fourier transform"
+.pp
+Let us return from this brief digression into techniques of digital signal
+analysis to the problem of determining the frequency spectrum of speech.
+Although a bank of bandpass filters such as is used in the channel vocoder
+is the perhaps most straightforward way to obtain a frequency spectrum,
+there are other techniques which are in fact more commonly used in digital speech
+processing.
+.pp
+It is possible to define the Fourier transform of a discrete sequence of
+points.  To motivate the definition, consider first the
+ordinary Fourier transform (FT), which is
+.LB
+$
+g(t) ~~ = ~~
+integral from {- infinity} to infinity ~G(f)~e sup {+j2 pi ft} df
+~~~~~~~~~~~~~~~~
+G(f) ~~ = ~~
+integral from {- infinity} to infinity ~g(t)~e sup {-j2 pi ft} dt .
+$
+.LE
+This takes a continuous time domain into a continuous frequency domain.
+Sometimes you see a normalizing factor $1/2 pi$ multiplying the integral in
+either the forward or the reverse transform.  This is only needed
+when the frequency variable is expressed in radians/s, and we will find it
+more convenient to express frequencies in\ Hz.
+.pp
+The Fourier series (FS), which should also be familiar to you,
+operates on a periodic time waveform (or, equivalently,
+one that only exists for a finite period of time, which is notionally extended
+periodically).  If a period lies in the time range $[0,b)$, then the transform is
+.LB
+$
+g(t) ~~ = ~~
+sum from {r = - infinity} to infinity ~G(r)~e sup {+j2 pi rt/b}
+~~~~~~~~~~~~~~~~
+G(r) ~~ = ~~ 1 over b ~ integral from 0 to b ~g(t)~e sup {-j2 pi rt/b} dt .
+$
+.LE
+The Fourier series takes a periodic time-domain function into a discrete frequency-domain one.
+Because of the basic duality between the time and frequency domains in the
+Fourier transforms, it is not surprising that another version of the transform
+can be defined which takes a periodic
+.ul
+frequency\c
+-domain function into a
+discrete
+.ul
+time\c
+-domain one.
+.pp
+Fourier transforms can only deal with a finite stretch of a time signal
+by assuming that the signal is periodic, for if $g(t)$ is evaluated from
+its transform $G(r)$ according to the formula above, and $t$ is chosen outside
+the interval $[0,b)$, then a periodic extension of the function $g(t)$ is obtained
+automatically.
+Furthermore, periodicity in one domain implies discreteness in the other.
+Hence if we transform a
+.ul
+finite
+stretch of a
+.ul
+discrete
+time waveform,
+we get a frequency-domain representation which is also finite (or, equivalently,
+periodic), and discrete.
+This is the discrete Fourier transform (DFT),
+and takes a discrete periodic time-domain function into a discrete
+periodic frequency-domain one as illustrated in Figure 4.4.
+.FC "Figure 4.4"
+It is defined by
+.LB
+$
+g(n) ~~ = ~~
+1 over N ~ sum from r=0 to N-1~G(r)~e sup { + j2 pi rn/N}
+~~~~~~~~~~~~~~~~
+G(r) ~~ = ~~ sum from n=0 to N-1 ~g(n)~e sup { - j2 pi rn/N} ,
+$
+.LE
+or, writing  $W=e sup {-j2 pi /N}$,
+.LB
+$
+g(n) ~~ = ~~
+1 over N ~ sum from r=0 to N-1~G(r)~W sup -rn
+~~~~~~~~~~~~~~~~
+G(r) ~~ = ~~ sum from n=0 to N-1 ~g(n)~W sup rn .
+$
+.LE
+.sp
+The $1/N$ in the first equation is the same normalizing
+factor as the $1/b$ in the Fourier series,
+for the finite time domain is $[0,N)$
+in the discrete case and $[0,b)$ in the Fourier series case.
+It does not matter
+whether it is written into the forward or the reverse transform, but it is usually
+placed as shown above as a matter of convention.
+.pp
+As illustrated by Figure 4.5, discrete Fourier transforms
+take an input of $N$ real values, representing equally-spaced time samples
+in the interval $[0,b)$, and produce as output $N$ complex values, representing
+equally-spaced frequency samples in the interval $[0,N/b)$.
+.FC "Figure 4.5"
+Note that the end-point of this frequency interval is the sampling frequency.
+It seems odd that the input is real and the output is the same number of
+.ul
+complex
+quantities:  we seem to be getting some numbers for nothing!
+However, this isn't so, for it is easy to show that if the input sequence is
+real, the output frequency
+spectrum has a symmetry about its mid-point (half the sampling frequency).
+This can be expressed as
+.LB
+DFT symmetry:\0\0\0\0\0\0 $
+~ mark G( half N +r) ~=~ G( half N -r) sup *$  if $g$ is real-valued,
+.LE
+where $*$ denotes the conjugate of a complex quantity
+(that is, $(a+jb) sup * = a-jb$).
+.pp
+It was argued above that the frequency spectrum in the DFT is periodic, with
+the spectrum from 0 to the sampling frequency being repeated regularly up and
+down the frequency axis.  It can easily be seen from the DFT equation that
+this is so.  It can be written
+.LB
+DFT periodicity:$ lineup G(N+r) ~=~ G(r)$  always.
+.LE
+Figure 4.6 illustrates the properties of symmetry and periodicity.
+.FC "Figure 4.6"
+.sh "4.5  Estimating the frequency spectrum of speech using the DFT"
+.pp
+Speech signals are not exactly periodic.  Although the waveform in a particular
+pitch period will usually resemble those in the preceding and following pitch
+periods, it will certainly not be identical to them.
+As the articulation of the speech changes, the formant positions will alter.
+As we saw in Chapter 2, the pitch itself is certainly not constant.
+Hence the fundamental assumption of the DFT, that the waveform is periodic,
+is not really justified.  However, the signal is quasi-periodic, for changes
+from period to period will not usually be very great.  One way of computing
+the short-term frequency spectrum of speech is to use
+.ul
+pitch-synchronous
+Fourier transformation, where single pitch periods are isolated from the
+waveform and processed with the DFT.  This gives a rather accurate estimate
+of the spectrum.  Unfortunately, it is difficult to determine the beginning
+and end of each pitch cycle, as we shall see later in this chapter when
+discussing pitch extraction techniques.
+.pp
+If a finite stretch of a speech waveform is isolated and Fourier transformed,
+without regard to pitch of the speech, then the periodicity assumption will
+be grossly violated.  Figure 4.7 illustrates that the effect is the same
+as
+multiplying the signal by a rectangular
+.ul
+window function,
+which is 0 except during the period to be analysed, where it is 1.
+.FC "Figure 4.7"
+The windowed sequence will almost certainly have discontinuities at its edges,
+and these will affect the resulting spectrum.  The effect can be analysed
+quite easily, but we will not do so here.  It is enough to say that the
+high frequencies associated with the edges of the window cause considerable
+distortion of the spectrum.  The effect can be alleviated by
+using a smoother window than a rectangular one,
+and several have been investigated extensively.  The commonly-used windows of
+Bartlett, Blackman, and Hamming are illustrated in Figure 4.8.
+.FC "Figure 4.8"
+.pp
+Because the DFT produces the same number of frequency samples, equally spaced,
+as there were points in the time waveform, there is a tradeoff between
+frequency resolution and time resolution (for a given sampling rate).
+For example, a 256-point transform with a sample rate of 8\ kHz gives the 256
+equally-spaced frequency components between 0 and 8\ kHz that are shown in Table
+4.2.
+.RF
+.nr x0 (\w'time domain'/2)
+.nr x1 (\w'frequency domain'/2)
+.in+1.0i
+.ta 1.0i 3.0i 4.0i
+\h'0.5i+2n-\n(x0u'time domain\h'|3.5i+2n-\n(x1u'frequency domain
+.sp
+sample	time	sample	\h'-3n'frequency
+number		number
+.nr x0 1i+\w'00000'
+\l'\n(x0u\(ul'	\l'\n(x0u\(ul'
+.sp
+\0\0\00	\0\0\0\00 $mu$sec	\0\0\00	\0\0\0\00 Hz
+\0\0\01	\0\0125	\0\0\01	\0\0\031
+\0\0\02	\0\0250	\0\0\02	\0\0\062
+\0\0\03	\0\0375	\0\0\03	\0\0\094
+\0\0\04	\0\0500	\0\0\04	\0\0125
+.nr x2 (\w'...'/2)
+\h'0.5i+4n-\n(x2u'...\h'|3.5i+4n-\n(x2u'...
+\h'0.5i+4n-\n(x2u'...\h'|3.5i+4n-\n(x2u'...
+\h'0.5i+4n-\n(x2u'...\h'|3.5i+4n-\n(x2u'...
+.sp
+\0254	31750	\0254	\07938
+\0255	31875 $mu$sec	\0255	\07969 Hz
+\l'\n(x0u\(ul'	\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.MT 2
+Table 4.2  Time domain and frequency domain samples for a 256-point DFT,
+with 8\ kHz sampling
+.TE
+The top half of the frequency spectrum is of no interest, because
+it contains the complex conjugates of the bottom half (in reverse order),
+corresponding to frequencies greater than half the sampling frequency.
+Thus for a 30\ Hz resolution in the frequency domain,
+256 time samples, or a 32\ msec stretch of speech, needs to be transformed.
+A common technique is to take overlapping periods in the time domain to
+give a new frequency spectrum every 16\ msec.  From the acoustic point
+of view this is a reasonable rate to re-compute the spectrum, for as noted
+above when discussing channel vocoders the rate of change in the spectrum
+is limited by the speed that the speaker can move his vocal organs, and
+anything between 10 and 25\ msec is a reasonable figure for transmitting
+or storing the spectrum.
+.pp
+The DFT is a complex transform, and speech is a real signal.  It is possible
+to do two DFT's at once by putting one time waveform into the real parts
+of the input and another into the imaginary parts.  This destroys the DFT
+symmetry property, for it only holds for real inputs.  But given the DFT
+of a complex sequence formed in this way, it is easy to separate out the
+DFT's of the two real time sequences.  If the two time sequences are
+$x(n)$ and $y(n)$, then the transform of the complex sequence
+.LB
+.EQ
+g(n) ~~ = ~~ x(n) ~+~ jy(n)
+.EN
+.LE
+is
+.LB
+.EQ
+G(r) ~~ = ~~ sum from n=0 to N-1 ~[x(n)W sup rn ~+~ y(n)W sup rn ] .
+.EN
+.LE
+It follows that the complex conjugate of the aliased parts of the spectrum,
+in the upper frequency region, are
+.LB
+.EQ
+G(N-r) sup * ~~ = ~~ sum from n=0 to N-1 ~[x(n)W sup -(N-r)n
+~-~ y(n)W sup -(N-r)n ] ,
+.EN
+.LE
+and this is the same as
+.LB
+.EQ
+G(N-r) sup * ~~ = ~~ sum from n=0 to N-1 ~[x(n)W sup rn
+~-~ y(n)W sup rn ] ,
+.EN
+.LE
+because $W sup N$ is 1 (recall the definition of $W$),
+and so $W sup -Nn$ is 1 for any $n$.
+Thus
+.LB
+.EQ
+X(r) ~~ = ~~ {G(r) ~+~ G(N-r) sup * } over 2
+~~~~~~~~~~~~~~~~
+Y(r) ~~ = ~~ {G(r) ~-~ G(N-r) sup * } over 2
+.EN
+.LE
+extracts the transforms $X(r)$ and $Y(r)$ of the original sequences
+$x$ and $y$.
+.pp
+With speech, this trick is frequently used to calculate two spectra at once.
+Using 256-point transforms, a new estimate of the spectrum can be obtained
+every 16\ msec by taking overlapping 32\ msec stretches of speech, with a
+computational requirement of one 256-point transform every 32\ msec.
+.sh "4.6  The fast Fourier transform"
+.pp
+Straightforward calculation of the DFT, expressed as
+.LB
+.EQ
+G(r) ~~ = ~~ sum from n=0 to N-1 ~g(n)~W sup nr ,
+.EN
+.LE
+for $r=0,~ 1,~ 2,~ ...,~ N-1$, takes $N sup 2$ operations, where each operation
+is a complex multiply and add (for $W$ is, of course, a complex number).
+There is a better way, invented in the early sixties, which reduces this to
+$N ~ log sub 2 N$ operations \(em a very considerable improvement.
+Dubbed the "fast Fourier transform" (FFT) for historical reasons, it would actually
+be better called the "Fourier transform", with the straightforward method above
+known as the "slow Fourier transform"!  There
+is no reason nowadays to use the slow method, except for tiny transforms.
+It is worth describing the basic principle of the FFT, for it is surprisingly
+simple.  More details on actual implementations can be found in Brigham (1974).
+.[
+Brigham 1974
+.]
+.pp
+It is important to realize that the FFT involves no approximation.
+It is an
+.ul
+exact
+calculation of the values that would be obtained by the slow method
+(although it may be affected differently by round-off errors).
+Problems of aliasing and windowing occur in all discrete Fourier transforms,
+and they are neither alleviated nor exacerbated by the FFT.
+.pp
+To gain insight into the working of the FFT, imagine the sequence $g(n)$ split
+into two halves, containing the even and odd points
+respectively.
+.LB
+even half $e(n)$ is $g(0)~ g(2)~ .~ .~ .~ g(N-2)$
+.br
+odd  half $o(n)$ is $g(1)~ g(3)~ .~ .~ .~ g(N-1)$.
+.LE
+Then it is easy to show that if $G$ is the transform of $g$,
+$E$ the transform of $e$,
+and $O$ that of $o$, then
+.LB
+$
+G(r) ~~ = ~~ E(r) ~+~ W sup r O(r)$  for  $r=0,~ 1,~ ...,~ half N -1$,
+.LE
+and
+.LB
+$
+G( half N +r ) ~~ = ~~ E(r) ~+~ W sup { half N +r} O(r)$  for  $
+r = 0,~ 1,~ ...,~ half N -1$.
+.LE
+Calculation of the $E$ and $O$ transforms involves $( half N) sup 2$ operations each,
+while combining them together according to the above relationship occupies
+$N$ operations.  Thus the total is  $N + half N sup 2 $  operations, which is considerably
+less than $N sup 2$.
+.pp
+But don't stop there!  The even half can itself be broken down into
+even and odd parts to expedite its calculation, and the same with the odd half.
+The only constraint is that the number of elements in the sequences splits
+exactly into two at each stage.
+Providing $N$ is a power of 2, then, we are left at the end with some 1-point
+transforms to do.  But transforming a single point leaves it unaffected!  (Check
+the definition of the DFT.)  A quick calculation shows that the number of operations
+needed is not  $N + half N sup 2$, but $N~ log sub 2 N$.
+Figure 4.9 compares this with $N sup 2$, the number of operations for
+straightforward DFT calculation, and it can be seen that the FFT is very much
+faster.
+.FC "Figure 4.9"
+.pp
+The only restriction on the use of the FFT is that $N$ must be a power of two.
+If it is not, alternative, more complicated, algorithms can be used which
+give comparable computational advantages.  However, for speech processing
+the number of samples that are transformed is usually arranged to be a power
+of two.  If a pitch synchronous analysis is undertaken, the
+time stretch that is to be transformed is dictated by the length of the pitch
+period, and will vary from time to time.  Then, it is usual to pad out the
+time waveform with zeros to bring the number of samples up to a power of two;
+otherwise, if different-length time stretches were transformed the scale
+of the resulting frequency components would vary too.
+.pp
+The FFT provides very worthwhile cost savings over the use of a bank of
+bandpass filters for spectral analysis.  Take the example of a 256-point
+transform with 8\ kHz sampling, giving 128 frequency components spaced
+by 31.25\ Hz from 0 up to almost 4\ kHz.  This can be computed on overlapping
+32\ msec stretches of the time waveform, giving a new spectrum every 16\ msec,
+by a single FFT calculation every 32\ msec (putting successive pairs of
+time stretches in the real and imaginary parts of the complex input sequence,
+as described earlier).  The FFT algorithm requires $N~ log sub 2 N$ operations,
+which is 2048 when $N=256$.  An additional 512 operations are required
+for the windowing calculation.  Repeated every 32\ msec, this gives
+a rate of 80,000 operations per second.  To achieve a much lower frequency
+resolution with 20 bandpass filters, each of which are fourth-order,
+will need a great deal more operations.  Each filter will need between 4 and 8
+multiplications per sample, depending on its exact digital implementation.  But new
+samples appear every 125
+.ul
+micro\c
+seconds, and so somewhere around a million
+operations will be required every second.
+If we increased the frequency resolution to that obtained by the FFT, 128
+filters would be needed, requiring between 4 and 8 million operations!
+.sh "4.7  Formant estimation"
+.pp
+Once the frequency spectrum of a speech signal has been calculated, it may
+seem a simple matter to estimate the positions of the formants.  But it is
+not!  Spectra obtained in practice are not usually like the idealized ones
+of Figure 2.2.  One reason for this is that, unless the analysis is
+pitch-synchronous, the frequency spectrum of the excitation source is mixed
+in with that of the vocal tract filter.  There are other reasons, which will
+be discussed later in this section.  But first, let us consider how to
+extract the vocal tract filter characteristics from the combined spectrum
+of source and filter.  To do so we must begin to explore the theory of linear
+systems.
+.rh "Discrete linear systems."
+Figure 4.10 shows an input signal exciting a filter to produce an output
+signal.
+.FC "Figure 4.10"
+For present purposes, imagine the input to be a glottal
+waveform, the filter a vocal tract one, and the output a
+speech signal (which is then subjected to high-frequency de-emphasis
+by radiation from the lips).
+We will consider here
+.ul
+discrete
+systems, so that the input $x(n)$ and output $y(n)$ are sampled signals,
+defined only when $n$ is integral.  The theory is quite similar for continuous
+systems.
+.pp
+Assume that the system is
+.ul
+linear,
+that is, if input $x sub 1 (n)$ produces output $y sub 1 (n)$ and
+input $x sub 2 (n)$ produces output $y sub 2 (n)$,
+then the sum of $x sub 1 (n)$ and
+$x sub 2 (n)$ will produce the sum of $y sub 1 (n)$ and $y sub 2 (n)$.
+It is easy to show from this that, for any constant multiplier $a$,
+the input $ax(n)$ will produce output $ay(n)$ \(em it is pretty obvious
+when $a=2$,
+or indeed any positive integer; for then $ax(n)$ can be written as
+$x(n)+x(n)+...$ .
+Assume further that the system is
+.ul
+time-invariant,
+that is, if input $x(n)$
+produces output $y(n)$ then a time-shifted version of $x$,
+say $x(n+n sub 0 )$ for
+some constant $n sub 0$, will produce the same output, only time-shifted; namely
+$y(n+n sub 0)$.
+.pp
+Now consider the discrete delta function $delta (n)$, which is 0 except at
+$n=0$ when it is 1.
+If this single impulse is presented as input to the system, the output is called
+the
+.ul
+impulse response,
+and will be denoted by $h(n)$.
+The fact that the system is time-invariant guarantees that the response does
+not depend upon the particular time at which the impulse occurred, so that,
+for example, the impulsive input $delta (n+n sub 0 )$ will produce output
+$h(n+n sub 0 )$.
+A delta-function input and corresponding impulse response are shown in Figure
+4.10.
+.pp
+The impulse response of a linear, time-invariant system is an extremely useful
+thing to
+know, for it can be used to calculate the output of the system for any input
+at all!  Specifically, an input signal $x(n)$ can be written
+.LB
+.EQ
+x(n)~ = ~~ sum from {k=- infinity} to infinity ~ x(k) delta (n-k) ,
+.EN
+.LE
+because $delta (n-k)$ is non-zero only when $k=n$, and so for any
+particular value of $n$, the summation contains only
+one non-zero term \(em that is, $x(n)$.
+The action of the system on each term of the sum is to produce an output
+$x(k)h(n-k)$, because $x(k)$ is just a constant, and
+the system is linear.
+Furthermore, the complete input $x(n)$ is just the sum of such terms, and since
+the system is linear, the output is the sum of $x(k)h(n-k)$.
+Hence the response of the system to an arbitrary input is
+.LB
+.EQ
+y(n)~ = ~~ sum from {k=- infinity} to infinity ~ x(k) h(n-k) .
+.EN
+.LE
+This is called a
+.ul
+convolution sum,
+and is sometimes written
+.LB
+.EQ
+y(n)~ =~ x(n) ~*~ h(n).
+.EN
+.LE
+.pp
+Let's write this in terms of $z$-transforms.  The (two-sided) $z$-transform of y(n)
+is
+.LB
+.EQ
+Y(z)~ = ~~ sum from {n=- infinity} to infinity ~y(n)z sup -n ~~ =
+~~ sum from n ~ sum from k ~x(k)h(n-k) ~z sup -n ,
+.EN
+.LE
+Writing $z sup -n$ as  $z sup -(n-k) z sup -k$,  and interchanging the order
+of summation, this becomes
+.LB
+.EQ
+Y(z)~ mark = ~~ sum from k ~[~ sum from n ~ h(n-k)z sup -(n-k) ~]~x(k)z sup -k
+.EN
+.br
+.EQ
+lineup = ~~ sum from k ~H(z)~z sup -k ~~ = ~~ H(z)~ sum from k ~x(k)z sup
+-k ~~=~~H(z)X(z) .
+.EN
+.LE
+Thus convolution in the time domain is the same as multiplication in the
+$z$-transform domain; a very important result.  Applied to the linear system of
+Figure 4.10, this means that the output $z$-transform is the input $z$-transform
+multiplied by the $z$-transform of the system's impulse response.
+.pp
+What we really want to do is to relate the frequency spectrum of
+the output to the response of the system and the spectrum of the
+input.
+In fact, frequency spectra are very closely connected with $z$-transforms.  A
+periodic signal $x(n)$ which repeats every $N$ samples has DFT
+.LB
+.EQ
+sum from n=0 to N-1 ~x(n)~e sup {-j2 pi rn/N} ,
+.EN
+.LE
+and its $z$-transform is
+.LB
+.EQ
+sum from {n=- infinity} to infinity ~x(n) ~z sup -n .
+.EN
+.LE
+Hence the DFT is the same as the $z$-transform of a single cycle of the signal,
+evaluated at the points  $z= e sup {j2 pi r/N}$  for $r=0,~ 1,~ ...~ ,~ N-1$.
+In other
+words, the frequency components are samples of the $z$-transform at $N$
+equally-spaced points around the unit circle.
+Hence the frequency spectrum at the output of a linear system is the product of
+the
+input spectrum and the frequency response of the system itself (that is, the
+transform of its impulse response function).
+It should be admitted that this statement is somewhat questionable,
+because to get from $z$-transforms to DFT's we have assumed that
+a single cycle only is transformed \(em and the impulse response function of
+a system is not necessarily periodic.  The real action of the system is
+to multiply $z$-transforms, not DFT's.  However, it is useful in imagining
+the behaviour of the system to think in terms of products of DFT's; and in
+practice it is always these rather than $z$-transforms which are computed
+because of the existence of the FFT algorithm.
+.pp
+Figure 4.11 shows the frequency spectrum of a typical voiced speech signal.
+.FC "Figure 4.11"
+The overall shape shows humps at the formant positions, like those in the
+idealized Figure 2.2.  However, superimposed on this is an "oscillation"
+(in the frequency domain!) at the pitch frequency.  This occurs because the
+transform of the vocal tract filter has been multiplied by that of the
+pitch pulse, the latter having components at harmonics of the pitch frequency.
+The oscillation must be suppressed before the formants
+can be estimated to any degree of accuracy.
+.pp
+One way of eliminating the oscillation is to perform pitch-synchronous
+analysis.
+This removes the influence of pitch from the frequency domain by dealing with
+it in the time domain!  The snag is, of course, that it is not easy to estimate
+the pitch frequency:  some techniques for doing so are discussed in the next
+main section.
+Another way is to use linear predictive analysis, which really does get rid
+of pitch information without having to estimate the pitch period first.  A
+smooth
+frequency spectrum can be produced using the analysis techniques described in
+Chapter 6, which provides
+a suitable starting-point for formant frequency estimation.
+The third method is to remove the pitch ripple from the frequency spectrum
+directly.  This will be discussed in an intuitive rather than a
+theoretical way, because linear predictive methods are becoming dominant
+in speech processing.
+.rh "Cepstral processing of speech."
+Suppose the frequency spectrum of Figure 4.11 were actually a time waveform.
+To remove the high-frequency pitch ripple is easy:  just filter it out!
+However,
+filtering removes
+.ul
+additive
+ripples, whereas this is a
+.ul
+multiplicative
+ripple.  To turn multiplication into addition, take logarithms.  Then the
+procedure would be
+.LB
+.NP
+compute the DFT of the speech waveform (windowed, overlapped);
+.NP
+take the logarithm of the transform;
+.NP
+filter out the high-frequency part, corresponding to pitch ripple.
+.LE
+.pp
+Filtering is often best done using the DFT.  If the rippled waveform of Figure
+4.11 is transformed, a strong component could be expected at the ripple
+frequency, with weaker ones at its harmonics.  These components can be
+simply removed by setting them to zero, and inverse-transforming the result
+to give a smoothed version of the original frequency spectrum.
+A spectrum of the logarithm of a frequency spectrum is often called a
+.ul
+cepstrum
+\(em a sort of backwards spectrum.  The horizontal axis of the cepstrum,
+having the dimension of time, is called "quefrency"!  Note that high-frequency
+signals have low quefrencies and vice versa.  In practice,
+because the pitch ripple is usually well above the quefrency of interest for
+formants, the upper end of the cepstrum is often simply cut off from a fixed
+quefrency which corresponds to the maximum pitch expected.  However, identifying
+the pitch peaks of the cepstrum has the useful byproduct of giving the pitch
+period of the original speech.
+.pp
+To summarize, then, the procedure for spectral smoothing by the cepstral method
+is
+.LB
+.NP
+compute the DFT of the speech waveform (windowed, overlapped);
+.NP
+take the logarithm of the transform;
+.NP
+take the DFT of this log-transform, calling it the cepstrum;
+.NP
+identify the lowest-quefrency peak in the spectrum as the pitch,
+confirming it by examining its harmonics, which should be
+equally spaced at the pitch quefrency;
+.NP
+remove pitch effects from the cepstrum by cutting off its high-quefrency
+part above either the pitch quefrency or some constant representing the maximum
+expected pitch (which is the minimum expected pitch quefrency);
+.NP
+inverse DFT the resulting cepstrum to give a smoothed spectrum.
+.LE
+.rh "Estimating formant frequencies from smoothed spectra."
+The difficulties of formant extraction are not over even when a smooth frequency
+spectrum has been obtained.  A simple peak-picking algorithm which identifies
+a peak at the $k$'th frequency component whenever
+.LB
+$
+X(k-1) ~<~ X(k)
+$  and  $
+X(k) ~>~ X(k+1)
+$
+.LE
+will quite often identify formants incorrectly.
+It helps to specify in advance minimum and maximum formant frequencies \(em say
+100\ Hz and 3\ kHz for three-formant identification, and ignore peaks lying
+outside these limits.  It helps to estimate
+the bandwidth of the peaks and reject those with bandwidths greater than
+500\ Hz \(em for real formants are never this wide.  However, if two formants are
+very close, then they may appear as a single, wide, peak and be rejected by
+this criterion.  It is usual to take account of formant positions identified
+in previous frames under these conditions.
+.pp
+Markel and Gray (1976) describe in detail several estimation algorithms.
+.[
+Markel Gray 1976 Linear prediction of speech
+.]
+Their simplest uses the number of peaks identified in the raw spectrum
+(under 3\ kHz, and with
+bandwidths greater than 500\ Hz), to determine what to do.  If exactly three
+peaks are found, they are used as the formant positions.  It is claimed that
+this happens about 85% to 90% of the time.
+If only one peak is found, the present frame is ignored and the
+previously-identified
+formant positions are used (this happens less than 1% of the time).
+The remaining cases are two peaks \(em corresponding to omission of one formant \(em
+and four peaks \(em corresponding to an extra formant being included.  (More
+than
+four peaks never occurred in their data.)  Under these conditions,
+a nearest-neighbour measure is used for disambiguation.  The measure is
+.LB
+.EQ
+v sub ij ~ = ~ |{ F sup * } sub i (k) ~-~ F sub j (k-1)| ,
+.EN
+.LE
+where $F sub j sup (k-1)$ is the $j$'th formant frequency defined
+in the previous frame
+$k-1$ and ${ F sup * } sub i (k)$ is the $i$'th raw data frequency estimate
+for frame $k$.
+If two peaks only are found, this measure is used to identify
+the closest peaks in the previous frame; and then the
+third peak of that frame is taken to be the missing formant
+position.  If four peaks are found, the measure is used to
+determine which of them is furthest from the previous formant
+values, and this one is discarded.
+.pp
+This procedure works forwards, using the previous frame to
+disambiguate peaks given in the current one.  More sophisticated
+algorithms work backwards as well, identifying
+.ul
+anchor points
+in the data which have clearly-defined formant positions, and
+moving in both directions from these to disambiguate
+neighbouring frames of data.  Finally, absolute limits can be
+imposed upon the magnitude of formant movements between frames
+to give an overall smoothing to the formant tracks.
+.pp
+Very often, people will refine the result of such automatic formant
+estimation procedures by hand, looking at the tracks, knowing
+what was said, and making adjustments in the light of their
+experience of how formants move in speech.  Unfortunately, it is difficult to
+obtain high-quality formant tracks by completely automatic
+means.
+.pp
+One of the most difficult cases in formant estimation is where
+two formants are so close together that the individual peaks
+cannot be resolved.  One simple solution to this problem is to
+employ "analysis-by-synthesis", whereby once a formant is
+identified, a standard formant shape at this position is
+synthesized and
+subtracted from the
+logarithmic spectrum (Coker, 1963).
+.[
+Coker 1963
+.]
+Then, even if two formants
+are right on top of each other, the second is not missed because
+it remains after the first one has been subtracted.
+.pp
+Unfortunately, however, the single peak which appears when
+two formants are close together usually does not correspond exactly with the
+position of either one.
+There is one rather advanced signal-processing technique that
+can help in this case.
+The frequency spectrum of
+speech is determined by
+.ul
+poles
+which lie in the complex $z$-plane inside the unit circle.  (They
+must be inside the unit circle if the system is stable.  Those
+familiar with Laplace analysis of analogue systems may like to note that the
+left half of the $s$-plane corresponds with the inside of the unit
+circle in the $z$-plane.)  As shown earlier, computing a DFT is tantamount to
+evaluating the $z$-transform at equally-spaced points around the
+unit circle.  However, better resolution is obtained by
+evaluating around a circle which lies
+.ul
+inside
+the unit circle, but
+.ul
+outside
+the outermost pole position.  Such a circle is sketched in
+Figure 4.12.
+.FC "Figure 4.12"
+.pp
+Recall that the FFT is a fast way of calculating the DFT of a
+sequence.  Is there a similarly fast way of evaluating the
+$z$-transform inside the unit circle?  The answer is yes, and the
+technique is known as the "chirp $z$-transform", because it
+involves considering a signal whose frequency increases
+linearly \(em just like a radar chirp signal.  The chirp method
+allows the $z$-transform to be computed quickly at equally-spaced
+points along spirally-shaped contours around the origin of the
+$z$-plane \(em corresponding to signals of linearly increasing
+complex frequency.  The spiral nature of these curves is not of
+particular interest in speech processing.  What
+.ul
+is
+of interest, though, is that the spiral can begin at any point
+on
+the $z=0$ axis, and its pitch can be set arbitrarily.
+If we begin spiralling at $z=0.9$, say, and set the pitch
+to zero, the contour becomes a circle inside the unit one, with
+radius 0.9.  Such a circle is exactly what is needed to refine
+formant resolution.
+.sh "4.8  Pitch extraction"
+.pp
+The last section discussed how to characterize the vocal tract filter
+in the source-filter model of speech production:  this one looks
+at how the most important property of the source \(em that is, the
+pitch period \(em can be derived.  In many ways pitch extraction
+is more important from a practical point of view than is formant
+estimation.  In a voice-output system, formant estimation is
+only necessary if speech is to be stored in formant-coded form.
+For linear predictive storage of speech, or for speech synthesis
+from phonetics or text, formant extraction is unnecessary \(em
+although of course general information about formant
+frequencies and formant tracks in natural speech is needed
+before a synthesis-from-phonetics system can be built.
+However, knowledge of the pitch contour is needed for
+many different purposes.  For example, compact encoding of
+linearly predicted speech relies on the pitch being estimated and
+stored as a parameter separate from the articulation.
+Significant improvements in frequency analysis can be made by
+performing pitch-synchronous Fourier transformations,
+because the need to window is eliminated.
+Many synthesis-from-phonetics systems require the pitch contour
+for utterances to be stored rather computed from markers in the
+phonetic text.
+.pp
+Another issue which is closely bound up with pitch extraction is
+the voiced-unvoiced distinction.   A good pitch estimator ought to
+fail when presented with aperiodic input such as an unvoiced
+sound, and so give a reliable indication of whether the frame of
+speech is voiced or not.
+.pp
+One method of pitch estimation, which uses the cepstrum, has been outlined
+above.  It involves a substantial amount of computation,
+and has a high degree of complexity.  However, if implemented
+properly it gives excellent results, because the source-filter
+structure of the speech is fully utilized.
+Another method, using the
+linear prediction residual, will be described in Chapter 6.
+Again, this requires a great deal of computation of a fairly sophisticated
+nature, and gives good results \(em although it relies on a
+somewhat more
+restricted version of the source-filter model than cepstral
+analysis.
+.rh "Autocorrelation methods."
+The most reliable way of estimating the pitch of a periodic
+signal which is corrupted by noise is to examine its
+short-time autocorrelation function.
+The autocorrelation of a signal $x(n)$ with lag $k$ is defined as
+.LB
+.EQ
+phi (k) ~~ = ~~ sum from {n=- infinity} to infinity ~ x(n)x(n+k) .
+.EN
+.LE
+If the signal is quasi-periodic, with slowly varying period,
+a finite stretch of it can be isolated with a window
+$w(i)$, which is 0 when $i$ is outside the range $[0,N)$.
+Beginning this window at sample $m$ gives the windowed signal
+.LB
+.EQ
+x(n)w(n-m),
+.EN
+.LE
+whose autocorrelation,
+the
+.ul
+short-time
+autocorrelation of the signal $x$ at point $m$ is
+.LB
+.EQ
+phi sub m (k)~ = ~~ sum from n ~ x(n)w(n-m)x(n+k)w(n-m+k) .
+.EN
+.LE
+.pp
+The autocorrelation function exhibits peaks at lags which correspond to
+the pitch periods and multiples of it.  At such lags, the signal is in
+phase with a delayed version of itself, giving high correlation.
+The pitch of natural speech ranges about three octaves, from 50\ Hz (low-pitched men) to around
+400\ Hz (children).  To ensure that at least two pitch cycles are seen, even at
+the
+low end, the window needs to be at least 40\ msec long, and the autocorrelation
+function calculated for lags up to 20\ msec.  The peaks which occur at lags
+corresponding to multiples of the pitch become smaller as the multiple
+increases, because the speech waveform will change slightly and the pitch
+period is not perfectly constant.  If signals at the high end of the pitch
+range, 400\ Hz, are
+viewed through a 40\ msec autocorrelation window, considerable smearing of
+pitch resolution in the time domain is to be expected.  Finally, for unvoiced
+speech, no substantial peaks of autocorrelation will occur.
+.pp
+If all deviations from perfect periodicity can be attributed to
+additive, white, Gaussian noise, then it can be shown from
+standard detection theory that autocorrelation methods are
+appropriate for pitch identification.  Unfortunately, this is
+certainly not the case for speech signals.  Although the
+short-time autocorrelation of voiced speech exhibits peaks at
+multiples of the pitch period, it is not clear that it is any
+easier to detect these peaks in the autocorrelation function
+than it is in the original time waveform!  To take a simple
+example, if a signal contains a fundamental and in-phase first
+and second harmonics,
+.LB
+.EQ
+x(n)~ =~ a sin 2 pi fnT ~+~ b sin 4 pi fnT ~+~ c sin 6 pi fnT ,
+.EN
+.LE
+then its autocorrelation function is
+.LB
+.EQ
+phi (k) ~=~~ {a sup 2 ~cos~2 pi fkT~+~b sup 2 ~cos~2 pi
+fkT~+~c sup 2 ~cos 2 pi fkT} over 2 ~ .
+.EN
+.LE
+There is no reason to believe that detection of the fundamental
+period of this signal will be any easier in the autocorrelation
+domain than in the time domain.
+.pp
+The most common error of pitch detection by autocorrelation
+analysis is that the periodicities of the formants are confused
+with the pitch.  This typically leads to the repetition time
+being identified as  $T sub pitch ~ +- ~ T sub formant1$,  where the
+$T$'s are the periods of the pitch and first formant.  Fortunately,
+there are simple ways of processing the signal non-linearly to
+reduce the effect of formants on pitch estimation using autocorrelation.
+.pp
+One way
+is to low-pass filter the
+signal with a cut-off above the maximum pitch period, say 600
+Hz.  However, formant 1 is often below this value.  A different
+technique, which may be used in conjunction with filtering, is
+to "centre-clip" the signal as shown in Figure 4.13.
+.FC "Figure 4.13"
+This
+removes many of
+the ripples which are associated with formants.  However, it
+entails the use of an adjustable clipping threshold to cater for
+speech of varying amplitudes.  Sondhi (1968), who introduced the
+technique, set the clipping level at 30% of the maximum
+amplitude.
+.[
+Sondhi 1968
+.]
+An alternative which achieves
+much the same effect without the need to fiddle with thresholds,
+is to cube the signal, or raise it to some other high (odd!)
+power, before taking the autocorrelation.  This highlights the
+peaks and suppresses the effect of low-amplitude parts.
+.pp
+For very accurate pitch detection, it is best to combine the evidence
+from several different methods of analysis of the time waveform.
+The autocorrelation function provides one source of evidence;
+and the cepstrum provides another.
+A third source comes from the time waveform itself.
+McGonegal
+.ul
+et al
+(1975) have described a semi-automatic method of pitch
+detection which uses human judgement to make a final decision based upon these
+three sources of evidence.
+.[
+McGonegal Rabiner Rosenberg 1975 SAPD
+.]
+This appears to provide highly accurate pitch contours at the expense of
+considerable human effort \(em it takes an experienced user 30 minutes to
+process each second of speech.
+.rh "Speeding up autocorrelation."
+Calculating the autocorrelation function is an
+arithmetic-intensive procedure.  For large lags, it can best be
+done using FFT methods; although there are simpler arithmetic
+tricks which speed it up without going to such complexity.
+However, with the availability of analogue delay lines using
+charge-coupled devices, autocorrelation can now be done
+effectively and cheaply by analogue, sampled-data, hardware.
+.pp
+Nevertheless, some techniques to speed up digital
+calculation of short-time autocorrelations are in wide use.  It
+is tempting to hard-limit the signal so that it becomes binary
+(Figure 4.14(a)), thus eliminating multiplication.
+.FC "Figure 4.14"
+This can be
+disastrous, however, because hard-limited speech is known to
+retain considerable intelligibility and therefore the formant
+structure is still there.  A better plan is to take
+centre-clipped speech and hard-limit that to a ternary signal
+(Figure 4.14(b)).  This simplifies the computation considerably
+with essentially no degradation in performance (Dubnowski
+.ul
+et al,
+1976).
+.[
+Dubnowski Schafer Rabiner 1976 Digital hardware pitch detector
+.]
+.pp
+A different approach to reducing the amount of calculation is to
+perform a kind of autocorrelation which does not use
+multiplications.  The
+"average magnitude difference function",
+which is defined by
+.LB
+.EQ
+d(k)~ = ~~ sum from {n=- infinity} to infinity ~ |x(n)-x(n+k)| ,
+.EN
+.LE
+has been used for this purpose with some success (Ross
+.ul
+et al,
+1974).
+.[
+Ross Schafer Cohen Freuberg Manley 1974
+.]
+It exhibits dips at pitch periods (instead of the peaks of the
+autocorrelation function).
+.rh "Feature-extraction methods."
+Another possible way of extracting pitch in the time domain is to try to
+integrate information from different sources to give reliable
+pitch estimates.  Several features of the time
+waveform can be defined, each of which provides an estimate of the pitch period,
+and
+an overall estimate can be obtained by majority vote.
+.pp
+For example, suppose that the only feature of the speech
+waveform which is retained is the height and position of the
+peaks, where a "peak" is defined by the simplistic criterion
+.LB
+$
+x(n-1) ~<~ x(n)
+$  and  $
+x(n) $>$ x(n+1) .
+$
+.LE
+Having found a peak which is thought to represent a pitch pulse,
+one could define a "blanking period", based upon the current
+pitch estimate, within which the next pitch pulse could not
+occur.  When this period has expired, the next pitch pulse is
+sought.  At first, a stringent criterion should be used for
+identifying the next peak as a pitch pulse; but it can gradually be
+relaxed if time goes on without a suitable pulse being
+located.  Figure 4.15 shows a convenient way of doing this:  a
+decaying exponential is begun at the end of the blanking period
+and when a peak shows above, it is identified as a pitch pulse.
+.FC "Figure 4.15"
+One big advantage of this type of algorithm is that the data is
+greatly reduced by considering peaks only \(em which can be
+detected by simple hardware.  Thus it can permit real-time
+operation on a small processor with minimal special-purpose
+hardware.
+.pp
+Such a pitch pulse detector is exceedingly simplistic, and will
+often identify the pitch incorrectly.  However, it can be used
+in conjunction with other features to produce good pitch
+estimates.  Gold and Rabiner (1969), who pioneered the
+approach, used six features:
+.[
+Gold Rabiner 1969 Parallel processing techniques for pitch periods
+.]
+.LB
+.NP
+peak height
+.NP
+valley depth
+.NP
+valley-to-peak height
+.NP
+peak-to-valley depth
+.NP
+peak-to-peak height (if greater than 0)
+.NP
+valley-to-valley depth (if greater than 0).
+.LE
+The features are symmetric with regard to peaks and valleys.
+The first feature is the one described above, and the second one works in
+exactly the same way.
+The third feature records the
+height between each valley and the succeeding peak, and fourth
+uses the depth between each peak and the succeeding valley.  The
+purpose of the final two detectors is to eliminate secondary,
+but rather large, peaks from consideration.  Figure 4.16 shows
+the kind of waveform on which the other features might
+incorrectly double the pitch, but the last two features identify
+correctly.
+.FC "Figure 4.16"
+.pp
+Gold and Rabiner also included the last two pitch estimates from each
+feature detector.
+Furthermore, for each feature, the present estimate
+was added to the previous one to make a fourth, and the previous one to
+the one before that to make a fifth, and all three were added together
+to make a sixth; so that for each feature there were 6 separate estimates of
+pitch.  The reason for this is that if three consecutive estimates of the
+fundamental period are $T sub 0$, $T sub 1$ and $T sub 2$; then if some peaks are
+being falsely identified, the actual period could be any of
+.LB
+.EQ
+T sub 0 ~+~ T sub 1 ~~~~ T sub 1 ~+~ T sub 2 ~~~~
+T sub 0 ~+~ T sub 1 ~+~ T sub 2 .
+.EN
+.LE
+It is essential to do this, because
+a feature of a given type can occur more than once in a pitch period \(em
+secondary peaks usually exist.
+.pp
+Six features, each contributing six separate estimates, makes 36 estimates
+of pitch in all.
+An overall figure was obtained from this
+set by selecting the most popular estimate (within some
+pre-specified tolerance).  The complete scheme has been
+evaluated extensively (Rabiner
+.ul
+et al,
+1976) and compares
+favourably with other methods.
+.[
+Rabiner Cheng Rosenberg McGonegal 1976
+.]
+.pp
+However, it must be admitted that this procedure seems to be rather
+.ul
+ad hoc
+(as are many other successful speech parameter estimation
+algorithms!).  Specifically, it is not easy to predict what
+kinds of waveforms it will fail on, and evaluation of it can
+only be pragmatic.  When used to
+estimate the pitch of musical
+instruments and singers over a 6-octave range (40\ Hz to 2.5\ kHz),
+instances were found where it failed dramatically (Tucker and Bates, 1978).
+.[
+Tucker Bates 1978
+.]
+This is, of
+course, a much more difficult problem than pitch estimation for
+speech, where the range is typically 3 octaves.
+In fact, for speech the feature
+detectors are usually preceded by
+a low-pass filter to attenuate the myriad
+of peaks
+caused by higher formants, and this
+is inappropriate for
+musical applications.
+.pp
+There is evidence which shows that additional features can
+assist with pitch identification.  The above features are all
+based upon the signal amplitude, and could be described as
+.ul
+secondary
+features derived from a single
+.ul
+primary
+feature.  Other primary features can easily be defined.
+Tucker and Bates (1978) used a centre-clipped waveform, and considered only
+the peaks rising above the central region.
+.[
+Tucker Bates 1978
+.]
+They defined two
+further primary features, in addition to the peak amplitude:  the
+.ul
+time width
+of a peak (period for which it is
+outside the clipping level), and its
+.ul
+energy
+(again, outside the clipping level).  The primary
+features are shown in Figure 4.17.
+.FC "Figure 4.17"
+Secondary features are
+defined, based on these three primary ones, and pitch estimates
+are made for each one.  A further innovation was to combine the
+individual estimates on a way which is based upon
+autocorrelation analysis, reducing to some degree the
+.ul
+ad-hocery
+of the pitch detection process.
+.sh "4.9  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "4.10  Further reading"
+.pp
+There are a lot of books on digital signal analysis, although in general
+I find them rather turgid and difficult to read.
+.LB "nn"
+.\"Ackroyd-1973-1
+.]-
+.ds [A Ackroyd, M.H.
+.ds [D 1973
+.ds [T Digital filters
+.ds [I Butterworths
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Here is the exception to prove the rule.
+This book
+.ul
+is
+easy to read.
+It provides a good introduction to digital signal processing,
+together with a wealth of practical design information on digital filters.
+.in-2n
+.\"Committee.I.D.S.P-1979-3
+.]-
+.ds [A IEEE Digital Signal Processing Committee
+.ds [D 1979
+.ds [T Programs for digital signal processing
+.ds [I Wiley
+.ds [C New York
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.in+2n
+This is a remarkable collection of tried and tested Fortran programs
+for digital signal analysis.
+They are all available from the IEEE in machine-readable form on magnetic
+tape.
+Included are programs for digital filter design, discrete Fourier transformation,
+and cepstral analysis, as well as others (like linear predictive analysis;
+see Chapter 6).
+Each program is accompanied by a concise, well-written description of how
+it works, with references to the relevant literature.
+.in-2n
+.\"Oppenheim-1975-4
+.]-
+.ds [A Oppenheim, A.V.
+.as [A " and Schafer, R.W.
+.ds [D 1975
+.ds [T Digital signal processing
+.ds [I Prentice Hall
+.ds [C Englewood Cliffs, New Jersey
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is one of the standard texts on most aspects of digital signal processing.
+It treats the $z$-transform, digital filters, and discrete Fourier transformation
+in far more detail than we have been able to here.
+.in-2n
+.\"Rabiner-1975-5
+.]-
+.ds [A Rabiner, L.R.
+.as [A " and Gold, B.
+.ds [D 1975
+.ds [T Theory and application of digital signal processing
+.ds [I Prentice Hall
+.ds [C Englewood Cliffs, New Jersey
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is the other standard text on digital signal processing.
+It covers the same ground as Oppenheim and Schafer (1975) above,
+but with a slightly faster (and consequently more difficult) presentation.
+It also contains major sections on special-purpose hardware for
+digital signal processing.
+.in-2n
+.\"Rabiner-1978-1
+.]-
+.ds [A Rabiner, L.R.
+.as [A " and Schafer, R.W.
+.ds [D 1978
+.ds [T Digital processing of speech signals
+.ds [I Prentice Hall
+.ds [C Englewood Cliffs, New Jersey
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Probably the best single reference for digital speech analysis,
+as it is for the time-domain encoding techniques of the last chapter.
+Unlike the books cited above, it is specifically oriented to speech processing.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "5  RESONANCE SPEECH SYNTHESIZERS"
+.ds RT "Resonance speech synthesizers
+.ds CX "Principles of computer speech
+.pp
+This chapter considers the design of speech synthesizers which
+implement a direct electrical analogue of
+the resonance properties of the vocal tract by providing a filter for each
+formant whose resonant frequency is to be controlled.  Another method is the
+channel vocoder, with a bank of fixed filters whose gains are varied to match
+the spectrum of the speech as described in Chapter 4.  This is not generally
+used for synthesis from a written representation, however, because it is hard
+to get good quality speech.  It
+.ul
+is
+used sometimes for low-bandwidth
+transmission and storage, for
+it is fairly easy to analyse natural speech into fixed frequency bands.
+A second alternative to the resonance synthesizer is the linear predictive
+synthesizer, which at present is used quite extensively and is likely to become
+even more popular.  This is covered in the next chapter.
+Another alternative is the articulatory synthesizer, which
+attempts to model the vocal tract directly, rather than
+modelling the acoustic output from it.
+Although, as noted in Chapter 2, articulatory synthesis holds a promise of
+high-quality speech \(em for the coarticulation effects caused by tongue
+and jaw inertia can be modelled directly \(em this has not yet been realized.
+.pp
+The source-filter model of speech production indicates that an electrical
+analogue of the vocal tract can be obtained by considering the source
+excitation and the filter that produces the formant frequencies separately.
+This approach was pioneered by Fant (1960), and we shall present much of his
+work in this chapter.
+.[
+Fant 1960 Acoustic theory of speech production
+.]
+There has been some discussion over whether the source-filter model really
+is a good one, and some
+synthesizers
+explicitly introduce an element of
+"sub-glottal coupling", which simulates the effect of the lung cavity
+on the vocal tract transfer function during the periods when the glottis is
+open (for an example see Rabiner, 1968).
+.[
+Rabiner 1968 Digital formant synthesizer JASA
+.]
+However, this is very much a low-order effect when considering
+speech synthesized by rule from a written representation, for the software
+which calculates parameter values to drive the synthesizer is a far greater
+source of degradation in speech quality.
+.sh "5.1  Overall spectral considerations"
+.pp
+Figure 5.1 shows the source-filter model of speech production.
+.FC "Figure 5.1"
+For voiced speech, the excitation source produces a waveform whose frequency
+components decay at about 12\ dB/octave, as we shall see in a later section.
+The excitation passes into the vocal tract filter.  Conceptually, this can best
+be viewed as an infinite series of formant filters, although for implementation
+purposes only the first few are modelled explicitly and the effect of the rest
+is lumped together into a higher-formant compensation network.  In either case
+the overall frequency profile of the filter is a flat one, upon which humps are
+superimposed at the various formant frequencies.  Thus the output of the
+vocal tract filter falls off at 12\ dB/octave just as the input does.
+However, measurements of actual speech show a 6\ dB/octave decay with increasing
+frequency.  This is explained by the effect of radiation of speech from the
+lips, which in fact has a "differentiating" action, producing a 6\ dB/octave
+rise in the frequency spectrum.  This 6\ dB/octave lift is similar to that
+provided by a treble boost control on a radio or amplifier.  Speech synthesized
+without it sounds unnaturally heavy and bassy.
+.pp
+These overall spectral shapes, which are derived from considering the human
+vocal tract, are summarized in the upper annotations in Figure 5.1.  But there
+is no real necessity for a synthesizer to model the frequency characteristics
+of the human vocal tract at intermediate points:  only the output speech is of
+any concern.  Because the system is a linear one, the filter blocks in the
+figure can be shuffled around to suit engineering requirements.  One such
+requirement is the desire to minimize internally-generated noise in the
+electrical implementation, most of which will arise in the vocal tract filter
+(because it is much more complicated than the other components).  For this
+reason an excitation source with a flat spectrum is often preferred, as shown
+in the lower annotations.  This can be generated either by taking the desired
+glottal pulse shape, with its 12\ dB/octave fall-off, and passing it through a
+filter giving 12\ dB/octave lift at higher frequencies; or, if the pulse shape
+is to be stored digitally, by storing its second derivative instead.
+Then the radiation compensation, which is now more properly called
+"spectral equalization", will comprise a 6\ dB/octave fall-off to give the
+required trend in the output spectrum.
+.pp
+For a given pitch period, this scheme yields exactly the same spectral
+characteristics as the original system which modelled the human vocal tract.
+However, when the pitch varies there will be a difference, for sounds with
+higher excitation frequencies will be attenuated by \-6\ dB/octave in the new
+system and +6\ dB/octave in the old by the final spectral equalization.
+In practice, the pitch of the human voice lies quite low in the frequency
+region \(em usually below 400\ Hz \(em and if all filter characteristics begin
+their roll-off at this frequency the two systems will be the same.  This
+simplifies the implementation with a slight compromise in its accuracy in
+modelling the spectral trend of human speech, for the overall \-6\ dB/octave
+decay actually begins at a frequency of around 100\ Hz.  If this is
+implemented, some adjustment will need to be made to the amplitudes to ensure
+that high-pitched sounds are not attenuated unduly.
+.pp
+The discussion so far pertains to voiced speech only.  The source spectrum of
+the random excitation in unvoiced sounds is substantially flat, and combines
+with the radiation from the lips to give a +6\ dB/octave rise in the output
+spectrum.  Hence if spectral equalization is changed to \-6\ dB/octave to
+accomodate a voiced excitation with flat spectrum, the noise source should
+show a 12\ dB/octave rise to give the correct overall effect.
+.sh "5.2  The excitation sources"
+.pp
+In human speech, the excitation source for voiced sounds is produced by two
+flaps of skin called the "vocal cords".  These are blown apart by pressure from
+the lungs.  When they come apart the pressure is relieved, and the muscles
+tensioning the skin cause the flaps to come together again.  Subsequently, the
+lung pressure \(em called "sub-glottal pressure" \(em builds up once more and the
+process is repeated.  The factors which influence the rate and nature of
+vibration are muscular tension of the cords and the sub-glottal pressure.  The detail
+of the excitation has considerable importance to speech synthesis because it
+greatly influences the apparent naturalness of the sound produced.  For example,
+if you have inflamed vocal cords caused by laryngitis the sound quality
+changes dramatically.  Old people who do not have proper muscular control over
+their vocal cord tension produce a quavering sound.  Shouted speech can easily
+be distinguished from quiet speech even when the volume cue is absent \(em you
+can verify this by fiddling with the volume control of a tape recorder \(em because
+when shouting, the vocal cords stay apart for a much smaller fraction of the
+pitch cycle than at normal volumes.
+.rh "Voiced excitation in natural speech."
+There are two basic ways to examine the shape of the excitation source in
+people.  One is to use a dentist's mirror and high-speed photography to observe
+the vocal cords directly.  Although it seems a lot to ask someone to speak
+naturally with a mirror stuck down the back of his throat, the method has been
+used and photographs can be found, for example, in Flanagan (1972).
+.[
+Flanagan 1972 Speech analysis synthesis and perception
+.]
+The second
+technique is to process the acoustic waveform digitally, identifying the
+formant positions and deducting the formant contributions from the waveform by
+filtering.  This leaves the basic excitation waveform, which can then be
+displayed.  Such techniques lead to excitation shapes like those sketched in
+Figure 5.2, in which the gradual opening and abrupt closure of the vocal cords
+can easily be seen.
+.FC "Figure 5.2"
+.pp
+It is a fact that if a periodic function has one or more discontinuities, its frequency
+spectrum will decay at sufficiently high frequencies at the rate of 6\ dB/octave.
+For example, the components of the square wave
+.LB
+$
+g(t) ~~ = ~~ mark 0
+$  for $
+0 <= t < h
+$
+.br
+$
+lineup 1
+$  for $
+h <= t < b
+$
+.LE
+can be calculated from the Fourier series
+.LB
+.EQ
+G(r) ~~ = ~~ 1 over b ~ integral from 0 to b ~g(t)~e sup {-j2 pi rt/b} ~dt
+~~ = ~~ j over {2 pi r} ~e sup {-j2 pi rh/b} ,
+.EN
+.LE
+so $|G(r)|$ is proportional to $1/r$, and the change in one octave is
+.LB
+.EQ
+20~log sub 10 ~ |G(2r)| over |G(r)|
+~~=~~20~log sub 10 ~ 1 over 2
+~~ = ~ 
+.EN
+\-6\ dB.
+.LE
+However, if the discontinuities are ones of slope only, then the asymptotic decay
+at high frequencies is 12\ dB/octave.  Thus the glottal excitation of Figure 5.2
+will decay at this rate.
+Note that it is not the
+.ul
+number
+but the
+.ul
+type
+of discontinuities which are important in determining the asymptotic spectral
+trend.
+.rh "Voiced excitation in synthetic speech."
+There are several ways that glottal excitation can be simulated in a synthesizer,
+four of which are shown in Figure 5.3.
+.FC "Figure 5.3"
+The square pulse and the sawtooth pulse
+both exhibit discontinuities, and so will have the wrong asymptotic rate of
+decay (6\ dB/octave instead of 12\ dB/octave).  A better bet is the triangular
+pulse.  This has the correct decay, for there are only discontinuities of slope.
+However, although the asymptotic rate of decay is of first importance, the fine
+structure of the frequency spectrum at the lower end is also significant, and
+the fact that there are two discontinuities of slope instead of just one in the
+natural waveform means that the spectra cannot match closely.
+.pp
+Rosenberg (1971) has investigated several different shapes using listening
+tests, and he found that the polynomial approximation sketched in Figure 5.3
+was preferred by listeners.
+.[
+Rosenberg 1971
+.]
+This has one slope discontinuity, and comprises
+three sections:
+.LB
+$g(t) ~~ = ~~ 0$  for $0 <= t < t sub 1$    (flat during the period of closure)
+.sp
+$g(t) ~~ = ~~ A~ u sup 2 (3 - 2u) $,	where
+$u ~=~ {t-t sub 1} over {t sub 2 -t sub 1} $ ,    for
+$t sub 1 <= t < t sub 2$  (opening phase)
+.sp
+.sp
+$g(t) ~~ = ~~ A~ (1 - v sup 2 )$,	where
+$v ~=~ {t-t sub 2} over {b-t sub 2} $ ,    for
+$t sub 2 <= t < b$    (closing phase).
+.LE
+It is easy to see that the joins between the first and second section, and
+between the second and third section, are smooth; but that the slope of the third
+section at the end of the cycle when $t=b$ is
+.LB
+.EQ
+dg over dt ~~ = ~~ -~ 2A.
+.EN
+.LE
+$A$ is the maximum amplitude of the pulse, and is reached when $t=t sub 2$.
+.pp
+A much simpler glottal pulse shape to implement is the filtered impulse.
+Passing an impulse through a filter with characteristic
+.LB
+.EQ
+1 over {(1+sT) sup 2}
+.EN
+.LE
+imparts a 12\ dB/octave decay after frequency $1/T$.  This gives a pulse shape of
+.LB
+.EQ
+g(t) ~~ = ~~ A~ t over T ~e sup {1-t/T} ,
+.EN
+.LE
+which is sketched in Figure 5.4.
+.FC "Figure 5.4"
+The pulse is the wrong way round in time
+when compared with the desired one; but this is not important under most
+listening conditions because phase differences are not noticeable (this
+point is discussed further below).
+The maximum is reached when $t=T$ and has
+height $A$.  The value zero is never actually attained, for the decay to it
+is asymptotic, and if the slight discontinuity between pulses shown in the
+Figure is left, the asymptotic rate of decay of the frequency spectrum will
+be 6\ dB/octave rather than 12\ dB/octave.  However, in a real implementation
+involving filtering an impulse there will be no such discontinuity, for the
+next pulse will start off where the last one ended.
+.pp
+This seems to be an attractive scheme because of its simplicity,
+and indeed is sometimes used in speech synthesis.  However, it does not have
+the right properties when the pitch is varied, for in real glottal
+waveforms the maximum occurs at a fixed
+.ul
+fraction
+of the period, whereas the filtered impulse's maximum is at a fixed time, $T$.
+If $T$ is chosen to make the system correct at high pitch frequencies (say
+400\ Hz), then the pulse will be much too narrow at low pitches and sound rather
+harsh.  The only solution is to vary the filter parameters with the pitch,
+leading to complexity again.
+.pp
+Holmes (1973) has made an extensive study of the effect of the glottal
+waveshape on the naturalness of high-quality synthesized speech.
+.[
+Holmes 1973 Influence of glottal waveform on naturalness
+.]
+He employed a rather special speech synthesizer, which provides far more
+comprehensive and sophisticated control than most.  It was driven by parameters
+which were extracted from natural utterances by hand \(em but the process of
+generating and tuning them took many months of a skilled person's time.
+By using the pulse shape
+extracted from the natural utterance, he found that synthetic and natural
+versions could actually be made indistinguishable to most people, even under high-quality
+listening conditions using headphones.  Performance dropped quite drastically
+when one of Rosenberg's pulse shapes, similar to the three-section one given
+above, was used.  Holmes also investigated phase effects and found that whilst
+different pulse shapes with identical frequency spectra could easily be
+distinguished when listening over headphones, there was no perceptible difference
+if the listener was placed at a comfortable distance from a loudspeaker in
+a room.  This is attributable to the fact that the room itself imposes a
+complex modification to the phase characteristics of the speech signal.
+.pp
+Although a great deal of care must be taken with the glottal pulse shape for very
+high-quality synthetic speech, for speech synthesized by rule from a written
+representation the degradation which stems from incorrect control of the
+synthesizer parameters is much greater than that caused by using a slightly
+inferior glottal pulse.  The triangular pulse illustrated in Figure 5.3
+has been found quite satisfactory for speech synthesis by rule.
+.rh "Unvoiced excitation."
+Speech quality is much less sensitive to the characteristics of the unvoiced
+excitation.  Broadband white noise will serve admirably.  It is quite
+acceptable to generate this digitally, using a pseudo-random feedback shift
+register.  This gives a bit sequence whose autocorrelation is zero except at
+multiples of the repetition length.  The repetition length
+can easily be made as long as the number of states in the shift
+register (less one) \(em in this case, the configuration is called
+"maximal length" (Gaines, 1969).
+.[
+Gaines 1969 Stochastic computing advances in information science
+.]
+For example, an 18-bit maximal-length shift register will repeat
+every $2 sup 18 -1$ cycles.  If the bit-stream is used as a source of analogue
+noise, the autocorrelation function will have triangular parts whose width is
+twice the clock period, as shown in Figure 5.5.
+.FC "Figure 5.5"
+According to a well-known
+result (the Weiner-Kinchine theorem; see for example Chirlian, 1973)
+the power density of the frequency
+spectrum is the same as the Fourier transform of the autocorrelation function.
+.[
+Chirlian 1973
+.]
+Since the feedback shift register gives a periodic autocorrelation function,
+its transform is a Fourier series.  The $r$'th frequency component is
+.LB
+.EQ
+G(r) ~~ = ~~ {R sup 2} over {4 pi sup 2 r sup 2 T}
+~(1~-~~cos~{{2 pi rT} over R}) ~ .
+.EN
+.LE
+Here, $T$ is the clock period and  $R=(2 sup N -1)T$  is the repetition time of
+an $N$-bit shift register.
+.pp
+The spectrum is a bar spectrum, with components spaced
+at
+.LB
+$
+{1 over R}~~=~~{1 over {(2 sup N -1)T}}$   Hz.
+.LE
+These are very close together \(em with $N=18$ and
+sampling at 20\ kHz (50\ $mu$sec)
+the spacing becomes under 0.1\ Hz \(em and so it is reasonable to treat the
+spectrum as continuous, with
+.LB
+.EQ
+G(f) ~~ = ~~ 1 over {4 pi sup 2 f sup 2 T}~~(1~-~cos 2 pi fT) .
+.EN
+.LE
+This spectrum is sketched in Figure 5.6(a), and the measured result of an actual
+implementation in Figure 5.6(b).
+.FC "Figure 5.6"
+The 3\ dB point occurs when
+.LB
+.EQ
+{G(f) over G(0)} ~~=~~{1 over 2} ~ ,
+.EN
+.LE
+and $G(0)$ is $T/2$.  Hence, at the 3\ dB point,
+.LB
+.EQ
+{1~-~cos 2 pi fT} over {2 pi sup 2 f sup 2 T sup 2}
+~~ = ~~ 1 over 2 ~ ,
+.EN
+.LE
+which has solution  $f=0.45/T$.
+Thus a pseudo-random shift register generates
+noise whose spectrum is substantially flat up to half the clock frequency.
+Anything over 10\ kHz is therefore a suitable clocking rate for speech-quality
+noise.  Choose 20\ kHz to err on the conservative side.  If the repetition occurs
+in less than 3 or 4 seconds, it can be heard quite clearly; but above this figure
+it is not noticeable.  An 18-bit shift register clocked at 20\ kHz repeats
+every  $(2 sup 18 -1)/20000 ~ = ~ 13$ seconds, which is more than adequate.
+.sh "5.3  Simulating vocal tract resonances"
+.pp
+The vocal tract, from glottis to lips, can be modelled as an unconstricted
+tube of varying cross-section with no side branches and no sub-glottal coupling.
+This has an all-pole transfer function, which can be written in the form
+.LB
+.EQ
+H(s) ~~ = ~~
+{w sub 1 sup 2} over {s sup 2 ~+~ b sub 1 s ~+~ w sub 1 sup 2}
+~.~{w sub 2 sup 2} over {s sup 2 ~+~ b sub 2 s ~+~ w sub 2 sup 2} ~~ .~ .~ .
+.EN
+.LE
+There is an unspecified (conceptually infinite) number of terms in the
+product.  Each of them produces a peak in the energy spectrum,
+and these are the formants we observed in Chapter 2.
+.pp
+Formants appear even in an over-simplified
+model of the tract as a tube of uniform cross-section, with a sound source
+at one end (the larynx) and open at the other (the lips).
+This extremely crude model was discussed in Chapter 2, and surprisingly,
+perhaps, it gives a good approximation to the observed formant frequencies
+for a neutral, relaxed vowel such as that in
+.ul
+"a\c
+bove".
+.pp
+Speech is made by varying the postures of the various organs of the vocal tract.
+Different vowels, for example, result largely from different tongue positions
+and lip postures.  Naturally, such physical changes alter the frequencies of the
+resonances, and successful automatic speech synthesis depends upon
+successful movement of the formants.  Fortunately, only the first three or
+four resonances need to be altered even for extremely realistic synthesis, and
+virtually all existing synthesizers provide control over these formants only.
+.rh "Analysis of a single formant."
+Each formant is modelled as a second-order resonance, with transfer function
+.LB
+.EQ
+H(s) ~~ = ~~ {w sub c sup 2} over {s sup 2 ~+~ b s ~+~ w sub c sup 2} ~ .
+.EN
+.LE
+As will be shown below, $w sub c$ is the nominal resonant frequency in
+radians/s, and $b$ is the
+approximate 3\ dB bandwidth of the resonance.  The term $w sub c sup 2$ in the
+numerator adjusts the gain to be unity at DC ($s=0$).
+.pp
+To calculate the frequency response of the formant, write  $s=jw$.  Then the
+energy spectrum is
+.LB
+.EQ
+|H(jw)| sup 2 ~~ mark = ~~
+{w sub c sup 4} over {(w sup 2 - w sub c sup 2 ) sup 2 ~+~ b sup 2 w sup 2}
+.EN
+.sp
+.sp
+.EQ
+lineup = ~~
+{w sub c sup 4} over
+{[w sup 2 ~-~(w sub c sup 2 -~ {b sup 2} over 2 )] sup 2 ~~
++~~b sup 2 (w sub c sup 2~-~{{b sup 2} over 4})} ~ .
+.EN
+.sp
+.LE
+This reaches a maximum when the squared term in the denominator of the second
+expression is zero, namely when  $w=(w sub c sup 2 ~-~ b sup 2 /2) sup 1/2$.
+However,
+formant bandwidths are low compared with their centre frequencies, and so to
+a good approximation the peak occurs
+at  $w=w sub c$  and is of amplitude  $w sub c /b$,  that
+is,  $10~log sub 10 w sub c /b$\ dB above the DC gain.
+At frequencies higher than the peak the energy falls off as $1/w sup 4$,
+a factor of 1/16 for each doubling
+in frequency, and so the asymptotic decay is 12\ dB/octave.
+.pp
+At the points which are 3\ dB below the peak,
+.LB
+.EQ
+|H(jw sub 3dB )| sup 2 ~~ = ~~
+1 over 2 ~|H(jw sub max )| sup 2 ~~ = ~~
+1 over 2 ~ times ~ {w sub c sup 2} over {b sup 2} ~ ,
+.EN
+.LE
+and it is easy to show that
+this is satisfied by  $w sub 3dB ~ = ~ w sub c ~ +- ~ b/2$  to a
+good approximation (neglecting higher powers of $b/w sub c )$.  Figure 5.7
+summarizes the shape of an individual formant resonance.
+.FC "Figure 5.7"
+.pp
+The bandwidth of a formant is fairly constant, regardless of the formant
+frequency.  This makes the formant filter a slightly unusual one:  most
+engineering applications which use variable-frequency resonances require
+the bandwidth to be a constant proportion of the resonant
+frequency \(em the ratio
+$w sub c /b$, often called the "$Q$" of the filter, is to be constant.
+For formants, we wish the Q to increase linearly with resonant frequency.
+Since the amplitude gain of the formant at resonance is $w sub c /b$,
+this peak gain increases as the formant frequency is increased.
+.pp
+Although it is easy to measure formant frequencies on a spectrogram
+(cf Chapter 2),
+it is not so easy to measure bandwidths accurately.  One rather unusual method
+was reported by van den Berg (1955), who took a subject who had had a partial
+laryngectomy, an operation which left an opening into the vocal tract near
+the larynx position.  Into this he inserted a sound source and made a
+swept-frequency calibration of the vocal tract!
+.[
+Berg van den 1955
+.]
+Almost as bizarre is a
+technique which involves setting off a spark inside the mouth of a subject
+as he holds his articulators in a given position.
+.pp
+The results of several different kinds of experiment are reported by Dunn (1961),
+and are summarized in Table 5.1, along with the formant frequency ranges.
+.[
+Dunn 1961
+.]
+.RF
+.in+0.5i
+.ta 1.7i +2.5i
+.nr x1 (\w'range of formant'/2)
+.nr x2 (\w'range of bandwidths'/2)
+	\h'-\n(x1u'range of formant	\h'-\n(x2u'range of bandwidths
+.nr x1 (\w'frequencies (Hz)'/2)
+.nr x2 (\w'as measured in different'/2)
+	\h'-\n(x1u'frequencies (Hz)	\h'-\n(x2u'as measured in different
+.nr x1 (\w'experiments (Hz)'/2)
+		\h'-\n(x1u'experiments (Hz)
+.nr x1 (\w'0000 \- 0000'/2)
+.nr x2 (\w'000 \- 000'/2)
+.nr x0 2.5i+(\w'range of formant'/2)+(\w'as measured in different'/2)
+.nr x3 (\w'range of formant'/2)
+	\h'-\n(x3u'\l'\n(x0u\(ul'
+.sp
+formant 1	\h'-\n(x1u'\0100 \- 1100	\h'-\n(x2u'\045 \- 130
+formant 2	\h'-\n(x1u'\0500 \- 2500	\h'-\n(x2u'\050 \- 190
+formant 3	\h'-\n(x1u'1500 \- 3500	\h'-\n(x2u'\070 \- 260
+	\h'-\n(x3u'\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in-0.5i
+.MT 2
+Table 5.1  Different estimates of formant bandwidths, with range of
+formant frequencies for reference
+.TE
+Note that the bandwidths really are narrow compared with the resonant frequencies
+of the filters, except at the lower end of the formant 1 range.  Choosing the
+lowest bandwidth estimate leads to an amplification factor at resonance of 50 for formant 2
+when its frequency is at the top of its range; and formant 3 happens to give
+the same value.
+.rh "Series synthesizers."
+The simplest realization of the vocal tract filter is a chain of formant
+filters in series, as illustrated in Figure 5.8.
+.FC "Figure 5.8"
+This leads to particular difficulties if the frequencies of two formants
+stray close together.  The worst case occurs if formants 2 and 3 have the
+same resonant frequencies, at the top of the range of formant 2, namely 2500\ Hz.
+In this case, and if the bandwidths of the formants are set to the lowest
+estimates, a combined amplification factor
+of  $(2500/50) times (2500/70)=1800$  is
+obtained at the point of resonance \(em that is,
+65\ dB above the DC value.  This is enough
+to tax most analogue implementations, and can evoke clipping in the formant
+filters, with a very noticeable effect on speech quality.  This
+extreme case will not occur during synthesis of realistic speech, for
+although the formant
+.ul
+ranges
+overlap, the values for any particular (human) sound will not coincide exactly.  However,
+it illustrates the difficulty of designing a series synthesizer which copes
+sensibly with arbitrary parameter settings, and explains why designers often
+choose formant bandwidths in the top half of the ranges given in Table 5.1.
+.pp
+The problem of excessive amplification within a series synthesizer can be
+alleviated to a small extent by choosing carefully the order in which the
+filters are placed in the chain.  In a linear system, of course, the order in
+which the components occur does not matter.
+In physical implementations, however, it is advantageous to minimize extreme
+amplification at intermediate points.  By placing the formant 1 filter between
+formants 2 and 3, the formant 2 resonance is attenuated somewhat before it
+reaches formant 3.  Continuing with the extreme example above, where both
+formants 2 and 3 were set to 2500\ Hz; assume that formant 1 is at its
+nominal value of 500\ Hz.  It provides attenuation at approximately 12\ dB/octave
+above this, and so at the formant 2 peak, 2.3\ octaves higher, the attenuation
+is 28\ dB.  Thus the gain at 2500\ Hz,
+which is $20 ~ log sub 10 ~ 2500/50 ~ = ~ 34$\ dB after
+passing through the formant 2 filter, is reduced to 6\ dB by formant 1, only
+to be increased by $20 ~ log sub 10 ~ 2500/70 ~ = ~ 31$\ dB to
+a value of 37\ dB by formant 3.
+This avoids the extreme 65\ dB gain of formants 2 and 3 combined.
+.pp
+Figure 5.8 shows only three formant filters modelled explicitly.
+The effect of the rest \(em and they do have an effect, although it is small
+at low frequencies \(em is
+incorporated by lumping them together into the "higher-formant correction" filter.
+To calculate the characteristics of this filter, assume that the lumped
+formants have the values given by the simple uniform-tube model of Chapter 2,
+namely 3500\ Hz for formant 4, 4500\ Hz for formant 5, and, in general,
+$500(2n-1)$\ Hz for formant $n$.  The effect of each of these on the spectrum is
+.LB
+.EQ
+10~ log sub 10  {w sub n sup 4} over {(w sup 2 ~-~w sub n sup 2 ) sup 2
+~~+~~b sub n sup 2 w sup 2}
+~~ = ~~ -~ 10~ log sub 10 ~[(1~-~~{{w sup 2} over {w sub n sup 2}}) sup 2
+~~+~~ {{b sub n sup 2 w sup 2} over {w sub n sup 4}}]
+.EN
+dB,
+.LE
+following from what was calculated above.
+We will have to approximate this by assuming that
+$b sub n sup 2 /w sub n sup 2$ is
+negligible \(em this is quite reasonable for these higher formants because
+Table 5.1 shows that the bandwidth does not increase in proportion to the
+formant frequency range \(em and approximate the logarithm by the first
+term of its series expansion:
+.LB
+.EQ
+-10 ~ log sub 10 ~ (1~-~~{{w sup 2} over {w sub n sup 2}}) sup 2
+~~ = ~~ -20~ log sub 10 ~ e ~ log sub e 
+(1~-~~{{w sup 2} over {w sub n sup 2}})
+~~ = ~~ 20~ log sub 10 ~ e ~ times ~ {w sup 2} over {w sub n sup 2} ~ .
+.EN
+.LE
+.pp
+Now the total effect of formants 4, 5, ... at frequency $f$\ Hz (as distinct
+from $w$\ radians/s) is
+.LB
+.EQ
+20~ log sub 10 ~ e ~ times ~ sum from n=4 to infinity
+~{{f sup 2} over {500 sup 2 (2n-1) sup 2}} ~ .
+.EN
+.LE
+This expression is
+.LB
+.EQ
+20~ log sub 10 ~ e ~ times ~
+{{f sup 2} over {500 sup 2}}~~(~sum from n=1 to infinity
+~{1 over {(2n-1) sup 2}} ~~-~~ sum from n=1 to 3 ~{1 over {(2n-1) sup 2}}~)
+~ .
+.EN
+.LE
+The infinite sum can actually be calculated in closed form, and is equal
+to  $pi sup 2 /8$.  Hence the total correction is
+.LB
+.EQ
+20~ log sub 10 ~ e ~ times {{f sup 2} over {500 sup 2}}
+~~(~{pi sup 2} over 8 ~~-~~ sum from n=1 to 3 ~{1 over {(2n-1) sup 2}}~)
+~~ = ~~ 2.87 times 10 sup -6 f sup 2
+.EN
+dB.
+.LE
+.pp
+Although this may at first seem to be a rather small correction,
+it is in fact 72\ dB when
+$f=5$\ kHz!  On further reflection this is not an unreasonable figure, for the
+12\ dB/octave decays contributed by formants 1, 2, and 3 must all be annihilated
+by the higher-formant correction to give an overall flat spectral trend.
+In fact, formant 1 will contribute
+12\ dB/octave from 500\ Hz (3.3\ octaves to 5\ kHz, representing 40\ dB); formant
+2 will contribute 12\ dB/octave from 1500\ Hz (1.7\ octaves to 5\ kHz, representing
+21\ dB); and formant 3 will contribute 12\ dB/octave from 2500\ Hz (1\ octave to 5\ kHz,
+representing 12\ dB).
+These sum to 73\ dB.
+.pp
+If the first five formants are synthesized explicitly instead of just the
+first three, the correction is
+.LB
+.EQ
+20~ log sub 10 ~ e ~ times ~ {{f sup 2} over {500 sup 2}}
+~~(~{pi sup 2} over 8 ~-~~ sum from n=1 to 5 ~{1 over {(2n-1) sup 2}}~)
+~~ = ~~ 1.73 times 10 sup -6  f sup 2
+.EN
+dB,
+.LE
+giving a rather more reasonable value of 43\ dB when $f=5$\ kHz.  In actual
+implementations, fixed filters are sometimes included explicitly for
+formants 4 and 5.  Although this lowers the gain of the higher-formant
+correction filter, the total amplification at 5\ kHz of the combined correction
+is still 72\ dB.  If one is less demanding and aims for a synthesizer that
+produces a correct spectrum only up to 3.5\ kHz, it is 35\ dB.
+This places quite stringent requirements on the preceding formant filters if
+the stray noise that they generate internally is not to be amplified to
+perceptible magnitudes by the correction filter at high frequencies.
+.pp
+Explicit inclusion of fixed filters for formants 4 and 5 undoubtedly improves
+the accuracy of the higher-formant correction.  Recall that the above derivation
+of the correction filter characteristic used the first-order approximation
+.LB
+.EQ
+log sub e (1~-~{{w sup 2} over {w sub n sup 2}})
+~~ = ~~ -~ {w sup 2} over {w sub n sup 2} ~ ,
+.EN
+.LE
+which is only valid if $w << w sub n$.
+Thus it only holds at frequencies less than
+the highest explicitly synthesized formant,
+and so with formants 4 (3.5\ kHz) and
+5 (4.5\ kHz) included a reasonable correction should be obtained for
+telephone-quality speech.  However, detailed analysis with a second-order
+approximation shows that the coefficient of the neglected term is in fact
+small (Fant, 1960).
+.[
+Fant 1960 Acoustic theory of speech production
+.]
+A second, perhaps more compelling, reason for explicitly
+including a couple of fixed formants is that the otherwise enormous amplification
+provided by the correction can be distributed throughout the formant chain.
+We saw earlier why there is reason to prefer the
+order F3\(emF1\(emF2 over F1\(emF2\(emF3.
+With explicit formants 4 and 5, a suitable order which helps
+to keep the amplification at intermediate points in the chain within reasonable
+bounds is F3\(emF5\(emF2\(emF4\(emF1.
+.rh "Parallel synthesizers."
+A series synthesizer models the vocal tract resonances by a chain of formant
+filters in series.  A parallel synthesizer utilizes a parallel connection of
+filters as illustrated in Figure 5.9.
+.FC "Figure 5.9"
+.pp
+Consider a parallel combination of two formants with individually-controllable
+amplitudes.  The combined transfer function is
+.LB
+.EQ
+H(s) ~~ mark = ~~ {A sub 1 w sub 1 sup 2} over
+{s sup 2 ~+~ b sub 1 s ~+~ w sub 1 sup 2}
+~~+~~{A sub 2 w sub 2 sup 2} over {s sup 2 ~+~ b sub 2 s ~+~ w sub 2 sup 2}
+.EN
+.sp
+.sp
+.EQ
+lineup = ~~ { (A sub 1 w sub 1 sup 2 + A sub 2 w sub 2 sup 2 )s sup 2
+~+~(A sub 1 b sub 2 w sub 1 sup 2 + A sub 2 b sub 1 w sub 2 sup 2 )s
+~+~ (A sub 1 +A sub 2 )w sub 1 sup 2 w sub 2 sup 2 }
+over
+{ (s sup 2 ~+~b sub 1 s~+~w sub 1 sup 2 )
+(s sup 2 ~+~b sub 2 s~+~w sub 2 sup 2 ) }
+.EN
+.LE
+If the formant bandwidths $b sub 1$ and $b sub 2$
+are equal and the amplitudes are
+chosen as
+.LB
+.EQ
+A sub 1 ~~=~~ {w sub 2 sup 2} over {w sub 2 sup 2 -w sub 1 sup 2}
+~~~~~~~~
+A sub 2 ~~=~~-~ {w sub 1 sup 2} over {w sub 2 sup 2 -w sub 1 sup 2} ~ ,
+.EN
+.LE
+then the transfer function becomes the same as that of a two-formant series synthesizer,
+namely
+.LB
+.EQ
+H(s) ~~ = ~~ {w sub 1 sup 2} over {s sup 2 ~+~ b sub 1 s ~+~ w sub 1 sup 2}
+~ . ~{w sub 2 sup 2} over {s sup 2 ~+~ b sub 2 s ~+~ w sub 2 sup 2} ~ .
+.EN
+.LE
+The argument can be extended to any number of formants, under the assumption
+that the formant bandwidths are equal.  Note that the signs of $A sub 1$
+and $A sub 2$
+differ:  in general the formant amplitudes for a parallel synthesizer alternate
+in sign.
+.pp
+In theory, therefore, it would be possible to use five parallel formants to
+model a five-formant series synthesizer exactly.  Then the same higher-formant
+correction filter would be needed for the parallel synthesizer as for the
+series one.  If the formant amplitudes were set slightly incorrectly, however,
+the five filters would not combine to give a total of 60\ dB/octave high-frequency
+decay above the resonances.  It is easy to see this in the context of the
+simplified two-formant combination above:  if the amplitudes were not chosen
+exactly right then the $s sup 2$
+term in the numerator would not be quite zero.
+Then, the decay in the two-formant combination would be \-12\ dB/octave instead
+of \-24\ dB/octave, and in the five-formant case the decay would in fact still be
+\-12\ dB/octave.  Advantage can be taken of this to equalize the levels
+within the synthesizer so that large amplitude variations do not occur.
+This can best be done by associating relatively low-gain fixed correction filters
+with each formant instead of providing one comprehensive correction to the
+combined spectrum:  these are shown in Figure 5.9.
+Suitable correction filters
+have been determined empirically by Holmes (1972).
+.[
+Holmes 1972 Speech synthesis
+.]
+They provide a 6\ dB/octave
+lift above 640\ Hz for formant 1, and 6\ dB/octave lift above 300\ Hz for formant
+2.  Formants 3 and 4 are uncorrected, whilst for formant 5 the correction begins
+as a 6\ dB/octave decay above 600\ Hz and increases to an 18\ dB/octave decay
+above 5.5\ kHz.
+.pp
+The disadvantage of a parallel synthesizer is that the amplitudes of the
+formants must be specified as well as their frequencies.  (Furthermore, the
+formant bandwidths should all be equal, but they are often chosen to be such
+in series synthesizers because of the uncertainty as to their exact
+values.)  However, the extra amplitude parameters clearly give greater
+control over the frequency spectrum of the synthesized speech.
+.pp
+A good example of how this extra control can usefully be exploited is the
+synthesis of nasal sounds.
+Nasalization introduces a cavity parallel to the oral tract, as illustrated
+in Figure 5.10, and this causes zeros in the transfer function.
+.FC "Figure 5.10"
+It is as if two different copies of the vocal tract transfer function, one for
+the oral and the other for the nasal passage, were added
+together.  We have seen the effect of this above when considering parallel
+synthesis.  The combination
+.LB
+.EQ
+H(s) ~~ = ~~ {A sub 1 w sub o sup 2} over
+{s sup 2 ~+~ b sub o s ~+~ w sub o sup 2}
+~~+~~{A sub 2 w sub n sup 2}
+over {s sup 2 ~+~ b sub n s ~+~ w sub n sup 2} ~ ,
+.EN
+.LE
+where the subscript "$o$" stands for oral and "$n$" for nasal,
+produces zeros in the
+numerator (unless the amplitudes are carefully adjusted to avoid them).
+These cannot be modelled by a series synthesizer, but they obviously can be
+by a parallel one.
+.pp
+Although they are certainly needed for accurate imitation of human speech,
+transfer function zeros to simulate nasal sounds are not essential for
+synthesis of intelligible English.  It is not difficult to get a sound
+like a nasal consonant
+(\c
+.ul
+n,
+or
+.ul
+m\c
+)
+with an all-pole synthesizer.
+Nevertheless, it is certainly true that a parallel synthesizer gives better
+.ul
+potential
+control over the spectrum than a series one.  Whether the added flexibility
+can be used properly by a synthesis-by-rule computer program is another matter.
+.rh "Implementation of formant filters."
+Formant filters can be built in either analogue or digital form.  A
+second-order resonance is needed, whose centre frequency can be controlled
+but whose bandwidth is fixed.  If the control can be arranged as two
+tracking resistors, then the simple analogue configuration of Figure 5.11,
+with two operational amplifiers, will suffice.
+.FC "Figure 5.11"
+.pp
+The transfer function of this arrangement is
+.LB
+.EQ
+- ~~ { 1/C sub 1 R sub 1 C sub 2 R sub 2 } over
+{ s sup 2 ~~+~~ {1 over {C sub 2 R sub 2}}~s
+~~+~~{1 over {C sub 1 R' sub 1 C sub 2 R sub 2 }}} ~ ,
+.EN
+.LE
+which characterizes it as a low-pass resonator with DC gain
+of  $- R' sub 1 /R sub 1 $,  bandwidth of  $1/2 pi C sub 2 R sub 2$\ Hz,  and
+centre frequency of  $1/2 pi (C sub 1 R' sub 1 C sub 2 R sub 2 ) sup 1/2$\ Hz.
+Tracking $R' sub 1$ with $R sub 1$ ensures that the DC gain remains constant,
+and that the centre frequency follows  $R sub 1 sup -1/2$.  Moreover,
+neither is especially sensitive to slight departures from exact tracking
+of $R' sub 1$ with $R sub 1$.
+Such a filter has been used in a simple hand-controlled speech synthesizer,
+built for demonstration and amusement (Witten and Madams, 1978).
+.[
+Witten Madams 1978 Chatterbox
+.]
+However, the need for tracking resistors, and the inverse square root variation
+of the formant frequency with $R sub 1$, makes it rather unsuitable for serious
+applications.
+.pp
+A better analogue filter is the ring-of-three configuration
+shown in Figure 5.12.
+.FC "Figure 5.12"
+(Ignore the secondary output for now.)  Control
+is achieved over the centre frequency by two multipliers, driven from
+the same control input $k$.  These have a high-impedance output, producing a
+current $kx$ if the input voltage is $x$.
+It is not too difficult to show that the transfer function of the circuit is
+.LB
+.EQ
+- ~~ { {k sup 2} over {C sup 2} } over
+{ s sup 2 ~~+~~ 2 over RC ~s
+~~+~~{1+k sup 2 R sup 2} over {R sup 2 C sup 2} } ~ .
+.EN
+.LE
+Suppose that $R$ is chosen so that  $k sup 2 R sup 2 ~ >>~ 1$.  Then this is a
+unity-gain resonator with constant bandwidth  $1/ pi RC$\ Hz  and centre
+frequency  $k/2 pi C$\ Hz.  Note that it is the combination of both multipliers that
+makes the centre frequency grow linearly with $k$:  with one multiplier there
+would be a square-root relationship.
+.pp
+The ring-of-three filter of Figure 5.12 is arranged in a slightly unusual
+way, with an inverting stage at the beginning and the two resonant stages
+following it.  This ensures that the signal level at intermediate
+points in the filter does not exceed that at the output, and gives the filter
+the best chance of coping with a wide range of input amplitudes without
+clipping.  This contrasts markedly with the resonator of Figure 5.11, where
+the voltage at the output of the first integrator is $w/b$ times the final output \(em a
+factor of 50 in the worst case.
+.pp
+For a digital implementation of a formant, consider the recurrence relation
+.LB
+.EQ
+y(n)~ = ~~ a sub 1 y(n-1) ~-~ a sub 2 y(n-2) ~+~ a sub 0 x(n) ,
+.EN
+.LE
+where $x(n)$ is the input and $y(n)$ the output at time $n$,
+$y(n-1)$ and $y(n-2)$ are the previous two values of the output,
+and $a sub 0$, $a sub 1$, and $a sub 2$ are (real) constants.
+The minus sign is in front of the second term because it makes $a sub 2$
+turn out to be
+positive.  To calculate the $z$-transform version of this relationship, multiply
+through by $z sup -n$ and sum from $n=- infinity$ to $infinity$ :
+.LB "nn"
+.EQ
+sum from {n=- infinity} to infinity ~y(n)z sup -n ~~ mark =~~
+a sub 1 sum from {n=- infinity} to infinity ~y(n-1)z sup -n ~~-~
+a sub 2 sum from {n=- infinity} to infinity ~y(n-2)z sup -n ~~+~
+a sub 0 sum from {n=- infinity} to infinity ~x(n)z sup -n
+.EN
+.sp
+.EQ
+lineup = ~~ a sub 1 z sup -1 ~ sum ~y(n-1)z sup -(n-1) ~~-~~
+a sub 2 z sup -2 ~ sum ~y(n-2)z sup -(n-2)
+~~+~~ a sub 0 ~ sum ~x(n)x sup -n ~ .
+.EN
+.LE "nn"
+Writing this in terms of $z$-transforms,
+.LB
+.EQ
+Y(z)~ = ~~ a sub 1 z sup -1 Y(z) ~-~ a sub 2 z sup -2 Y(z) ~+~ a sub 0 X(z) .
+.EN
+.LE
+Thus the input-output transfer function of the system is
+.LB
+.EQ
+H(z)~ = ~~ Y(z) over X(z)
+~~=~~ {a sub 0 } over {1~-~a sub 1 z sup -1 ~+~a sub 2 z sup -2} ~ .
+.EN
+.LE
+.pp
+We learned in the previous chapter that the frequency response is obtained
+from the $z$-transform of a system by replacing $z sup -1$
+by  $e sup {-j2 pi fT}$,  where $f$ is the frequency variable in\ Hz.
+Hence the amplitude response of the digital formant filter is
+.LB
+.EQ
+|H(e sup {j2 pi fT} )| sup 2
+~~ = ~~ left [ {a sub 0} over {1~-~a sub 1 e sup {-j2 pi fT}
+~+~a sub 2 e sup {-j4 pi fT} } ~ right ] sup 2 ~ .
+.EN
+.sp
+.LE
+It is fairly obvious from this that a DC gain of 1 is obtained if
+.LB
+.EQ
+a sub 0 ~ = ~~ 1 ~-~ a sub 1  ~+~ a sub 2 ,
+.EN
+.LE
+for  $e sup {-j2 pi fT}$  is 1 at a frequency of 0\ Hz.  Some manipulation is
+required to show that, under the usual assumption that the bandwidth is
+small, the centre frequency is
+.LB
+.EQ
+1 over {2 pi T} ~~ cos sup -1 ~ {a sub 1} over {2 a sub 2 sup 1/2} ~
+.EN
+Hz.
+.LE
+Furthermore, the 3\ dB bandwidth of the resonance is given approximately by
+.LB
+.EQ
+-~ 1 over {2 pi T} ~~ log sub e a sub 2 ~
+.EN
+Hz.
+.LE
+.pp
+As an example, Figure 5.13 shows an amplitude response for this digital filter.
+.FC "Figure 5.13"
+The parameters $a sub 0$, $a sub 1$ and $a sub 2$
+were generated from the above
+relationships for a sampling frequency of 8\ kHz, centre frequency of 1\ kHz,
+and bandwidth of 75\ Hz.
+It exhibits a peak of approximately the right bandwidth at the correct
+frequency, 1\ kHz.  Note that the response is flat at half the sampling
+frequency, for the frequency response from 4\ kHz to 8\ kHz is just a reflection of
+that up to 4\ kHz.
+This contrasts sharply with that of an analogue formant filter, also shown
+in Figure 5.13, which slopes
+at \-12\ dB/octave at frequencies above resonance.
+.pp
+The behaviour of a digital formant filter at frequencies above
+resonance actually makes it preferable to an analogue implementation.
+We saw earlier that considerable trouble must be taken with the latter to
+compensate for the cumulative effect of \-12\ dB/octave at higher frequencies for
+each of the formants.
+This is not necessary with digital implementations, for the response of
+a digital formant filter is flat at half the sampling frequency.  In fact, further
+study shows that digital synthesizers without any higher-pole correction
+give a closer approximation to the vocal tract than analogue ones with higher-pole
+correction (Gold and Rabiner, 1968).
+.[
+Gold Rabiner 1968 Analysis of digital and analogue formant synthesizers
+.]
+.rh "Time-domain methods."
+An interesting alternative to frequency-domain speech synthesis is to construct
+the formants in the time domain.  When a second-order resonance is excited by
+an impulse, an exponentially decaying sinusoid is produced, as illustrated by
+Figure 5.14.
+.FC "Figure 5.14"
+The oscillation occurs at the resonant frequency of the filter,
+while the decay is related to the bandwidth.  In fact, if the formant filter
+has transfer function
+.LB
+.EQ
+{w sup 2} over {s sup 2 ~+~ b s ~+~ w sup 2} ~ ,
+.EN
+.LE
+the time waveform for impulsive excitation is
+.LB
+.EQ
+x(t)~ = ~~ w~ e sup -bt/2 ~ sin ~ wt ~~~~~~~~
+.EN
+(neglecting  $b sup 2 /w sup 2$).
+.LE
+It is the combination of several such time waveforms, coupled with the regular
+reappearance of excitation at the pitch period, that produces the characteristic
+wiggly waveform of voiced speech.
+.pp
+Now suppose we take a sine wave of frequency $w$ and multiply it by a
+decaying exponential  $e sup -bt/2$.  This gives a signal
+.LB
+.EQ
+x(t)~ = ~~ e sup -bt/2 ~ sin ~ wt ,
+.EN
+.LE
+which is identical with the filtered impulse except for a factor $w$.
+If there are several formants in parallel, all with the same bandwidth,
+the exponential factor is the same for each:
+.LB
+.EQ
+x(t)~ = ~~ e sup -bt/2 ~ (A sub 1 ~ sin ~ w sub 1 t
+~~+ ~~ A sub 2 ~ sin ~ w sub 2 t ~~ + ~~ A sub 3 ~  sin ~ w sub 3 t) .
+.EN
+.LE
+$A sub 1$, $A sub 2$, and $A sub 3$ control the formant amplitudes,
+as in an ordinary parallel synthesizer;
+except that they need adjusting to account for the missing
+factors $w sub 1$, $w sub 2$, and $w sub 3$.
+.pp
+A neat way of implementing such a synthesizer digitally is to store one cycle of a
+sine wave in a read-only memory (ROM).  Then, the formant frequencies can be
+controlled by reading the ROM at different rates.  For example, if twice the
+basic frequency is desired, every second value should be read.
+Multiplication is needed for amplitude control of each formant:  this can be
+accomplished by shifting the digital word (each place shifted accounts for
+6\ dB of attenuation).  Finally, the exponential damping factor can be
+provided in analogue hardware by a single capacitor after the D/A converter.
+This implementation gives a system for hardware-software synthesis which
+involves an absolutely minimal amount of extra hardware apart from the computer,
+and does not need hardware multiplication for real-time operation.
+It could easily be made to work in real time with a microprocessor coupled
+to a D/A converter, damping capacitor, and fixed tone-control filter to give
+the required spectral equalization.
+.pp
+Because the overall spectral decay of an impulse exciting a second-order
+formant filter is 12\ dB/octave, the appropriate equalization is +6\ dB/octave
+lift at high frequencies, to give an overall \-6\ dB/octave spectral trend.
+.pp
+Note, however, that this synthesis model is an extremely basic one.  Only
+impulsive excitation can be accomodated.  For fricatives, which we will
+discuss in more detail below, a different implementation is needed.  A
+hardware noise generator, with a few fixed filters \(em one
+for each fricative type \(em will suffice for a simple system.  More damaging
+is the lack of aspiration, where random noise excites the vocal tract resonances.
+This cannot be simulated in the model.  The
+.ul
+h
+sound can be provided by
+treating it as a fricative, and although it will not sound completely realistic,
+because there will be no variation with the formant positions of adjacent phonemes,
+this can be tolerated because
+.ul
+h
+is not too important for speech intelligibility.
+A bigger disadvantage is the lack of proper aspiration control for producing
+unvoiced stops, which as mentioned in Chapter 2 consist of an silent phase
+followed by a burst of aspiration.
+Experience has shown that although it is difficult to drive such a synthesizer
+from a software synthesis-by-rule system, quite intelligible output can
+be obtained if parameters are derived from real speech and tweaked by hand.
+Then, for each aspiration burst the most closely-matching fricative sound
+can be used.
+.sh "5.4  Aspiration and frication"
+.pp
+The model of the vocal tract as a filter which affects the frequency spectrum
+of the basic voiced excitation breaks down if there are constrictions in it,
+for these introduce new sound sources caused by turbulent air.
+The generation of unvoiced excitation has been discussed earlier in this
+chapter:  now we must consider how to simulate the filtering action of
+the vocal tract for unvoiced sounds.
+.pp
+Aspiration and frication need to be dealt with separately.  The former
+is caused by excitation at the vocal cords \(em the cords are held
+so close together that turbulent noise is produced.
+This noise passes through the same vocal tract filter that modifies voiced
+sounds, and the same kind of formant structure can be observed.
+All that is needed to simulate it is to replace the voiced excitation
+source by white noise, as shown in the upper part of Figure 5.15.
+.FC "Figure 5.15"
+.pp
+Speech can be whispered by substituting aspiration for voicing throughout.
+Of course, there is no fundamental frequency associated with aspiration.
+An interesting way of assessing informally the degradation caused by inadequate
+pitch control in a speech synthesis-by-rule system is to listen to
+whispered speech, in which pitch variations play no part.
+.pp
+Voiced and aspirative excitation are rarely produced at the same time
+in natural speech (but see the discussion in Chapter 2 about breathy voice).
+However, the excitation can change from one to the other quite quickly, and
+when this happens there is no discontinuity in the formant structure.
+.pp
+Fricative, or sibilant, excitation is quite different from aspiration,
+because it introduces a new sound source at a different place from the vocal
+cords.  The constriction which produces the sound may be at the lips,
+the teeth, the hard ridge just behind the top front teeth, or further
+back along the palate.
+These positions each produce a different sound
+(\c
+.ul
+f,
+.ul
+th,
+.ul
+s,
+and
+.ul
+sh
+respectively).  However, smooth transitions from one of these sounds to another
+do not occur in natural speech; and dynamical movement of the frequency
+spectrum during a fricative is unnecessary for speech synthesis.
+.pp
+It is necessary, however, to be able to produce an approximation to the
+noise spectrum for each of these sound types.  This is commonly achieved
+by a single high-pass resonance whose centre frequency can be controlled.
+This is the purpose of the secondary output
+of the formant filter of Figure 5.12.
+Taking the output from this point gives a high-pass instead of a low-pass
+resonance, and this same filter configuration is quite acceptable for
+fricatives.  Figure 5.15 shows the fricative sound path as a noise generator
+followed by such a filter.
+.pp
+Unlike aspiration, fricative excitation is frequently combined with voicing.
+This gives the voiced fricative sounds
+.ul
+v,
+.ul
+dh,
+.ul
+z,
+and
+.ul
+zh.
+It is possible to produce frication and aspiration together, and although
+there are no examples of this in English, speech synthesis-by-rule
+programs often use a short burst of aspiration
+.ul
+and
+frication when simulating the opening of unvoiced stops.
+Separate amplitude controls are therefore needed for voicing and frication,
+but the former can be used for aspiration as well, with a "glottal excitation
+type" switch to indicate aspiration rather than voicing.
+.sh "5.5  Summary"
+.pp
+A resonance speech synthesizer consists of a vocal tract filter, excited by
+either a periodic pitch pulse or aspiration noise.  In addition, a set of
+sibilant sounds must be provided.  The vocal tract filter is dynamic, with
+three controllable resonances.  These, coupled with some fixed spectral
+compensation, give it a fairly high order \(em about 10 complex poles are
+needed.  Although several different sibilant sound types must be simulated,
+dynamical movement is less important in fricative sound spectra than
+for voiced and aspirated sounds because
+smooth transitions between one fricative and another are not important
+in speech.
+However, fricative timing and amplitude must be controlled rather precisely.
+.pp
+The speech synthesizer is controlled by several parameters.
+These include fundamental frequency (if voiced), amplitude of voicing,
+frequency of the first few \(em typically three \(em formants,
+aspiration amplitude, sibilance amplitude, and frequency of one (or more)
+sibilance filters.
+Additionally, if the synthesizer is a parallel one, parameters for the
+amplitudes of individual formants will need to be included.
+It may be that some control over formant bandwidths is provided too.
+Thus synthesizers have from eight up to about 20 parameters (Klatt, 1980,
+describes one with 20 parameters).
+.[
+Klatt 1980 Software for a cascade/parallel formant synthesizer
+.]
+.pp
+The parameters are supplied to the synthesizer at regular intervals of time.
+For a 10-parameter synthesizer, the control can be thought of as a set of
+10 graphs, each representing the time evolution of one parameter.
+They are usually called parameter
+.ul
+tracks,
+the terminology dating from the days when a track was painted on a glass
+slide for each parameter to provide dynamic control of the synthesizer
+(Lawrence, 1953).
+.[
+Lawrence 1953
+.]
+The pitch track is often called a pitch
+.ul
+contour;
+this is a common phonetician's usage.
+Do not confuse this with the everyday meaning of "contour"
+as a line joining points of equal height on a map \(em a pitch contour is
+just the time evolution of the pitch frequency.
+.pp
+For computer-controlled synthesizers, of course, the parameter tracks
+are sampled, typically every 5 to 20\ msec.
+The rate is determined by the need to generate fast amplitude transitions
+for nasals and stop consonants.
+Contrast it with the 125\ $mu$sec sampling period needed to digitize
+telephone-quality speech.
+The raw data rate for a 10-parameter synthesizer updated every 10 msec
+is 1,000 parameters/sec, or 6\ Kbit/s if each parameter is represented
+by 6\ bits.
+This is a substantial reduction over the 56\ Kbit/s needed for PCM representation.
+For speech synthesis by rule (Chapter 7), these parameter tracks
+are generated by a computer program from a phonetic (or English)
+version of the utterance, lowering the data rate by a further one or two
+orders of magnitude.
+.pp
+Filters for speech
+synthesizers can be implemented in either analogue or digital form.
+High-order filters are usually broken down into second-order sections in
+parallel or in series.  A third possibility, which has not been discussed
+above, is to implement a single high-order filter directly.  Finally, the
+action of formant filters can be synthesized in the time domain.  This gives
+eight possibilities which are summarized in Table 5.2.
+.RF
+.in +0.5i
+.ta 2.1i +2.0i
+.nr x1 (\w'Analogue'/2)
+.nr x2 (\w'Digital'/2)
+	\h'-\n(x1u'Analogue	\h'-\n(x2u'Digital
+.nr x0 2.0i+(\w'Liljencrants (1968)'/2)+(\w'Morris and Paillet (1972)'/2)
+.nr x3 (\w'Liljencrants (1968)'/2)
+	\h'-\n(x3u'\l'\n(x0u\(ul'
+.sp
+.nr x1 (\w'Rice (1976)'/2)
+.nr x2 (\w'Rabiner \fIet al\fR'/2)
+Series	\h'-\n(x1u'Rice (1976)	\h'-\n(x2u'Rabiner \fIet al\fR
+.nr x1 (\w'Liljencrants (1968)'/2)
+.nr x2 (\w'Holmes (1973)'/2)
+Parallel	\h'-\n(x1u'Liljencrants (1968)	\h'-\n(x2u'Holmes (1973)
+.nr x1 (\w'unpublished'/2)
+.nr x2 (\w'unpublished'/2
+Time-domain	\h'-\n(x1u'unpublished	\h'-\n(x2u'unpublished
+.nr x1 (\w'\(em'/2)
+.nr x2 (\w'Morris and Paillet (1972)'/2)
+High-order filter	\h'-\n(x1u'\(em	\h'-\n(x2u'Morris and Paillet (1972)
+	\h'-\n(x3u'\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in-0.5i
+.FG "Table 5.2  Implementation options for resonance speech synthesizers"
+.[
+Rice 1976 Byte
+.]
+.[
+Rabiner Jackson Schafer Coker 1971
+.]
+.[
+Liljencrants 1968
+.]
+.[
+Holmes 1973 Influence of glottal waveform on naturalness
+.]
+.[
+Morris and Paillet 1972
+.]
+All but one have certainly been used as the basis for synthesis, and
+the table includes reference to published descriptions.
+.pp
+Each method has advantages and disadvantages.  Series decomposition obviates
+the need for control over the amplitudes of individual formants, but does
+not allow synthesis of sounds which use the nasal tract as well as the oral
+one; for these are in parallel.  Analogue implementation of series synthesizers
+is complicated by the need for higher-pole correction, and the fact that
+the gains at different frequencies can vary widely throughout the system.
+Higher-pole correction is not so important for digital synthesizers.
+Parallel decomposition eliminates some of these problems:  higher-pole correction
+can be implemented individually for each formant.  However, the formant
+amplitudes must be controlled rather precisely to simulate the vocal tract,
+which is essentially serial.
+Time-domain synthesis is associated with low hardware costs but does not
+easily allow proper control over the excitation sources.  In particular,
+it cannot simulate dynamical movement of the spectrum during aspiration.
+Implementation of the entire vocal tract model as a single high-order filter,
+without breaking it down into individual formants in series or parallel,
+is attractive from the computational point of view because less arithmetic
+operations are required.  It is best analysed in terms of linear predictive
+coding, which is the subject of the next chapter.
+.sh "5.6  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "5.7  Further reading"
+.pp
+Historically-minded readers should look at the early speech synthesizer
+designed by Lawrence (1953).
+This and other classic papers on the subject
+are reprinted in Flanagan and Rabiner (1973).
+A good description of a quite sophisticated parallel synthesizer can
+be found in Holmes (1973), above, and another of a switchable
+series/parallel one in Klatt (1980), who even includes a listing of
+the Fortran program that implements it.
+Here are some useful books on speech synthesizers.
+.LB "nn"
+.\"Fant-1960-1
+.]-
+.ds [A Fant, G.
+.ds [D 1960
+.ds [T Acoustic theory of speech production
+.ds [I Mouton
+.ds [C The Hague
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Fant really started the study of the vocal tract as an acoustic system,
+and this book marks the beginning of modern speech synthesis.
+.in-2n
+.\"Flanagan-1972-1
+.]-
+.ds [A Flanagan, J.L.
+.ds [D 1972
+.ds [T Speech analysis, synthesis, and perception (2nd, expanded, edition)
+.ds [I Springer Verlag
+.ds [C Berlin
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This book is the speech researcher's bible, and like the bible, it's not
+all that easy to read.
+However, it is an essential reference source for speech acoustics and
+speech synthesis (as well as for human speech perception).
+.in-2n
+.\"Flanagan-1973-2
+.]-
+.ds [A Flanagan, J.L.
+.as [A " and Rabiner, L.R.(Editors)
+.ds [D 1973
+.ds [T Speech synthesis
+.ds [I Dowsen, Hutchinson and Ross
+.ds [C Stroudsburg, Pennsylvania
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.in+2n
+I recommended this book at the end of Chapter 1 as a collection of
+classic papers on the subject of speech synthesis and synthesizers.
+.in-2n
+.\"Holmes-1972-3
+.]-
+.ds [A Holmes, J.N.
+.ds [D 1972
+.ds [T Speech synthesis
+.ds [I Mills and Boom
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This little book, by one of Britain's foremost workers in the field,
+introduces the subject of speech synthesis and speech synthesizers.
+It has a particularly good discussion of parallel synthesizers.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "6  LINEAR PREDICTION OF SPEECH"
+.ds RT "Linear prediction of speech
+.ds CX "Principles of computer speech
+.pp
+The speech coding techniques which were discussed in Chapter 3 operate
+in the time domain, while the analysis and synthesis techniques
+of Chapters 4 and 5 are
+based in the frequency domain.  Linear prediction is a relatively
+new method of speech analysis-synthesis,
+introduced in the early 1970's and used
+extensively since then, which is primarily a time-domain coding method
+but can be used to give frequency-domain parameters like formant
+frequency, bandwidth, and amplitude.
+.pp
+It has several advantages over other speech analysis techniques, and is
+likely to become increasingly dominant in speech output systems.
+As well as bridging the gap between time- and frequency-domain techniques, it
+is of equal value for both speech storage and speech synthesis, and forms
+an extremely convenient basis for speech-output systems which use high-quality
+stored speech for routine messages and synthesis from phonetics or text
+for unusual or exceptional conditions.  Linear prediction can be used to
+separate the excitation source properties of pitch and amplitude from the
+vocal tract filter which governs phoneme articulation, or, in other words,
+to separate much of the prosodic from the segmental information.
+Hence it makes it easy to use stored segmentals with synthetic prosody,
+which is just what is needed to enhance the flexibility of stored speech by
+providing overall intonation contours for utterances formed by word
+concatenation (see Chapter 7).
+.pp
+The frequency-domain analysis technique
+of Fourier transformation necessarily involves approximation because it
+applies only to periodic waveforms, and so the artificial operation
+of windowing is required to suppress the aperiodicity of real
+speech.  In contrast, the linear predictive technique, being a time-domain
+method, can \(em in certain forms \(em deal more rationally with aperiodic
+signals.
+.pp
+The basic idea of linear predictive coding is exactly the same as
+one form of adaptive differential pulse code modulation which
+was introduced briefly in Chapter 3.  There it was noted that a speech
+sample $x(n)$ can be predicted quite closely by the previous sample
+$x(n-1)$.  The prediction can be improved by multiplying the previous
+sample by a number, say $a sub 1$, which is adapted on a syllabic
+time-scale.  This can be utilized for speech coding by transmitting
+only the prediction error
+.LB
+.EQ
+e(n)~=~~x(n)~-~a sub 1 x(n-1),
+.EN
+.LE
+and using it (and the value of $a sub 1$) to reconstitute the signal
+$x(n)$ at the receiver.  It is worthwhile noting that
+exactly the same relationship was used for digital
+preemphasis in Chapter 4, with the value of $a sub 1$
+being constant at about 0.9 \(em although
+the possibility of adapting it to take into account the difference
+between voiced and unvoiced speech was discussed.
+.pp
+An obvious extension is to use several past values of the signal to form
+the prediction, instead of just one.  Different multipliers for each would
+be needed, so that the prediction error could be written as
+.LB
+.EQ
+e(n)~~ mark =~~x(n)~-~a sub 1 x(n-1)~-~a sub 2 x(n-2)~-~...~-~a sub p x(n-p)
+.EN
+.sp
+.EQ
+lineup =~~x(n)~-~~sum from k=1 to p ~a sub k x(n-k).
+.EN
+.LE
+The multipliers $a sub k$ should be adapted to minimize the error signal,
+and we will consider how to do this in the next section.  It turns out
+that they must be re-calculated and transmitted on a time-scale that is
+rather faster than syllabic but much slower than
+the basic sampling rate:  intervals
+of 10\-25\ msec are usually used (compare this with the 125\ $mu$sec sampling
+rate for telephone-quality speech).
+A configuration for high-order adaptive differential
+pulse code modulation is shown in Figure 6.1.
+.FC "Figure 6.1"
+.pp
+Figure 6.2 shows typical time waveforms for each of the ten coefficients
+over a 1-second stretch of speech.
+.FC "Figure 6.2"
+Notice that they vary much more slowly than, say, the speech waveform of
+Figure 3.5.
+.pp
+Turning the above relationship into $z$-transforms gives
+.LB
+.EQ
+E(z)~~=~~X(z)~-~~sum from k=1 to p ~a sub k z sup -k ~X(z)~~=~~(1~-~~
+sum from k=1 to p ~a sub k z sup -k )~X(z).
+.EN
+.LE
+Rewriting the speech signal in terms of the error,
+.LB
+.EQ
+X(z)~~=~~1 over {1~-~~ sum ~a sub k z sup -k }~.~E(z) .
+.EN
+.LE
+.pp
+Now let us bring together some facts from the previous chapter which will
+allow the time-domain technique of linear prediction to be interpreted
+in terms of the frequency-domain formant model of speech.  Recall that speech
+can be viewed as an excitation source passing through a vocal tract filter,
+followed by another filter to model the effect of radiation from the lips.
+The overall spectral levels can be reassigned as in Figure 5.1 so that
+the excitation source has a 0\ dB/octave spectral profile, and hence is
+essentially impulsive.
+Considering the vocal tract filter as a series connection
+of digital formant filters, its transfer function is the product of terms like
+.LB
+.EQ
+1 over {1~-~b sub 1 z sup -1 ~+~b sub 2 z sup -2}~ ,
+.EN
+.LE
+where $b sub 1$ and $b sub 2$ control the position and bandwidth of the formant resonances.
+The \-6\ dB/octave spectral compensation can be modelled by the
+first-order digital filter
+.LB
+.EQ
+1 over {1~-~bz sup -1}~ .
+.EN
+.LE
+The product of all these terms, when multiplied out, will have the
+form
+.LB
+.EQ
+1 over {1~-~c sub 1 z sup -1 ~-~c sub 2 z sup -2 ~-~...~-~
+c sub q z sup -q }~ ,
+.EN
+.LE
+where $q$ is twice the number of formants plus one, and the $c$'s are calculated
+from the positions and bandwidths of the formant resonances and the spectral
+compensation parameter.  Hence
+the $z$-transform of the speech is
+.LB
+.EQ
+X(z)~=~~1 over {1~-~~ sum from k=1 to q ~c sub k z sup -k }~.~I(z) ,
+.EN
+.LE
+where $I(z)$ is the transform of the impulsive excitation.
+.pp
+This is remarkably similar to the linear prediction relation given earlier!  If
+$p$ and $q$ are the same, then the linear predictive coefficients $a sub k$
+form a $p$'th order polynomial which is the same as that obtained by multiplying
+together the second-order polynomials representing the individual formants
+(together with the first-order one for spectral compensation).
+Furthermore, the predictive error $E(z)$ can be identified with the
+impulsive excitation $I(z)$.  This raises the very interesting
+possibility of parametrizing the error signal by its frequency and
+amplitude \(em two relatively slowly-varying quantities \(em instead of
+transmitting it sample-by-sample (at an 8\ kHz rate).  This is how
+linear prediction separates out the excitation properties of the source
+from the vocal tract filter:  the source parameters can be derived
+from the error signal and the vocal tract filter is represented by
+the linear predictive coefficients.
+Figure 6.3 shows how this can be used for speech transmission.
+.FC "Figure 6.3"
+Note that
+.ul
+no
+signals need now be transmitted at the speech sampling rate; for the
+source parameters vary relatively slowly.  This leads to an extremely
+low data rate.
+.pp
+Practical linear predictive coding schemes operate with a value of $p$ between
+10 and 15, corresponding approximately to 4-formant and 7-formant synthesis
+respectively.  The $a sub k$'s are re-calculated every 10 to 25\ msec, and
+transmitted to the receiver.  Also, the pitch and amplitude
+of the speech are estimated and transmitted at the same rate.
+If the speech
+is unvoiced, there is no pitch value:  an "unvoiced flag" is
+transmitted instead.
+Because the linear predictive coefficients are intimately related to
+formant frequencies and bandwidths, a "frame rate" in the region
+of 10 to 25\ msec is appropriate because this approximates the maximum rate
+at which acoustic events happen in speech production.
+.pp
+At the receiver, the excitation waveform
+is reconstituted.
+For voiced speech, it is impulsive at the specified
+frequency and with the specified amplitude, while for unvoiced speech it
+is random, with the specified amplitude.  This signal $e(n)$, together
+with the transmitted parameters $a sub 1$, ..., $a sub p$, is used
+to regenerate the speech waveform by
+.LB
+.EQ
+x(n)~=~~e(n)~+~~sum from k=1 to p ~a sub k x(n-k) ,
+.EN
+.LE
+\(em which is the inverse of the transmitter's formula for calculating $e(n)$,
+namely
+.LB
+.EQ
+e(n)~=~~x(n)~-~~sum from k=1 to p ~a sub k x(n-k) .
+.EN
+.LE
+This relies on knowing the past $p$ values of the speech samples.
+Many systems set these past values to zero at the beginning of each pitch
+cycle.
+.pp
+Linear prediction can also be used for speech analysis, rather than
+for speech coding, as shown in Figure 6.4.
+.FC "Figure 6.4"
+Instead of transmitting the coefficients $a sub k$,
+they are used to determine the formant positions and bandwidths.
+We saw above that the polynomial
+.LB
+.EQ
+1~-~a sub 1 z sup -1 ~-~a sub 2 z sup -2 ~-~...~-~a sub p z sup -p ,
+.EN
+.LE
+when factored into a product of second-order terms, gives the formant
+characteristics (as well as the spectral compensation term).
+Factoring is equivalent to finding the complex roots of the polynomial,
+and this is fairly demanding computationally \(em especially if done at
+a high rate.  Consequently, peak-picking algorithms are sometimes
+used instead.  The absolute value of the polynomial gives the
+frequency spectrum of the vocal tract filter, and the formants
+appear as peaks \(em just as they do in cepstrally smoothed speech
+(see Chapter 4).
+.pp
+The chief deficiency in the linear predictive method, whether it
+is used for speech coding or for speech analysis, is that \(em like a series
+synthesizer \(em it
+implements an all-pole model of the vocal tract.
+We mentioned in Chapter 5 that this is rather simplistic,
+especially for nasalized sounds which involve a cavity in parallel
+with the oral one.  Some research has been done on incorporating zeros
+into a linear predictive model, but it complicates the problem of
+calculating the parameters enormously.  For most purposes people seem
+to be able to live with the limitations of the all-pole model.
+.sh "6.1  Linear predictive analysis"
+.pp
+The key problem in linear predictive coding is to determine the values
+of the coefficients $a sub 1$, ..., $a sub p$.
+If the error signal is to be transmitted on a sample-by-sample basis,
+as it is in adaptive differential pulse code modulation, then it can be most
+economically encoded if its mean power is as small as possible.
+Thus the coefficients are chosen to minimize
+.LB
+.EQ
+sum ~e(n) sup 2
+.EN
+.LE
+over some period of time.
+The period of time used is related to the frame rate at which the
+coefficients are transmitted or stored, although there is no need
+to make it exactly the same as one frame interval.  As mentioned above,
+the frame size
+is usually chosen to be in the region of 10 to 25\ msec.  Some
+schemes minimize the error signal over as few as 30 samples
+(corresponding to 3\ msec at a 10\ kHz sampling rate).  Others take
+longer; up to 250 samples (25\ msec).
+.pp
+However, if the error signal is to be considered as impulsive and
+parametrized by its frequency and amplitude before transmission,
+or if the coefficients $a sub k$ are to be used for spectral calculations,
+then it is not immediately obvious how the coefficients should be
+calculated.
+In fact, it is still best to choose them to minimize the above sum.
+This is at least plausible, for an impulsive excitation will have a
+rather small mean power \(em most of the samples are zero.
+It can be justified theoretically in terms of
+.ul
+spectral whitening,
+for it can be shown that minimizing the mean-squared error
+produces an error signal whose spectrum is maximally flat.
+Now the only two waveforms whose spectra are absolutely flat
+are a single impulse and white noise.  Hence if
+the speech is voiced, minimizing the mean-squared error
+will lead to an error signal which is as nearly impulsive
+as possible.  Provided the time-frame for minimizing is short enough,
+the impulse will correspond to a single excitation pulse.
+If the speech is unvoiced, minimization will lead to an error
+signal which is as nearly white noise as possible.
+.pp
+How does one choose the linear predictive coefficients to minimize
+the mean-squared error?  The total squared prediction error is
+.LB
+.EQ
+M~=~~sum from n ~e(n) sup 2~~=~~sum from n
+~[x(n)~-~ sum from k=1 to p ~a sub k x sub n-k ] sup 2 ,
+.EN
+.LE
+leaving the range of summation unspecified for the moment.
+To minimize $M$ by choice of the coefficients $a sub j$, differentiate
+with respect to each of them and set the resulting derivatives
+to zero.
+.LB
+.EQ
+dM over {da sub j} ~~=~~-2 sum from n ~x(n-j)[x(n)~-~~
+sum from k=1 to p ~a sub k x(n-k)]~~=~0~,
+.EN
+.LE
+so
+.LB
+.EQ
+sum from k=1 to p ~a sub k ~ sum from n ~x(n-j)x(n-k)~~=~~
+sum from n ~x(n)x(n-j)~~~~j~=~1,~2,~...,~p.
+.EN
+.LE
+.pp
+This is a set of $p$ linear equations for the $p$ unknowns $a sub 1$, ...,
+$a sub p$.
+Solving it is equivalent to inverting a $p times p$ matrix.
+This job must be repeated at the frame rate, and so if
+real-time operation is desired quite a lot of calculation is needed.
+.rh "The autocorrelation method."
+So far, the range of the $n$-summation has been left open.  The
+coefficients of the matrix equation have the form
+.LB
+.EQ
+sum from n ~x(n-j)x(n-k).
+.EN
+.LE
+If a doubly-infinite summation were made, with $x(n)$ being defined
+as zero whenever $n<0$, we could make use of the fact that
+.sp
+.ce
+.EQ
+sum from {n=- infinity} to infinity ~x(n-j)x(n-k)~=~~
+sum from {n=- infinity} to infinity ~x(n-j+1)x(n-k+1)~=~...~=~~
+sum from {n=- infinity} to infinity ~x(n)x(n+j-k)
+.EN
+.sp
+to simplify the matrix equation.  This just states that the
+autocorrelation of an infinite sequence depends only on the lag at which
+it is computed, and not on absolute time.
+.pp
+Defining $R(m)$ as the
+autocorrelation at lag $m$, that is,
+.LB
+.EQ
+R(m)~=~ sum from n ~x(n)x(n+m),
+.EN
+.LE
+the matrix equation becomes
+.LB
+.ne7
+.nf
+.EQ
+R(0)a sub 1 ~+~R(1)a sub 2 ~+~R(2)a sub 3 ~+~...~~=~R(1)
+.EN
+.EQ
+R(1)a sub 1 ~+~R(0)a sub 2 ~+~R(1)a sub 3 ~+~...~~=~R(2)
+.EN
+.EQ
+R(2)a sub 1 ~+~R(1)a sub 2 ~+~R(0)a sub 3 ~+~...~~=~R(3)
+.EN
+.EQ
+etc
+.EN
+.fi
+.LE
+An elegant method due to Durbin and Levinson exists for solving this
+special system of equations.  It requires much less computational
+effort than is generally needed for symmetric matrix equations.
+.pp
+Of course, an infinite range of summation can not be used in
+practice.  For one thing, the power spectrum is changing, and
+only the data from a short time-frame should be used for
+a realistic estimate of the optimum linear predictive coefficients.
+Hence a windowing procedure,
+.LB
+.EQ
+x(n) sup * ~=~w sub n x(n),
+.EN
+.LE
+is used to reduce the signal to zero outside a finite range of
+interest.  Windows were discussed in Chapter 4 from the
+point of view of Fourier analysis of speech signals, and the same
+sort of considerations apply to choosing a window for linear
+prediction.
+.pp
+This is known as the
+.ul
+autocorrelation method
+of computing prediction parameters.  Typically a window of
+100 to 250 samples is used for analysis of one frame of speech.
+.rh "Algorithm for the autocorrelation method."
+The algorithm for obtaining linear prediction coefficients
+by the autocorrelation method is quite simple.  It is
+straightforward to compute the matrix coefficients
+$R(m)$ from the speech samples and window coefficients.
+The Durbin-Levinson method of solving matrix equations operates
+directly on this $R$-vector to produce the coefficient vector $a sub k$.
+The complete procedure is given as Procedure 6.1, and is shown
+diagrammatically in Figure 6.5.
+.FC "Figure 6.5"
+.RF
+.fi
+.na
+.nh
+.ul
+const
+N=256; p=15;
+.ul
+type
+svec =
+.ul
+array
+[0..N\-1]
+.ul
+of
+real;
+cvec =
+.ul
+array
+[1..p]
+.ul
+of
+real;
+.sp
+.ul
+procedure
+autocorrelation(signal: vec; window: svec;
+.ul
+var
+coeff: cvec);
+.sp
+{computes linear prediction coefficients by autocorrelation method
+in coeff[1..p]}
+.sp
+.ul
+var
+R, temp:
+.ul
+array
+[0..p]
+.ul
+of
+real;
+n: [0..N\-1]; i,j: [0..p]; E: real;
+.sp
+.ul
+begin
+{window the signal}
+.in+6n
+.ul
+for
+n:=0
+.ul
+to
+N\-1
+.ul
+do
+signal[n] := signal[n]*window[n];
+.sp
+{compute autocorrelation vector}
+.br
+.ul
+for
+i:=0
+.ul
+to
+p
+.ul
+do begin
+.in+2n
+R[i] := 0;
+.br
+.ul
+for
+n:=0
+.ul
+to
+N\-1\-i
+.ul
+do
+R[i] := R[i] + signal[n]*signal[n+i]
+.in-2n
+.ul
+end;
+.sp
+{solve the matrix equation by the Durbin-Levinson method}
+.br
+E := R[0];
+.br
+coeff[1] := R[1]/E;
+.br
+.ul
+for
+i:=2
+.ul
+to
+p
+.ul
+do begin
+.in+2n
+E := (1\-coeff[i\-1]*coeff[i\-1])*E;
+.br
+coeff[i] := R[i];
+.br
+.ul
+for
+j:=1
+.ul
+to
+i\-1
+.ul
+do
+coeff[i] := coeff[i] \- R[i\-j]*coeff[j];
+.br
+coeff[i] := coeff[i]/E;
+.br
+.ul
+for
+j:=1
+.ul
+to
+i\-1
+.ul
+do
+temp[j] := coeff[j] \- coeff[i]*coeff[i\-j];
+.br
+.ul
+for
+j:=1
+.ul
+to
+i\-1
+.ul
+do
+coeff[j] := temp[j]
+.in-2n
+.ul
+end
+.in-6n
+.ul
+end.
+.nf
+.FG "Procedure 6.1  Pascal algorithm for the autocorrelation method"
+.pp
+This algorithm is not quite as efficient as it might be, for some
+multiplications are repeated during the calculation of the
+autocorrelation vector.  Blankinship (1974) shows how
+the number of multiplications can be reduced by about half.
+.[
+Blankinship 1974
+.]
+.pp
+If the algorithm is performed in fixed-point arithmetic
+(as it often is in practice because of speed considerations),
+some scaling must be done.  The maximum and minimum values of
+the windowed signal can be determined within the window
+calculation loop, and one extra pass over the vector will
+suffice to scale it to maximum significance.
+(Incidentally, if all sample values are the same the procedure
+cannot produce a solution because $E$ becomes zero, and this
+can easily be checked when scaling.)
+.pp
+The absolute value of the $R$-vector has no significance, and since
+$R(0)$ is always the greatest element, this can be set to the largest
+fixed-point number and the other $R$'s scaled down appropriately
+after they have been calculated.
+These scaling operations are shown as dashed boxes in Figure 6.5.
+$E$ decreases monotonically
+as the computation proceeds, so it is safe to initialize it to $R(0)$
+without extra scaling.  The remainder of the scaling is straightforward,
+with the linear prediction coefficients $a sub k$ appearing as fractions.
+.rh "The covariance method."
+One of the advantages of linear predictive methods that was
+promised earlier was that it allows us to escape from
+the problem of windowing.  To do this, we must abandon the
+requirement that the coefficients of the matrix equation have
+the symmetry property of autocorrelations.  Instead, suppose
+that the range of $n$-summation uses a fixed number of
+elements, say N, starting at $n=h$, to estimate the prediction
+coefficients between sample number $h$ and sample number $h+N$.
+.pp
+This leads to the matrix equation
+.LB
+.EQ
+sum from k=1 to p ~a sub k sum from n=h to h+N-1 ~x(n-j)x(n-k) ~~=~~
+sum from n=h to h+N-1 ~x(n)x(n-j)~~~~j~=~1,~2,~...,~p.
+.EN
+.LE
+Alternatively, we could write
+.LB
+.EQ
+sum from k=1 to p ~a sub k ~ Q sub jk sup h~~=~~Q sub 0j sup h
+~~~~j~=~1,~2,~...,~p;
+.EN
+.LE
+where
+.LB
+.EQ
+Q sub jk sup h~~=~~sum from n=h to h+N-1 ~x(n-j)x(n-k).
+.EN
+.LE
+Note that some values of $x(n)$ outside the range  $h ~ <= ~ n ~ < ~ h+N$  are
+required:  these are shown diagrammatically in Figure 6.6.
+.FC "Figure 6.6"
+.pp
+Now  $Q sub jk sup h ~=~ Q sub kj sup h$,  so the equation has
+a diagonally symmetric matrix; and in fact the matrix $Q sup h$ can
+be shown to be positive semidefinite \(em and is almost always positive
+definite in practice.  Advantage can be taken of these facts
+to provide a computationally efficient method for solving the
+equation.  According to a result called Cholesky's theorem, a
+positive definite symmetric matrix $Q$ can be factored into the form
+$Q ~ = ~ LL sup T$, where $L$ is a lower triangular matrix.
+This leads to an efficient
+solution algorithm.
+.pp
+This method of computing prediction coefficients has become known
+as the
+.ul
+covariance method.
+It does not use windowing of the speech signal, and can give accurate
+estimates of the prediction coefficients with a smaller analysis
+frame than the autocorrelation method.  Typically, 50 to 100 speech samples
+might be used to estimate the coefficients, and they are re-calculated
+every 100 to 250 samples.
+.rh "Algorithm for the covariance method."
+An algorithm for the covariance method is given in Procedure 6.2,
+.RF
+.fi
+.na
+.nh
+.ul
+const
+N=100; p=15;
+.ul
+type
+svec =
+.ul
+array
+[\-p..N\-1]
+.ul
+of
+real;
+cvec =
+.ul
+array
+[1..p]
+.ul
+of
+real;
+.sp
+.ul
+procedure
+covariance(signal: svec;
+.ul
+var
+coeff: cvec);
+.sp
+{computes linear prediction coefficients by covariance method
+in coeff[1..p]}
+.sp
+.ul
+var
+Q:
+.ul
+array
+[0..p,0..p]
+.ul
+of
+real;
+n: [0..N\-1]; i,j,r: [0..p]; X: real;
+.sp
+.ul
+begin
+{calculate upper-triangular covariance matrix in Q}
+.in+6n
+.ul
+for
+i:=0
+.ul
+to
+p
+.ul
+do
+.in+2n
+.ul
+for
+j:=i
+.ul
+to
+p
+.ul
+do begin
+.in+2n
+Q[i,j]:=0;
+.br
+.ul
+for
+n:=0
+.ul
+to
+N\-1
+.ul
+do
+.in+2n
+Q[i,j] := Q[i,j] + signal[n\-i]*signal[n\-j]
+.in-2n
+.in-2n
+.ul
+end;
+.in-2n
+.sp
+{calculate the square root of Q}
+.br
+.ul
+for
+r:=2
+.ul
+to
+p
+.ul
+do
+.in+2n
+.ul
+begin
+.in+2n
+.ul
+for
+i:=2
+.ul
+to
+r\-1
+.ul
+do
+.in+2n
+.ul
+for
+j:=1
+.ul
+to
+i\-1
+.ul
+do
+.in+2n
+Q[i,r] := Q[i,r] \- Q[j,i]*Q[j,r];
+.in-2n
+.ul
+for
+j:=1
+.ul
+to
+r\-1
+.ul
+do
+.in+2n
+.ul
+begin
+.in+2n
+X := Q[j,r];
+.br
+Q[j,r] := Q[j,r]/Q[j,i];
+.br
+Q[r,r] := Q[r,r] \- Q[j,r]*X
+.in-2n
+.ul
+end
+.in-2n
+.in-2n
+.in-2n
+.ul
+end;
+.in-2n
+.sp
+{calculate coeff[1..p]}
+.br
+.ul
+for
+r:=2
+.ul
+to
+p
+.ul
+do
+.in+2n
+.ul
+for
+i:=1
+.ul
+to
+r\-1
+.ul
+do
+Q[0,r] := Q[0,r] \- Q[i,r]*Q[0,i];
+.in-2n
+.ul
+for
+r:=1
+.ul
+to
+p
+.ul
+do
+Q[0,r] := Q[0,r]/Q[r,r];
+.br
+.ul
+for
+r:=p\-1
+.ul
+downto
+1
+.ul
+do
+.in+2n
+.ul
+for
+i:=r+1
+.ul
+to
+p
+.ul
+do
+Q[0,r] := Q[0,r] \- Q[r,i]*Q[0,i];
+.in-2n
+.ul
+for
+r:=1
+.ul
+to
+p
+.ul
+do
+coeff[r] := Q[0,r]
+.in-6n
+.ul
+end.
+.nf
+.FG "Procedure 6.2  Pascal algorithm for the covariance method"
+and is shown diagrammatically in Figure 6.7.
+.FC "Figure 6.7"
+The algorithm shown is not terribly efficient from a computation
+and storage point of view, although it is workable.  For one thing,
+it uses the obvious method for computing the covariance matrix
+by calculating
+.EQ
+Q sub 01 sup h ,
+.EN
+.EQ
+Q sub 02 sup h , ~ ...,
+.EN
+.EQ
+Q sub 0p sup h ,
+.EN
+.EQ
+Q sub 11 sup h , ...,
+.EN
+in turn, which repeats most of the multiplications $p$ times \(em not
+an efficient procedure.  A simple alternative is to precompute the necessary
+multiplications and store them in a  $(N+h) times (p+1)$ diagonally symmetric
+table, but even apart from the extra storage required for this, the number
+of additions which must be performed subsequently to give the $Q$'s is far
+larger than necessary.  It is possible, however, to write a procedure which is
+both time- and space-efficient (Witten, 1980).
+.[
+Witten 1980 Algorithms for linear prediction
+.]
+.pp
+The scaling problem is rather more tricky for the covariance
+method than for the autocorrelation method.  The $x$-vector
+should be scaled initially in the same way as before, but now there
+are $p+1$ diagonal elements of the covariance matrix, any of which could
+be the greatest element.  Of course,
+.LB
+.EQ
+Q sub jk ~~ <= ~~ Max ( Q sub 11 , Q sub 22 , ..., Q sub pp ),
+.EN
+.LE
+but despite the considerable communality in the summands of the diagonal
+elements, there are no
+.ul
+a priori
+bounds on the ratios between them.
+.pp
+The only way to scale the $Q$ matrix properly is to calculate each of its $p$
+diagonal elements and use the greatest as a scaling factor.
+Alternatively, the fact that
+.LB
+.EQ
+Q sub jk ~~ <= ~~ N times Max( x sub n sup 2 )
+.EN
+.LE
+can be used to give a bound for scaling purposes; however, this
+is usually a rather conservative bound, and as $N$ is often around 100, several
+bits of significance will be lost.
+.pp
+Scaling difficulties do not cease when $Q$ has been determined.  It is possible
+to show that the elements of the lower-triangular matrix $L$ which represents
+the square root of $Q$ are actually
+.ul
+unbounded.
+In fact there is a slightly different variant of the Cholesky decomposition
+algorithm which guarantees bounded coefficients but suffers from the
+disadvantage that it requires square roots to be taken (Martin
+.ul
+et al,
+1965).
+.[
+Martin Peters Wilkinson 1965
+.]
+However, experience with the method indicates that it is rare for the elements
+of $L$ to exceed 16 times the maximum element of $Q$, and the possibility of
+occasional failure to adjust the coefficients may be tolerable in a practical
+linear prediction system.
+.rh "Comparison of autocorrelation and covariance analysis."
+There are various factors which should be taken into account when
+deciding whether to use the autocorrelation or covariance method for linear
+predictive analysis.  Furthermore, there is a rather different technique,
+called the "lattice method", which will be discussed shortly.
+The autocorrelation method involves windowing, which means that in
+practice a rather longer stretch of speech should be used
+for analysis.  We have illustrated this by setting $N$=256 in the
+autocorrelation algorithm and 100 in the covariance one.
+Offsetting the extra calculation that this entails is the
+fact that the Durbin-Levinson method of inverting a matrix is much more
+efficient than Cholesky decomposition.  In practice, this means
+that similar amounts of computation are needed for each method \(em a
+detailed comparison is made in Witten (1980).
+.[
+Witten 1980 Algorithms for linear prediction
+.]
+.pp
+A factor which weighs against the covariance method is the
+difficulty of scaling intermediate quantities within the algorithm.
+The autocorrelation method can be implemented quite satisfactorily
+in fixed-point arithmetic, and this makes it more suitable for
+hardware implementation.  Furthermore, serious instabilities sometimes
+arise with the covariance method, whereas it can be shown that
+the autocorrelation one is always stable.  Nevertheless, the approximations
+inherent in the windowing operation, and the smearing effect of taking a
+larger number of sample points, mean that covariance-method coefficients
+tend to represent the speech more accurately, if they can be obtained.
+.pp
+One way of using the covariance method which has proved to be rather
+satisfactory in practice is to synchronize the analysis frame with
+the beginning of a pitch period, when the excitation is strongest.
+Pitch synchronous techniques were discussed in Chapter 4 in the context
+of discrete Fourier transformation of speech.  The snag, of course, is that
+pitch peaks do not occur uniformly in time, and furthermore it is difficult
+to estimate their locations precisely.
+.sh "6.2  Linear predictive synthesis"
+.pp
+If the linear predictive coefficients and the error signal are available,
+it is easy to regenerate the original speech by
+.LB
+.EQ
+x(n)~=~~e(n)~+~~ sum from k=1 to p ~a sub k x(n-k) .
+.EN
+.LE
+If the error signal is parametrized into the sound source type
+(voiced or unvoiced), amplitude, and pitch (if voiced), it can be
+regenerated by an impulse repeated at the appropriate pitch
+frequency (if voiced), or white noise (if unvoiced).
+.pp
+However, it may be that the filter represented by the coefficients $a sub k$ is
+unstable, causing the output speech signal to oscillate wildly.
+In fact, it is only possible for the covariance method to produce an
+unstable filter, and not the autocorrelation method \(em although even
+with the latter, truncation of the $a sub k$'s for transmission may turn
+a stable filter into an unstable one.  Furthermore, the coefficients
+$a sub k$ are not suitable candidates for quantization, because small
+changes in them can have a dramatic effect on the characteristics of
+the synthesis filter.
+.pp
+Both of these problems can be solved by using a different set of numbers,
+called
+.ul
+reflection coefficients,
+for quantization and transmission.  Thus, for example, in Figures 6.1
+and 6.3 these reflection coefficients could be derived at the
+transmitter, quantized, and used by the receiver to reproduce
+the speech waveform.  They can be related to reflection and transmission
+parameters at the junctions of an acoustic tube model of the vocal tract;
+hence the name.  Procedure 6.3 shows an algorithm for calculating the
+reflection coefficients from the filter coefficients $a sub k$.
+.RF
+.fi
+.na
+.nh
+.ul
+const
+p=15;
+.ul
+type
+cvec =
+.ul
+array
+[1..p]
+.ul
+of
+real;
+.sp
+.ul
+procedure
+reflection(coeff: cvec;
+.ul
+var
+refl: cvec);
+.sp
+{computes reflection coefficients in refl[1..p] corresponding
+to linear prediction coefficients in coeff[1..p]}
+.sp
+.ul
+var
+temp: cvec;  i, m: 1..p;
+.sp
+.ul
+begin
+.in+6n
+.ul
+for
+m:=p
+.ul
+downto
+1
+.ul
+do begin
+.in+2n
+refl[m] := coeff[m];
+.br
+.ul
+for
+i:=1
+.ul
+to
+m\-1
+.ul
+do
+temp[i] := coeff[i];
+.br
+.ul
+for
+i:=1
+.ul
+to
+m\-1
+.ul
+do
+.ti+2n
+coeff[i] :=
+.ti+4n
+(coeff[i] + refl[m]*temp[m\-i]) / (1 \- refl[m]*refl[m]);
+.in-2n
+.ul
+end
+.in-6n
+.ul
+end.
+.nf
+.MT 2
+Procedure 6.3  Pascal algorithm for producing reflection coefficients
+from filter coefficients
+.TE
+.pp
+Although we will not go into the theoretical details here,
+reflection coefficients are bounded by $+-$1 for stable filters,
+and hence form a useful test for stability.  Having a limited
+range makes them easy to quantize for transmission, and in fact
+they behave better under quantization than do the filter coefficients.
+One could resynthesize speech from reflection coefficients by first
+converting them to filter coefficients and using the synthesis
+method described above.  However, it is natural to seek a single-stage
+procedure which can regenerate speech directly from reflection
+coefficients.
+.pp
+Such a procedure does exist, and is called a
+.ul
+lattice filter.
+Figure 6.8 shows one form of lattice for speech synthesis.
+.FC "Figure 6.8"
+The error signal (whether transmitted or synthesized)
+enters at the upper left-hand corner, passes along the top forward
+signal path, being modified on the way, to give the output signal
+at the right-hand side.
+Then it passes back through a chain of delays along the bottom,
+backward, path, and is used to modify subsequent forward signals.
+Finally it is discarded at the lower left-hand corner.
+.pp
+There are $p$ stages in the lattice structure of Figure 6.8, where $p$ is the
+order of the linear predictive filter.
+Each stage involves two multiplications by the appropriate
+reflection coefficients, one by the backward signal \(em the
+result of which is added into the forward path \(em and the other by
+the forward signal \(em the result of which is subtracted from the
+backward path.  Thus the number of multiplications is twice
+the order of the filter, and hence twice as many as for the
+realization using coefficients $a sub k$.  If the labour necessary
+to turn the reflection coefficients into $a sub k$'s is included,
+the computational load becomes the same.  Moreover, since the
+reflection coefficients need fewer quantization bits than the $a sub k$'s
+(for a given speech quality), the word lengths are smaller in the
+lattice realization.
+.pp
+The advantages of the lattice method of synthesis over direct evaluation
+of the prediction using filter coefficients $a sub k$, then, are:
+.LB
+.NP
+the reflection coefficients are used directly
+.NP
+the stability of the filter is obvious from the reflection coefficient
+values
+.NP
+the system is more tolerant to quantization errors in fixed-point
+implementations.
+.LE
+Although it may seem unlikely that an unstable filter would be produced
+by linear predictive analysis, instability is in fact a real problem
+in non-lattice implementations.  For example,
+coefficients are often interpolated at the receiver, to allow longer
+frame times and smooth over sudden transitions, and it is quite likely that
+an unstable configuration is obtained when interpolating filter coefficients
+between two stable configurations.
+This cannot happen with reflection coefficients, however, because a
+necessary and sufficient condition for stability is that all
+coefficients lie in the interval $(-1,+1)$.
+.sh "6.3  Lattice filtering"
+.pp
+Lattice filters are an important new method of linear predictive
+.ul
+analysis
+as well as synthesis, and so
+it is worth considering the theory behind them a little further.
+.rh "Theory of the lattice synthesis filter."
+Figure 6.9 shows a single stage of the synthesis lattice given earlier.
+.FC "Figure 6.9"
+There are two signals at each side of the lattice, and the $z$-transforms
+of these have been labelled $X sup +$ and $X sup -$ at the left-hand side
+and $Y sup +$ and $Y sup -$ at the right-hand side.
+The direction of signal flow is forwards along the upper ("positive") path
+and backwards along the lower ("negative") one.
+.pp
+The signal flows show that the following two relationships hold:
+.LB
+.EQ
+Y sup + ~=~~ X sup + ~+~ k z sup -1 Y sup - ~~~~~~
+.EN
+for the forward (upper) path
+.br
+.EQ
+X sup - ~ =~ -kY sup + ~+~ z sup -1 Y sup - ~~~~~~~
+.EN
+\h'-\w'\-'u'for the backward (lower) path.
+.LE
+Re-arranging the first equation yields
+.LB
+.EQ
+X sup + ~ =~~ Y sup + ~-~ k z sup -1 Y sup - ,
+.EN
+.LE
+and so we can describe the function of the lattice by a single matrix
+equation:
+.LB
+.ne4
+.EQ
+left [ matrix {ccol {X sup + above X sup -}} right ] ~~=~~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}} right ]
+~ left [ matrix {ccol {Y sup + above Y sup -}} right ] ~ .
+.EN
+.LE
+It would be nice to be able to
+call this an input-output equation, but it is not;
+for the input signals to the lattice stage are $X sup +$ and $Y sup -$,
+and the outputs are $X sup -$ and $Y sup +$.
+We have written it in this form because it allows a multi-stage lattice to
+be described by cascading these matrix equations.
+.pp
+A single-stage lattice filter has $Y sup +$ and $Y sup -$ connected together,
+forming its output (call this $X sub output$), while the input is $X sup +$
+($X sub input$).
+Hence the input is related to the output by
+.LB
+.EQ
+left [ matrix {ccol {X sub input above \(sq }} right ] ~~ =
+~~ left [ matrix {ccol {1 above -k} ccol {-k z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {X sub output above X sub output}} right ] ~ ,
+.EN
+.LE
+so
+.LB
+.EQ
+X sub input ~ = ~~ (1~-~ k z sup -1 )~X sub output ,
+.EN
+.LE
+or
+.LB
+.EQ
+{X sub output} over {X sub input} ~~=~~ 1 over {1~-~ k sub 1 z sup -1} ~ .
+.EN
+.LE
+(The symbol \(sq is used here and elsewhere
+to indicate an unimportant element of a vector
+or matrix.)  This certainly has the form of a linear predictive
+synthesis filter, which is
+.LB
+.EQ
+X(z) over E(z) ~~=~~ 1 over {1~-~~ sum from k=1 to p ~a sub k
+z sup -k}~~=~~ 1 over {1~-~a sub 1 z sup -1 } ~~~~~~
+.EN
+when $p=1$.
+.LE
+.pp
+The behaviour of a second-order lattice filter, shown in Figure 6.10,
+can be described by
+.LB
+.ne4
+.EQ
+left [ matrix {ccol {X sub 3 sup + above X sub 3 sup -}} right ] ~~ =
+~~ left [ matrix {ccol {1 above -k sub 2 } ccol {-k sub 2 z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {X sub 2 sup + above X sub 2 sup -}} right ]
+.EN
+.sp
+.ne4
+.EQ
+left [ matrix {ccol {X sub 2 sup + above X sub 2 sup -}} right ] ~~ =
+~~ left [ matrix {ccol {1 above -k sub 1 } ccol {-k sub 1 z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {X sub 1 sup + above X sub 1 sup -}} right ]
+.EN
+.LE
+with
+.LB
+.ne3
+.EQ
+X sub 3 sup + ~=~X sub input
+.EN
+.br
+.EQ
+X sub 1 sup + ~=~ X sub 1 sup - ~=~ X sub output .
+.EN
+.LE
+.FC "Figure 6.10"
+$X sub 2 sup +$ and $X sub 2 sup -$ can be eliminated by substituting the
+second equation into the first, which yields
+.LB
+.EQ
+left [ matrix {ccol {X sub input above \(sq }} right ] ~~ mark =
+~~ left [ matrix {ccol {1 above -k sub 2 } ccol {-k sub 2 z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {1 above -k sub 1 } ccol {-k sub 1 z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {X sub output above X sub output}} right ]
+.EN
+.sp
+.sp
+.EQ
+lineup = ~~ left [ matrix {ccol {1+k sub 1 k sub 2 z sup -1 above \(sq }
+ccol { -k sub 1 z sup -1 -k sub 2 z sup -2 above \(sq }} right ]
+~ left [ matrix {ccol {X sub output above X sub output}} right ] ~ .
+.EN
+.LE
+This leads to an input-output relationship
+.LB
+.EQ
+{X sub output} over {X sub input} ~~ = ~~
+1 over {1~+~k sub 1 (k sub 2 -1)z sup -1 ~-~k sub 2 z sup -2} ~ ,
+.EN
+.LE
+which has the required form, namely
+.LB
+.EQ
+1 over {1~-~~ sum from k=1 to p ~a sub k z sup -k } ~~~~~~ (p=2)
+.EN
+.LE
+when
+.LB
+.EQ
+a sub 1 ~=~-k sub 1 (k sub 2 -1)
+.EN
+.br
+.EQ
+a sub 2 ~=~k sub 2.
+.EN
+.LE
+.pp
+A third-order filter is described by
+.LB
+.EQ
+left [ matrix {ccol {X sub input above \(sq }} right ] ~~ =
+~~ left [ matrix {ccol {1 above -k sub 3 } ccol {-k sub 3 z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {1 above -k sub 2 } ccol {-k sub 2 z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {1 above -k sub 1 } ccol {-k sub 1 z sup -1
+above z sup -1}} right ]
+~ left [ matrix {ccol {X sub output above X sub output}} right ] ~ ,
+.EN
+.LE
+and brave souls can verify that this gives an input-output
+relationship
+.LB
+.EQ
+{X sub output} over {X sub input} ~~ = ~~ 
+1 over {1~+~[k sub 2 k sub 3 + k sub 1 (1-k sub 2 )] z sup -1 ~+~
+[k sub 1 k sub 3 (1-k sub 2 ) -k sub 2 ] z sup -2 ~-~ k sub 3 z sup -3 } ~ .
+.EN
+.LE
+It is fairly obvious that a $p$'th order lattice filter will give the
+required all-pole $p$'th order synthesis form,
+.LB
+.EQ
+1 over { 1~-~~ sum from k=1 to p ~a sub k z sup -k } ~ .
+.EN
+.LE
+.pp
+We have not shown that the algorithm given in Procedure 6.3 for producing
+reflection coefficients from filter coefficients gives those values
+for $k sub i$ which are necessary to make the lattice filter equivalent
+to the ordinary synthesis filter.  However, this is the case, and it is
+easy to verify by hand for the first, second, and third-order cases.
+.rh "Different lattice configurations."
+The lattice filters of Figures 6.8, 6.9, and 6.10 have two multipliers
+per section.
+This is called a "two-multiplier" configuration.
+However, there are other configurations which achieve
+the same effect, but require different numbers of multiplies.
+Figure 6.11 shows one-multiplier and four-multiplier configurations,
+along with the familiar two-multiplier one.
+.FC "Figure 6.11"
+It is easy to verify that the three configurations can be modelled in
+matrix terms by
+.LB
+.ne4
+$
+left [ matrix {ccol {X sup + above X sup -}} right ] ~~ = ~~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}} right ]
+~ left [ matrix {ccol {Y sup + above Y sup -}} right ]
+$		two-multiplier configuration
+.sp
+.sp
+.ne4
+$
+left [ matrix {ccol {X sup + above X sup -}} right ] ~~ = ~~
+left [ {1-k over 1+k} right ] sup 1/2 ~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}} right ]
+~ left [ matrix {ccol {Y sup + above Y sup -}} right ]
+$	one-multiplier configuration
+.sp
+.sp
+.ne4
+$
+left [ matrix {ccol {X sup + above X sup -}} right ] ~~ = ~~
+1 over {(1-k sup 2) sup 1/2} ~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}} right ]
+~ left [ matrix {ccol {Y sup + above Y sup -}} right ]
+$	four-multiplier configuration.
+.LE
+Each of the three has the same frequency-domain response, although
+a different constant factor is involved in each case.
+The effect of this can be annulled by performing a single multiply
+operation on the output of a complete lattice chain.
+The multiplier has the form
+.LB
+.EQ
+left [ {1 - k sub p} over {1 + k sub p} ~.~
+{1 - k sub p-1} over {1 + k sub p-1} ~.~...~.~
+{1 - k sub 1} over {1 + k sub 1} right ] sup 1/2
+.EN
+.sp
+.LE
+for single-multiplier lattices, and
+.LB
+.EQ
+left [ 1 over {1 - k sub p sup 2} ~.~
+1 over {1 - k sub p-1 sup 2} ~.~...~.~
+1 over {1 - k sub 1 sup 2} right ] sup 1/2
+.EN
+.LE
+for four-multiplier lattices, where the reflection coefficients
+in the lattice are $k sub p$, $k sub p-1$, ..., $k sub 1$.
+.pp
+There are important differences between these three configurations.
+If multiplication is time-consuming, the one-multiplier model has obvious
+computational advantages over the other two methods.
+However, the four-multiplier structure behaves substantially better
+in finite word-length implementations.  It is easy to show that, with this
+configuration,
+.LB
+.EQ
+(X sup - ) sup 2 ~+~ (Y sup + ) sup 2 ~~ = ~~
+(X sup + ) sup 2 ~+~ (z sup -1 Y sup - ) sup 2 ,
+.EN
+.LE
+\(em a relationship which suggests that the "energy" in the
+the input signals, namely  $X sup +$ and $Y sup -$,  is preserved in the output
+signals,  $X sup -$ and $Y sup +$.
+Notice that care must be taken with the $z$-transforms, since squaring is a
+non-linear operation.  $(z sup -1 Y sup - ) sup 2$  means the square of
+the previous value of  $Y sup -$,  which is not the same
+as  $z sup -2 (Y sup - ) sup 2$.
+.pp
+It has been shown (Gray and Markel, 1975) that the four-multiplier
+configuration has some stability properties which are not shared by other
+digital filter structures.
+.[
+Gray Markel 1975 Normalized digital filter structure
+.]
+When a linear predictive filter is used for synthesis, the parameters
+of the filter \(em the $k$-parameters in the case of lattice filters,
+and the $a$-parameters in the case of direct ones \(em change with time.
+It is usually rather difficult to guarantee stability in the case of
+time-varying filter parameters, but some guarantees can be made for a
+chain of four-multiplier lattices.  Furthermore, if the input is a
+discrete delta function, the cumulative energies at each stage of the
+lattice are the same, and so maximum dynamic range will be achieved
+for the whole filter if each section is implemented with the same
+word size.
+.rh "Lattice analysis."
+It is quite easy to construct a filter which is inverse to
+a single-stage lattice.
+The structure of Figure 6.12(a) does the job.
+(Ignore for a moment
+the dashed lines connecting Figure 6.12(a) and (b).)  Its matrix transfer
+function is
+.FC "Figure 6.12"
+.LB
+.ne4
+$
+left [ matrix {ccol {Y sup + above Y sup -}} right ] ~~=~~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}} right ]
+~ left [ matrix {ccol {X sup + above X sup -}} right ]
+$	analysis lattice (Figure 6.12(a)).
+.LE
+Notice that this is exactly the same as the transfer function of the
+synthesis lattice of Figure 6.9, which is reproduced
+in Figure 6.12(b), except that the $X$'s and $Y$'s are reversed:
+.LB
+.ne4
+$
+left [ matrix {ccol {X sup + above X sup -}} right ] ~~=~~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}} right ]
+~ left [ matrix {ccol {Y sup + above Y sup -}} right ]
+$	synthesis lattice (Figure 6.12(b)),
+.LE
+or, in other words,
+.LB
+.ne4
+$
+left [ matrix {ccol {Y sup + above Y sup -}} right ] ~~ = ~~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}}
+right ] sup -1
+~ left [ matrix {ccol {X sup + above X sup -}} right ]
+$	synthesis lattice (Figure 6.12(b)).
+.LE
+Hence if the filters of Figures 6.12(a) and (b) were connected together
+as shown by the dashed lines, they
+would cancel each other out, and the overall transfer would be unity:
+.LB
+.ne4
+.EQ
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}}
+right ] ~
+left [ matrix {ccol {1 above -k} ccol {-kz sup -1 above z sup -1}}
+right ] sup -1 ~~ = ~~
+left [ matrix {ccol {1 above 0} ccol {0 above 1}} right ] ~ .
+.EN
+.LE
+Actually, such a connection is not possible in physical terms,
+for although the upper paths can be joined together the lower ones can not.
+The right-hand lower point of Figure 6.12(a) is an
+.ul
+output
+terminal, and so is the left-hand lower one of Figure 6.12(b)!  However,
+there is no need to envisage a physical connection of the lower paths.
+It is sufficient for cancellation just to assume that the signals at both
+of the points turn out to be the same.
+.pp
+And they do.
+The general case of a $p$-stage analysis lattice
+connected to a $p$-stage synthesis
+lattice is shown in Figure 6.13.
+.FC "Figure 6.13"
+Notice that the forward and backward paths are connected together at both
+of the extreme ends of the system.
+It is not difficult to show that under these
+conditions the signal at the lower righthand
+terminal of the analysis chain will equal that at the lower lefthand
+terminal of the synthesis chain, even though they are not connected,
+provided the upper terminals are connected together as shown by the dashed
+line.
+Of course, the reflection coefficients  $k sub 1$, $k sub 2$, ...,
+$k sub p$  in the analysis lattice must equal those in the synthesis
+lattice, and as Figure 6.13 shows the order is reversed in the synthesis
+lattice.
+Successive analysis and synthesis sections pair off, working from
+the middle outwards.  At each stage the sections cancel each other out,
+giving a unit transfer function as demonstrated above.
+.rh "Estimating reflection coefficients."
+As stated earlier in this chapter, the key problem in linear prediction is to
+determine the values of the predictive coefficients \(em in this case, the
+reflection coefficients.
+If this is done correctly, we have shown using Procedure 6.3 that
+the the synthesis part of Figure 6.13 performs the same calculation that
+a conventional direct-form linear predictive synthesizer would, and hence
+the signal that excites it \(em that is, the signal represented by the
+dashed line \(em must be the prediction residual, or error signal, discussed
+earlier.  The system is effectively the same as the high-order adaptive
+differential pulse code modulation one of Figure 6.1.
+.pp
+One of the most interesting features of the lattice structure for
+analysis filters is that calculation of suitable values for the
+reflection coefficients can be done locally at each stage of the lattice.
+For example, consider the $i$'th section of the analysis lattice in
+Figure 6.13.  It is possible to determine a suitable value of $k sub i$
+simply by performing a calculation on the inputs to the $i$'th
+section (ie $X sup +$ and $X sup -$ in Figure 6.12).
+No longer need the complicated global optimization technique of matrix
+inversion be used, as in the autocorrelation and covariance methods discussed
+earlier.
+.pp
+A suitable value for $k$ in the single lattice section of Figure 6.12 is
+.LB
+.EQ
+k~ = ~~ {E[ x sup + (n) x sup - (n-1)]} over
+{( E[ x sup + (n) sup 2 ] E[ x sup - (n-1) sup 2 ] ) sup 1/2} ~~ ;
+.EN
+.LE
+that is, the statistical correlation between $x sup + (n)$ and
+$x sup - (n-1)$.
+Here, $x sup + (n)$ and $x sup - (n)$ represent the input signals to the
+upper and lower paths (recall that $X sup +$ and $X sup -$
+are their $z$-transforms).
+$x sup - (n-1)$ is just $x sup - (n)$ delayed by one time unit, that is,
+the output of the $z sup -1$ box in the Figure.
+.pp
+The criterion of optimality for the autocorrelation and covariance methods
+was that the prediction error, that is, the signal which emerges from
+the right-hand end of the upper path of a lattice analysis filter,
+should be minimized in a mean-square sense.
+The reflection coefficients obtained from the above formula do not necessarily
+satisfy any such global minimization criterion.
+Nevertheless, they do keep the error signal small, and have been used with
+success in speech analysis systems.
+.pp
+It is easy to minimize the output from either the upper or the lower path
+of the lattice filter at each stage.  For example, the $z$-transform of the
+upper output is given by
+.LB
+.EQ
+Y sup + ~~=~~ X sup + ~-~ k z sup -1 X sup - ,
+.EN
+.LE
+or
+.LB
+.EQ
+y sup + (n) ~~=~~ x sup + (n) ~-~ k x sup - (n-1) .
+.EN
+.LE
+Hence
+.LB
+.EQ
+E[y sup + (n) sup 2 ] ~~ = ~~ E[x sup + (n) sup 2 ] ~-~
+2kE[x sup + (n) x sup - (n-1) ] ~+~ k sup 2 E [x sup - (n-1) sup 2 ] ,
+.EN
+.LE
+where $E$ stands for expected value, and this reaches a minimum when the
+derivative with respect to $k$ becomes zero:
+.LB
+.EQ
+-2E[x sup + (n) x sup - (n-1) ] ~+~ 2kE[x sup - (n-1) sup 2 ] ~~=~0 ,
+.EN
+.LE
+that is, when
+.LB
+.EQ
+k~ = ~~ {E[x sup + (n) x sup - (n-1) ]} over {E[x sup - (n-1) sup 2 ]
+} ~ .
+.EN
+.LE
+A similar calculation shows that the output of the lower path is minimized
+when
+.LB
+.EQ
+k~ = ~~ {E[x sup + (n) x sup - (n-1) ]} over {E[x sup + (n-1) sup 2 ]
+} ~ .
+.EN
+.LE
+Unfortunately, either of these expressions can exceed 1, leading to an
+unstable filter.
+The value of $k$ cited earlier is the geometric mean of these two
+expressions, and since it is a correlation coefficient, must be less than 1.
+.pp
+Another possibility is to minimize the expected value of the sum of the
+squares of the upper and lower outputs:
+.LB
+.EQ
+y sup + (n) sup 2 ~+~ y sup - (n) sup 2 ~~ = ~~
+(1+k sup 2 )x sup + (n) sup 2 ~-~ 2kx sup + (n) x sup - (n-1) ~+~
+(1+k sup 2 )x sup - (n) sup 2 .
+.EN
+.LE
+Taking expected values and setting the derivative with respect to k to zero
+leads to
+.LB
+.EQ
+k~ = ~~ {E[x sup + (n) x sup - (n-1) ]} over
+{ half ~ E[x sup + (n) sup 2 ~+~ x sup - (n-1) sup 2 ]} ~.
+.EN
+.LE
+This also is guaranteed to be less than 1, and has given good results
+in speech analysis systems.
+.pp
+Figure 6.14 shows the implementation of a single section of an analysis
+lattice.
+.FC "Figure 6.14"
+The signals $x sup + (n)$ and $x sup - (n-1)$ are fed to a
+correlator, which produces a suitable value for $k$.
+This value is used to calculate the output of the lattice section,
+and hence the input to the next lattice section.
+The reflection coefficient needs to be low-pass filtered, because it will
+only be transmitted to the synthesizer occasionally (say every 20\ msec) and so a
+short-term average is required.
+.pp
+One implementation of the correlator is shown in Figure 6.15 (Kang, 1974).
+.[
+Kang 1974
+.]
+.FC "Figure 6.15"
+This calculates the value of $k$ given by the last equation above, and does it
+by summing and differencing the two
+signals $x sup + (n)$ and $x sup - (n-1)$, squaring the results to give
+.LB
+.EQ
+x sup + (n) sup 2 + 2x sup + (n mark ) x sup - (n-1) +x sup - (n-1) sup 2
+~~~~~~~~ x sup + (n) sup 2 - 2x sup + (n) x sup - (n-1) +x sup - (n-1) sup 2
+~ ,
+.EN
+.LE
+and summing and differencing these, to yield
+.LB
+.EQ
+lineup 2x sup + (n) sup 2 + 2x sup - (n-1) sup 2 ~~~~~~~~
+4x sup + (n) x sup - (n-1) ~ .
+.EN
+.LE
+.sp
+Before these are divided to give the final coefficient $k$, they are
+individually low-pass filtered.
+While some rather complex schemes have been proposed,
+based upon Kalman filter theory (eg Matsui
+.ul
+et al,
+1972),
+.[
+Matsui Nakajima Suzuki Omura 1972
+.]
+a simple exponential weighted past average has been found to be
+satisfactory.  This has $z$-transform
+.LB
+.EQ
+1 over {64 - 63 z sup -1} ~ ,
+.EN
+.LE
+that is, in the time domain,
+.LB
+.EQ
+y(n)~ = ~~ 63 over 64 ~ y(n-1) ~+~ 1 over 64 ~ y(n) ~ .
+.EN
+.LE
+This filter exponentially averages past sample values
+with a time-constant of 64 sampling intervals
+\(em that is, 8\ msec at an 8\ kHz sampling rate.
+.sh "6.4  Pitch estimation"
+.pp
+It is sometimes useful to think of linear prediction as a kind of
+curve-fitting technique.
+Figure 6.16 illustrates how four samples of a speech signal can predict
+the next one.
+.FC "Figure 6.16"
+In essence, a curve is drawn through four points
+to predict the position of the fifth, and only the prediction error
+is actually transmitted.  Now if the order of linear prediction
+is high enough (at least 10), and if the coefficients are chosen
+correctly, the prediction will closely model the resonances of the
+vocal tract.  Thus the error will actually be zero, except at pitch
+pulses.
+.pp
+Figure 6.17 shows a segment of voiced speech together with the prediction
+error (often called the prediction residual).
+.FC "Figure 6.17"
+It is apparent that the
+error is indeed small, except at pitch pulses.
+This suggests that a good way to determine the pitch period is to examine
+the error signal, perhaps by looking at its autocorrelation function.
+As with all pitch detection methods, one must be
+careful:  spurious peaks can occur, especially in nasal sounds when
+the all-pole model provided by linear prediction fails.  Continuity
+constraints, which use previous values of pitch period when determining
+which peak to accept as a new pitch impulse, can eliminate many of these
+spurious peaks.  Unvoiced speech should produce an error signal with no
+prominent peaks, and this needs to be detected.
+Voiced fricatives are a difficult case:  peaks should be present
+but the general noise level of the error signal will be greater than
+it is in
+purely voiced speech.
+Such considerations have been taken into account in a practical pitch
+estimation system based upon this technique (Markel, 1972).
+.[
+Markel 1972 SIFT
+.]
+.pp
+This method of pitch detection highlights another advantage of the lattice
+analysis technique.  When using autocorrelation or covariance analysis to
+determine the filter (or reflection) coefficients, the error signal is not
+normally produced.  It can, of course, be found by taking the speech samples
+which constitute the current frame and running them through an analysis
+filter whose parameters are those determined by the analysis, but this
+is a computationally demanding exercise, for the filter must run at the
+speech sampling rate (say 8\ kHz) instead of at the frame rate (say 50\ Hz).
+Usually, pitch is estimated by other methods, like those discussed in
+Chapter 4, when using autocorrelation or covariance linear prediction.
+However, we have seen above that with the lattice method, the error
+signal is produced as a byproduct:  it appears at the right-hand end
+of the  upper path of the lattice chain.  Thus it is already available
+for use in determining pitch periods.
+.sh "6.5  Parameter coding for linear predictive storage or transmission"
+.pp
+In this section, the coding requirements of linear predictive parameters
+will be examined.  The parameters that need to be stored or transmitted
+are:
+.LB
+.NP
+pitch
+.NP
+voiced-unvoiced flag
+.NP
+overall amplitude level
+.NP
+filter coefficients or reflection coefficients.
+.LE
+The first three are parameters of the excitation source.
+They can be derived directly from the error signal as indicated above, if
+it is generated (as it is in lattice implementations); or by other
+methods if no error signal is calculated.
+The filter or reflection coefficients are, of course, the main product
+of linear predictive analysis.
+.pp
+It is generally agreed that around 60 levels, logarithmically spaced,
+are needed to represent pitch for telephone quality speech.
+The voiced-unvoiced indication requires one bit, but since pitch is
+irrelevant in unvoiced speech it can be coded as one of the pitch
+levels.  For example, with 6-bit coding of pitch, the value 0 can be
+reserved to indicate unvoiced speech, with values 1\-63 indicating the
+pitch of voiced speech.
+The overall gain has not been discussed above:  it is simply the average
+amplitude of the error signal.  Five bits on a logarithmic scale
+are sufficient to represent it.
+.pp
+Filter coefficients are not very amenable to quantization.  At least
+8\-10\ bits are required for each one.  However, reflection coefficients
+are better behaved, and 5\-6\ bits each seems adequate.  The number of
+coefficients that must be stored or transmitted is the same as the
+order of the linear prediction:  10 is commonly used for low-quality
+speech, with as many as 15 for higher qualities.
+.pp
+These figures give around 100\ bits/frame for a 10'th order system using
+filter coefficients, and around 65\ bits/frame for a 10'th order system
+using reflection coefficients.  Frame lengths vary between 10\ msec
+and 25\ msec, depending on the quality desired.  Thus for 20\ msec frames,
+the data rates work out at around 5000\ bit/s using filter coefficients,
+and 3250\ bit/s using reflection coefficients.
+.pp
+Substantially lower data rates can be achieved by more careful
+coding of parameters.  In 1976, the US Government defined a standard
+coding scheme for 10-pole linear prediction with a data rate of
+2400\ bit/s \(em conveniently chosen as one of the
+commonly-used rates for serial data transmission.
+This standard, called LPC-10, tackles the difficult problem of
+protection against transmission errors (Fussell
+.ul
+et al,
+1978).
+.[
+Fussell Boudra Abzug Cowing 1978
+.]
+.pp
+Whenever data rates are reduced, redundancy inherent in the signal is
+necessarily lost and so the effect of transmission errors becomes
+greatly magnified.
+For example, a single corrupted sample in PCM transmission of speech
+will probably not be noticed, and even a short burst of errors will be
+perceived as a click which can readily be distinguished from the speech.
+However, any error in LPC transmission will last for one entire
+frame \(em say 20\ msec \(em and worse still, it will be integrated into the
+speech signal and not easily discriminated from it by the listener's brain.
+A single corruption may, for example, change a voiced frame into an
+unvoiced one, or vice versa.  Even if it affects only 
+a reflection coefficient it will change the resonance characteristics
+of that frame, and change them in a way that does not simply sound like
+superimposed noise.
+.pp
+Table 6.1 shows the LPC-10 coding scheme.
+.RF
+.in+0.1i
+.ta 2.0i +1.8i +0.6i
+.nr x1 (\w'voiced sounds'/2)
+.nr x2 (\w'unvoiced sounds'/2)
+.ul
+	\h'-\n(x1u'voiced sounds	\h'-\n(x2u'unvoiced sounds
+.sp
+pitch/voicing	7	7	60 pitch levels, Hamming
+			\h'\w'00 'u'and Gray coded
+energy	5	5	logarithmically coded
+$k sub 1$	5	5	coded by table lookup
+$k sub 2$	5	5	coded by table lookup
+$k sub 3$	5	5
+$k sub 4$	5	5
+$k sub 5$	4	\-
+$k sub 6$	4	\-
+$k sub 7$	4	\-
+$k sub 8$	4	\-
+$k sub 9$	3	\-
+$k sub 10$	2	\-
+synchronization	1	1	alternating 1,0 pattern
+error detection/	\-	\h'-\w'0'u'21
+correction
+	\h'-\w'__'u+\w'0'u'__	\h'-\w'__'u+\w'0'u'__
+.sp
+	\h'-\w'0'u'54	\h'-\w'0'u'54
+.sp
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+	frame rate: 44.4\ Hz (22.5\ msec frames)
+.in 0
+.FG "Table 6.1  Bit requirements for each parameter in LPC-10 coding scheme"
+Different coding is used for voiced and unvoiced frames.
+Only four reflection coefficients are transmitted for unvoiced frames,
+because it has been determined that no perceptible increase in speech quality
+occurs when more are used.
+The bits saved are more fruitfully employed to provide error detection
+and correction for the other parameters.
+Seven bits are used for pitch and the voiced-unvoiced flag, and they are
+redundant in that only 60 possible pitch values are
+allowed.
+Most transmission errors in this field will be detected by the receiver;
+which can then use an estimate of pitch based on previous values and
+discard the erroneous one.  Pitch values are also Gray coded so that
+even if errors are not detected, there is a good chance that an adjacent
+pitch value is read instead.
+Different numbers of bits are allocated to the various reflection
+coefficients:  experience shows that the lower-numbered ones contribute
+most highly to intelligibility and so these are quantized most finely.
+In addition, a table lookup operation is performed on the code
+generated for the first two, providing a non-linear quantization which is
+chosen to minimize the error on a statistical basis.
+.pp
+With 54\ bits/frame and 22.5\ msec frames, LPC-10 requires a 2400\ bit/s
+data rate.  Even lower rates have been used successfully for lower-quality
+speech.  The Speak 'n Spell toy, described in Chapter 11, has an
+average data rate of 1200\ bit/s.  Rates as low as 600\ bit/s have
+been achieved (Kang and Coulter, 1976) by pattern recognition techniques operating
+on the reflection coefficients:  however, the speech quality is not good.
+.[
+Kang Coulter 1976
+.]
+.sh "6.6  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "6.7  Further reading"
+.pp
+Most recent books on digital signal processing contain some information
+on linear prediction (see Oppenheim and Schafer, 1975; Rabiner and Gold, 1975;
+and Rabiner and Schafer, 1978; all referenced at the end of Chapter 4).
+.LB "nn"
+.\"Atal-1971-1
+.]-
+.ds [A Atal, B.S.
+.as [A " and Hanauer, S.L.
+.ds [D 1971
+.ds [T Speech analysis and synthesis by linear prediction of the acoustic wave
+.ds [J JASA
+.ds [V 50
+.ds [P 637-655
+.nr [P 1
+.ds [O August
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+This paper is of historical importance because it introduced the idea
+of linear prediction to the speech processing community.
+.in-2n
+.\"Makhoul-1975-2
+.]-
+.ds [A Makhoul, J.I.
+.ds [D 1975
+.ds [K *
+.ds [T Linear prediction: a tutorial review
+.ds [J Proc IEEE
+.ds [V 63
+.ds [N 4
+.ds [P 561-580
+.nr [P 1
+.ds [O April
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+An interesting, informative, and readable survey of linear prediction.
+.in-2n
+.\"Markel-1976-3
+.]-
+.ds [A Markel, J.D.
+.as [A " and Gray, A.H.
+.ds [D 1976
+.ds [T Linear prediction of speech
+.ds [I Springer Verlag
+.ds [C Berlin
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is the only book which is entirely devoted to linear prediction of speech.
+It is an essential reference work for those interested in the subject.
+.in-2n
+.\"Wiener-1947-4
+.]-
+.ds [A Wiener, N.
+.ds [D 1947
+.ds [T Extrapolation, interpolation and smoothing of stationary time series
+.ds [I MIT Press
+.ds [C Cambridge, Massachusetts
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Linear prediction is often thought of as a relatively new technique,
+but it is only its application to speech processing that is novel.
+Wiener develops all of the basic mathematics used in linear prediction
+of speech, except the lattice filter structure.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "7  JOINING SEGMENTS OF SPEECH"
+.ds RT "Joining segments of speech
+.ds CX "Principles of computer speech
+.pp
+The obvious way to provide speech output from computers
+is to select the basic acoustic units to be used; record them;
+and generate utterances by concatenating together appropriate segments
+from this pre-stored inventory.
+The crucial question then becomes, what are the basic units?
+Should they be whole sentences, words, syllables, or phonemes?
+.pp
+There are several trade-offs to be considered here.
+The larger the units, the more utterances have to be stored.
+It is not so much the length of individual utterances that is of concern,
+but rather their variety, which tends to increase exponentially instead
+of linearly with the size of the basic unit.  Numbers provide an
+easy example:  there are $10 sup 7$ 7-digit telephone numbers, and it is
+certainly infeasible to record each one individually.
+Note that as storage technology improves the limitation is becoming
+more and more one of recording the utterances in the first place rather
+than finding somewhere to store them.
+At a PCM data rate of 50\ Kbit/s, a 100\ Mbyte disk can hold over 4\ hours
+of continuous speech.
+With linear predictive coding at 1\ Kbit/s it holds 0.8 of a
+megasecond \(em well over a week.  And this is a 24-hour 7-day week,
+which corresponds to a working month; and continuous speech \(em without
+pauses \(em which probably requires another factor of five for
+production by a person.
+Setting up a recording session to fill the disk would be a formidable
+task indeed!
+Furthermore, the use of videodisks \(em which will be common domestic items
+by the end of the decade \(em could increase these figures by a factor of 50.
+.pp
+The word seems to be a sensibly-sized basic unit.
+Many applications use a rather limited vocabulary \(em 190 words
+for the airline reservation system described in Chapter 1.
+Even at PCM data rates, this will consume less than 0.5\ Mbyte of
+storage.
+Unfortunately, coarticulation and prosodic factors now come into play.
+.pp
+Real speech is connected \(em there are few gaps between words.
+Coarticulation, where sounds are affected by those on either side,
+naturally operates across word boundaries.
+And the time constants of coarticulation are associated with the
+mechanics of the vocal tract and hence measure tens or hundreds
+of msec.  Thus the effects straddle several pitch periods (100\ Hz pitch
+has 10\ msec period) and cannot be simulated by simple interpolation of the
+speech waveform.
+.pp
+Prosodic features \(em notably pitch and rhythm \(em span much longer
+stretches of speech than single words.  As far as most speech output
+applications are concerned, they operate at the utterance level of
+a single, sentence-sized, information unit.  They cannot be
+accomodated if speech waveforms of individual words of
+the utterance are stored,
+for it is rarely feasible to alter the fundamental
+frequency or duration of a time waveform without changing all the formant
+resonances as well.
+However, both word-to-word coarticulation and the essential features
+of rhythm and intonation can be incorporated if the stored words are
+coded in source-filter form.
+.pp
+For more general applications of speech output, the limitations of
+word storage soon become apparent.  Although people's daily
+vocabularies are not large, most words have a variety
+of inflected forms which need to be treated separately if a strict
+policy is adopted of word storage.  For instance, in this book
+there are 84,000 words, and 6,500 (8%) different ones (counting
+inflected forms).
+In Chapter 1 alone, there are 6,800 words and 1,700 (25%) different ones.
+.pp
+It seems crazy to treat a simple inflection like "$-s$" or its voiced
+counterpart, "$-z$" (as in "inflection\c
+.ul
+s\c
+"),
+as a totally different word from the base form.
+But once you consider storing roots and endings separately,
+it becomes apparent
+that there is a vast number of different endings, and it is difficult to know
+where to draw the line.  It is natural to think instead of simply
+using the syllable as the basic unit.
+.pp
+A generous estimate of the number of different syllables in English is 10,000.
+At three a second, only about an
+hour's storage is required for them all.  But waveform storage
+will certainly not do.
+Although coarticulation effects between words are needed to make
+speech sound fluent, coarticulation between syllables is necessary
+for it even to be
+.ul
+comprehensible.
+Adopting a source-filter form of representation is essential, as is
+some scheme of interpolation between syllables which simulates
+coarticulation.
+Unfortunately, a great deal of acoustic action occurs at syllable
+boundaries \(em stops are exploded, the sound source changes
+between voicing and frication, and so on.  It may be more appropriate
+to consider inverse syllables, comprising a vowel-consonant-vowel sequence
+instead of consonant-vowel-consonant.
+(These have jokingly been dubbed "lisibles"!)
+.pp
+There is again some considerable practical difficulty in creating
+an inventory of syllables, or lisibles.
+Now it is not so much the recording that is impractical, but
+the editing needed to ensure that the cuts between syllables are made
+at exactly the right point.  As units get smaller, the exact
+placement of the boundaries becomes ever more critical; and several thousand
+sensitive editing jobs is no easy task.
+.pp
+Since quite general effects of coarticulation must be accomodated
+with syllable synthesis, there will not necessarily be significant
+deterioration if smaller, demisyllable, units are employed.
+This reduces the segment inventory to an estimated 1000\-2000 entries,
+and the tedious job of editing each one individually becomes at
+least feasible, if not enviable.
+Alternatively, the segment inventory could be created by artificial
+means involving cut-and-try experiments with resonance parameters.
+.pp
+The ultimate in economy of inventory size, of course, is to use
+phonemes as the basic unit.  This makes the most critical
+part of the task interpolation between units, rather than their
+construction or recording.  With only about 40 phonemes
+in English, each one can be examined in many different contexts to
+ascertain the best data to store.
+There is no need to record them directly from a human voice \(em it
+would be difficult anyway for most cannot be produced in isolation.
+In fact, a phoneme is an abstract unit, not a particular sound
+(recall the discussion of phonology in Chapter 2), and so it is
+most appropriate that data be abstracted from several different
+realizations rather than an exact record made of any one.
+.pp
+If information is stored about phonological units of
+speech \(em phonemes \(em the difficult task of phonological-to-phonetic
+conversion must necessarily be performed automatically.
+Allophones are created by altering the transitions between units,
+and to a lesser extent by modifying the central parts of the units
+themselves.
+The rules for making transitions will have a big effect on the
+quality of the resulting speech.
+Instead of trying to perform this task automatically by a computer
+program, the allophones themselves could be stored.  This will
+ease the job of generating transitions between segments, but
+will certainly not eliminate it.
+The total number of allophones will depend on the narrowness of the
+transcription system:  60\-80 is typical, and it is unlikely to exceed
+one or two hundred.  In any case there will not be a storage problem.
+However, now the burden of producing an allophonic transcription
+has been transferred to the person who codes the utterance prior
+to synthesizing it.  If he is skilful and patient, he should
+be able to coax the system into producing fairly understandable
+speech, but the effort required for this on a per-utterance basis
+should not be underestimated.
+.RF
+.nr x0 \w'sentences  '
+.nr x1 \w'  '
+.nr x2 \w'depends on  '
+.nr x3 \w'generalized or  '
+.nr x4 \w'natural speech  '
+.nr x5 \w'author of segment'
+.nr x6 \n(x0u+\n(x1u+\n(x2u+\n(x3u+\n(x4u+\n(x5u
+.nr x7 (\n(.l-\n(x6)/2
+.in \n(x7u
+.ta \n(x0u +\n(x1u +\n(x2u +\n(x3u +\n(x4u
+	|	size of	storage	source of	principal
+	|	utterance	method	utterance	burden is
+	|	inventory		inventory	placed on
+	|\h'-1.0i'\l'\n(x6u\(ul'
+	|
+sentences	|	depends on	waveform or	natural speech	recording artist,
+	|	application	source-filter		storage medium
+	|		parameters
+	|
+words	|	depends on	source-filter	natural speech	recording artist
+	|	application	parameters		and editor,
+	|				storage medium
+	|
+syllables/	|	\0\0\010000	source-filter	natural speech	recording editor
+  lisibles	|		parameters
+	|
+demi-	|	\0\0\0\01000	source-filter	natural speech	recording editor
+  syllables	|		parameters	or artificially	or inventory
+	|			generated	compiler
+	|
+phonemes	|	\0\0\0\0\0\040	generalized	artificially	author of segment
+	|		parameters	generated	concatenation
+	|				program
+	|
+allophones	|	\0\050\-100	generalized or	artificially	coder of
+	|		source-filter	generated or	synthesized
+	|		parameters	natural speech	utterances
+	|\h'-1.0i'\l'\n(x6u\(ul'
+.in 0
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.FG "Table 7.1  Some issues relevant to choice of basic unit"
+.pp
+Table 7.1 summarizes in broad brush-strokes the issues which relate to the
+choice of basic unit for concatenation.
+The sections which follow provide more detail about the different
+methods of joining segments of speech together.
+Only segmental aspects are considered, for the important problems of
+prosody will be treated in the next chapter.
+All of the methods rely to some extent on the acoustic properties of speech,
+and as smaller basic units are considered the role of speech acoustics
+becomes more important.
+It is impossible in a book like this to give a detailed account of acoustic
+phonetics, for it would take several volumes!
+What I aim to do in the following pages is to highlight some salient features
+which are relevant to segment concatenation, without attempting to be
+complete.
+.sh "7.1  Word concatenation"
+.pp
+For general speech output, word concatenation is an inherently limited
+technique because of the large number of phonetically different words.
+Despite this fact, it is at present the most widely-used synthesis
+method, and is likely to remain so for several years.
+We have seen that the primary problems are word-to-word
+coarticulation and prosody; and both can be overcome, at least to a useful
+approximation, by coding the words in source-filter form.
+.rh "Time-domain techniques."
+Nevertheless, a surprising number of applications simply store
+the time waveform, coded, usually, by one of the techniques described in
+Chapter 3.
+From an implementation point of view there are many advantages to this.
+Speech quality can easily be controlled by selecting a suitable sampling
+rate and coding scheme.
+A natural-sounding voice is guaranteed; male or female as desired.
+The equipment required is minimal \(em a digital-to-analogue
+converter and post-sampling filter will do for synthesis if
+PCM coding is used, and
+DPCM, ADPCM, and delta modulation decoders are not much more complicated.
+.pp
+From a speech point of view, the resulting utterances can never be made
+convincingly fluent.
+We discussed the early experiments of Stowe and Hampton (1961)
+at the beginning of Chapter 3.
+.[
+Stowe Hampton 1961
+.]
+A major drawback to word concatenation in the
+analogue domain is the introduction of clicks and other interference
+between words:  it is difficult to prevent the time waveform transitions
+from adding extraneous sounds.
+This poses no problem with digital storage, however, for the waveforms
+can be edited accurately prior to storage so that they start
+and finish at an exactly
+zero level.
+Rather, the lack of fluency stems from the absence of proper control
+of coarticulation and prosody.
+.pp
+But this is not necessarily a serious drawback if the application is
+a sufficiently limited one.  Complete, invariant utterances can be
+stored as one unit.  Often they must contain data-dependent
+slot-fillers, as in
+.LB
+This flight makes \(em stops
+.LE
+and
+.LB
+Flight number \(em leaves \(em at \(em , arrives in \(em at \(em
+.LE
+(taken from the airline reservation system of Chapter 1
+(Levinson and Shipley, 1980)).
+.[
+Levinson Shipley 1980
+.]
+Then, each slot-filling word is recorded in an intonation consistent
+both with its position in the template utterance and with the
+intonation of that utterance.
+This could be done by embedding the word in the utterance
+for recording, and excising it by digital editing before storage.
+It would be dangerous to try to take into account coarticulation effects,
+for the coarticulation could not be made consistent with both the
+several slot-fillers and the single template.
+This could be overcome if several versions of the template were stored,
+but then the scheme becomes subject to combinatorial explosion
+if there is more than one slot in a single utterance.
+But it is not really necessary, for the lack of fluency will probably
+be interpreted by a benevolent listener as an attempt to convey the
+information as clearly as possible.
+.pp
+Difficulties will occur if the same slot-filler is used in different
+contexts.  For instance, the first gap in each of the sentences above
+contains a number; yet the intonation of that number is different.
+Many systems simply ignore this problem.
+Then one does notice anomalies, if one is attentive:  the words come,
+as it were, from different mouths, without fluency.
+However, the problem is not necessarily acute.  If it is, two or more
+versions of each slot-filler can be recorded, one for each context.
+.pp
+As an example, consider the synthesis of 7-digit telephone numbers,
+like 289\-5371.  If one version only of each digit is stored,
+it should be recorded in a level tone of voice.  A pause should be
+inserted after the third digit of the synthetic number, to accord
+with common elocution.  The result will certainly be unnatural, although
+it should be clear and intelligible.
+Any pitch errors in the recordings will make certain numbers
+audibly anomalous.
+At the other extreme, 70 single digits could be stored, one version of
+each digit for each position in the number.  The recording will be
+tedious and error-prone, and the synthetic utterances will still not
+be fluent \(em for coarticulation is ignored \(em but instead
+unnaturally clearly enunciated.  A compromise is to record only
+three versions of each digit, one for any of the
+five positions
+.nr x1 \w'\(ul'
+.nr x2 (8*\n(x1)
+.nr x3 0.2m
+\zx\h'\n(x1u'\zx\h'\n(x1u'\h'\n(x1u'\z\-\h'\n(x1u'\zx\h'\n(x1u'\zx\h'\n(x1u'\c
+\zx\h'\n(x1u'\h'\n(x1u'\v'\n(x3u'\l'-\n(x2u\(ul'\v'-\n(x3u' ,
+another one for the third position
+\h'\n(x1u'\h'\n(x1u'\zx\h'\n(x1u'\z\-\h'\n(x1u'\h'\n(x1u'\c
+\h'\n(x1u'\h'\n(x1u'\h'\n(x1u'\v'\n(x3u'\l'-\n(x2u\(ul'\v'-\n(x3u' ,
+and the last for the final position
+\h'\n(x1u'\h'\n(x1u'\h'\n(x1u'\z\-\h'\n(x1u'\h'\n(x1u'\c
+\h'\n(x1u'\h'\n(x1u'\zx\h'\n(x1u'\v'\n(x3u'\l'-\n(x2u\(ul'\v'-\n(x3u' .
+The first version will be in a level voice, the second an
+incomplete, rising tone; and the third a final, dropping pitch.
+.rh "Joining formant-coded words."
+The limitations of the time-domain method are lack of
+fluency caused by unnatural transitions between words, and the
+combinatorial explosion created by recording slot-fillers several times
+in different contexts.
+Both of these problems can be alleviated by storing formant tracks,
+concatenating them with suitable interpolation, and applying a complete
+pitch contour suitable for the whole utterance.
+But one can still not generate conversational speech, for natural speech
+rhythms cause non-linear warpings of the time axis which cannot reasonably
+be imitated by this method.
+.pp
+Solving problems often creates others.
+As we saw in Chapter 4, it is not easy to obtain reliable formant tracks
+automatically.  Yet hand-editing of formant parameters adds a whole new
+dimension to the problem of vocabulary construction, for it is
+an exceedingly tiresome and time-consuming task.
+Even after such tweaking, resynthesized utterances will be degraded
+considerably from the original, for the source-filter model is by no means
+a perfect one.
+A hardware or real-time software formant synthesizer must be added
+to the system, presenting design problems and creating extra cost.
+Should a serial or parallel synthesizer be used? \(em the latter offers
+potentially better speech (especially in nasal sounds), but requires
+additional parameters, namely formant amplitudes, to be estimated.
+Finally, as we will see in the next chapter, it is not an easy matter to
+generate a suitable pitch contour and apply it to the utterance.
+.pp
+Strangely enough, the interpolation itself does not present any great
+difficulty, for there is not enough information in the formant-coded
+words to make possible sophisticated coarticulation.
+The need for interpolation is most pressing when one word ends with
+a voiced sound and the next begins with one.
+If either the end of the first or the beginning of the second word
+(or both) is unvoiced, unnatural formant transitions do not matter
+for they will not be heard.
+Actually, this is only strictly true for fricative transitions:  if
+the juncture is aspirated then formants will be perceived in the
+aspiration.  However,
+.ul
+h
+is the only fully aspirated sound in English,
+and it is relatively uncommon.
+It is not absolutely necessary to interpolate the fricative filter resonance,
+because smooth transitions from one fricative sound to another are rare
+in natural speech.
+.pp
+Hence unless both sides of the junction are voiced, no interpolation
+is needed:  simple abuttal of the stored parameter tracks will do.
+Note that this is
+.ul
+not
+the same as joining time waveforms, for the synthesizer
+will automatically ensure a relatively smooth transition from one
+segment to another because of energy storage in the filters.
+A new set of resonance parameters for the formant-coded words will be stored
+every 10 or 20 msec (see Chapter 5), and so the transition will automatically
+be smoothed over this time period.
+.pp
+For voiced-to-voiced transitions, some interpolation is needed.
+An overlap period of duration, say, 50\ msec, is established, and
+the resonance parameters in the final 50\ msec of the first word are
+averaged with those in the first 50\ msec of the second.
+The average is weighted, with the first word's formants dominating
+at the beginning and their effect progressively dying out
+in favour of the second word.
+.pp
+More sophisticated than a simple average is to weight the components
+according to how rapidly they are changing.
+If the spectral change in one word is much greater than that in the
+other, we might expect that this will dominate the transition.
+A simple measure of spectral derivative at any given time can be found
+by adding the magnitude of the discrepancies in each formant frequency
+between one sample and the next.
+The spectral change in the transition region can be obtained by summing
+the spectral derivatives at each sample in the region.
+Such a measure can perhaps be made more accurate by taking into
+account the relative importance of the formants, but will probably
+never be more than a rough and ready yardstick.
+At any rate, it can be used to load the average in favour of the
+dominant side of the junction.
+.pp
+Much more important for naturalness of the speech are the effects
+of rhythm and intonation, discussed in the next chapter.
+.pp
+Such a scheme has been implemented and tested on \(em guess what! \(em 7-digit
+telephone numbers (Rabiner
+.ul
+et al,
+1971).
+.[
+Rabiner Schafer Flanagan 1971
+.]
+Significant improvement (at the 5% level of statistical
+significance) in people's
+ability to recall numbers was found for this method over direct
+abuttal of either natural or synthetic versions of the digits.
+Although the method seemed, on balance, to produce utterances that were
+recalled less accurately than completely natural spoken
+telephone numbers, the difference was not significant (at the 5% level).
+The system was also used to generate wiring instructions by computer
+directly from the connection list, as described in Chapter 1.
+As noted there, synthetic speech was actually preferred to natural speech
+in the noisy environment of the production line.
+.rh "Joining linear predictive coded words."
+Because obtaining accurate formant tracks for natural utterances
+by Fourier transform methods is difficult, it is worth considering
+the use of linear prediction as the source-filter model.
+Actually, formant resonances can be extracted from linear predictive
+coefficients quite easily, but there is no need to do this because
+the reflection coefficients themselves are quite suitable
+for interpolation.
+.pp
+A slightly different interpolation scheme from that described in the
+previous section has been reported (Olive, 1975).
+.[
+Olive 1975
+.]
+The reflection coefficients were spliced during an overlap region of
+only 20\ msec.
+More interestingly, attempts were made to suppress the plosive bursts
+of stop sounds in cases where they were followed by another stop at
+the beginning of the next word.
+This is a common coarticulation, occurring, for instance, in the phrase
+"stop burst".  In running speech, the plosion on the
+.ul
+p
+of "stop" is
+normally suppressed because it is followed by another stop.
+This is a particularly striking case because the place of articulation
+of the two stops
+.ul
+p
+and
+.ul
+b
+is the same:  complete suppression is not as likely
+to happen in "stop gap", for example (although it may occur).
+Here is an instance of how extra information could improve the
+quality of the synthetic transitions considerably.
+However, automatically identifying the place of articulation of stops is
+a difficult job, of a complexity far above what is appropriate for
+simply joining words stored in source-filter form.
+.pp
+Another innovation was introduced into the transition between two
+vowel sounds, when the second word began with an accented syllable.
+A glottal stop was placed at the juncture.
+Although the glottal stop was not described in Chapter 2, it is a sound
+used in many dialects of English.  It frequently occurs
+in the utterance "uh-uh", meaning "no".  Here it
+.ul
+is
+used to separate two vowel sounds, but in fact this is not particularly
+common in most dialects.
+One could say "the apple", "the orange", "the onion" with a neutral vowel
+in "the" (to rhyme with "\c
+.ul
+a\c
+bove") and a glottal stop as separator,
+but it is much more usual to rhyme "the" with "he" and introduce a
+.ul
+y
+between the words.
+Similarly, even speakers who do not normally pronounce an
+.ul
+r
+at the
+end of words will introduce one in "bigger apple", rather than
+using a glottal stop.
+Note that it would be wrong to put an
+.ul
+r
+in "the apple", even
+for speakers who usually terminate "the" and "bigger" with the same sound.
+Such effects occur at a high level of processing, and are practically
+impossible to simulate with word-interpolation rules.
+Hence the expedient of introducing a glottal stop is a good one, although
+it is certainly unnatural.
+.sh "7.2  Concatenating whole or partial syllables"
+.pp
+The use of segments larger than a single phoneme or allophone but smaller
+than a word as the basic unit for speech synthesis has an interesting
+history.
+It has long been realized that transitions between phonemes are
+extremely sensitive and critical components of speech, and thus are
+essential for successful synthesis.
+Consider the unvoiced stop sounds
+.ul
+p, t,
+and
+.ul
+k.
+Their central portion is actually silence!  (Try saying a word like
+"butter" with a very long
+.ul
+t.\c
+)  Hence
+in this case it is
+.ul
+only
+the transitional information which can distinguish these sounds from
+each other.
+.pp
+Sound segments which comprise the transition from the centre of one phoneme
+to the centre of the next are called
+.ul
+dyads
+or
+.ul
+diphones.
+The possibility of using them as the basic units for concatenation
+was first mooted in the mid 1950's.
+The idea is attractive because there is relatively little spectral
+movement in the central, so-called "steady-state", portion of many
+phonemes \(em in the extreme case of unvoiced stops there is not only
+no spectral movement, but no spectrum at all in the steady state!
+At that time the resonance synthesizer was in its infancy, and
+so recorded segments of live speech were used.  The early experiments
+met with little success because of the technical difficulties
+of joining analogue waveforms and inevitable discrepancies between
+the steady-state parts of a phoneme recorded in different contexts \(em not
+to mention the problems of coarticulation and prosody which effectively
+preclude the use of waveform concatenation at such a low level.
+.pp
+In the mid 1960's, with the growing use of resonance synthesizers,
+it became possible to generate diphones by copying resonance parameters
+manually from a spectrogram, and improving the result by trial and error.
+It was not feasible to extract formant frequencies automatically from real
+speech, though, because the fast Fourier transform was not yet widely
+known and the computational burden of slow Fourier transformation was
+prohibitive.
+For example, a project at IBM stored manually-derived parameter tracks
+for diphones, identified by pairs of phoneme names (Dixon and Maxey, 1968).
+.[
+Dixon Maxey 1968
+.]
+To generate a synthetic utterance it was coded in
+phonetic form and used to access
+the diphone table to give a set of parameter tracks for the complete
+utterance.  Note that this is the first system we have encountered
+whose input is a phonetic transcription which relates to an inventory
+of truly synthetic character:  all previous schemes used recordings of
+live speech, albeit processed in some form.
+Since the inventory was synthetic, there was no difficulty in ensuring
+that discontinuities did not arise between segments beginning and ending with
+the same phoneme.  Thus interpolation was irrelevant, and the synthesis
+procedure concentrated on prosodic questions.  The resulting speech
+was reported to be quite impressive.
+.pp
+Strictly speaking, diphones are not demisyllables but phoneme pairs.
+In the simplest case they happen to be similar, for two primary diphones
+characterize a consonant-vowel-consonant syllable.
+There is an advantage to using demisyllables rather than diphones as the basic
+unit, for many syllables begin or end with complicated consonant clusters
+which are not easy to produce convincingly by diphone
+concatenation.
+But they are not easy to produce by hand-editing resonance parameters
+either!
+Now that speech analysis methods have been developed and refined,
+resonance parameters or linear predictive coefficients
+can be extracted automatically
+from natural utterances, and there has been a resurgence of interest in
+syllabic and demisyllabic synthesis methods.  The wheel has turned
+full circle, from segments of natural speech to hand-tailored parameters
+and back again!
+.pp
+The advantage of storing demisyllables over syllables (or lisibles) from
+the point of view of storage capacity has already been pointed out
+(perhaps 1,000\-2,000 demisyllables as opposed to 4,000\-10,000 syllables).
+But it is probably not too significant with the continuing decline
+of storage costs.
+The requirements are of the order of 25\ Kbyte versus 0.5\ Mbyte
+for 1200\ bit/s linear predictive coding, and the latter could
+almost be accomodated today \(em 1981 \(em on a state-of-the-art
+read-only memory chip.
+A bigger advantage comes from rhythmic considerations.
+As we will see in the next chapter, the rhythms of fluent speech cause
+dramatic variations in syllable duration, but these seem to affect
+the vowel and closing consonant cluster much more than the initial consonant
+cluster.  Thus if a demisyllable is deemed to begin shortly (say 60\ msec)
+after onset of the vowel, when the formant structure has settled down,
+the bulk of the vowel and the closing consonant cluster will form a
+single demisyllable.  The opening cluster of the next syllable will lie
+in the next demisyllable.  Then differential lengthening can be applied
+to that part of the syllable which tends to be stretched in live speech.
+.pp
+One system for demisyllable concatenation has produced excellent results
+for monosyllabic English words (Lovins and Fujimura, 1976).
+.[
+Lovins Fujimura 1976
+.]
+Complex word-final consonant clusters are excluded from the inventory by
+using syllable affixes
+.ul
+s, z, t,
+and
+.ul
+d;
+these are attached to the
+syllabic core as a separate exercise (Macchi and Nigro, 1977).
+.[
+Macchi Nigro 1977
+.]
+Prosodic rather than segmental considerations are likely to prove the major
+limiting factor when this scheme is extended to running speech.
+.pp
+Monosyllabic words spoken in isolation are coded as linear predictive
+reflection coefficients, and segmented by digital editing into the initial
+consonant cluster and the vocalic nucleus plus final cluster.
+The cut is made 60\ msec into the vowel, as suggested above.
+This minimizes the difficulty of interpolation when concatenating
+segments, for there is ample voicing on either side of the juncture.
+The reflection coefficients should not differ radically because the
+vowel is the same in each demisyllable.
+A 40\ msec overlap is used, with the usual linear interpolation.
+An alternative smoothing rule applies when the second segment has
+a nasal or glide after the vowel.  In this case anticipatory coarticulation
+occurs, affecting even the early part of the vowel.  For example, a vowel
+is frequently nasalized when followed by a nasal sound \(em even in English
+where nasalization is not a distinctive feature in vowels (see Chapter 2).
+Under these circumstances the overlap area is moved forward in time so
+that the colouration applies throughout almost the whole vowel.
+.sh "7.3  Phoneme synthesis"
+.pp
+Acoustic phonetics is the study of how the acoustic
+signal relates to the phonetic sequence which was spoken or heard.
+People \(em especially engineers \(em often ask, how could phonetics not
+be acoustic?  In fact it can be articulatory, auditory, or linguistic
+(phonological), for example, and we have touched on the first and last
+in Chapter 2.
+The invention of the sound spectrograph in the late 1940's was an
+event of colossal significance for acoustic phonetics, for it somehow
+seemed to make the intricacies of speech visible.
+(This was thought to be a greater advance than actually turned
+out:  historically-minded readers should refer to Potter
+.ul
+et al,
+1947,
+for an enthusiastic contemporary appraisal of the invention.)  A
+.[
+Potter Kopp Green 1947
+.]
+result of several years of research at Haskins Laboratories in New York
+during the 1950's was a set of "minimal rules for synthesizing speech",
+which showed how stylized formant patterns could generate cues for
+identifying vowels and, particularly, consonants
+(Liberman, 1957; Liberman
+.ul
+et al,
+1959).
+.[
+Liberman 1957 Some results of research on speech perception
+.]
+.[
+Liberman Ingemann Lisker Delattre Cooper 1959
+.]
+.pp
+These were to form the basis of many speech synthesis-by-rule computer
+programs in the ensuing decades.  Such programs take as input a
+phonetic transcription of the utterance and generate a spoken version
+of it.  The transcription may be broad or narrow, depending on the
+system.  Experience has shown that the Haskins rules really are
+minimal, and the success of a synthesis-by-rule program depends on
+a vast collection of minutia, each seemingly insignificant in isolation
+but whose effects combine to influence the speech quality dramatically.
+The best current systems produce clearly understandable
+speech which is nevertheless something of a strain to listen to for
+long periods.
+However, many are not good; and some are execrable.
+In recent times commercial influences have unfortunately restricted
+the free exchange of results and programs between academic researchers,
+thus slowing down progress.
+Research attention has turned to prosodic factors,
+which are certainly less well understood than segmental ones, and
+to synthesis from plain English text rather than from phonetic transcriptions.
+.pp
+The remainder of this chapter describes the techniques of segmental
+synthesis.  First it is necessary to introduce some
+elements of acoustic phonetics.
+It may be worth re-reading Chapter 2 at this point, to refresh
+your memory about the classification of speech sounds.
+.sh "7.4  Acoustic characterization of phonemes"
+.pp
+Shortly after the invention of the sound spectrograph an inverse
+instrument was developed, called the "pattern playback" synthesizer.
+This took as input a spectrogram, either in its original form or
+painted by hand.
+An optical arrangment was used to modulate the amplitude of some
+fifty harmonically-related oscillators by the lightness or darkness
+of each point on the frequency axis of the spectrogram.
+As it was drawn past the playing head, sound was produced which
+had approximately the frequency components shown on the spectrogram,
+although the fundamental frequency was constant.
+.pp
+This device allowed the complicated
+acoustic effects seen on a spectrogram (see for example Figures 2.3 and 2.4)
+to be replayed in either original or simplified form.
+Hence the features which are important for perception of the different sounds
+could be isolated.  The procedure was to copy from an actual spectrogram
+the features which were most prominent visually, and then to make further
+changes by trial and error until the result was judged to have
+reasonable intelligibility when replayed.
+.pp
+For the purpose of acoustic characterization of particular phonemes,
+it is useful to consider the central, steady-state part separately from
+transitions into and out of the segment.
+The steady-state part is that sound which is heard when the phoneme
+is prolonged.  The term "phoneme" is being used in a rather loose sense
+here:  it is more appropriate to think of a "sound segment" rather than
+the abstract unit which forms the basis of phonological classification,
+and this is the terminology I will adopt.
+.pp
+The essential auditory characteristics of some sound segments are inherent in
+their steady states.
+If a vowel, for example, is spoken and prolonged, it can readily be
+identified by listening to any part of the utterance.
+This is not true for diphthongs:  if you say "I" very slowly and freeze
+your vocal tract posture at any time, the resulting steady-state sound
+will not be sufficient to identify the diphthong.  Rather, it will be
+a vowel somewhere between
+.ul
+aa
+(in "had") or
+.ul
+ar
+(in "hard") and
+.ul
+ee
+(in "heed").
+Neither is it true for glides, for prolonging
+.ul
+w
+(in "want") or
+.ul
+y
+(in "you") results in vowels resembling respectively
+.ul
+u
+("hood") or
+.ul
+ee
+("heed").
+Fricatives, voiced or unvoiced, can be identified from the steady state;
+but stops can not, for their's is silent (or \(em in the case
+of voiced stops \(em something close to it).
+.pp
+Segments which are identifiable from their steady state are easy to synthesize.
+The difficulty lies with the others, for it must be the transitions which
+carry the information.  Thus "transitions" are an essential part of speech,
+and perhaps the term is unfortunate for it calls to mind an unimportant
+bridge between one segment and the next.
+It is tempting to use the words "continuant" and "non-continuant" to distinguish
+the two categories; unfortunately they are used by phoneticians in a different
+sense.
+We will call them "steady-state" and "transient" segments.  The latter term
+is not particularly appropriate, for even sounds in this class
+.ul
+can
+be prolonged:  the point is that the identifying information is in the
+transitions rather than the steady state.
+.RF
+.nr x1 (\w'excitation'/2)
+.nr x2 (\w'formant resonance'/2)
+.nr x3 (\w'fricative'/2)
+.nr x4 (\w'frequencies (Hz)'/2)
+.nr x5 (\w'resonance (Hz)'/2)
+.nr x0 4n+1.7i+0.8i+0.6i+0.6i+1.0i+\w'00'+\n(x5
+.nr x6 (\n(.l-\n(x0)/2
+.in \n(x6u
+.ta 4n +1.7i +0.8i +0.6i +0.6i +1.0i
+		\h'-\n(x1u'excitation		\0\0\h'-\n(x2u'formant resonance	\0\0\h'-\n(x3u'fricative
+				\0\0\h'-\n(x4u'frequencies (Hz)	\0\0\c
+\h'-\n(x5u'resonance (Hz)
+\l'\n(x0u\(ul'
+.sp
+.nr x1 (\w'voicing'/2)
+\fIuh\fR	(the)	\h'-\n(x1u'voicing	\0500	1500	2500
+\fIa\fR	(bud)	\h'-\n(x1u'voicing	\0700	1250	2550
+\fIe\fR	(head)	\h'-\n(x1u'voicing	\0550	1950	2650
+\fIi\fR	(hid)	\h'-\n(x1u'voicing	\0350	2100	2700
+\fIo\fR	(hod)	\h'-\n(x1u'voicing	\0600	\0900	2600
+\fIu\fR	(hood)	\h'-\n(x1u'voicing	\0400	\0950	2450
+\fIaa\fR	(had)	\h'-\n(x1u'voicing	\0750	1750	2600
+\fIee\fR	(heed)	\h'-\n(x1u'voicing	\0300	2250	3100
+\fIer\fR	(heard)	\h'-\n(x1u'voicing	\0600	1400	2450
+\fIar\fR	(hard)	\h'-\n(x1u'voicing	\0700	1100	2550
+\fIaw\fR	(hoard)	\h'-\n(x1u'voicing	\0450	\0750	2650
+\fIuu\fR	(food)	\h'-\n(x1u'voicing	\0300	\0950	2300
+.nr x1 (\w'aspiration'/2)
+\fIh\fR	(he)	\h'-\n(x1u'aspiration
+.nr x1 (\w'frication'/2)
+.nr x2 (\w'frication and voicing'/2)
+\fIs\fR	(sin)	\h'-\n(x1u'frication				6000
+\fIz\fR	(zed)	\h'-\n(x2u'frication and voicing				6000
+\fIsh\fR	(shin)	\h'-\n(x1u'frication				2300
+\fIzh\fR	(vision)	\h'-\n(x2u'frication and voicing				2300
+\fIf\fR	(fin)	\h'-\n(x1u'frication				4000
+\fIv\fR	(vat)	\h'-\n(x2u'frication and voicing				4000
+\fIth\fR	(thin)	\h'-\n(x1u'frication				5000
+\fIdh\fR	(that)	\h'-\n(x2u'frication and voicing				5000
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 7.2  Resonance synthesizer parameters for steady-state sounds"
+.rh "Steady-state segments."
+Table 7.2 shows appropriate values for the resonance parameters and
+excitation sources of a resonance synthesizer, for steady-state
+segments only.
+There are several points to note about it.
+Firstly, all the frequencies involved obviously depend upon the
+speaker \(em the size of his vocal tract, his accent and speaking habits.
+The values given are nominal ones for a male speaker with a dialect of
+British English called "received pronunciation" (RP) \(em for it is what
+used to be "received" on the wireless in the old days
+before the British Broadcasting Corporation
+adopted a policy of more informal, more regional, speech.
+Female speakers have formant frequencies approximately 15% higher
+than male ones.
+Secondly, the third formant is relatively unimportant for vowel
+identification; it is
+the first and second that give the vowels their character.
+Thirdly, formant values for
+.ul
+h
+are not given, for they would be meaningless.
+Although it is certainly a steady-state sound,
+.ul
+h
+changes radically
+in context.  If you say "had", "heed", "hud", and so on, and freeze
+your vocal tract posture on the initial
+.ul
+h,
+you will find it
+already configured for the following vowel \(em an excellent
+example of anticipatory coarticulation.
+Fourthly, amplitude values do play some part in identification,
+particularly for fricatives.
+.ul
+th
+is the weakest sound, closely followed by
+.ul
+f,
+with
+.ul
+s
+and
+.ul
+sh
+the
+strongest.  It is necessary to get a reasonable mix of excitation in
+the voiced fricatives; the voicing amplitude is considerably less than
+in vowels.  Finally, there are other sounds that might be considered
+steady state ones.  You can probably identify
+.ul
+m, n,
+and
+.ul
+ng
+just by
+their steady states.  However, the difference is not particularly
+strong; it is the transitional parts which discriminate most effectively
+between these sounds.  The steady state of
+.ul
+r
+is quite distinctive, too,
+for most speakers, because the top of the tongue is curled back in a
+so-called "retroflex" action and this causes a radical change in the
+third formant resonance.
+.rh "Transient segments."
+Transient sounds include diphthongs, glides,
+nasals, voiced and unvoiced stops, and affricates.
+The first two are relatively easy to characterize, for they are
+basically continuous, gradual transitions from one vocal tract posture
+to another \(em sort of dynamic vowels.  Diphthongs and glides are
+similar to each other.  In fact "you" could be transcribed as
+a triphthong,
+.ul
+i e uu,
+except that in the initial posture the tongue
+is even higher, and the vocal tract correspondingly more constricted,
+than in
+.ul
+i
+("hid") \(em though not as constricted as in
+.ul
+sh.
+Both categories can be represented in terms of target formant
+values, on the understanding that these are not to be
+interpreted as steady state configurations but strictly as
+extreme values at the beginning or end of the formant motion (for
+transitions out of and into the segment, respectively).
+.pp
+Nasals have a steady-state portion comprising a strong nasal formant
+at a fairly low frequency, on account of the large size of the
+combined nasal and oral cavity which is resonating.
+Higher formants are relatively weak, because of attenuation effects.
+Transitions into and out of nasals are strongly nasalized,
+as indeed are adjacent vocalic segments, with
+the oral and nasal tract operating in parallel.  As discussed in
+Chapter 5, this cannot be simulated on a series synthesizer.
+However, extremely fast motions of the formants occur on account of
+the binary switching action of the velum, and it turns out that
+fast formant transitions are sufficient to simulate nasals because
+the speech perception mechanism is accustomed to hearing them only
+in that context!  Contrast this with the extremely slow transitions
+in diphthongs and glides.
+.pp
+Stops form the most interesting category, and research using the pattern
+playback synthesizer was instrumental in providing adequate acoustic
+characterizations for them.  Consider unvoiced stops.
+They each have three phases:  transition in, silent central portion,
+and transition out.  There is a lot of action on the transition out
+(and many phoneticians would divide this part alone into several "phases").
+First, as the release occurs, there is a small burst of fricative noise.
+Say "t\ t\ t\ ..." as in "tut-tut", without producing any voicing.
+Actually, when used as an admonishment this is accompanied by
+an ingressive, inhaling air-stream instead of the normal egressive,
+exhaling one used in English speech (although some languages
+do have ingressive sounds).
+In any case, a short fricative somewhat resembling a tiny
+.ul
+s
+can be heard as the tongue leaves the roof of the mouth.
+Frication is produced when the gap is very narrow, and ceases
+rapidly as it becomes wider.
+Next, when an unvoiced stop is released, a significant amount of aspiration
+follows the release.
+Say "pot", "tot", "cot" with force and you will hear the
+.ul
+h\c
+-like
+aspiration quite clearly.
+It doesn't always occur, though; for example you will hear little
+aspiration when a fricative like
+.ul
+s
+precedes the stop in the
+same syllable, as in "spot", "scot".  The aspiration is a distinguishing
+feature between "white spot" and the rather unlikely "White's pot".
+It tends to increase as the emphasis on the syllable increases,
+and this in an example of a prosodic feature influencing segmental
+characteristics.  Finally, at the end of the segment,
+the aspiration \(em if any \(em will turn to voicing.
+.pp
+What has been described applies to
+.ul
+all
+unvoiced stops.
+What distinguishes one from another?
+The tiny fricative burst will be different because the noise is produced
+at different places in the vocal tract \(em at the lips for
+.ul
+p,
+tongue and front of palate for
+.ul
+t,
+and tongue and back of palate for
+.ul
+k.
+The most important difference, however, is the formant motion illuminated
+by the last vestiges of voicing at closure and by both aspiration and the
+onset of voicing at opening.
+Each stop has target formant values which, although
+they cannot be heard during the stopped portion (for there is no
+sound there), do affect the transitions in and out.
+An added complexity is that the target positions themselves vary to some
+extent depending on the adjacent segments.
+If the stop is heavily aspirated, the vocal posture will have almost
+attained that for the following vowel before voicing begins, but
+the formant transitions will be perceived because they affect
+the sound quality of aspiration.
+.pp
+The voiced stops
+.ul
+b, d,
+and
+.ul
+g
+are quite similar to their unvoiced analogues
+.ul
+p, t,
+and
+.ul
+k.
+What distinguishes them from each other are the formant transitions to
+target positions, heard during closure and opening.
+They are distinguished from their unvoiced counterparts by the fact
+that more voicing is present:  it lingers on longer at closure
+and begins earlier on opening.  Thus little or no aspiration appears
+during the opening phase.  If an unvoiced stop is uttered in a context
+where aspiration is suppressed, as in "spot", it is almost identical to the
+corresponding voiced stop, "sbot".  Luckily no words in English require
+us to make a distinction in such contexts.
+Voicing sometimes pervades the entire stopped portion of a voiced stop,
+especially when it is surrounded by other voiced segments.
+When saying a word like "baby" slowly you can choose whether or not to
+prolong voicing throughout the second
+.ul
+b.
+If you do, creating what is
+called a "voice bar" in spectrograms,
+the sound escapes through the cheeks, for
+the lips are closed \(em try doing it for a very long time and your cheeks
+will fill up with air!
+This severely attenuates high-frequency components, and can
+be simulated with a weak first formant at a low resonant frequency.
+.RF
+.nr x0 \w'unvoiced stops:    'u
+.nr x1 4n
+.nr x2 \n(x0+\n(x1+\w'aspiration burst (context- and emphasis-dependent)'u
+.nr x3 (\n(.l-\n(x2)/2
+.in \n(x3u
+.ta \n(x0u +\n(x1u
+unvoiced stops:	closure (early cessation of voicing)
+	silent steady state
+	opening, comprising
+		short fricative burst
+		aspiration burst (context- and emphasis-dependent)
+		onset of voicing
+.sp
+voiced stops:	closure (late cessation of voicing)
+	steady state (possibility of voice bar)
+	opening, comprising
+		pre-voicing
+		short fricative burst
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 7.3  Acoustic phases of stop consonants"
+.pp
+Table 7.3 summarizes some of the acoustic phases of voiced and unvoiced
+stops.  There are many variations that have not been mentioned.
+Nasal plosion ("good news") occurs (at the word boundary, in this case)
+when the nasal formant pervades the
+opening phase.  Stop bursts are suppressed when the next sound is a stop
+too (the burst on the
+.ul
+p
+of "apt", for example).
+It is difficult to distinguish a voiced stop from an unvoiced one
+at the end of a word ("cab" and "cap"); if the speaker is trying to
+make himself particularly clear he will put a short neutral vowel
+after the voiced stop to emphasize its early onset of voicing.
+(If he is Italian he will probably do this anyway, for it is the norm
+in his own language.)
+.pp
+Finally, we turn to affricates, of which there are only two
+in English:
+.ul
+ch
+("chin") and
+.ul
+j
+("djinn").
+They are very similar to the stops
+.ul
+t
+and
+.ul
+d
+followed by the fricatives
+.ul
+sh
+and
+.ul
+zh
+respectively, and their acoustic characterization is similar to that
+of the phoneme pair.
+.ul
+ch
+has a closing phase, a stopped phase, and a long fricative burst.
+There is no aspiration,
+for the vocal cords are not involved.
+.ul
+j
+is the same except that voicing extends further into the stopped
+portion, and the terminating fricative is also voiced.
+It may be pronounced with a voice bar if the preceding segment is voiced
+("adjunct").
+.sh "7.5  Speech synthesis by rule"
+.pp
+Generation of speech by rules acting upon a phonetic transcription
+was first investigated in the early 1960's (Kelly and Gerstman, 1961).
+.[
+Kelly Gerstman 1961
+.]
+Most systems employ a hardware resonance synthesizer, analogue or digital,
+series or parallel,
+to reduce the load on the computer which operates the rules.
+The speech-by-rule program, rather than the
+synthesizer, inevitably contributes by far the greater part of the
+degradation in the resulting speech.
+Although parallel synthesizers offer greater potential control over
+the spectrum, it is not clear to what extent a synthesis program can take
+advantage of this.  Parameter tracks for a series synthesizer can
+easily be converted into linear predictive coefficients, and systems
+which use a linear predictive synthesizer will probably become popular
+in the near future.
+.pp
+The phrase "synthesis by rule", which is in common use, does not
+make it clear just what sort of features the rules are supposed to
+accomodate, and what information must be included explicitly in the
+input transcription.
+Early systems made no attempt to simulate prosodics.
+Pitch and rhythm could be controlled, but only by inserting
+pitch specifiers and duration markers in the input.
+Some kind of prosodic control was often incorporated later,
+but usually as a completely separate phase from segmental synthesis.
+This does not allow interaction effects (such as the extra
+aspiration for voiceless stops in accented syllables) to be taken
+into account easily.
+Even systems which perform prosodic operations invariably need to have
+prosodic specifications embedded explicitly in the input.
+.pp
+Generating parameter tracks for a synthesizer from a phonetic transcription
+is a process of data
+.ul
+expansion.
+Six bits are ample to specify a phoneme, and a speaking rate of 12 phonemes/sec
+leads to an input data rate of 72 bit/s.
+The data rate required to control the synthesizer will depend upon the number
+of parameters and the rate at which they are sampled,
+but a typical figure is 6 Kbit/s (Chapter 5).
+Hence there is something like a hundredfold data expansion.
+.pp
+Figure 7.1 shows the parameter tracks for a series synthesizer's rendering
+of the utterance
+.ul
+s i k s.
+.FC "Figure 7.1"
+There are eight parameters.
+You can see the onset of frication at the beginning and end (parameter 5),
+and the amplitude of voicing (parameter 1) come on for the
+.ul
+i
+and off again before the
+.ul
+k.
+The pitch (parameter 0) is falling slowly throughout the utterance.
+These tracks are stylized:  they come from a computer synthesis-by-rule
+program and not from a human utterance.
+With a parameter update rate of 10 msec, the graphs can be represented
+by 90 sets of eight parameter values, a total of 720 values or 4320 bits
+if a 6-bit representation is used for each value.
+Contrast this with the input of only four phoneme segments, or say 24 bits.
+.rh "A segment-by-segment system."
+A seminal paper appearing in 1964 was the first comprehensive
+description of a computer-based synthesis-by-rule system
+(Holmes
+.ul
+et al,
+1964).
+.[
+Holmes Mattingly Shearme 1964
+.]
+The same system is still in use and has been reimplemented in a more
+portable form (Wright, 1976).
+.[
+Wright 1976
+.]
+The inventory of sound segments
+includes the phonemes listed in Table 2.1, as well as diphthongs and
+a second allophone of
+.ul
+l.
+(Many British speakers use quite a different vocal posture for
+pre- and post-vocalic
+.ul
+l\c
+\&'s, called clear and dark
+.ul
+l\c
+\&'s
+respectively.)  Some phonemes are expanded into sub-phonemic
+"phases" by the program.  Stops have three phases, corresponding to
+the closure, silent steady state, and opening.
+Diphthongs have two phases.  We will call individual phases and
+single-phase phonemes "segments", for they are subject to exactly
+the same transition rules.
+.pp
+Parameter tracks are constructed out of linear pieces.
+Consider a pair of adjacent segments in an utterance to be synthesized.
+Each one has a steady-state portion and an internal transition.
+The internal transition of one phoneme is dubbed "external"
+as far as the other is concerned.
+This is important because instead of each segment being responsible
+for its own internal transition, one of the pair is identified
+as "dominant" and it controls the duration of both transitions \(em its
+internal one and its external (the other's internal) one.
+For example, in Figure 7.2 the segment
+.ul
+sh
+dominates
+.ul
+ee
+and so it
+governs the duration of both transitions shown.
+.FC "Figure 7.2"
+Note that each
+segment contributes as many as three linear pieces to the parameter track.
+.pp
+The notion of domination is similar to that discussed earlier for
+word concatenation.
+The difference is that for word concatenation the dominant segment was
+determined by computing the spectral derivative over the transition
+region, whereas for synthesis-by-rule
+segments are ranked according to a static precedence,
+and the higher-ranking segment dominates.
+Segments of stop consonants have the highest rank (and also
+the greatest spectral derivative), while fricatives, nasals, glides,
+and vowels follow in that order.
+.pp
+The concatenation procedure is controlled by a table which associates
+25 quantities with each segment.  They are
+.LB
+.NI
+rank
+.NI
+2\ \ overall durations (for stressed and unstressed occurrences)
+.NI
+4\ \ transition durations (for internal and external transitions of
+formant frequencies and amplitudes)
+.NI
+8\ \ target parameter values (amplitudes and frequencies of three
+formant resonances, plus fricative information)
+.NI
+5\ \ quantities which specify how to calculate boundary values for
+formant frequencies (two for each formant except the third,
+which has only one)
+.NI
+5\ \ quantities which specify how to calculate boundary values for
+amplitudes.
+.LE
+This table is rather large.  There are 80 segments in all (remember
+that many phonemes are represented by more than one segment),
+and so it has 2000 entries.  The system was an offline one which ran on
+what was then \(em 1964 \(em a large computer.
+.pp
+The advantage of such a large table of "rules" is the
+flexibility it affords.
+Notice that transition durations are specified independently for
+formant frequency and amplitude parameters \(em this permits
+fine control which is particularly useful for stops.
+For each parameter the boundary value between segments is calculated
+using a fixed contribution from the dominant one
+and a proportion of the steady state value of the other.
+.pp
+It is possible that the two transition durations which are
+calculated for a segment actually exceed the overall duration specified
+for it.  In this case, the steady-state target values will be approached
+but not actually attained, simulating a situation where coarticulation
+effects prevent a target value from being reached.
+.rh "An event-based system."
+The synthesis system described above, in common with many others, takes
+an uncompromisingly segment-by-segment view of speech.
+The next phoneme is read, perhaps split into a few segments, and
+these are synthesized one by one with due attention being paid
+to transitions between them.
+Some later work has taken a more syllabic view.
+Mattingly (1976) urges a return to syllables for both practical and
+theoretical reasons.
+.[
+Mattingly 1976 Syllable synthesis
+.]
+Transitional effects are particularly strong
+within a syllable and comparatively weak (but by no means negligible)
+from one syllable to the next.  From a theoretical viewpoint,
+there are much stronger phonetic restrictions on phoneme sequences
+than there are on syllable sequences:  pretty well any syllable can
+follow another (although whether the pair makes sense is
+a different matter), but the linguistically
+acceptable phoneme sequences are only a fraction
+of those formed by combining phonemes in all
+possible ways.
+Hill (1978) argues against what be calls the "segmental assumption"
+that progress through the utterance should be made one segment at a time,
+and recommends a description of speech based upon perceptually relevant
+"events".
+.[
+Hill 1978 A program structure for event-based speech synthesis by rules
+.]
+This framework is interesting because it provides an opportunity for prosodic
+considerations to be treated as an integral part of the synthesis
+process.
+.pp
+The phonetic segments and other information that specify an utterance
+can be regarded as a list of events which describes it
+at a relatively high level.
+Synthesis-by-rule is the act of taking this list and elaborating on it
+to produce lower-level events which are realized by the vocal tract,
+or acoustically simulated by a resonance synthesizer, to give a speech
+waveform.
+In articulatory terms, an event might be "begin tongue motion towards
+upper teeth with a given effort", while in resonance terms it could be
+"begin second formant transition towards 1500\ Hz at a given rate".
+(These two examples are
+.ul
+not
+intended to describe the same event:  a tongue motion causes much more
+than the transition of a single formant.)  Coarticulation
+issues such as stop burst suppression and nasal plosion should
+be easier to imitate within an event-based scheme than a segment-to-segment
+one.
+.pp
+The ISP system (Witten and Abbess, 1979) is event-based.
+.[
+Witten Abbess 1979
+.]
+The key to its operation is the
+.ul
+synthesis list.
+To prepare an utterance for synthesis, the lexical items which specify
+it are joined into a linked list.  Figure 7.3 shows the start of
+the list created for
+.LB
+1
+.ul
+dh i z  i z  /*d zh aa k s  /h aa u s
+.LE
+(this is Jack's house); the "1\ ...\ /*\ ...\ /\ ..." are
+prosodic markers which will be discussed in the next chapter.
+.FC "Figure 7.3"
+Next, the rhythm and pitch assignment routines
+augment the list with syllable boundaries, phoneme
+cluster identifiers, and duration and pitch specifications.
+Then it is passed to the segmental synthesis routine
+which chains events into the appropriate places and, as it
+proceeds, removes the no longer useful elements (phoneme names,
+pitch specifiers, etc) which originally constituted the synthesis list.
+Finally, an interrupt-driven speech synthesizer handler removes
+events from the list as they become due and uses them to control
+the hardware synthesizer.
+.pp
+By adopting the synthesis list as a uniform data structure for
+holding utterances at every stage of processing, the problems of storage
+allocation and garbage collection are minimized.
+Each list element has a forward pointer and five data words, the first
+indicating what type of element it is.
+Lexical items which may appear in the input are
+.LB
+.NI
+end of utterance (".", "!", ",", ";")
+.NI
+intonation indicator ("1", ...)
+.NI
+rhythm indicator ("/", "/*")
+.NI
+word boundary ("  ")
+.NI
+syllable boundary ("'")
+.NI
+phoneme segment
+(\c
+.ul
+ar, b, ng, ...\c
+)
+.NI
+explicit duration or pitch information.
+.LE
+Several of these have to do with prosodic features \(em a prime
+advantage of the structure is that it does not create an artificial
+division between segmentals and prosody.
+Syllable boundaries and duration and pitch information are optional.
+They will normally be computed by ISP, but the user can override them in the
+input in a natural way.
+The actual characters which identify lexical items are not fixed
+but are taken from the rule table.
+.pp
+As synthesis
+proceeds, new elements are chained in to the synthesis list.
+For segmental purposes, three types of event are defined \(em
+target events, increment events, and aspiration events.
+With each event is associated a time at which the event becomes due.
+For a target event, a parameter number, target parameter value,
+and time-increment are specified.
+When it becomes due, motion of the parameter towards the
+target is begun.  If no other event for that parameter intervenes,
+the target value will be reached after the given time-increment.
+However, another target event for the parameter may change its motion
+before the target has been attained.
+Increment events contain a parameter number, a parameter increment,
+and a time-increment.  The fixed increment is added to the parameter value
+throughout the time specified.  This provides an easy way to make a
+fricative burst during the opening phase of a stop consonant.
+Aspiration events switch the mode of excitation from voicing to aspiration
+for a given period of time.  Thus the aspirated part of unvoiced stops
+can be accomodated in a natural manner, by changing the mode of excitation
+for the duration of the aspiration.
+.RF
+.nr x1 (\w'excitation'/2)
+.nr x2 (\w'formant resonance'/2)
+.nr x3 (\w'fricative'/2)
+.nr x4 (\w'type'/2)
+.nr x5 (\w'frequencies (Hz)'/2)
+.nr x6 (\w'resonance (Hz)'/2)
+.nr x0 1.0i+0.7i+0.6i+0.6i+1.0i+1.2i+(\w'long vowel'/2)
+.nr x7 (\n(.l-\n(x0)/2
+.in \n(x7u
+.ta 1.0i +0.7i +0.6i +0.6i +1.0i +1.2i
+	\h'-\n(x1u'excitation		\0\0\h'-\n(x2u'formant resonance	\0\0\h'-\n(x3u'fricative	\h'-\n(x4u'type
+			\0\0\h'-\n(x5u'frequencies (Hz)	\0\0\h'-\n(x6u'resonance (Hz)
+\l'\n(x0u\(ul'
+.sp
+.nr x1 (\w'voicing'/2)
+.nr x2 (\w'vowel'/2)
+\fIuh\fR	\h'-\n(x1u'voicing	\0490	1480	2500		\c
+\h'-\n(x2u'vowel
+\fIa\fR	\h'-\n(x1u'voicing	\0720	1240	2540		\h'-\n(x2u'vowel
+\fIe\fR	\h'-\n(x1u'voicing	\0560	1970	2640		\h'-\n(x2u'vowel
+\fIi\fR	\h'-\n(x1u'voicing	\0360	2100	2700		\h'-\n(x2u'vowel
+\fIo\fR	\h'-\n(x1u'voicing	\0600	\0890	2600		\h'-\n(x2u'vowel
+\fIu\fR	\h'-\n(x1u'voicing	\0380	\0950	2440		\h'-\n(x2u'vowel
+\fIaa\fR	\h'-\n(x1u'voicing	\0750	1750	2600		\h'-\n(x2u'vowel
+.nr x2 (\w'long vowel'/2)
+\fIee\fR	\h'-\n(x1u'voicing	\0290	2270	3090		\h'-\n(x2u'long vowel
+\fIer\fR	\h'-\n(x1u'voicing	\0580	1380	2440		\h'-\n(x2u'long vowel
+\fIar\fR	\h'-\n(x1u'voicing	\0680	1080	2540		\h'-\n(x2u'long vowel
+\fIaw\fR	\h'-\n(x1u'voicing	\0450	\0740	2640		\h'-\n(x2u'long vowel
+\fIuu\fR	\h'-\n(x1u'voicing	\0310	\0940	2320		\h'-\n(x2u'long vowel
+.nr x1 (\w'aspiration'/2)
+.nr x2 (\w'h'/2)
+\fIh\fR	\h'-\n(x1u'aspiration					\h'-\n(x2u'h
+.nr x1 (\w'voicing'/2)
+.nr x2 (\w'glide'/2)
+\fIr\fR	\h'-\n(x1u'voicing	\0240	1190	1550			 \h'-\n(x2u'glide
+\fIw\fR	\h'-\n(x1u'voicing	\0240	\0650			\h'-\n(x2u'glide
+\fIl\fR	\h'-\n(x1u'voicing	\0380	1190			\h'-\n(x2u'glide
+\fIy\fR	\h'-\n(x1u'voicing	\0240	2270			\h'-\n(x2u'glide
+.nr x2 (\w'nasal'/2)
+\fIm\fR	\h'-\n(x1u'voicing	\0190	\0690	2000		\h'-\n(x2u'nasal
+.nr x1 (\w'none'/2)
+.nr x2 (\w'stop'/2)
+\fIb\fR	\h'-\n(x1u'none	\0100	\0690	2000		\h'-\n(x2u'stop
+\fIp\fR	\h'-\n(x1u'none	\0100	\0690	2000		\h'-\n(x2u'stop
+.nr x1 (\w'voicing'/2)
+.nr x2 (\w'nasal'/2)
+\fIn\fR	\h'-\n(x1u'voicing	\0190	1780	3300		\h'-\n(x2u'nasal
+.nr x1 (\w'none'/2)
+.nr x2 (\w'stop'/2)
+\fId\fR	\h'-\n(x1u'none	\0100	1780	3300		\h'-\n(x2u'stop
+\fIt\fR	\h'-\n(x1u'none	\0100	1780	3300		\h'-\n(x2u'stop
+.nr x1 (\w'voicing'/2)
+.nr x2 (\w'nasal'/2)
+\fIng\fR	\h'-\n(x1u'voicing	\0190	2300	2500		\h'-\n(x2u'nasal
+.nr x1 (\w'none'/2)
+.nr x2 (\w'stop'/2)
+\fIg\fR	\h'-\n(x1u'none	\0100	2300	2500		\h'-\n(x2u'stop
+\fIk\fR	\h'-\n(x1u'none	\0100	2300	2500		\h'-\n(x2u'stop
+.nr x1 (\w'frication'/2)
+.nr x2 (\w'voice + fric'/2)
+.nr x3 (\w'fricative'/2)
+\fIs\fR	\h'-\n(x1u'frication				6000	\h'-\n(x3u'fricative
+\fIz\fR	\h'-\n(x2u'voice + fric	\0190	1780	3300	6000	\h'-\n(x3u'fricative
+\fIsh\fR	\h'-\n(x1u'frication				2300	\h'-\n(x3u'fricative
+\fIzh\fR	\h'-\n(x2u'voice + fric	\0190	2120	2700	2300	\h'-\n(x3u'fricative
+\fIf\fR	\h'-\n(x1u'frication				4000	\h'-\n(x3u'fricative
+\fIv\fR	\h'-\n(x2u'voice + fric	\0190	\0690	3300	4000	\h'-\n(x3u'fricative
+\fIth\fR	\h'-\n(x1u'frication				5000	\h'-\n(x3u'fricative
+\fIdh\fR	\h'-\n(x2u'voice + fric	\0190	1780	3300	5000	\h'-\n(x3u'fricative
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 7.4  Rule table for an event-based synthesis-by-rule program"
+.pp
+Now the rule table, which is shown in Table 7.4,
+holds simple target positions for each phoneme segment, as well as
+the segment type.  The latter is used to trigger events by computer
+procedures which have access to the context of the segment.
+In principle, this allows considerably more sophistication to be
+introduced than does a simple segment-by-segment approach.
+.RF
+.nr x1 0.5i+0.5i+\w'preceding consonant in this syllable (suppress burst if fricative)'u
+.nr x1 (\n(.l-\n(x1)/2
+.in \n(x1u
+.ta 0.5i +0.5i
+fricative bursts on stops
+aspiration bursts on unvoiced stops, affected by
+	preceding consonant in this syllable (suppress burst if fricative)
+	following consonant (suppress burst if another stop; introduce
+		nasal plosion if a nasal)
+	prosodics (increase burst if syllable is stressed)
+voice bar on voiced stops (in intervocalic position)
+post-voicing on terminating voiced stops, if syllable is stressed
+anticipatory coarticulation for \fIh\fR
+vowel colouring when a nasal or glide follows
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 7.5  Some coarticulation effects"
+.pp
+For example, Table 7.5 summarizes some of the subtleties of the
+speech production process which have been mentioned earlier in this
+chapter.  Most of them are context-dependent, with the prosodic
+context (whether two segments are in the same syllable; whether a
+syllable is stressed) playing a significant role.  A scheme where
+data-dependent "demons" fire on particular patterns in a linked list
+seems to be a sensible approach towards incorporating such rules.
+.rh "Discussion."
+There are two opposing trends in speech synthesis by rule.
+On the one hand larger and larger segment inventories can be used,
+containing more and more allophones explicitly.
+This is the approach of the Votrax sound-segment synthesizer,
+discussed in Chapter 11.
+It puts an increasing burden on the person who codes the utterances
+for synthesis, although, as we shall see, computer programs can assist with
+this task.
+On the other hand the segment inventory can be kept small, perhaps
+comprising just the logical phonemes as in the ISP system.
+This places the onus on the computer program to accomodate allophonic variations,
+and to do so it must take account of the segmental and prosodic
+context of each phoneme.
+An event-based approach seems to give the best chance of incorporating
+contextual modification whilst avoiding undesired interactions.
+.pp
+The second trend brings synthesis closer to the articulatory process
+of speech production.  In fact an event-based system would be
+an ideal way of implementing an articulatory model for speech synthesis
+by rule.  It would be much more satisfying to have the rule table
+contain articulatory target positions instead of resonance ones,
+with events like "begin tongue motion towards upper teeth with a given
+effort".  The problem is that hard data on articulatory postures and
+constraints is much more difficult to gather than resonance information.
+.pp
+An interesting question that relates to articulation is whether formant
+motion can be simulated adequately by a small number of linear pieces.
+The segment-by-segment system described above had as many as nine
+pieces for a single phoneme, for some phonemes had three phases
+and each one contributes up to three pieces (transition in,
+steady state, and transition out).
+Another system used curves of decaying exponential
+form which ensured that all transitions started rapidly towards
+the target position but slowed down as it was approached (Rabiner, 1968, 1969).
+.[
+Rabiner 1968 Speech synthesis by rule Bell System Technical J
+.]
+.[
+Rabiner 1969 A model for synthesizing speech by rule
+.]
+The time-constant of decay was stored with each segment in the rule
+table.  The rhythm of the synthetic speech was controlled at this level,
+for the next segment was begun when all the formants had attained
+values sufficiently close to the current targets.
+This is a poor model of the human speech production process, where rhythm
+is dictated at a relatively high level and the next phoneme is not
+simply started when the current one happens to end.
+Nevertheless, the algorithm produced smooth, continuous formant motions
+not unlike those found in spectrograms.
+.pp
+There is, however, by no means universal agreement on decaying exponential formant
+motions.  Lawrence (1974) divided segments into "checked" and "free"
+categories, corresponding roughly to consonants and vowels; and postulated
+.ul
+increasing
+exponential transitions into checked segments, and decaying transitions into
+free ones.
+.[
+Lawrence 1974
+.]
+This is a reasonable supposition if you consider the mechanics of
+articulation.  The speed of movement of the tongue (for example) is likely
+to increase until it is physically stopped by reaching the roof of the
+mouth.
+When moving away from a checked posture into a free one the transition will
+be rapid at first but slow down to approach the target asymptotically,
+governed by proprioceptive feedback.
+.pp
+The only thing that seems to be agreed is that the formant tracks should
+certainly
+.ul
+not
+be piecewise linear.  However, in the face of
+conflicting opinions as to whether exponentials should be decaying
+or increasing, piecewise linear motions seem to be a reasonable
+compromise!  It is likely that the precise shape of formant
+tracks is unimportant so long as the gross features are imitated
+correctly.
+Nevertheless, this is a question which an articulatory model
+could help to answer.
+.sh "7.6  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "7.7  Further reading"
+.pp
+There are unfortunately few books to recommend on the subject of
+joining segments of speech.
+The references form a representative and moderately comprehensive bibliography.
+Here is some relevant background reading in linguistics.
+.LB "nn"
+.\"Fry-1976-1
+.]-
+.ds [A Fry, D.B.(Editor)
+.ds [D 1976
+.ds [T Acoustic phonetics
+.ds [I Cambridge Univ Press
+.ds [C Cambridge, England
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.in+2n
+This book of readings contains many classic papers on acoustic phonetics
+published from 1922\-1965.
+It covers much of the history of the subject, and is intended
+primarily for students of linguistics.
+.in-2n
+.\"Lehiste-1967-2
+.]-
+.ds [A Lehiste, I.(Editor)
+.ds [D 1967
+.ds [T Readings in acoustic phonetics
+.ds [I MIT Press
+.ds [C Cambridge, Massachusetts
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.in+2n
+Another basic collection of references which covers much the same ground
+as Fry (1976), above.
+.in-2n
+.\"Sivertsen-1961-3
+.]-
+.ds [A Sivertsen, E.
+.ds [D 1961
+.ds [K *
+.ds [T Segment inventories for speech synthesis
+.ds [J Language and Speech
+.ds [V 4
+.ds [P 27-89
+.nr [P 1
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+This is a careful early study of the quantitative implications of using
+phonemes, demisyllables, syllables, and words as the basic building
+blocks for speech synthesis.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "8  PROSODIC FEATURES IN SPEECH SYNTHESIS"
+.ds RT "Prosodic features
+.ds CX "Principles of computer speech
+.pp
+Prosodic features are those which characterize an utterance as a whole,
+rather than having a local influence on individual sound segments.
+For speech output from computers, an "utterance" usually comprises a
+single unit of information which stretches over several words \(em a clause
+or sentence.  In natural speech an utterance can be very much longer, but
+it will be broken into prosodic units which are again roughly the size of a
+clause or sentence.  These prosodic units are certainly closely related
+to each other.  For example, the pitch contour used when introducing a new
+topic is usually different from those employed to develop it subsequently.
+However, for the purposes of synthesis the successive prosodic units can
+be treated independently, and information about pitch contours to be used
+will have to be specified in the input for each one.
+The independence between them is not complete, however, and
+lower-level contextual effects, such as interpolation of pitch between
+the end of one prosodic unit and the start of the next, must still be
+imitated.
+.pp
+Prosodic features were introduced briefly in Chapter 2.
+Variations in voice dynamics occur in three dimensions:  pitch of the voice,
+time, and amplitude.
+These dimensions are inextricably twined together in living speech.
+Variations in voice quality are much less important for the factual
+kind of speech usually sought in voice response applications,
+although they can play a considerable in conveying emotions
+(for a discussion of the acoustic manifestations of emotion in speech,
+see Williams and Stevens, 1972).
+.[
+Williams Stevens 1972
+.]
+.pp
+The distinction between prosodic and segmental effects is a traditional one,
+but it becomes rather fuzzy when examined in detail.
+It is analogous to the distinction between hardware and
+software in computer science:  although useful from some points of view
+the borderline becomes blurred as one gets closer to actual systems \(em with
+microcode, interrupts, memory management, and the like.
+At a trivial level, prosodics
+cannot exist without segmentals, for there must be some vehicle to carry the
+prosodic contrasts.
+Timing \(em a prosodic feature \(em is actually realized by the durations of
+individual segments.  Pauses are tantamount to silent segments.
+.pp
+While pitch may seem to be relatively independent of segmentals \(em and
+this view is reinforced by the success of the source-filter model
+which separates the frequency of the
+excitation source from the filter characteristics \(em there
+are some subtle phonetic effects of pitch.
+It has been observed that it drops on the transition into certain
+consonants, and rises again on the transition out (Haggard
+.ul
+et al,
+1970).
+.[
+Haggard Ambler Callow 1970
+.]
+This can be explained in terms of variations in pressure from the
+lungs on the vocal cords (Ladefoged, 1967).
+.[
+Ladefoged 1967
+.]
+Briefly, the increase in mouth pressure which occurs during some consonants
+causes a reduction in the pressure difference across the vocal cords
+and in the rate of flow of air between them.
+This results in a decrease in their frequency of vibration.
+When the constriction is released, there is a temporary increase in the air
+flow which increases the pitch again.
+The phenomenon is called "microintonation".
+It is particularly noticeable in voiced stops, but also occurs in voiced
+fricatives and unvoiced stops.
+Simulation of the effect in synthesis-by-rule has often been found to give
+noticeable improvements in the speech quality.
+.pp
+Loudness also has a segmental role.  For example, we noted in the last chapter
+that amplitude values play a small part in identification of fricatives.
+In fact loudness is a very
+.ul
+weak
+prosodic feature.  It contributes little to the perception of stress.
+Even for shouting the distinction from normal speech is as much in the voice
+quality as in amplitude
+.ul
+per se.
+It is not necessary to consider varying loudness on a prosodic basis
+in most speech synthesis systems.
+.pp
+The above examples show how prosodic features have segmental influences
+as well.
+The converse is also true:  some segmental features have a prosodic effect.
+The last chapter described how stress is associated with increased aspiration
+of syllable-initial unvoiced stops.  Furthermore, stressed syllables
+are articulated with greater effort than unstressed ones, and hence the formant
+transitions are more likely to attain their target values
+under circumstances which would otherwise cause them to fall short.
+In unstressed syllables, extreme vowels (like
+.ul
+ee, aa, uu\c
+)
+tend to more centralized sounds
+(like
+.ul
+i, uh, u
+respectively).
+Although all British English vowels
+.ul
+can
+appear in unstressed syllables, they often become "reduced" into a
+centralized form.
+Consider the following examples.
+.LB
+.NI
+diplomat	\ 
+.ul
+d i p l uh m aa t
+.NI
+diplomacy	\ 
+.ul
+d i p l uh u m uh s i
+.NI
+diplomatic	\ 
+.ul
+d i p l uh m aa t i k.
+.LE
+The vowel of the second syllable is reduced to
+.ul
+uh
+in "diplomat" and "diplomatic", whereas the root form "diploma", and also
+"diplomacy", has a diphthong
+(\c
+.ul
+uh u\c
+)
+there.  The third syllable has an
+.ul
+aa
+in "diplomat" and "diplomatic" which is reduced to
+.ul
+uh
+in "diplomacy".
+In these cases the reduction is shown explicitly in the phonetic transcription;
+but in more marginal examples where it is less extreme it will not be.
+.pp
+I have tried to emphasize in previous chapters that prosodic features are
+important in speech synthesis.
+There is something very basic about them.
+Rhythm is an essential part of all bodily activity \(em of breathing,
+walking, working and playing \(em and so it pervades speech too.
+Mothers and babies communicate effectively using intonation alone.
+Some experiments have indicated that the language environment of
+an infant affects his babbling at an early age, before he has effective
+segmental control.
+There is no doubt that "tone of voice" plays a large part in human
+communication.
+.pp
+However, early attempts at synthesis did not pay too
+much attention to prosodics, perhaps because it was thought sufficient to get the
+meaning across by providing clear segmentals.
+As artificial speech grows more widespread, however, it is becoming
+apparent that its acceptability to users, and hence its ultimate
+success, depends to a large extent on incorporating natural-sounding
+prosodics.  Flat, arhythmic speech may be comprehensible in short stretches,
+but it strains the concentration in significant discourse and people
+are not usually prepared to listen to it.
+Unfortunately, current commercial speech output systems do not really tackle
+prosodic questions, which indicates our present rather inadequate
+state of knowledge.
+.pp
+The importance of prosodics for automatic speech
+.ul
+recognition
+is beginning to be appreciated too.  Some research projects
+have attended to the automatic identification of points of stress,
+in the hope that the clear articulation of stressed syllables can be used
+to provide anchor points in an unknown utterance (for example, see Lea
+.ul
+et al,
+1975).
+.[
+Lea Medress Skinner 1975
+.]
+.pp
+But prosodics and segmentals are closely intertwined.
+I have chosen to
+treat them in separate chapters in order to split the material up into
+manageable chunks rather than to enforce a deep division between them.
+It is also true that synthesis of prosodic features is an uncharted and
+controversial area, which gives this chapter rather a different
+flavour from the last.
+It is hard to be as definite about alternative strategies
+and methods as you can for segment concatenation.
+In order to make the treatment as concrete and down-to-earth as possible,
+I will describe in some detail two example projects in prosodic synthesis.
+The first treats the problem of transferring pitch from one utterance to
+another, while the second considers how artificial timing and pitch can be
+assigned to synthetic speech.
+These examples illustrate quite different problems, and are reasonably
+representative of current research activity.
+(Other systems are described by Mattingly, 1966; Rabiner
+.ul
+et al,
+1969.)  Before
+.[
+Mattingly 1966
+.]
+.[
+Rabiner Levitt Rosenberg 1969
+.]
+looking at the two examples, we will discuss
+a feature which is certainly prosodic but does not appear in the
+list given earlier \(em stress.
+.sh "8.1  Stress"
+.pp
+Stress is an everyday notion, and when
+listening to natural speech people can usually agree on which syllables
+are stressed.  But it is difficult to characterize in acoustic terms.
+From the speaker's point of view, a stressed syllable is produced by
+pushing more air out of the lungs.  For a listener, the points of stress
+are "obvious".
+You may think that stressed syllables are louder than the others:  however,
+instrumental studies show that this is not necessarily (nor even usually)
+so (eg Lehiste and Peterson, 1959).
+.[
+Lehiste Peterson 1959
+.]
+Stressed syllables frequently have a longer vowel than unstressed
+ones, but this is by no means universally true \(em if you say "little"
+or "bigger" you will find that the vowel in the first, stressed, syllable
+is short and shows little sign of lengthening as you increase the emphasis.
+Moreover, experiments using bisyllabic nonsense words have indicated
+that some people consistently judge the
+.ul
+shorter
+syllable to be stressed in the absence of other clues (Morton and Jassem,
+1965).
+.[
+Morton Jassem 1965
+.]
+Pitch often helps to indicate stress.
+It is not that stressed syllables are always higher- or lower-pitched
+than neighbouring ones, or even that they are uttered with a rising or
+falling pitch.  It is the
+.ul
+rate of change
+of pitch that tends to be greater
+for stressed syllables:  a sharp rise or fall,
+or a reversal of direction, helps to give emphasis.
+.pp
+Stress is acoustically manifested in timing and pitch,
+and to a much lesser extent in loudness.
+However it is a rather subtle feature and does
+.ul
+not
+correspond simply to duration increases or pitch rises.
+It seems that listeners unconsciously put together all the clues
+that are present in an utterance in order to deduce which syllables are
+stressed.
+It may be that speech is perceived by a listener with reference to how
+he would have produced it himself, and that this is how he detects which syllables
+were given greater vocal effort.
+.pp
+The situation is confused by the fact that certain syllables in words are
+often said in ordinary language to be "stressed" on account of their
+position in the word.  For example, the words
+"diplomat", "diplomacy", and "diplomatic" have stress on the first,
+second, and third syllables respectively.
+But here we are talking about the word itself rather than
+any particular utterance of it.  The "stress" is really
+.ul
+latent
+in the indicated syllables and only made manifest upon uttering them,
+and then to a greater or lesser degree depending on exactly how
+they are uttered.
+.pp
+Some linguists draw a careful distinction between salient syllables,
+accented syllables, and stressed syllables,
+although the words are sometimes used differently by different authorities.
+I will not adopt a precise terminology here,
+but it is as well to be aware of the subtle distinctions involved.
+The term "salience" is applied to actual utterances, and salient
+syllables are those that are perceived as being more prominent than their
+neighbours.
+"Accent" is the potential for salience, as marked, for example,
+in a dictionary or lexicon.
+Thus the discussion of the "diplo-" words above is about accent.
+Stress is an articulatory phenomenon associated with increased
+muscular activity.
+Usually, syllables which are perceived as salient were produced with stress,
+but in shouting, for example, all syllables can be stressed \(em even
+non-salient ones.
+Furthermore, accented syllables may not be salient.
+For instance, the first syllable of the word "very" is accented,
+that is, potentially salient, but in a sentence as uttered it may or may not be
+salient.  One can say
+.LB
+"\c
+.ul
+he's
+very good"
+.LE
+with salience on "he" and possibly "good", or
+.LB
+"he's
+.ul
+very
+good"
+.LE
+with salience on the first syllable of "very", and possibly "good".
+.pp
+Non-standard stress patterns are frequently used to bring out contrasts.
+Words like "a" and "the" are normally unstressed, but can be stressed
+in contexts where ambiguity has arisen.
+Thus factors which operate at a much higher level than the phonetic structure
+of the utterance must be taken into account when deciding where stress
+should be assigned.  These include syntactic and semantic considerations,
+as well as the attitude of the speaker and the likely attitude of
+the listener to the material being spoken.
+For example, I might say
+.LB
+"Anna
+.ul
+and
+Nikki should go",
+.LE
+with emphasis on the "and" purely because I was aware that my listener
+might quibble about the expense of sending them both.
+Clearly some notation is needed to communicate to the synthesis process
+how the utterance is supposed to be rendered.
+.sh "8.2  Transferring pitch from one utterance to another"
+.pp
+For speech stored in source-filter form and concatenated on a
+slot-filling basis, it would be useful to
+have stored typical pitch contours which can be applied to the
+synthetic utterances.
+From a practical point of view it is important to be able to generate
+natural-sounding pitch for high-quality artificial speech.
+Although several algorithms for creating completely synthetic contours
+have been proposed \(em and we will examine one later in this chapter \(em
+they are unsuitable for high-quality speech.
+They are generally designed for use with synthesis-by-rule from phonetics,
+and the rather poor quality of articulation does not encourage the
+development of excellent pitch assignment procedures.  With speech
+synthesized by rule there is generally an emphasis on keeping the
+data storage requirements to a minimum, and so it is not appropriate
+to store complete contours.
+Moreover, if speech is entered in textual
+form as phoneme strings, it is natural to attach pitch information as markers
+in the text rather than by entering a complete and detailed contour.
+.pp
+The picture is rather different for concatenated segments of natural speech.
+In the airline reservation system, with utterances formed from templates like
+.LB
+Flight number \(em leaves \(em at \(em , arrives in \(em at \(em ,
+.LE
+it is attractive to store the pitch contour of one complete instance of the
+utterance and apply it to all synthetic versions.
+.pp
+There is an enormous literature on the anatomy of intonation, and much of it
+rests upon the notion of a pitch contour as a descriptive aid to analysis.
+Underlying this is the assumption, usually unstated, that a contour can be
+discussed independently of the particular stream of words that manifests it;
+that a single contour can somehow be bound to any sentence (or phrase, or
+clause) to produce an acceptable utterance.  But the contour, and its binding,
+are generally described only at the grossest level, the details being left
+unspecified.
+.pp
+There are phonetic influences on pitch \(em the characteristic lowering
+during certain consonants was mentioned above \(em and these are
+not normally considered as part of intonation.
+Such effects will certainly spoil attempts to store contours extracted
+from living speech and apply them to different utterances, but the impairment
+may not be too great, for pitch is only one of many segmental clues to
+consonant identification.
+.pp
+In the system mentioned earlier which generated 7-digit telephone numbers
+by concatenating formant-coded words, a single natural pitch contour
+was applied to all utterances.
+It was taken to match as well as possible the general shape of the
+contours measured in naturally-spoken telephone numbers.  However, this is a very
+restricted environment, for telephone numbers exhibit almost no variety in
+the configuration of stressed and unstressed syllables \(em
+the only digit which is not a monosyllable is "seven".
+Significant problems arise when more general utterances are considered.
+.pp
+Suppose the pitch contour of one utterance (the "source")
+is to be transferred to another (the "target").
+Assume that the utterances are encoded in source-filter form,
+either as parameter tracks for a formant synthesizer or as linear predictive
+coefficients.
+Then there are no technical obstacles to combining pitch and segmentals.
+The source must be available as a complete utterance, while the target
+may be formed by concatenating smaller units such as words.
+.pp
+For definiteness, we will consider utterances of the form
+.LB
+The price is \(em dollars and \(em cents,
+.LE
+where the slots are filled by numbers less than 100;
+and of the form
+.LB
+The price is \(em cents.
+.LE
+The domain of prices encompasses a wide range of syllable
+configurations.
+There are between one and five syllables in each variable part,
+if the numbers are restricted to be less than 100.
+The sentences have a constant pragmatic, semantic, and syntactic structure.
+As in the vast majority of real-life situations,
+minimal phonetic distinctions between utterances do not occur.
+.pp
+Pitch transfer is complicated by the fact that values of the source pitch
+are only known during the voiced parts of the utterance.
+Although it would certainly be possible to extrapolate pitch
+over unvoiced parts, this would introduce some artificiality into
+the otherwise completely natural contours.
+Let us assume, therefore, that the pitch contour
+of the voiced nucleus of each syllable in the source is applied to the
+corresponding syllable nucleus in the target.
+.pp
+The primary factors which might tend to inhibit successful transfer
+are
+.LB
+.NP
+different numbers of syllables in the utterances;
+.NP
+variations in the pattern of stressed and unstressed syllables;
+.NP
+different syllable durations;
+.NP
+pitch discontinuities;
+.NP
+phonetic differences between the utterances.
+.LE
+.rh "Syllabification."
+It is essential to take into account the syllable structures
+of the utterances, so that pitch is transferred between
+corresponding syllables rather than over the utterance
+as a whole.
+Fortunately, syllable boundaries can be detected automatically
+with a fair degree of accuracy, especially if the speech is carefully
+enunciated.
+It is worth considering briefly how this can be done, even though it takes
+us off the main topic of synthesis and into speech analysis.
+.pp
+A procedure developed by Mermelstein (1975)
+involves integrating the spectral energy
+at each point in the utterance.
+.[
+Mermelstein 1975 Automatic segmentation of speech into syllabic units
+.]
+First the low (<500\ Hz) and high (>4000\ Hz) ends are filtered out
+with 12\ dB/octave cutoffs.
+The resulting energy signal is smoothed
+by a 40\ Hz lowpass filter, giving a so-called "loudness"
+function.
+All this can be accomplished with simple recursive digital filters.
+.pp
+Then, the loudness function is compared with its convex hull.
+The convex hull is the shape a piece of elastic would assume if
+stretched over the top of the loudness function and anchored down at
+both ends, as illustrated in Figure 8.1.
+.FC "Figure 8.1"
+The point of maximum difference between the hull and loudness function
+is taken to be a tentative syllable
+boundary.
+The hull is recomputed, but anchored to the actual loudness function
+at the tentative boundary,
+and the points of maximum hull-loudness difference in each of the
+two halves  are selected as further tentative
+boundaries.
+The procedure continues recursively until the maximum hull-loudness
+difference, with the hull anchored at each tentative boundary,
+falls below a certain minimum (say 4\ dB).
+.pp
+At this stage, the number of tentative boundaries will greatly exceed
+the actual number of syllables (by a factor of around 5).
+Many of the extraneous boundaries are eliminated by the following
+constraints:
+.LB
+.NP
+if two boundaries lie within a certain time of each other
+(say 120\ msec), one of them is discarded;
+.NP
+if the maximum loudness within a tentative syllable falls too
+far short of the overall maximum for the utterance
+(more than 20\ dB), one boundary is discarded.
+.LE
+The question of which boundary to discard can be decided by
+examining the voicing continuity of the utterance.
+If possible, voicing across a syllable boundary should be avoided.
+Otherwise, the boundary with the smallest hull-loudness
+difference should be rejected.
+.RF
+.nr x0 \w'boundaries moved slightly to correspond better with voicing:'
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta 3.4i +0.5i
+\l'\n(x0u\(ul'
+.sp
+total syllable count:	332
+boundaries missed by algorithm:	\0\09	(3%)
+extra boundaries inserted by algorithm:	\029	(9%)
+boundaries moved slightly to correspond better with voicing:
+	\0\03	(1%)
+.sp
+total errors:	\041	(12%)
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 8.1  Success of the syllable segmentation procedure"
+.pp
+Table 8.1 illustrates the success of this syllabification
+procedure, in a particular example.
+Segmentation is performed with less than 10% of extraneous
+boundaries being inserted,
+and much less than 10% of actual boundaries being missed.
+These figures are rather sensitive to the values of the
+three thresholds.
+The values were chosen to err on the side
+of over-zealous syllabification, because all the boundaries need to be checked
+by ear and eye and it is easier to delete
+a boundary by hand than to insert one at an appropriate place.
+It may well be that with careful optimization of thresholds,
+better figures could be
+achieved.
+.rh "Stressed and unstressed syllables."
+If the source and target utterances have the same number of
+syllables, and the same pattern of stressed and unstressed syllables,
+pitch can simply be transferred from a syllable in the source
+to the corresponding one in the target.
+But if the pattern differs \(em even though the
+number of syllables may be the same, as in "eleven" and "seventeen" \(em
+then a one-to-one mapping will conflict with the stress points,
+and certainly sound unnatural.
+Hence an attempt should be made to ensure that the pitch is mapped in a
+plausible way.
+.pp
+The syllables of each utterance can be classified as "stressed"
+and "unstressed".
+This distinction could be made automatically by
+inspection of the pitch contour, within the domain of utterances used,
+and possibly even in general (Lea
+.ul
+et al,
+1975).
+.[
+Lea Medress Skinner 1975
+.]
+However, in many cases it is expedient to perform the job by hand.
+In our example, the sentences have fixed "carrier" parts and
+variable "number" parts.
+The stressed carrier syllables, namely
+.LB
+"... price ... dol\- ... cents",
+.LE
+can be marked as such, by hand,
+to facilitate proper alignment between the source and target.
+This marking would be difficult to do automatically
+because it would be hard to distinguish the carrier from the numbers.
+.pp
+Even after classifying the syllables as "carrier stressed",
+"stressed", and "unstressed", alignment still presents problems,
+because the configuration of syllables in the variable parts
+of the utterances may differ.
+Syllables in the source which have no
+correspondence in the target can be ignored.
+The pitch track of
+the source syllable can be replicated for each
+additional syllable in corresponding
+position in the target.
+Of course, a stressed syllable should be selected for copying
+if the unmatched target syllable is stressed,
+and similarly for unstressed ones.
+It is rather dangerous to copy exactly a part of a pitch
+contour, for the ear is very sensitive to the juxtaposition of
+identically intoned segments of speech \(em especially when the segment is stressed.
+To avoid this, whenever a stressed syllable is replicated the
+pitch values should be decreased by, say, 20%, on the second copy.
+It sometimes happens that a single stressed syllable in the source
+needs to cover a stressed-unstressed pair in the target:  in
+this case the first part of the source pitch track can be used
+for the stressed syllable, and the remainder for the
+unstressed one.
+.pp
+The example of Figure 8.2 will help to make these rules clear.
+.FC "Figure 8.2"
+Note that the marking alone is done by hand.
+The detailed mapping decisions can be left to the computer.
+The rules were derived intuitively, and do not have any sound theoretical
+basis.
+They are intended to give reasonable results in the majority of cases.
+.pp
+Figure 8.3 shows the result of transferring the pitch from "the price is ten
+cents" to "the price is seventy-seven cents".
+.FC "Figure 8.3"
+The syllable boundaries which are marked were determined automatically.
+The use of the last 30% of the
+"ten" contour to cover the first "-en" syllable, and its replication
+to serve the "-ty" syllable, can be seen.
+However, the 70%\(em30% proportion is applied to the source contour,
+and the linear distortion (described next) upsets the proportion in the
+target utterance.
+The contour of the second "seven" can be seen to be a
+replication of that of the first one, lowered by 20%.
+Notice that the pitch extraction procedure has introduced an artifact into the final
+part of one of the "cents" contours by doubling the pitch.
+.rh "Stretching and squashing."
+The pitch contour over a source syllable nucleus must be stretched
+or squashed to match the duration
+of the target nucleus.
+It is difficult to see how anything other than linear stretching
+and squashing could be done without considerably increasing the
+complexity of the procedure.
+The gross non-linearities will have been accounted for
+by the syllable alignment process, and so simple linear time-distortion
+should not cause too much degradation.
+.rh "Pitch discontinuities."
+Sudden jumps in pitch during voiced speech sound peculiar,
+although they can in fact be produced naturally (by yodelling).
+People frequently burst into laughter on hearing them in synthetic speech.
+It is particularly important to avoid this diverting effect in
+voice response applications,
+for the listener's attention is instantly directed
+away from what is said to the voice that speaks.
+.pp
+Discontinuities can arise in the pitch-transfer procedure either by a
+voiced-unvoiced-voiced transition between syllables mapping on to
+a voiced-voiced transition in the target,
+or by voicing continuity being broken when the syllable
+alignment procedure drops or replicates a syllable.
+There are several ways in which at least some of the possibilities can
+be avoided.
+For example, one could hold unstressed syllables at a constant pitch
+whose value coincides with either the end of the previous
+syllable's contour or the beginning of the next syllable's contour,
+depending on which transition is voiced.
+Alternatively, the policy of reserving the trailing part
+of a stressed syllable in the source to cover an unmatched following
+unstressed syllable in the target could be generalized to allow use of the leading 30%
+of the next stressed syllable's contour instead,
+if that maintained voicing continuity.
+A third solution is simply to merge the pitch contours
+at a discontinuity by mixing the average pitch value at the break
+with the pitch contour on either side of it in a proportion which
+increases linearly from the edges of the domain of influence to the discontinuity.
+Figure 8.4 shows the effect of this merging,
+when the pitch contour of "the price is seven cents"
+is transferred to "the price is eleven cents".
+.FC "Figure 8.4"
+Of course, the
+interpolated part will not necessarily be linear.
+.rh "Results of an experiment on pitch transfer."
+Some experiments have been conducted to evaluate the performance
+of this pitch transfer method on the kind of utterances discussed above
+(Witten, 1979).
+.[
+Witten 1979 On transferring pitch from one utterance to another
+.]
+First, the source and target sentences
+were chosen to be lexically identical, that is, the same words were spoken.
+For this experiment alone,
+expert judges were employed.
+Each sentence was recorded twice (by the same person),
+and pitch was transferred from copy A
+to copy B and vice versa.  Also, the originals were resynthesized from their linear
+predictive coefficients with their own pitch contours.
+Although all four often sounded extremely similar, sometimes the pitch
+contours of originals A and B were quite different,
+and in these cases it was immediately obvious to the ear that two of
+the four utterances shared the same intonation,
+which was different to that shared by the other two.
+.pp
+Experienced researchers in speech analysis-synthesis served as
+judges.
+In order to make the test as stringent as possible it was explained
+to them exactly what had been done,
+except that the order of the utterances in each quadruple was kept secret.
+They were asked to identify which two of the four sentences did not have their
+original contours,
+and were allowed to listen to each quadruple as often as they liked.
+On occasion they were prepared to identify only one, or even none,
+of the sentences as artificial.
+.pp
+The result was that an utterance with pitch transferred
+from another, lexically identical, one is indistinguishable from
+a resynthesized version of the original, even to a skilled ear.
+(To be more precise, this hypothesis
+could not be rejected even at the 1% level of statistical significance.)  This
+gave confidence in the transfer procedure.
+However, one particular judge was quite successful at identifying the bogus contours,
+and he attributed his success to the fact that
+on occasion the segmental durations did not accord with the
+pitch contour.
+This casts a shadow of suspicion on the linear stretching and
+squashing mechanism.
+.pp
+The second experiment examined pitch transfers between utterances having only one variable part
+each ("the price is ... cents") to test the transfer
+method under relatively controlled conditions.
+Ten sentences of the form
+.LB
+"The price is \(em cents"
+.LE
+were selected to cover
+a wide range of syllable structures.
+Each one was regenerated with pitch transferred from each of
+the other nine,
+and these nine versions were paired with the original resynthesized
+with its natural pitch.
+The $10 times 9=90$ resulting pairs were recorded on tape in random order.
+.pp
+Five males and five females, with widely differing occupations
+(secretaries, teachers, academics, and students), served as judges.
+Written instructions explained that the tape contained pairs of
+sentences which were lexically identical but had a slight difference
+in "tone of voice", and that the subjects were to judge which of
+each pair sounded "most natural and intelligible".  The
+response form gave the price associated with each pair \(em
+a preliminary experiment had shown that there was never
+any difficulty in identifying this \(em and a column for decision.
+With each decision, the subjects recorded their confidence in the decision.
+Subjects could rest at any time during the test, which lasted for about
+30 minutes, but they were not permitted to hear any pair a second time.
+.pp
+Defining a "success" to be a choice of the utterance with
+natural pitch as the best of a pair,
+the overall success rate was about 60%.
+If choices were random, one would of course expect only a 50% success rate,
+and the figure obtained was significantly different from this.
+Almost half the choices were correct and made with high confidence;
+high-confidence but incorrect choices accounted for a quarter of the
+judgements.
+.pp
+To investigate structural effects in the pitch transfer process,
+low confidence decisions were ignored to eliminate noise, and the others
+lumped together and tabulated by source and target utterance.
+The number of stressed and unstressed syllables does not appear to play
+an important part in determining whether a particular utterance is an
+easy target.
+For example, it proved to be particularly difficult to tell
+.EQ
+delim @@
+.EN
+natural from transferred contours with utterances $0.37 and $0.77.
+.EQ
+delim $$
+.EN
+In fact, the results showed no better than random discrimination for them,
+even though the decisions in which listeners expressed little confidence
+had been discarded.
+Hence it seems that the syllable alignment procedure and the policy
+of replication were successful.
+.pp
+.EQ
+delim @@
+.EN
+The worst target scores were for utterances $0.11 and $0.79.
+.EQ
+delim $$
+.EN
+Both of these contained large unbroken voiced periods
+in the "variable" part \(em almost twice as long as the next longest
+voiced period.
+The first has an unstressed syllable followed by
+a stressed one with no break in voicing,
+involving, in a natural contour,
+a fast but continuous climb in pitch over the juncture,
+and it is not surprising that it proved to be the most difficult target.
+A more sophisticated "smoothing" algorithm than the
+one used may be worth investigating.
+.pp
+In a third experiment, sentences with two variable parts were used to check
+that the results of the second experiment extended to more complex
+utterances.
+The overall success rate was 75%, significantly different from chance.
+However, a breakdown of the results by source and target utterance
+showed that there was one contour (for the utterance
+"the price is 19 dollars and 8 cents") which exhibited very successful
+transfer, subjects identifying the transferred-pitch utterances at only
+a chance level.
+.pp
+Finally, transfers of pitch from utterances with two variable parts
+to those with one variable part were tested.
+Pitch contours were transferred to sentences with the same "cents"
+figure but no "dollars" part; for example,
+"the price is five dollars and thirteen cents"
+to
+"the price is thirteen cents".  The
+contour was simply copied between the corresponding
+syllables, so that no adjustment needed to be made
+for different syllable structures.
+The overall score was 60 successes in 100 judgements \(em
+the same percentage as in the second experiment.
+.pp
+To summarize the results of these four experiments,
+.LB
+.NP
+even accomplished linguists cannot distinguish an utterance from one with
+pitch transferred from a different recording of it;
+.NP
+when the utterance contained only one variable part embedded in a
+carrier sentence,
+lay listeners identified the original correctly in 60% of cases,
+over a wide variety of syllable structures:  this
+figure differs significantly from the chance value of 50%;
+.NP
+lay listeners identified the original confidently and correctly in
+50% of cases; confidently but incorrectly in 25% of cases;
+.NP
+the greatest hindrance to successful transfer was the presence of
+a long uninterrupted period of voicing in the target utterance;
+.NP
+the performance of the method deteriorates as the number
+of variable parts in the utterances increases;
+.NP
+some utterances seemed to serve better than others as the pitch source for
+transfer, although this was not correlated with complexity of syllable structure;
+.NP
+even when the utterance contained two variable parts,
+there was one source utterance whose pitch contour was
+transferred to all the others so successfully that listeners could not identify
+the original.
+.LE
+.pp
+The fact that only 60% of originals in the second experiment were
+spotted by lay listeners in a stringent
+paired-comparison test \(em many of them being identified without confidence \(em
+does encourage the use of the procedure for generating stereotyped,
+but different, utterances of high quality in voice-response systems.
+The experiments indicate that although different syllable patterns
+can be handled satisfactorily by this procedure,
+long voiced periods should be avoided if possible when designing
+the message set,
+and that if individual utterances must contain multiple variable parts
+the source utterance should be chosen with the aid of listening tests.
+.sh "8.3  Assigning timing and pitch to synthetic speech"
+.pp
+The pitch transfer method can give good results within a fairly narrow
+domain of application.
+But like any speech output technique which treats complete utterances
+as a single unit, with provision for a small number of slot-fillers to
+accomodate data-dependent messages, it becomes unmanageable in more general
+situations with a large variety of utterances.
+As with segmental synthesis it becomes necessary to consider methods
+which use a textual rather than an acoustically-based representation
+of the prosodic features.
+.pp
+This raises a problem with prosodics that was not there for segmentals:  how
+.ul
+can
+prosodic features be written in text form?
+The standard phonetic transcription method does not give much help with
+notation for prosodics.  It does provide a diacritical mark to indicate
+stress, but this is by no means enough information for synthesis.
+Furthermore, text-to-speech procedures (described in the next chapter)
+promise to allow segmentals to be specified by an ordinary orthographic
+representation of the utterance; but we have seen that considerable
+intelligence is required to derive prosodic features from text.
+(More than mere intelligence may be needed:  this is underlined by a paper
+(Bolinger, 1972)
+delightfully entitled
+"Accent is predictable \(em if you're a mind reader"!)
+.[
+Bolinger 1972 Accent is predictable \(em if you're a mind reader
+.]
+.pp
+If synthetic speech is to be used as a computer output medium rather
+than as an experimental tool for linguistic research, it is important
+that the method of specifying utterances is natural and easy to learn.
+Prosodic features must be communicated to the computer in a manner
+considerably simpler than individual duration and pitch specifications
+for each phoneme, as was required in early synthesis-by-rule systems.
+Fortunately, a notation has been developed for conveying some of the
+prosodic features of utterances, as a by-product of the linguistically
+important task of classifying the intonation contours used in
+conversational English (Halliday, 1967).
+.[
+Halliday 1967
+.]
+This system has even been used to help foreigners speak English
+(Halliday, 1970) \(em which emphasizes the fact that it was designed for use
+by laymen, not just linguists!
+.[
+Halliday 1970 Course in spoken English: Intonation
+.]
+.pp
+Here are examples of the way utterances can be conveyed to the ISP
+speech synthesis system which was described in the previous chapter.
+The notation is based upon Halliday's.
+.LB
+.NI
+3
+.ul
+^  aw\ t\ uh/m\ aa\ t\ i\ k  /s\ i\ n\ th\ uh\ s\ i\ s  uh\ v  /*s\ p\ ee\ t\ sh,
+.NI
+1
+.ul
+^  f\ r\ uh\ m  uh  f\ uh/*n\ e\ t\ i\ k  /r\ e\ p\ r\ uh\ z\ e\ n/t\ e\ i\ sh\ uh\ n.
+.LE
+(Automatic synthesis of speech, from a phonetic representation.)  Three
+levels of stress are distinguished:  tonic or "sentence" stress,
+marked by "*" before the syllable; foot stress (marked by "/");
+and unstressed syllables.
+The notion of a "foot" controls the rhythm of the speech in a way that
+will be described shortly.
+A fourth level of stress is indicated on a segmental basis when a syllable
+contains a reduced vowel.
+.pp
+Utterances are divided by punctuation into
+.ul
+tone groups,
+which are the basic prosodic unit \(em there are two in the example.
+The shape of the pitch contour is governed by a numeral at the start of
+each tone group.
+Crude control over pauses is achieved by punctuation marks:  full stop, for
+example, signals a pause while comma does not.
+(Longer pauses can be obtained by several full stops as in "...".)  The
+"^" character stands for a so-called "silent stress" or breath point.
+Word boundaries are marked by two spaces between phonemes.
+As mentioned in the previous chapter, syllable boundaries and explicit
+pitch and duration specifiers can also be included in the input.
+If they are not, the ISP system will attempt to compute them.
+.rh "Rhythm."
+Our understanding of speech rhythm knows many laws but little order.
+In the mid 1970's there was a spate of publications reporting new data
+on segmental duration in various contexts, and there is a growing
+awareness that segmental duration is influenced by a great many factors,
+ranging from the structure of a discourse, through semantic and syntactic
+attributes of the utterances, their phonemic and phonetic make-up,
+right down to physiological constraints
+(these multifarious influences are ably documented and reviewed by
+Klatt, 1976).
+.[
+Klatt 1976 Linguistic uses of segment duration in English
+.]
+What seems to be lacking in this work is a conceptual framework on to
+which new information about segmental duration can be nailed.
+.pp
+One starting-point for imitating the rhythm of English speech is the
+hypothesis of regularly recurring stresses.
+These stresses are primarily
+.ul
+rhythmic
+ones, and should be distinguished from the tonic stress mentioned above which
+is primarily an
+.ul
+intonational
+one.
+Rhythmic stresses are marked in the transcription by a "/".
+The stretch between one and the next is called a "foot",
+and the hypothesis above is often referred to as that of isochronous feet
+("isochronous" means "of equal time").
+There is considerable controversy about this hypothesis.
+It is most popular among British linguists and, it must be admitted,
+amongst those who work by introspection and intuition and do not actually
+.ul
+measure
+things.
+Although the question of isochrony of feet has long been debated, there
+seems to be general agreement
+\(em even amongst American linguists \(em
+that there is at least a tendency towards
+equal spacing of foot boundaries.
+However, little is known about the strength of this tendency and the extent
+of deviations from it (see Hill
+.ul
+et al,
+1979, for an attempt
+to quantify it) \(em and there is even evidence to suggest that it may in part
+be a
+.ul
+perceptual
+phenomenon (Lehiste, 1973).
+.[
+Hill Jassem Witten 1979
+.]
+.[
+Lehiste 1973
+.]
+On this basic point, as on many others, the designer of a prosodic synthesis
+strategy must needs make assumptions which cannot be properly justified.
+.pp
+From a pragmatic point of view there are two advantages to basing
+a synthesis strategy on this hypothesis.
+Firstly, it provides a way to represent the many influences of higher-level
+processes (like syntax and semantics) on rhythm using a simple notation which
+fits naturally into the phonetic utterance representation,
+and which people find quite easy to understand and generate.
+Secondly, it tends to produce a heavily accentuated, but not unnatural,
+speech rhythm which can easily be moderated into a more acceptable rhythm
+by departing from isochrony in a controlled manner.
+.pp
+The ISP procedure does not make feet exactly isochronous.
+It starts with a standard foot time and attempts to fit the syllables of the
+foot into this time.
+If doing so would result in certain syllables having less than a preset minimum
+duration, the isochrony constraint is relaxed and the foot is expanded.
+There is no preset
+.ul
+maximum
+syllable length.
+However, when the durations of individual phoneme postures are adjusted
+to realize the calculated syllable durations,
+limits are imposed on the amount by which individual phonemes can be expanded
+or contracted.
+Thus a hierarchy of limits exists.
+.pp
+The rate of talking is determined by the standard foot time.
+If this time is short, many feet will be forced to have durations longer than
+the standard, and the speech will be "less isochronous".
+This seems to accord with common human experience.
+If the standard time is longer, however, the minimum syllable limit
+will always be exceeded and the speech will be completely isochronous.
+If it is too long, the above-mentioned limits to phoneme expansion will
+come into play and again partially destroy the isochrony.
+.pp
+It has often been observed that the final foot of an utterance tends to be
+longer than others; as does the tonic foot \(em that which bears the
+major stress.
+This is easy to accomodate, simply by making the target duration
+longer for these feet.
+.rh "From feet to syllables."
+A foot is a succession of syllables, one or more.
+And it is obvious that since there are more syllables in some feet than
+in others, some syllables must occupy less time than others in order to preserve
+the tendency towards isochrony of feet.
+.pp
+However, the duration of a foot is not divided evenly between its constituent
+syllables.  The syllables have a definite rhythm of their own, which seems
+to be governed by
+.LB
+.NP
+the nature of the salient (that is, the first) syllable of the foot
+.NP
+the presence of word boundaries within the foot.
+.LE
+A salient syllable tends to be long either if it contains one of
+a class of so-called "long" vowels, or if there is a cluster of two or more
+consonants following the vowel.
+The pattern of syllables and word boundaries governs the rhythm of the foot,
+and Table 8.2 shows the possibilities for one-, two-, and three-syllable feet.
+This theory of speech rhythm is due to Abercrombie (1964).
+.[
+Abercrombie 1964 Syllable quantity and enclitics in English
+.]
+.RF
+.nr x2 \w'three-syllable feet  'u
+.nr x3 \w'sal-short  'u
+.nr x4 \w'weak [#]  'u
+.nr x5 \w'weak      'u
+.nr x6 \w'/\fIit s incon\fR/ceivable    'u
+.nr x1 (\w'syllable rhythm'/2)
+.nr x7 \n(x2+\n(x3+\n(x4+\n(x5+\n(x6+\n(x1+\n(x1
+.nr x7 (\n(.l-\n(x7)/2
+.in \n(x7u
+.ta \n(x2u +\n(x3u +\n(x4u +\n(x5u +\n(x6u
+.ul
+	syllable pattern		example	\0\0\h'-\n(x1u'syllable rhythm
+.sp
+one-syllable feet	salient			/\fIgood\fR /show	1
+	^	weak		/\fI^ good\fR/bye	2:1
+.sp
+two-syllable feet	sal-long	weak		/\fIcentre\fR /forward	1:1
+	sal-short	weak		/\fIatom\fR /bomb	1:2
+	salient  #	weak		/\fItea for\fR /two	2:1
+.sp
+three-syllable feet	salient  #	weak [#]	weak	/\fIone for the\fR /road	2:1:1
+				/\fIit's incon\fR/ceivable
+	sal-long	weak #	weak	/\fIafter the\fR /war	2:3:1
+	sal-short	weak #	weak	/\fImiddle to\fR /top	1:3:2
+	sal-long	weak	weak	/\fInobody\fR /knows	3:1:2
+	sal-short	weak	weak	/\fIanything\fR /more	1:1:1
+.sp
+	# denotes a word boundary;
+	[#] is an optional word boundary
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.FG "Table 8.2  Syllable patterns and rhythms"
+.pp
+A foot may have the rhythmical characteristics of a two-syllable foot
+while having only one syllable, if the first place in it is filled by a
+silent stress (marked by "^").
+This is shown in the second one-syllable example of
+Table 8.2.
+A similar effect may occur with two- and three-syllable feet,
+although examples are not given in the table.
+Feet of four and five syllables \(em with or without a silent stress \(em are
+considerably rarer.
+.pp
+Syllabification \(em splitting an utterance into syllables \(em is a job
+which had to be done for the pitch-transfer procedure described earlier,
+and the nature of syllable rhythms calls for it here too.
+Even though the utterance is now specified phonetically instead of
+acoustically, the same basic principle applies.
+Syllables normally coincide with peaks of sonority,
+where "sonority" measures the inherent loudness of a sound relative to
+other sounds of the same duration and pitch.
+However, difficult cases exist where it seems to be unclear how many syllables
+there are in a word.  (Ladefoged, 1975, discusses this problem with examples
+such as "real", "realistic", and "reality".)  Furthermore,
+.[
+Ladefoged 1975
+.]
+care must be taken to avoid counting two syllables in a word like "sky"
+because of its two peaks of sonority \(em for the stop
+.ul
+k
+has lower
+sonority than the fricative
+.ul
+s.
+.pp
+Three levels of notional sonority are enough for syllabification.
+Dividing phoneme segments into
+.ul
+sonorants
+(glides and nasals),
+.ul
+obstruents
+(stops and fricatives), and vowels; a general syllable has the form
+.LB
+.EQ
+<obstruent> sup * ~ <sonorant> sup * ~ <vowel> sup * ~ <sonorant> sup * ~
+<obstruent> sup * ~ ,
+.EN
+.LE
+where "*" means repetition, that is, occurrence zero or more times.
+This sidesteps the "sky" problem by giving fricatives the same
+sonority as stops.
+It is easy to use the above structure to count the number
+of syllables in a given utterance by counting the sonority
+peaks.
+.pp
+However, what is required is an indication of syllable
+.ul
+boundaries
+as well as a syllable count.
+For slow conversational speech, these can be approximated as follows.
+Word divisions obviously form syllable boundaries, as should
+foot markers \(em but it may be wise not to assume that the latter do if the
+utterance has been prepared by someone with little knowledge of linguistics.
+Syllable boundaries should be made to coincide with sonority minima.
+As an
+.ul
+ad hoc
+pragmatic
+rule, if only one segment has the minimum sonority the boundary is placed
+before it.
+If there are two segments, each with the minimum sonority, it is placed between
+them, while for three or more it is placed after the first two.
+.pp
+These rules produce obviously acceptable divisions in many cases
+(to'day, ash'tray, tax'free), with perhaps unexpected positioning of the
+boundary in others (ins'pire, de'par'tment).
+Actually, people do differ in placement of syllable boundaries
+(Abercrombie, 1967).
+.[
+Abercrombie 1967
+.]
+.rh "From syllables to segments."
+The theory of isochronous feet (with the caveats noted earlier)
+and that of syllable rhythms provide a way of producing durations for
+individual syllables.  But where are these durations supposed to be measured?
+There is a beat point, or tapping point, near the beginning of each syllable.
+This is the place where a listener will tap if asked to give one tap to each
+syllable; it has been investigated experimentally by Allen (1972).
+.[
+Allen 1972 Location of rhythmic stress beats in English One
+.]
+It is not necessarily at the very beginning of the syllable.
+For example, in "straight", the tapping point is certainly after the
+.ul
+s
+and the stopped part of the
+.ul
+t.
+.pp
+Another factor which relates to the division of the syllable duration
+amongst phonetic segments is the often-observed fact that the length of the
+vocalic nucleus is a strong clue to the degree of voicing of the terminating
+cluster (Lehiste, 1970).
+.[
+Lehiste 1970 Suprasegmentals
+.]
+If you say in pairs words like "cap", "cab"; "cat", "cad"; "tack", "tag"
+you will find that the vowel in the first word of each pair is significantly
+shorter than that in the second.
+In fact, the major difference between such pairs is the vowel length,
+not the final consonant.
+.pp
+Such effects can be taken into account by considering a syllable to comprise
+an initial consonant cluster, followed by a vocalic nucleus and a final
+consonant cluster.
+Any of these elements can be missing \(em the most unusual case where the
+nucleus is absent occurs, for example, in so-called syllabic
+.ul
+n\c
+\&'s
+(as in renderings of "button", "pudding" which might be written
+"butt'n", "pudd'n").
+However, it is convenient to modify the definition of the nucleus
+so as to rule out the possibility of it being empty.
+Using the characterization of the syllable given above, the clusters can
+be defined as
+.LB
+.NI
+initial cluster	=  <obstruent>\u*\d <sonorant>\u*\d
+.NI
+nucleus	=  <vowel>\u*\d <sonorant>\u*\d
+.NI
+final cluster	=  <obstruent>\u*\d.
+.LE
+Sonorants are included in the nucleus so that it is always present,
+even in the case of a syllabic consonant.
+.pp
+Then, rules can be used to divide the syllable duration between the
+initial cluster, nucleus, and final cluster.
+These must distinguish between situations where the terminating cluster
+is voiced or unvoiced so that the characteristic differences in vowel lengths
+can be accomodated.
+.pp
+Finally, the cluster durations must be apportioned amongst their constituent
+phonetic segments.  There is little published data on which to base this.
+Two simple schemes which have been used in ISP are described in
+Witten (1977) and Witten & Smith (1977).
+.[
+Witten 1977 A flexible scheme for assigning timing and pitch to synthetic speech
+.]
+.[
+Witten Smith 1977 Synthesizing British English rhythm
+.]
+.rh "Pitch."
+There are two basically different ways of looking at the pitch of an
+utterance.
+One is to imagine pitch
+.ul
+levels
+attached to individual syllables.
+This has been popular amongst American linguists, and some people
+have even gone so far as to associate pitch levels with levels of
+stress.
+The second approach is to consider pitch
+.ul
+contours,
+as we did earlier when examining how to transfer pitch from one utterance
+to another.
+This seems to be easier for the person who transcribes the utterances
+to produce, for the information required is much less detailed than levels
+attached to each syllable.  Some indication needs to be given of how
+the contour is to be bound to the utterance, and in the notation introduced above
+the most prominent, or "tonic", syllable is indicated in the transcription.
+.pp
+Halliday's (1970) classification identifies five different primary intonation
+contours, each hinging on the tonic syllable.
+.[
+Halliday 1970 Course in spoken English: Intonation
+.]
+These are sketched in Figure 8.5, in the style of Halliday.
+.FC "Figure 8.5"
+Several secondary contours, which are variations on the primary ones,
+are defined as well.
+However, this classification scheme is intended for consumption by people,
+who bring to the problem a wealth of prior knowledge of speech and years
+of experience with it!  It captures only the gross features
+of the infinite variety of pitch contours found in living speech.
+In a sense, the classification is
+.ul
+phonological
+rather than
+.ul
+phonetic,
+for it attempts to distinguish the features which make a logical difference
+to the listener instead of the acoustic details of the pitch contours.
+.pp
+It is necessary to take these contours and subject them to a sort of
+phonological-to-phonetic embellishment before applying them in synthetic
+speech.
+For example, the stretches with constant pitch which precede the tonic
+syllable in tone groups 1, 2, and 3 sound
+most unnatural when synthesized \(em for pitch is hardly ever
+exactly constant in living speech.
+Some pretonic pitch variation is necessary,
+and this can be made to emphasize the salient syllable
+of each foot.  A "lilting" effect which reaches a peak at each foot
+boundary, and drops rather faster at the beginning of the foot than it
+rises at the end, sounds more natural.  The magnitude of this inflection
+can be altered slightly to add interest, but a considerable increase in it
+produces a semantic change by making the utterance sound more emphatic.
+It is a major problem to pin down exactly the turning points of pitch in
+the falling-rising and rising-falling contours (4 and 5 in Figure 8.5).
+And even deciding on precise values for the pitch frequencies involved is not
+always easy.
+.pp
+The aim of the pitch assignment method of ISP is to allow the person
+(or program) which originates a spoken message to exercise a great deal
+of control over its intonation, without having to concern himself with
+foot or syllable structure.  The message to be spoken must be broken down
+into tone groups,
+which correspond roughly to Halliday's tone groups.
+Each one comprises a
+.ul
+tonic
+of one or more feet, which is optionally preceded by a
+.ul
+pretonic,
+also with a number of feet.  It is advantageous to allow a tone group
+boundary to occur in the middle of a foot (whereas Halliday's scheme
+insists that it occurs at a foot boundary).
+The first foot of the tonic, the
+.ul
+tonic foot,
+is marked by an asterisk at the beginning.
+It is on the first syllable of this foot \(em the
+"tonic" or "nuclear"
+syllable \(em that the major stress of the tone group occurs.
+If there is no asterisk in a tone group,
+ISP takes the final foot as the tonic
+(since this is the most common case).
+.pp
+The pitch contour on a tone group is specified by an array of ten numbers.
+Of course, the system cannot generate all conceivable contours for a tone
+group, but the definitions of the ten specifiable quantities have been
+chosen to give a useful range of contours.
+If necessary, more precise control over the pitch of an utterance can
+be achieved by making the tone groups smaller.
+.pp
+The overall pitch movement is controlled by specifying the pitch at three
+places:  the beginning of the tone group, the beginning of the tonic syllable,
+and the end of the tone group.
+Provision is made for an abrupt pitch break at the start of the tonic
+syllable in order to simulate tone groups 2 and 3, and, to a lesser
+extent, tone groups 4 and 5.
+The pitch is interpolated linearly over the first part of the
+tone group (up to the tonic syllable) and over the last part (from there to
+the end), except that it is possible to specify a non-linearity on the tonic
+syllable, for emphasis, as shown in Figure 8.6.
+.FC "Figure 8.6"
+.pp
+On this basic shape are superimposed two finer pitch patterns.
+One of these is an initialization-continuation option which allows
+the pitch to rise (or fall) independently on the initial and final feet
+to specified values, without affecting the contour on the rest
+of the tone group (Figure 8.7).
+.FC "Figure 8.7"
+The other is a foot pattern which is superimposed on each pretonic foot,
+to give the stressed syllables of the pretonic added prominence and avoid
+the monotony of constant pitch.
+This is specified by a
+.ul
+non-linearity
+parameter which distorts the contour on the foot at a pre-determined
+point along it.
+Figure 8.8 shows the effect.
+.FC "Figure 8.8"
+.pp
+The ten quantities that define a pitch contour are summarized in
+Table 8.3, and shown diagrammatically in Figure 8.9.
+.FC "Figure 8.9"
+.RF
+.nr x0 \w'H:    'u
+.nr x1 \n(x0+\w'fraction along foot of the non-linearity position, for the tonic foot'u
+.nr x1 (\n(.l-\n(x1)/2
+.in \n(x1u
+.ta \n(x0u +4n
+A:	continuation from previous tone group
+		zero gives no continuation
+		non-zero gives pitch at start of tone group
+B:	notional pitch at start
+C:	pitch range on whole of pretonic
+D:	departure from linearity on each foot of pretonic
+E:	pitch change at start of tonic
+F:	pitch range on tonic
+G:	departure from linearity on tonic
+H:	continuation to next tone group
+		zero gives no continuation
+		non-zero gives pitch at end of tone group
+I:	fraction along foot of the non-linearity position, for pretonic feet
+J:	fraction along foot of the non-linearity position, for the tonic foot
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 8.3  The quantities that define a pitch contour"
+.pp
+The intention of this parametric method of specifying contours
+is that the parameters should be easily derivable from semantic variables
+like emphasis, novelty of idea, surprise, uncertainty, incompleteness.
+Here we really are getting into controversial, unresearched areas.
+Roughly speaking, parameters D and G control emphasis, G by itself
+controls novelty and surprise, and H and the relative sizes of E and F
+control uncertainty and incompleteness.
+Certain parameters (notably I and J) are defined because although they
+do not appear to correspond to semantic distinctions, we do not yet know
+how to generate them automatically.
+.RF
+.nr x0 0.6i+0.5i+0.5i+0.5i+0.5i+0.5i+0.5i+0.5i+0.5i+0.5i+0.5i+\w'0000'
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta 0.6i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+Halliday's
+tone group	\0\0A	\0\0B	\0\0C	\0\0D	\0\0E	\0\0F	\0\0G	\0\0H	\0\0I	\0\0J
+\l'\n(x0u\(ul'
+.sp
+	1	\0\0\00	\0175	\0\0\00	\0\-40	\0\0\00	\-100	\0\-40	\0\0\00	0.33	\00.5
+	2	\0\0\00	\0280	\0\0\00	\0\-40	\-190	\0100	\0\0\00	\0\0\00	0.33	\00.5
+	3	\0\0\00	\0175	\0\0\00	\0\-40	\0\-70	\0\045	\0\-10	\0\0\00	0.33	\00.5
+	4	\0\0\00	\0280	\-100	\0\-40	\0\020	\0\045	\0\-45	\0\0\00	0.33	\00.5
+	5	\0\0\00	\0175	\0\060	\0\-40	\0\-20	\0\-45	\0\045	\0\0\00	0.33	\00.5
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 8.4  Pitch contour table for Halliday's primary tone groups"
+.pp
+One basic requirement of the pitch assignment scheme was the ability to
+generate contours which approximate Halliday's five primary tone groups.
+Values of the ten specifiable quantities are given in Table 8.4, for each
+tone group.
+All pitches are given in\ Hz.
+A distinctly dipping pitch movement has been given to each pretonic foot
+(parameter D),
+to lend prominence to the salient syllables.
+.sh "8.4  Evaluating prosodic synthesis"
+.pp
+It is extraordinarily difficult to evaluate schemes for prosodic synthesis,
+and this is surely a large part of the reason why prosodics are among the
+least advanced aspects of artificial speech.
+Segmental synthesis can be tested by playing people minimal pairs of
+words which differ in just one feature that is being investigated.
+For example, one might experiment with "pit", "bit"; "tot", "dot";
+"cot", "got" to test the rules which discriminate unvoiced from voiced stops.
+There are standard word-lists for intelligibility tests which can be
+used to compare systems, too.
+No equivalent of such micro-level evaluation exists for prosodics,
+for they by definition have a holistic effect on utterances.
+They are most noticeable, and most important, in longish stretches of speech.
+Even monotonous, arhythmic speech will be intelligible in
+sufficiently short samples provided the segmentals are good enough;
+but it is quite impossible to concentrate on such speech in quantity.
+Some attempts at evaluation appear in Ainsworth (1974) and McHugh (1976),
+but these are primarily directed at assessing the success of pronunciation
+rules, which are discussed in the next chapter.
+.[
+Ainsworth 1974 Performance of a speech synthesis system
+.]
+.[
+McHugh 1976 Listener preference and comprehension tests
+.]
+.pp
+One evaluation technique is to compare synthetic with natural versions
+of utterances, as was done in the pitch transfer experiment.
+The method described earlier used a sensitive paired-comparison test,
+where subjects heard both versions in quick succession and were asked
+to judge which was "most natural and intelligible".
+This is quite a stringent test, and one that may not be so useful
+for inferior, completely synthetic, contours.
+It is essential to degrade the "natural" utterance so that it is
+comparable segmentally to the synthetic one:  this was done in the
+experiment described by extracting its pitch and resynthesizing it
+from linear predictive coefficients.
+.pp
+Several other experiments could be undertaken to evaluate artificial
+prosody.
+For example, one could compare
+.LB
+.NP
+natural and artificial rhythms, using artificial segmental synthesis
+in both cases;
+.NP
+natural and artificial pitch contours, using artificial segmental synthesis
+in both cases;
+.NP
+natural and artificial pitch contours, using segmentals extracted from
+natural utterances.
+.LE
+There are many other topics which have not yet been fully investigated.
+It would be interesting, for example, to define rules for generating speech
+at different tempos.
+Elisions, where phonemes or even whole syllables are suppressed,
+occur in fast speech; these have been analyzed by linguists
+but not yet incorporated into synthetic models.
+It should be possible to simulate emotion by altering parameters such as
+pitch range and mean pitch level; but this seems exceptionally difficult
+to evaluate.  One situation where it would perhaps be possible to
+measure emotion is in the reading of sports results \(em in fact a study
+has already been made of intonation in soccer results (Bonnet, 1980)!
+.[
+Bonnet 1980
+.]
+Even the synthesis of voices with different pitch ranges requires
+investigation, for, as noted earlier, it is difficult to place
+precise frequency specifications on phonological contours such as
+those sketched in Figure 8.5.
+Clearly the topic of prosodic synthesis is a rich and potentially
+rewarding area of research.
+.sh "8.5  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "8.6  Further reading"
+.pp
+There are quite a lot of books in the field of linguistics which
+describe prosodic features.
+Here is a small but representative sample from both sides of the Atlantic.
+.LB "nn"
+.\"Abercrombie-1965-1
+.]-
+.ds [A Abercrombie, D.
+.ds [D 1965
+.ds [T Studies in phonetics and linguistics
+.ds [I Oxford Univ Press
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Abercrombie is one of the leading English authorities on phonetics,
+and this is a collection of essays which he has written over the years.
+Some of them treat prosodics explicitly, and others show the influence
+of verse structure on Abercrombie's thinking.
+.in-2n
+.\"Bolinger-1972-2
+.]-
+.ds [A Bolinger, D.(Editor)
+.ds [D 1972
+.ds [T Intonation
+.ds [I Penguin
+.ds [C Middlesex, England
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.in+2n
+A collection of papers that treat a wide variety of different aspects
+of intonation in living speech.
+.in-2n
+.\"Crystal-1969-3
+.]-
+.ds [A Crystal, D.
+.ds [D 1969
+.ds [T Prosodic systems and intonation in English
+.ds [I Cambridge Univ Press
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This book attempts to develop a theoretical basis for the study of British
+English intonation.
+.in-2n
+.\"Gimson-1966-3
+.]-
+.ds [A Gimson, A.C.
+.ds [D 1966
+.ds [T The linguistic relevance of stress in English
+.ds [B Phonetics and linguistics
+.ds [E W.E.Jones and J.Laver
+.ds [P 94-102
+.nr [P 1
+.ds [I Longmans
+.ds [C London
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 3 article-in-book
+.in+2n
+Here is a careful discussion of what is meant by "stress", with much more
+detail than has been possible in this chapter.
+.in-2n
+.\"Lehiste-1970-4
+.]-
+.ds [A Lehiste, I.
+.ds [D 1970
+.ds [T Suprasegmentals
+.ds [I MIT Press
+.ds [C Cambridge, Massachusetts
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This is a comprehensive study of suprasegmental phenomena in natural speech.
+It is divided into three major sections:  quantity (timing), tonal features
+(pitch), and stress.
+.in-2n
+.\"Pike-1945-5
+.]-
+.ds [A Pike, K.L.
+.ds [D 1945
+.ds [T The intonation of American English
+.ds [I Univ of Michigan Press
+.ds [C Ann Arbor, Michigan
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+A classic, although somewhat dated, study.
+Notice that it deals specifically with American English.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "9  GENERATING SPEECH FROM TEXT"
+.ds RT "Generating speech from text
+.ds CX "Principles of computer speech
+.pp
+In the preceding two chapters I have described how artificial speech
+can be produced from a written phonetic representation with additional
+markers indicating intonation contours, points of major stress, rhythm,
+and pauses.
+This representation is substantially the same as that used by linguists
+when recording natural utterances.
+What we will discuss now are techniques for generating this information,
+or at least some of it, from text.
+.pp
+Figure 9.1 shows various levels of the speech synthesis process.
+.FC "Figure 9.1"
+Starting from the top with plain text, the first box splits it into
+intonation units (tone groups), decides where the major emphases
+(tonic stresses) should be placed,
+and further subdivides the tone group into rhythmic units (feet).
+For intonation analysis it is necessary to decide on an "interpretation"
+of the text, which in turn, as was emphasized at the beginning of the
+previous chapter, depends both on the semantics of what is being said and
+on the attitude of the speaker to his material.
+The resulting representation will be at the level of Halliday's notation
+for utterances, with the words still in English rather than phonetics.
+Table 9.1 illustrates the utterance representation at the various levels
+of the Figure.
+.RF
+.nr x0 \w'pitch and duration    '+\w'at 8 kHz sampling rate a 4-second utterance'
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta \w'pitch and duration    'u +\w'pause  'u +\w'00 msec   'u
+representation	example
+\l'\n(x0u\(ul'
+.sp
+plain text	Automatic synthesis of speech,
+	from a phonetic representation.
+.sp
+text adorned with	3\0^ auto/matic /synthesis of /*speech,
+prosodic markers	1\0^ from a pho/*netic /represen/tation.
+.sp
+phonetic text with	3\0\fI^  aw t uh/m aa t i k  /s i n th uh s i s\fR
+prosodic markers	\0\0\fIuh v  /*s p ee t sh\fR ,
+	1\0\fI^  f r uh m  uh  f uh/*n e t i k\fR
+	\0\0\fI/r e p r uh z e n/t e i sh uh n\fR .
+.sp
+phonemes with	pause	80 msec
+pitch and duration	\fIaw\fR	70 msec	105 Hz
+	\fIt\fR	40 msec	136 Hz
+	\fIuh\fR	50 msec	148 Hz
+	\fIm\fR	70 msec	175 Hz
+	\fIaa\fR	90 msec	140 Hz
+		...
+		...
+		...
+.sp
+parameters for	10 parameters, each updated at a frame
+formant or linear	rate of 10 msec
+predictive	(4 second utterance gives 400 frames,
+synthesizer	or 4,000 data values)
+.sp
+acoustic wave	at 8 kHz sampling rate a 4-second utterance
+	has 32,000 samples
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 9.1  Utterance representations at various levels in speech synthesis"
+.pp
+The next job is to translate the plain text into a broad phonetic
+transcription.
+This requires knowledge of letter-to-sound pronunciation
+rules for the language under consideration.
+But much more is needed.  The structure of each word must be examined for
+prefixes and suffixes, because they \(em especially the latter \(em have a
+strong influence on pronunciation.
+This is called "morphological" analysis.
+Actually it is also required for rhythmical purposes, because prefixes
+are frequently unstressed (note that the word "prefix" is itself an
+exception to this!).
+Thus the appealing segmentation of the overall problem shown in Figure 9.1
+is not very accurate, for the individual processes cannot be rigidly
+separated as it implies.  In fact, we saw earlier how this intermixing of
+levels occurs with prosodic and segmental features.
+Nevertheless, it is helpful to structure discussion of the problem by
+separating levels as a first approximation.
+Further influences on pronunciation come from the semantics and syntax
+of the utterance \(em and both also play a part in intonation and rhythm analysis.
+The result of this second process is a phonetic representation, still
+adorned with prosodic markers.
+.pp
+Now we move down from higher-level intonation and rhythm considerations
+to the details of the pitch contour and segment durations.
+This process was the subject of the previous chapter.
+The problems are twofold:  to map an appropriate acoustic pitch contour
+on to the utterance, using tonic stress point and foot boundaries as
+anchor points; and to assign durations to segments using the
+foot\(emsyllable\(emcluster\(emsegment hierarchy.
+If it is accepted that the overall rhythm can be captured adequately by foot
+markers, this process does not interact with earlier ones.
+However, many researchers do not, believing instead that rhythm is
+syntactically determined at a very detailed level.
+This will, of course, introduce strong interaction between the duration
+assignment process and the levels above.
+(Klatt, 1975, puts it into his title \(em
+"Vowel lengthening is syntactically determined in a connected discourse".
+.[
+Klatt 1975 Vowel lengthening is syntactically determined
+.]
+Contrast this with the paper cited earlier (Bolinger, 1972) entitled
+"Accent is predictable \(em if you're a mind reader".
+.[
+Bolinger 1972 Accent is predictable \(em if you're a mind reader
+.]
+No-one would disagree that "accent" is an influential factor in vowel length!)
+.pp
+Notice incidentally that the representation of the result of the pitch
+and duration assignment process in Table 9.1 is inadequate, for each segment
+is shown as having just one pitch.
+In practice the pitch varies considerably throughout every segment,
+and can easily rise and fall on a single one.  For example,
+.LB
+"he's
+.ul
+very
+good"
+.LE
+may have a rise-fall on the vowel of "very".
+The linked event-list data-structure of ISP is much more suitable
+than a textual string for utterance representation at this level.
+.pp
+The fourth and fifth processes of Figure 9.1 have little interaction with
+the first two, which are the subject of this chapter.  Segmental
+concatenation, which was treated in Chapter 7, is affected by prosodic
+features like stress; but a notation which indicates stressed syllables
+(like Halliday's) is sufficient to capture this influence.
+Contextual modification of segments, by which I mean
+the coarticulation effects which govern allophones of phonemes,
+is included explicitly in the fourth process to emphasize that the upper levels
+need only provide a broad phonemic transcription rather than a detailed
+phonetic one.
+Signal synthesis can be performed by either a formant synthesizer or a
+linear predictive one (discussed in Chapters 5 and 6).
+This will affect the details of the segmental concatenation process but should have no
+impact at all on the upper levels.
+.pp
+Figure 9.1 performs a useful function by summarizing where we have
+been in earlier chapters \(em the lower three boxes \(em and introducing the
+remaining problems that must be faced by a full text-to-speech system.
+It also serves to illustrate an important point:  that a speech output system
+can demand that its utterances be entered in any of a wide range of
+representations.
+Thus one can enter at a low level with a digitized waveform or linear
+predictive parameters; or higher up with a phonetic representation
+that includes detailed pitch and duration specification at the phoneme level;
+or with a phonetic text or plain text adorned with prosodic markers;
+or at the very top with plain text as it would appear in a book.
+A heavy price in naturalness and intelligibility is paid by moving up
+.ul
+any
+of these levels \(em and this is just as true at the top of the Figure as
+at the bottom.
+.sh "9.1  Deriving prosodic features"
+.pp
+If you really need to start with plain text,
+some very difficult problems present themselves.
+The text should be understood, first of all, and then decisions need to be
+made about how it is to be interpreted.
+For an excellent speaker \(em like an actor \(em these decisions will be artistic,
+at least in part.
+They should certainly depend upon the opinion and attitude of the speaker,
+and his perception of the structure and progress of the dialogue.
+Very little is known about this upper level of speech synthesis from text.
+In practice it is almost completely ignored \(em and the speech is at most
+barely intelligible, and certainly uncomfortable to listen to.
+Hence anybody contemplating building or using a speech output system which
+starts from something close to plain text should consider carefully whether some extra
+semantic information can be coded into the initial utterances to help with
+prosodic interpretation.
+Only rarely is this impossible \(em and reading machines for the blind are
+a prime example of a situation where arbitrary, unannotated, texts
+must be read.
+.rh "Intonation analysis."
+One distinction which a program can usefully try
+to make is between basically rising
+and basically falling pitch contours.  It is often said that pitch rises on
+a question and falls on a statement, but if you listen to speech you will
+find this to be a gross oversimplification.  It normally
+falls on statements, certainly; but it falls as often as it rises on questions.
+It is more accurate to say that pitch rises on "yes-no" questions
+and falls on other utterances, although this rule is still only a rough guide.
+A simple test which operates lexically on the input text is to determine
+whether a sentence is a question by looking at the 
+punctuation mark at its end, and then to examine the first word.
+If it is a "wh"-word like "what", "which", "when", "why" (and also "how")
+a falling contour is likely to fit.
+If not, the question is probably a yes-no one, and the contour
+should rise.
+Such a crude rule will certainly not be very accurate
+(it fails, for example, when the "wh"-word is embedded in a phrase as in
+"at what time are you going?"), but at least it provides a starting-point.
+.pp
+An air of finality is given to an utterance when it bears a definite
+fall in pitch, dropping to a rather low value at the end.
+This should accompany the last intonation unit in an utterance
+(unless it is a yes-no question).
+However, a rise-fall contour such as Halliday's tone group 5 (Figure 8.5)
+can easily be used in utterance-final position by one person
+in a conversation \(em
+although it would be unlikely to terminate the dialogue altogether.
+A new topic is frequently introduced by a fall-rise contour \(em such as
+Halliday's tone group 4 \(em and this often begins a paragraph.
+.pp
+Determining the type of pitch contour is only one part of
+intonation assignment.  There are really three separate problems:
+.LB
+.NP
+dividing the utterance into tone groups
+.NP
+choosing the tonic syllable, or major stress point, of each one
+.NP
+assigning a pitch contour to each tone group.
+.LE
+Let us continue to use the Halliday notation for intonation, which was introduced
+in simplified form in the previous chapter.
+Moreover, assume that the foot boundaries can be placed correctly \(em
+this problem will be discussed in the next subsection.
+Then a scheme which considers only the lexical form of the utterance
+and does not attempt to "understand" it (whatever that means) is as follows:
+.LB
+.NP
+place a tone group boundary at every punctuation mark
+.NP
+place the tonic at the first syllable of the last foot in a tone group
+.NP
+use contour 4 for the first tone group in a paragraph and contour 1
+elsewhere, except for a yes-no question which receives contour 2.
+.LE
+.RF
+.nr x0 \w'From Scarborough to Whitby\0\0\0\0'+\w'4  ^  from /Scarborough to /*Whitby is a'
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta \w'From Scarborough to Whitby\0\0\0\0\0\0'u
+plain text	text adorned with prosodic markers
+\l'\n(x0u\(ul'
+.sp
+From Scarborough to Whitby is a	4 ^ from /Scarborough to /*Whitby is a
+very pleasant journey, with	1\- very /pleasant /*journey with
+very beautiful countryside.	1\- very /beautiful /*countryside ...
+In fact the Yorkshire coast is	1+ ^ in /fact the /Yorkshire /coast is
+\0\0\0\0lovely,	\0\0\0\0/*lovely
+all along, ex-	1+ all a/*long ex
+cept the parts that are covered	_4 cept the /parts that are /covered
+\0\0\0\0in caravans of course; and	\0\0\0\0in /*caravans of /course and
+if you go in spring,	4 if you /go in /*spring
+when the gorse is out,	4 ^ when the /*gorse is /out
+or in summer,	4 ^ or in /*summer
+when the heather's out,	4 ^ when the /*heather's /out
+it's really one of the most	13 ^ it's /really /one of the /most
+\0\0\0\0delightful areas in the	\0\0\0\0de/*lightful /*areas in the
+whole country.	1 whole /*country
+.sp
+The moorland is	4 ^ the /*moorland is
+rather high up, and	1 rather /high /*up and
+fairly flat \(em a	1 fairly /*flat a
+sort of plateau.	1 sort of /*plateau ...
+At least,	1 ^ at /*least
+it isn't really flat,	13 ^ it /*isn't /really /*flat
+when you get up on the top;	\-3 ^ when you /get up on the /*top
+it's rolling moorland	1 ^ it's /rolling /*moorland
+cut across by steep valleys.  But	1 cut across by /steep /*valleys but
+seen from the coast it's	4 seen from the /*coast it's ...
+"up there on the moors", and you	1 up there on the /*moors and you
+always think of it as a	_4 always /*think of it as a
+kind of tableland.	1 kind of /*tableland
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 9.2  Example of intonation and rhythm analysis (from Halliday, 1970)"
+.[
+Halliday 1970 Course in spoken English: Intonation
+.]
+.pp
+These extremely crude and simplistic rules are really the most that one can do
+without subjecting the utterance to a complicated semantic analysis.
+In statistical terms, they are actually remarkably effective.
+Table 9.2 shows part of a spontaneous monologue which was transcribed by
+Halliday and appears in his teaching text on intonation
+(Halliday, 1970, p 133).
+.[
+Halliday 1970 Course in Spoken English: Intonation
+.]
+Among the prosodic markers are some that were not introduced in Chapter 8.
+Firstly, each tone group has secondary contours which are identified
+by "1+", "1\-" (for tone group 1), and so on.
+Secondly, the mark "..." is used to indicate a pause which disrupts
+the speech rhythm.
+Notice that its positioning belies the advice of the old elocutionists:
+.br
+.ev2
+.in 0
+.LB
+.fi
+A Comma stops the Voice while we may privately tell
+.NI
+.ul
+one,
+a Semi-colon
+.ul
+two;
+a Colon
+.ul
+three:\c
+  and a Period
+.ul
+four.
+.br
+.nr x0 \w'\fIone,\fR a Semi-colon \fItwo;\fR a Colon \fIthree:\fR  and a Period \fIfour.'-\w'(Mason,\fR 1748)'
+.NI
+\h'\n(x0u'(Mason, 1748)
+.nf
+.LE
+.br
+.ev
+Thirdly, compound tone groups such as "13" appear which contain
+.ul
+two
+tonic syllables.
+This differs from a simple concatenation of tone groups
+(with contours 1 and 3 in this case) because the second is in some sense subsidiary to
+the first.
+Typically it forms an adjunct clause, while the first clause gives the
+main information.  Halliday provides many examples, such as
+.LB
+.NI
+/Jane goes /shopping in /*town /every /*Friday
+.NI
+/^ I /met /*Arthur on the /*train.
+.LE
+But he does not comment on the
+.ul
+acoustic
+difference between a compound tone group and a concatenation of simple ones \(em
+which is, after all, the information needed for synthesis.
+A final, minor, difference between Halliday's scheme and that outlined earlier
+is that he compels tone group boundaries to occur at the beginning
+of a foot.
+.RF
+.nr x0 3.3i+1.3i+\w'complete'
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta 3.3i +1.3i
+	excerpt in	complete
+	Table 9.2	passage
+\l'\n(x0u\(ul'
+.sp
+number of tone groups	25	74
+.sp
+number of boundaries correctly	19 (76%)	47 (64%)
+placed
+.sp
+number of boundaries incorrectly	\00	\01 (\01%)
+placed
+.sp
+number of tone groups having a	22 (88%)	60 (81%)
+tonic syllable at the beginning
+of the final foot
+.sp
+number of tone groups whose	17 (68%)	51 (69%)
+contours are correctly assigned
+\l'\n(x0u\(ul'
+.sp
+number of compound tone groups	\02 (\08%)	\06 (\08%)
+.sp
+number of secondary intonation	\07 (28%)	13 (17%)
+contours
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 9.3  Success of simple intonation assignment rules"
+.pp
+Applying the simple rules given above to the text of Table 9.2 leads to
+the results in the first column of Table 9.3.
+Three-quarters of the foot boundaries are flagged by
+punctuation marks, with no extraneous ones being included.
+88% of tone groups have a tonic syllable at the start of the final foot.
+However, the compound tone groups each have two tonic syllables,
+and of course only the second one is predicted by the final-foot rule.
+Assigning intonation contours on the extremely simple basis of using
+contour 4 for the first tone group in a paragraph, and contour 1 thereafter,
+also seems to work quite well.  Secondary contours such as "1+" and "1\-"
+have been mapped into the appropriate primary contour (1, in this case)
+for the present purpose, and compound tone groups have been assigned the first
+contour of the pair.
+The result is that 68% of contours are given correctly.
+.pp
+In order to give some idea of the reliability of these figures, the results
+for the whole passage transcribed by Halliday \(em of which Table 9.2 is an
+excerpt \(em are shown in the second column of Table 9.3.  Although it
+looks as though the rules may have been slightly lucky with the excerpt,
+the general trends are the same, with 65% to 80% of features being assigned
+correctly.
+It could be argued, though, that the complete text is punctuated fairly liberally by
+present-day standards, so that the tone-group boundary rule is unusually
+successful.
+.pp
+These results are really astonishingly good, considering the crudeness of
+the rules.  However, they should be interpreted with caution.
+What is missed by the rules, although appearing to comprise only
+20% to 35% of the features, is certain to include the important,
+information-bearing, and variety-producing features that give the utterance
+its liveliness and interest.
+It would be rash to assume that all tone-group boundaries,
+all tonic positions, and all intonation contours, are equally
+important for intelligibility and naturalness.
+It is much more likely that the rules predict a
+default pattern, while most information is borne by deviations from
+them.
+To give an engineering analogy, it may be as though the carrier waveform
+of a modulated transmission is being simulated, instead of the
+information-bearing signal!
+Certainly the utterance will, if synthesized with intonation given by these
+rules, sound extremely dull and repetitive, mainly because of the
+overwhelming predominance of tone group 1 and the universal placement
+of tonic stress on the final foot.
+.pp
+There are certainly many different ways to orate any particular text,
+and that given by Halliday and reproduced in Table 9.2 is only one possible
+version.
+However, it is fair to say that the default intonation discussed above
+could only occur naturally under very unusual circumstances \(em such as
+a petulant child, unwilling and sulky, having been forced to read aloud.
+This is hardly how we want our computers to speak!
+.rh "Rhythm analysis."
+Consider now how to decide where foot boundaries should be placed
+in English text.
+Clearly semantic considerations sometimes play a part in this \(em one could
+say
+.LB
+/^ is /this /train /going /*to /London
+.LE
+instead of the more usual
+.LB
+/^ is /this /train /going to /*London
+.LE
+in circumstances where the train might be going
+.ul
+to
+or
+.ul
+from
+London.
+Such effects are ignored here, although it is worth noting in passing that the
+rogue words will often be marked by underscoring or italicizing
+(as in the previous sentence).
+If the text is liberally underlined, semantic analysis may
+be unnecessary for the purposes of rhythm.
+.pp
+A rough and ready rule for placing foot boundaries is to insert one before
+each word which is not in a small closed set of "function words".
+The set includes, for example, "a", "and", "but", "for", "is", "the", "to".
+If a verb or adjective begins with a prefix, the boundary should be moved
+between it and the root \(em but not for a noun.
+This will give the distinction between
+.ul
+con\c
+vert (noun) and con\c
+.ul
+vert
+(verb),
+.ul
+ex\c
+tract and ex\c
+.ul
+tract,
+and for many North American speakers,
+will help to distinguish
+.ul
+in\c
+quiry from in\c
+.ul
+quire.
+However, detecting prefixes by a simple splitting algorithm is dangerous.
+For example, "predate" is a verb with stress on what appears to be a prefix,
+contrary to the rule; while the "pre" in "predator" is not a prefix \(em at
+least, it is not pronounced as the prefix "pre" normally is.
+Moreover, polysyllabic words like "/diplomat", "dip/lomacy", "diplo/matic";
+or "/telegraph", "te/legraphy", "tele/graphic" cannot be handled on such a simple
+basis.
+.pp
+In 1968, a remarkable work on English sound structure was published
+(Chomsky and Halle, 1968) which proposes a system of rules to transform
+English text into a phonetic representation in terms of distinctive features,
+with the aid of a lexicon.
+.[
+Chomsky Halle 1968
+.]
+A great deal of attention is paid to stress, and rules are given which
+perform well in many tricky cases.
+.pp
+It uses the American system of levels of stress, marking
+so-called primary stress with a superscript 1, secondary stress with a
+superscript 2, and so on.
+The superscripts are written on the vowel of the stressed
+syllable:  completely unstressed syllables receive no annotation.
+For example, the sentence "take John's blackboard eraser" is written
+.LB
+ta\u2\dke Jo\u3\dhn's bla\u1\dckboa\u5\drd era\u4\dser.
+.LE
+In foot notation this utterance
+is
+.LB
+/take /John's /*blackboard e/raser.
+.LE
+It undoubtedly contains less information than the stress-level version.
+For example, the second syllable of "blackboard" and the first one of "erase"
+are both unstressed, although the rhythm rules given in Chapter 8
+will cause them
+to be treated differently because they occupy different places in the
+syllable pattern of the foot.
+"Take", "John's", and the second syllable of "erase" are all non-tonic
+foot-initial syllables and hence are not distinguished in the notation;
+although the pitch contours schematized in Figure 8.9 will give them different
+intonations.
+.pp
+An indefinite number of levels of stress can be used.  For example, according
+to the rules given by Chomsky and Halle, the word "sad" in
+.LB
+my friend can't help being shocked at anyone who would fail to consider
+his sad plight
+.LE
+has level-8 stress, the final two words being annotated
+as "sa\u8\dd pli\u1\dght".
+However, only the first few levels are used regularly, and
+it is doubtful whether acoustic distinctions are made in speech
+between the weaker ones.
+.pp
+Chomsky and Halle are concerned to distinguish between such utterances as
+.LB
+.NI
+bla\u2\dck boa\u1\drd-era\u3\dser    ("board eraser that is black")
+.NI
+bla\u1\dckboa\u3\drd era\u2\dser     ("eraser for a blackboard")
+.NI
+bla\u3\dck boa\u1\drd era\u2\dser    ("eraser of a black board"),
+.LE
+and their stress assignment rules do indeed produce each version when
+appropriate.
+In foot notation the distinctions can still be made:
+.LB
+.NI
+/black /*board-eraser/
+.NI
+/*blackboard e/raser/
+.NI
+/black /*board e/raser/
+.LE
+.pp
+The rules operate on a grammatical derivation tree
+of the text.
+For instance, input for the three examples would be written
+.LB
+.NI
+[\dNP\u[\dA\u black ]\dA\u [\dN\u[\dN\u board]\dN\u
+[\dN\u eraser ]\dN\u]\dN\u]\dNP\u
+.NI
+[\dN\u[\dN\u[\dA\u black ]\dA\u [\dN\u board ]\dN\u]\dN\u [\dN\u eraser ]\dN\u]\dN\u
+.NI
+[\dN\u[\dNP\u[\dA\u black ]\dA\u [\dN\u board ]\dN\u]\dNP\u [\dN\u eraser ]\dN\u]\dN\u,
+.LE
+representing the trees shown in Figure 9.2.
+.FC "Figure 9.2"
+Here, N stands for a noun, NP for a noun phrase, and A for an adjective.
+These categories appear explicitly as nodes in the tree.
+In the linearized textual representation they are used to label
+brackets which represent the tree structure.
+An additional piece of information which is needed is the lexical entry for
+"eraser", which would show that it has only one accented
+(that is, potentially stressed) syllable, namely, the second.
+.pp
+Consider now how to account for stress in prefixed and
+suffixed words, and those polysyllabic ones with more than one potential
+stress point.
+For these, the morphological structure must appear in the input.
+.pp
+Now
+.ul
+morphemes
+are well-defined minimal units of grammatical analysis from which a word
+may be composed.
+For example,  [went]\ =\ [go]\ +\ [ed]  is
+a morphemic decomposition, where "[ed]" denotes the
+past-tense morpheme.
+This representation is not particularly suitable for speech synthesis
+for the obvious reason that the result bears no phonetic resemblance to
+the input.
+What is needed is a decomposition into
+.ul
+morphs,
+which occur only when the lexical or phonetic representation of a word may
+easily be segmented into parts.
+Thus  [wanting]\ =\ [want]\ +\ [ing]  and  [bigger]\ =\ [big]\ +\ [er]  are
+simultaneously morphic and morphemic decompositions.
+Notice that in the second example, a rule about final consonant doubling has
+been applied at the lexical level (although it is not needed in
+a phonetic representation):  this comes into the sphere
+of "easy" segmentation.
+Contrast this with  [went]\ =\ [go]\ +\ [ed]  which
+is certainly not an easy segmentation and hence a
+morphemic but not a morphic decomposition.
+But between these extremes there are some difficult
+cases:  [specific]\ =\ [specify]\ +\ [ic]  is probably morphic
+as well as morphemic, but it is not clear
+that  [galactic]\ =\ [galaxy]\ +\ [ic]  is.
+.pp
+Assuming that the input is given as a derivation tree with morphological
+structure made explicit, Chomsky and Halle present rules which assign stress
+correctly in nearly all cases.  For example, their rules give
+.LB
+.NI
+[\dA\u[\dN\u incident ]\dN\u + al]\dA\u  \(em>  i\u2\dncide\u1\dntal;
+.LE
+and if the stem is marked by  [\dS\u\ ...\ ]\dS\u  in prefixed words,
+they can deduce
+.LB
+.NI
+[\dN\u tele [\dS\u graph ]\dS\u]\dN\u		\(em>  te\u1\dlegra\u3\dph
+.NI
+[\dN\u[\dN\u tele [\dS\u graph ]\dS\u]\dN\u y ]\dN\u	\(em>  tele\u1\dgraphy
+.NI
+[\dA\u[\dN\u tele [\dS\u graph ]\dS\u]\dN\u ic ]\dA\u	\(em>  te\u3\dlegra\u1\dphi\u2\dc.
+.LE
+.pp
+There are two rules which account for the word-level stress
+on such examples:  the "main stress"
+rule and the "alternating stress" rule.
+In essence, the main stress rule emphasizes the last strong syllable
+of a stem.
+A syllable is "strong" either if it contains one of a class of so-called
+"long" vowels, or if there is a cluster of two or more consonants
+following the vowel; otherwise it is "weak".
+(If you are exceptionally observant you will notice that this strong\(emweak
+distinction has been used before, when discussing the rhythm of feet in
+syllables.)  Thus the verb "torment" receives stress on the second syllable,
+for it is a strong one.
+A noun like "torment" is treated as being derived from the corresponding verb,
+and the rule assigns stress to the verb first and then modifies it for the noun.
+The second, "alternating stress", rule gives some stress to alternate
+syllables of polysyllabic words like "form\c
+.ul
+al\c
+de\c
+.ul
+hyde\c
+".
+.pp
+It is quite easy to incorporate the word-level rules into a computer
+program which uses feet rather than stress levels as the basis for prosodic
+description.
+A foot boundary is simply placed before the primary-stressed (level-1) syllable,
+except for function words, which do not begin a foot.
+The other stress levels should be ignored,
+except that for slow, deliberate speech, secondary (level-2) stress is
+mapped into a foot boundary too, if it precedes the primary stress.
+There is also a rule which reduces vowels in unstressed
+syllables.
+.pp
+The stress assignment rules can work on phonemic script, as well as English.
+For example, starting from the phonetic
+form  [\d\V\u\ \c
+.ul
+aa\ s\ t\ o\ n\ i\ sh\ \c
+]\dV\u,
+the stress assignment rules
+produce  \c
+.ul
+aa\ s\ t\ o\u1\d\ n\ i\ sh\ ;\c
+  the
+vowel reduction rule
+generates  \c
+.ul
+uh\ s\ t\ o\u1\d\ n\ i\ sh\ ;\c
+  and
+the foot conversion process
+gives  \c
+.ul
+uh\ s/t\ o\ n\ i\ sh.
+This appears to provide a fairly reliable algorithm for foot boundary
+placement.
+.rh "Speech synthesis from concept."
+I argued earlier that in order to derive prosodic features
+of an utterance from text it
+is necessary to understand its role in the dialogue, its semantics,
+its syntax, and \(em as we have just seen \(em its morphological structure.
+This is a very tall order, and the problem of natural language comprehension
+by machine is a vast research area in its own right.
+However, in many applications requiring speech output,
+utterances are generated by the computer from internally stored data
+rather than being read aloud from pre-prepared text.
+Then the problem of comprehending text may be evaded, for
+presumably the language-generation module can provide a semantic,
+syntactic, and even morphological decomposition of the utterance,
+as well as some indication of its role in the dialogue
+(that is, why it is necessary to say it).
+.pp
+This forms the basis of the appealing notion of "speech synthesis from concept".
+It has some advantages over speech generation from text, and in principle
+should provide more natural-sounding speech.
+Every word produced by the system can have a complete lexical entry which
+shows its morphological decomposition and potential stress points.
+The full syntactic history of each utterance is known.
+The Chomsky-Halle rules described above can therefore be used to place
+foot boundaries accurately, without the need for a complex parsing program
+and without the risk of having to make guesses about unknown words.
+.pp
+However, it is not clear how to take advantage of any semantic information
+which is available.  Ideally, it should be possible to place tone group
+boundaries and tonic stress points, and assign intonation contours, in
+a natural-sounding way.
+But look again at the example text of Table 9.2 and imagine that you have
+at your disposal as much semantic information as is needed.
+It is
+.ul
+still
+far from obvious how the intonation features could be assigned!
+It is, in the ultimate analysis, interpretive and stylistic
+.ul
+choices
+that add variety and interest to speech.
+.pp
+Take the problem of determining pitch contours, for instance.
+Some of them may be explicable.
+Contour 4 on
+.LB
+.NI
+except the parts that are covered in caravans of course
+.LE
+is due to its being a contrastive clause, for it presents
+essentially new information.
+Similarly, the succession
+.LB
+.NI
+if you go in spring
+.NI
+when the gorse is out
+.NI
+or in summer
+.NI
+when the heather's out
+.LE
+could be considered contrastive, being in the subjunctive voice, and
+this could explain why contour 4's were used.
+But this is all conjecture, and it is difficult to apply throughout the
+passage.
+Halliday (1970) explains the contexts in which each tone group is typically
+used, but in an extremely high-level manner which would be impossible
+to embody directly in a computer program.
+.[
+Halliday 1970 Course in spoken English: Intonation
+.]
+At the other end of the spectrum, computer systems for written
+discourse production do not seem to provide the subtle information needed
+to make intonation decisions (see, for example, Davey, 1978, for a fairly
+complete description of such a system).
+.[
+Davey 1978
+.]
+.pp
+One project which uses such a method for generating speech has been
+described (Young and Fallside, 1980).
+.[
+Young Fallside 1980
+.]
+Although some attention is paid to rhythm, the intonation contours
+which are generated are disappointingly repetitive and lacking in
+richness.
+In fact, very little semantic information is used to assign contours; really
+just that inferred by the crude punctuation-driven method described
+earlier.
+.pp
+The higher-level semantic problems associated with speech output were
+studied some years go under the
+title "synthetic elocution" (Vanderslice, 1968).
+.[
+Vanderslice 1968
+.]
+A set of rules was generated and tested by hand on a sample passage,
+the first part of which is shown in Table 9.4.
+However, no attempt was made to formalize the rules in a computer program,
+and indeed it was recognized that a number of important questions,
+such as the form of the semantic information assumed at the input,
+had been left unanswered.
+.RF
+.nr x0 \w'\0\0  psychologist   '+\w'emphasis assigned because of antithesis with  '
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta \w'\0\0  psychologist   'u
+\l'\n(x0u\(ul'
+.sp
+Human experience and human behaviour are accessible to
+observation by everyone.  The psychologist tries to bring
+them under systematic study.  What he perceives, however,
+anyone can perceive; for his task he requires no microscope
+or electronic gear.
+.sp2
+\0\0  word	comments
+\l'\n(x0u\(ul'
+.sp
+\01  Human	special treatment because paragraph-initial
+\04  human	accent deleted because it echoes word 1
+13  psychologist	emphasis assigned because of antithesis with
+	"everyone"
+17  them	anaphoric to "Human experience and human
+	behaviour"
+19  systematic	emphasis assigned because of contrast with
+	"observation"
+20  study	emphasis? \(em text is ambiguous whether
+	"observation" is a kind of study that is
+	nonsystematic, or an activity contrasting
+	with the entire concept of "systematic study"
+21  What	increase in pitch for "What he perceives"
+	because it is not the subject
+22  he	accented although anaphoric to word 13
+	because of antithesis with word 25
+24  however	decrease in pitch because it is parenthetical
+25  anyone	emphasized by antithesis with word 22
+27  perceive	unaccented because it echoes word 23,
+	"perceives"
+\0\0  ;	semicolon assigns falling intonation
+30  task	unaccented because it is anaphoric with
+	"tries to bring them under systematic study"
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 9.4  Sample passage and comments pertinent to synthetic elocution"
+.pp
+The comments in the table, which are selected and slightly edited versions
+of those appearing in the original work (Vanderslice, 1968), are intended
+as examples of the nature and subtlety of the prosodic influences which
+were examined.
+.[
+Vanderslice 1968
+.]
+The concepts of "accent" and "emphasis" are used; these relate to stress
+but are not easy to define precisely in our tone-group terminology.
+Fortunately we do not need an exact characterization of them for the present
+purpose.
+Roughly speaking, "accent" encompasses both foot-initial stress and
+tonic stress, whereas "emphasis" is something more than this,
+typically being realized by the fall-rise or rise-fall contours of
+Halliday's tone groups 4 and 5 (Figure 8.5).
+.pp
+Particular attention is paid to anaphora and antithesis (amongst other things).
+The first term means the repetition of a word or phrase in the text,
+and is often applied to pronoun references.
+In the example, the word "human" is repeated in the first few words;
+"them" in the second sentence refers to "human experience and human
+behaviour"; "he" in the third sentence is the previously-mentioned
+psychologist; and "task" is anaphoric with "tries to bring them under
+systematic study".
+Other things being equal, anaphoric references are unaccented.
+In our terms this means that they certainly do not receive tonic stress
+and may not even receive foot stress.
+.pp
+Antithesis is defined as the contrast of ideas expressed by parallelism of
+strongly contrasting words or phrases; and the second element taking part
+in it is generally emphasized.
+"Psychologist" in the passage is an antithesis of "everyone";
+"systematic" and possibly "study" of "observation".
+Thus
+.LB
+.NI
+/^ the psy/*chologist
+.LE
+would probably receive intonation contour 4, since it is also introducing
+a new actor; while
+.LB
+.NI
+/tries to /bring them /under /system/*matic /study
+.LE
+could receive contour 5.
+"He" and "everyone" are antithetical; not only does the latter receive
+emphasis but the former has its accent restored \(em for otherwise
+it would have been removed because of anaphora with "psychologist".
+Hence it will certainly begin a foot, possibly a tonic foot.
+.pp
+A factor that does not affect the sample passage is the accentuation
+of unusual syllables of similar words to bring out a contrast.
+For example,
+.LB
+.NI
+he went
+.ul
+out\c
+side, not
+.ul
+in\c
+side.
+.LE
+Although this may seem to be just another facet of antithesis,
+Vanderslice points out that it is phonetic rather than structural
+similarity that is contrasted:
+.LB
+.NI
+I said
+.ul
+de\c
+plane, not
+.ul
+com\c
+plain.
+.LE
+This introduces an interesting interplay between the phonetic and
+prosodic levels.
+.pp
+Anaphora and antithesis provide an ideal domain for speech synthesis from
+concept.
+Determining them from plain text is a very difficult problem,
+requiring a great deal of real-world knowledge.
+The first has received some attention in the field of natural language
+understanding.
+Finding pronoun referents is an important problem for language translation,
+for their gender is frequently distinguished in, say, French where it is not
+in English.
+Examples such as
+.LB
+.NI
+I bought the wine, sat on a table, and drank it
+.NI
+I bought the wine, sat on a table, and broke it
+.LE
+have been closely studied (Wilks, 1975); for if they were to be translated
+into French the pronoun "it" would be rendered differently in each case
+(\c
+.ul
+le
+vin,
+.ul
+la
+table).
+.[
+Wilks 1975 An intelligent analyzer and understander of English
+.]
+.pp
+In spoken language, emphasis is used to indicate the referent of a pronoun
+when it would not otherwise be obvious.
+Vanderslice gives the example
+.LB
+.NI
+Bill saw John across the room and he ran over to him
+.NI
+Bill saw John across the room and
+.ul
+he
+ran over to
+.ul
+him,
+.LE
+where the emphasis reverses the pronoun referents
+(so that John did the running).
+He suggests accenting a personal pronoun whenever the true
+antecedent is not the same as the "unmarked" or default one.
+Unfortunately he does not elaborate on what is meant by "unmarked".
+Does it mean that the referent cannot be predicted from
+knowledge of the words alone \(em as in the second example above?
+If so, this is a clear candidate for speech synthesis from concept,
+for the distinction cannot be made from text! 
+.sh "9.2  Pronunciation"
+.pp
+English pronunciation is notoriously irregular.
+A poem by Charivarius, the pseudonym of a Dutch high school teacher
+and linguist G.N.Trenite (1870\-1946), surveys the problems in an amusing
+way and is worth quoting in full.
+.br
+.ev2
+.in 0
+.LB "nnnnnnnnnnnnnnnn"
+.ul
+              The Chaos
+.sp2
+.ne4
+Dearest creature in Creation
+Studying English pronunciation,
+.in +5n
+I will teach you in my verse
+Sounds like corpse, corps, horse and worse.
+.ne4
+.in -5n
+It will keep you, Susy, busy,
+Make your head with heat grow dizzy;
+.in +5n
+Tear in eye your dress you'll tear.
+So shall I!  Oh, hear my prayer:
+.ne4
+.in -5n
+Pray, console your loving poet,
+Make my coat look new, dear, sew it.
+.in +5n
+Just compare heart, beard and heard,
+Dies and diet, lord and word.
+.ne4
+.in -5n
+Sword and sward, retain and Britain,
+(Mind the latter, how it's written).
+.in +5n
+Made has not the sound of bade,
+Say \(em said, pay \(em paid, laid, but plaid.
+.ne4
+.in -5n
+Now I surely will not plague you
+With such words as vague and ague,
+.in +5n
+But be careful how you speak:
+Say break, steak, but bleak and streak,
+.ne4
+.in -5n
+Previous, precious; fuchsia, via;
+Pipe, shipe, recipe and choir;
+.in +5n
+Cloven, oven; how and low;
+Script, receipt; shoe, poem, toe.
+.ne4
+.in -5n
+Hear me say, devoid of trickery;
+Daughter, laughter and Terpsichore;
+.in +5n
+Typhoid, measles, topsails, aisles;
+Exiles, similes, reviles;
+.ne4
+.in -5n
+Wholly, holly; signal, signing;
+Thames, examining, combining;
+.in +5n
+Scholar, vicar and cigar,
+Solar, mica, war and far.
+.ne4
+.in -5n
+Desire \(em desirable, admirable \(em admire;
+Lumber, plumber; bier but brier;
+.in +5n
+Chatham, brougham; renown but known,
+Knowledge; done, but gone and tone,
+.ne4
+.in -5n
+One, anemone; Balmoral,
+Kitchen, lichen; laundry, laurel;
+.in +5n
+Gertrude, German; wind and mind;
+Scene, Melpemone, mankind;
+.ne4
+.in -5n
+Tortoise, turquoise, chamois-leather,
+Reading, Reading; heathen, heather.
+.in +5n
+This phonetic labyrinth
+Gives:  moss, gross; brook, brooch; ninth, plinth.
+.ne4
+.in -5n
+Billet does not end like ballet;
+Bouquet, wallet, mallet, chalet;
+.in +5n
+Blood and flood are not like food,
+Nor is mould like should and would.
+.ne4
+.in -5n
+Banquet is not nearly parquet,
+Which is said to rime with darky
+.in +5n
+Viscous, viscount; load and broad;
+Toward, to forward, to reward.
+.ne4
+.in -5n
+And your pronunciation's O.K.
+When you say correctly:  croquet;
+.in +5n
+Rounded, wounded; grieve and sieve;
+Friend and fiend, alive and live
+.ne4
+.in -5n
+Liberty, library; heave and heaven;
+Rachel, ache, moustache; eleven.
+We say hallowed, but allowed;
+People, leopard; towed, but vowed.
+.in +5n
+Mark the difference moreover
+Between mover, plover, Dover;
+.ne4
+.in -5n
+Leeches, breeches; wise, precise;
+Chalice, but police and lice.
+.in +5n
+Camel, constable, unstable,
+Principle, discipline, label;
+.ne4
+.in -5n
+Petal, penal and canal;
+Wait, surmise, plait, promise; pal.
+.in +5n
+Suit, suite, ruin; circuit, conduit,
+Rime with:  "shirk it" and "beyond it";
+.ne4
+.in -5n
+But it is not hard to tell
+Why it's pall, mall, but Pall Mall.
+.in +5n
+Muscle, muscular; goal and iron;
+Timber, climber; bullion, lion;
+.ne4
+.in -5n
+Worm and storm; chaise, chaos, chair;
+Senator, spectator, mayor.
+.in +5n
+Ivy, privy; famous, clamour
+and enamour rime with "hammer".
+.ne4
+.in -5n
+Pussy, hussy and possess,
+Desert, but dessert, address.
+.in +5n
+Golf, wolf; countenants; lieutenants
+Hoist, in lieu of flags, left pennants.
+.ne4
+.in -5n
+River, rival; tomb, bomb, comb;
+Doll and roll, and some and home.
+.in +5n
+Stranger does not rime with anger,
+Neither does devour with clangour.
+.ne4
+.in -5n
+Soul, but foul; and gaunt, but aunt;
+Font, front, won't; want, grand and grant;
+.in +5n
+Shoes, goes, does.  Now first say:  finger,
+And then; singer, ginger, linger.
+.ne4
+.in -5n
+Real, zeal; mauve, gauze and gauge;
+Marriage, foliage, mirage, age.
+.in +5n
+Query does not rime with very,
+Nor does fury sound like bury.
+.ne4
+.in -5n
+Dost, lost, post; and doth, cloth, loth;
+Job, Job; blossom, bosom, oath.
+.in +5n
+Though the difference seems little
+We say actual, but victual;
+.ne4
+.in -5n
+Seat, sweat; chaste, caste; Leigh, eight, height;
+Put, nut; granite but unite.
+.in +5n
+Reefer does not rime with deafer,
+Feoffer does, and zephyr, heifer.
+.ne4
+.in -5n
+Dull, bull; Geoffrey, George; ate, late;
+Hint, pint; senate, but sedate.
+.in +5n
+Scenic, Arabic, Pacific;
+Science, conscience, scientific.
+.ne4
+.in -5n
+Tour, but our, and succour, four;
+Gas, alas and Arkansas!
+.in +5n
+Sea, idea, guinea, area,
+Psalm, Maria, but malaria.
+.ne4
+.in -5n
+Youth, south, southern; cleanse and clean;
+Doctrine, turpentine, marine.
+.in +5n
+Compare alien with Italian.
+Dandelion with battalion,
+.ne4
+.in -5n
+Sally with ally, Yea, Ye,
+Eye, I, ay, aye, whey, key, quay.
+Say aver, but ever, fever,
+Neither, leisure, skein, receiver.
+.in +5n
+Never guess \(em it is not safe;
+We say calves, valves, half, but Ralf.
+.ne4
+.in -5n
+Heron, granary, canary;
+Crevice and device and eyrie;
+.in +5n
+Face, preface, but efface,
+Phlegm, phlegmatic; ass, glass, bass;
+.ne4
+.in -5n
+Large, but target, gin, give, verging;
+Ought, out, joust and scour, but scourging;
+.in +5n
+Ear, but earn; and wear and tear
+Do not rime with "here", but "ere".
+.ne4
+.in -5n
+Seven is right, but so is even;
+Hyphen, roughen, nephew, Stephen;
+.in +5n
+Monkey, donkey; clerk and jerk;
+Asp, grasp, wasp; and cork and work.
+.ne4
+.in -5n
+Pronunciation \(em think of psyche -
+Is a paling, stout and spikey;
+.in +5n
+Won't it make you lose your wits,
+Writing groats and saying "groats"?
+.ne4
+.in -5n
+It's a dark abyss or tunnel,
+Strewn with stones, like rowlock, gunwale,
+.in +5n
+Islington and Isle of Wight,
+Housewife, verdict and indict.
+.ne4
+.in -5n
+Don't you think so, reader, rather
+Saying lather, bather, father?
+.in +5n
+Finally:  which rimes with "enough",
+Though, through, plough, cough, hough or tough?
+.ne4
+.in -5n
+Hiccough has the sound of "cup",
+My advice is ... give it up!
+.LE "nnnnnnnnnnnnnnnn"
+.br
+.ev
+.rh "Letter-to-sound rules."
+Despite such irregularities, it is surprising how much can be done
+with simple letter-to-sound rules.
+These specify phonetic equivalents of word fragments and single letters.
+The longest stored fragment which matches the current word is translated,
+and then the same strategy is adopted on the remainder of the word.
+Table 9.5 shows some English fragments and their pronunciations.
+.RF
+.nr x0 1.5i+\w'pronunciation  '
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta 1.5i
+fragment	pronunciation
+\l'\n(x0u\(ul'
+.sp
+-p-	\fIp\fR
+-ph-	\fIf\fR
+-phe|	\fIf ee\fR
+-phe|s	\fIf ee z\fR
+-phot-	\fIf uh u t\fR
+-place|-	\fIp l e i s\fR
+-plac|i-	\fIp l e i s i\fR
+-ple|ment-	\fIp l i m e n t\fR
+-plie|-	\fIp l aa i y\fR
+-post	\fIp uh u s t\fR
+-pp-	\fIp\fR
+-pp|ly-	\fIp l ee\fR
+-preciou-	\fIp r e s uh\fR
+-proce|d-	\fIp r uh u s ee d\fR
+-prope|r-	\fIp r o p uh r\fR
+-prov-	\fIp r uu v\fR
+-purpose-	\fIp er p uh s\fR
+-push-	\fIp u sh\fR
+-put	\fIp u t\fR
+-puts	\fIp u t s\fR
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 9.5  Word fragments and their pronunciations"
+.pp
+It is sometimes important to specify that a rule applies only when
+the fragment is matched at the beginning or end of a word.
+In the Table "-" means that other fragments can precede or follow this
+one.
+The "|" sign is used to separate suffixes from a word stem,
+as will be explained
+shortly.
+.pp
+An advantage of the longest-string search strategy is that it is easy
+to account for exceptions simply by incorporating them into the fragment
+table.
+If they occur in the input, the complete word will automatically be
+matched first, before any fragment of it is translated.
+The exception list of complete words can be surprisingly small for
+quite respectable performance.
+Table 9.6 shows the entire dictionary for an excellent early pronunciation
+system written at Bell Laboratories (McIlroy, 1974).
+.[
+McIlroy 1974
+.]
+Some of the words are notorious exceptions in English, while others are
+included simply because the rules would run amok on them.
+Notice that the exceptions are all quite short, with only a few of them
+having more than two syllables.
+.RF
+.nr x1 0.9i+0.9i+0.9i+0.9i+0.9i+0.9i
+.nr x1 (\n(.l-\n(x1)/2
+.in \n(x1u
+.ta 0.9i +0.9i +0.9i +0.9i +0.9i
+a	doesn't	guest	meant	reader	those
+alkali	doing	has	moreover	refer	to
+always	done	have	mr	says	today
+any	dr	having	mrs	seven	tomorrow
+april	early	heard	nature	shall	tuesday
+are	earn	his	none	someone	two
+as	eleven	imply	nothing	something	upon
+because	enable	into	nowhere	than	very
+been	engine	is	nuisance	that	water
+being	etc	island	of	the	wednesday
+below	evening	john	on	their	were
+body	every	july	once	them	who
+both	everyone	live	one	there	whom
+busy	february	lived	only	thereby	whose
+copy	finally	living	over	these	woman
+do	friday	many	people	they	women
+does	gas	maybe	read	this	yes
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 9.6  Exception table for a simple pronunciation program"
+.pp
+Special action has to be taken with final "e"'s.
+These lengthen and alter the quality
+of the preceding vowel, so that "bit" becomes "bite" and so on.
+Unfortunately, if the word has a suffix the "e" must be detected even though
+it is no longer final, as in "lonely", and it is even dropped sometimes
+("biting") \(em otherwise these would be pronounced "lonelly", "bitting".
+To make matters worse the suffix may be another word:  we do not
+want "kiteflying" to have an extra syllable which rhymes with "deaf"!
+Although simple procedures can be developed to take care of common
+word endings like "-ly", "-ness", "-d", it is difficult to decompose
+compound words like "wisecrack" and "bumblebee" reliably \(em but this must
+be done if they are not to be articulated with three syllables instead of two.
+Of course, there are exceptions to the final "e" rule.
+Many common words ("some", "done", "[live]\dV\u") disobey the rule by not
+lengthening the main vowel, while in other, rarer, ones ("anemone",
+"catastrophe", "epitome") the final "e" is actually pronounced.
+There are also some complete anomalies ("fete").
+.pp
+McIlroy's (1974) system is a superb example of a robust program which takes
+a pragmatic approach to these problems, accepting that they will never be
+fully solved, and which is careful to degrade
+gracefully when stumped.
+.[
+McIlroy 1974
+.]
+The pronunciation of each word is found by a succession of increasingly
+desperate trials:
+.LB
+.NP
+replace upper- by lower-case letters, strip punctuation, and try again;
+.NP
+remove final "-s", replace final "ie" by "y", and try again;
+.NP
+reject a word without a vowel;
+.NP
+repeatedly mark any suffixes with "|";
+.NP
+mark with "|" probable morph divisions in compound words;
+.NP
+mark potential long vowels indicated by "e|",
+and long vowels elsewhere in the word;
+.NP
+mark voiced medial "s" as in "busy", "usual";
+replace final "-s" if stripped;
+.NP
+scanning the word from left to right, apply letter-to-sound rules
+to word fragments;
+.NP
+when all else fails spell the word, punctuation and all
+(burp on letters for which no spelling rule exists).
+.LE
+.RF
+.nr x0 \w'| ment\0\0\0'+\w'replace final ie by y\0\0\0'+\w'except when no vowel would remain in  '
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta \w'| ment\0\0\0'u +\w'replace final ie by y\0\0\0'u
+suffix	action	notes and exceptions
+\l'\n(x0u\(ul'
+.sp
+s	strip off final s	except in context us
+\&'	strip off final '
+ie	replace final ie by y
+e	replace final e by E	when it is the only vowel in a word
+	(long "e")
+
+| able	place suffix mark as	except when no vowel would remain in
+| ably	shown	the rest of the word
+e | d
+e | n
+e | r
+e | ry
+e | st
+e | y
+| ful
+| ing
+| less
+| ly
+| ment
+| ness
+| or
+
+| ic	place suffix mark as
+| ical	shown and terminate
+e |	final e processing
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 9.7  Rules for detecting suffixes for final 'e' processing"
+.pp
+Table 9.7 shows the suffixes which the program recognizes, with some comments
+on their processing.
+Multiple suffixes are detected and marked in words like
+"force|ful|ly" and "spite|ful|ness".
+This allows silent "e"'s to be spotted even when they occur far back in a
+word.
+Notice that the suffix marks are available to the word-fragment
+rules of Table 9.5, and are frequently used by them.
+.pp
+The program has some
+.ul
+ad hoc
+rules for dealing with compound words like "race|track", "house|boat";
+these are applied as well as normal suffix splitting so that multiple
+decompositions like "pace|make|r" can be accomplished.
+The rules look for short letter sequences which do not
+usually appear in monomorphemic words.
+It is impossible, however, to detect every morph boundary
+by such rules, and the program inevitably makes mistakes.
+Examples of boundaries which go undetected are
+"edge|ways", "fence|post", "horse|back", "large|mouth", "where|in";
+while boundaries are incorrectly inserted into "comple|mentary",
+"male|volent", "prole|tariat", "Pame|la".
+.pp
+We now seem to have presented two opposing points of view on the pronunciation
+problem.
+Charivarius, the Dutch poet, shows that an enormous number of
+exceptional words exist; whereas McIlroy's program makes do with a tiny
+exception dictionary.
+These views can be reconciled by noting that most of Charivarius' words
+are relatively uncommon.
+McIlroy tested his program against the 2000 most frequent words in a large
+corpus (Kucera and Francis, 1967),
+and found that 97% were pronounced correctly if word frequencies were
+taken into account.
+.[
+Kucera Francis 1967
+.]
+(The notion of "correctness" is of course a rather subjective one.)  However,
+he estimated that on the remaining words the success rate was only 88%.
+.pp
+The system is particularly impressive in that it is prepared to say
+anything:  if used, for example, on source programs in a high-level
+computer language it will say the keywords and pronouncable
+identifiers, spell the other identifiers, and even give the names of special
+symbols (like +, <, =) correctly!
+.rh "Morphological analysis."
+The use of letter-to-sound rules provides a cheap and fast technique
+for pronunciation \(em the fragment table and exception dictionary for the
+program described above occupy only 11 Kbyte of storage, and can easily
+be kept in solid-state read-only memory.
+It produces reasonable results if careful attention is paid to rules
+for suffix-splitting.
+However, it is inherently limited because it is not possible in general
+to detect compound words by simple rules which operate on the lexical
+structure of the word.
+.pp
+Compounds can only be found reliably by using a morph dictionary.
+This gives the added advantage that syntactic information
+can be stored with the morphs to assist with rhythm assignment according
+to the Chomsky-Halle theory.
+However, it was noted earlier that morphs, unlike the grammatically-determined
+morphemes, are not very well defined from a linguistic point of view.
+Some morphemic decompositions are obviously not morphic because the
+constituents do not in any way resemble the final word;
+while others, where the word is simply a concatenation
+of its components, are clearly morphic.
+Between these extremes lies a hazy region where what one considers
+to be a morph depends upon how complex one is prepared to make the
+concatenation rules.
+The following description draws on techniques used in a project at MIT
+in which a morph-based pronunciation system has been implemented
+(Lee, 1969; Allen, 1976).
+.[
+Lee 1969
+.]
+.[
+Allen 1976 Synthesis of speech from unrestricted text
+.]
+.pp
+Estimates of the number of morphs in English vary from 10,000 to 30,000.
+Although these seem to be very large numbers, they are considerably less
+than the number of words in the language.
+For example, Webster's
+.ul
+New Collegiate Dictionary
+(7'th edition) contains about 100,000 entries.
+If all forms of the words were included, this number would probably
+double.
+.pp
+There are several classes of morphs, with restrictions on the combinations
+that occur.
+A general word has prefixes, a root, and suffixes, as shown in Figure 9.3;
+only the root is mandatory.
+.FC "Figure 9.3"
+Suffixes usually perform a grammatical role, affecting the
+conjugation of a verb or declension of a noun; or transforming one
+part of speech into another
+("-al" can make a noun into an adjective, while "-ness" performs the reverse
+transformation.)  Other
+suffixes, such as "-dom" or "-ship", only apply to certain parts of
+speech (nouns, in this case), but do not change the grammatical
+role of the word.  Such suffixes, and all prefixes, alter the meaning
+of a word.
+.pp
+Some root morphs cannot combine with other morphs but always stand
+alone \(em for instance, "this".
+Others, called free morphs, can either occur on their own or combine
+with further morphs to form a word.
+Thus the root "house" can be joined on either side by another root,
+such as "boat",
+or by a suffix such as "ing".
+A third type of root morph is one which
+.ul
+must
+combine with another morph, like "crimin-", "-ceive".
+.pp
+Even with a morph dictionary, decomposing a word into a sequence
+of morphs is not a trivial operation.
+The process of lexical concatenation often results in a
+minor change in the constituents.
+How big this change is allowed to be governs the morph system being used.
+For example, Allen (1976) gives three concatenation rules:  a
+final "e" can be omitted, as in
+.ta 1.1i
+.LB
+.NI
+give + ing	\(em>  giving;
+.LE
+the last consonant of the root can be doubled, as in
+.LB
+.NI
+bid + ing	\(em>  bidding;
+.LE
+or a final "y" can change to an "i", as in
+.LB
+.NI
+handy + cap	\(em>  handicap.
+.[
+Allen 1976 Synthesis of speech from unrestricted text
+.]
+.LE
+If these are the only rules permitted, the morph dictionary will
+have to include multiple versions of some suffixes.
+For example, the plural morpheme [-s] needs to be represented both by
+"-s" and "-es", to account for
+.LB
+.NI
+pea + s	\(em>  peas
+.LE
+and
+.LB
+.NI
+baby + es	\(em>  babies  (using the "y" \(em> "i" rule).
+.LE
+This would not be necessary if a  "y" \(em> "ie"  rule were included too.
+Similarly, the morpheme [-ic] will include morphs
+"-ic" and "-c"; the latter to cope with
+.LB
+.NI
+specify + c	\(em>  specific    (using the "y" \(em> "i" rule).
+.LE
+Furthermore, non-morphemic roots such as "galact" need to be included because
+the concatenation rules do not capture the transformation
+.LB
+.NI
+galaxy + ic	\(em>  galactic.
+.LE
+There is clearly a trade-off between the size of the morph dictionary
+and the complexity of the concatenation rules.
+.pp
+Since a text-to-speech system is presented with already-concatenated
+morphs, it must be prepared to reverse the effects of the concatenation
+rules to deduce the constituents of a word.
+When two morphs combine with any of the three rules given above,
+the changes in spelling occur only in the lefthand one.
+Therefore the word is best scanned in a right-to-left direction to
+split off the morphs starting with suffixes, as McIlroy's program does.
+If the procedure fails at any point, one of the three rules is
+hypothesized, its effect is undone, and splitting continues.
+For example, consider the word
+.LB
+.NI
+grasshoppers	<\(em  grass + hop + er + s
+.LE
+(Lee, 1969).
+.[
+Lee 1969
+.]
+The "-s" is detected first, then "-er"; these are both stored in
+the dictionary as suffixes.
+The remainder, "grasshopp", cannot be decomposed and does not appear
+in the dictionary.
+So each of the rules above is hypothesized in turn, and the
+result investigated.  (The "y" \(em> "i" rule is obviously not
+applicable.)  When
+the final-consonant-doubling rule is considered, the sequence
+"grasshop" is investigated.
+"Shop" could be split off this, but then the unknown morph "gras"
+would result.
+The alternative, to remove "hop", leaves a remainder "grass" which
+.ul
+is
+a free morph, as desired.
+Thus a unique and correct decomposition is obtained.
+Notice that the procedure would fail if, for example, "grass" had
+been inadvertently omitted from the dictionary.
+.pp
+Sometimes, several seemingly valid decompositions present themselves
+(Allen, 1976).
+.[
+Allen 1976 Synthesis of speech from unrestricted text
+.]
+For example:
+.LB
+.NI
+scarcity	<\(em  scar + city
+.NI
+	<\(em  scarce + ity  (using final-"e" deletion)
+.NI
+	<\(em  scar + cite + y  (using final-"e" deletion)
+.NI
+resting	<\(em  rest + ing
+.NI
+	<\(em  re + sting
+.NI
+biding	<\(em  bide + ing  (using final-"e" deletion)
+.NI
+	<\(em  bid + ing
+.NI
+unionized	<\(em  un + ion + ize + d
+.NI
+	<\(em  union + ize + d
+.NI
+winding	<\(em  [wind]\dN\u + ing
+.NI
+	<\(em  [wind]\dV\u + ing.
+.LE
+The last distinction is important because the pronunciation of "wind"
+depends on whether it is a noun or a verb.
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.pp
+Several sources of information can be used to resolve these ambiguities.
+The word structure of Figure 9.3, together with the division of root
+morphs into bound and free ones, may eliminate some possibilities.
+Certain letter sequences (such as "rp") do not appear at the beginning
+of a word or morph, and others never occur at the end.
+Knowledge of these sequences can reject some unacceptable
+decompositions \(em or perhaps more importantly, can enable intelligent guesses
+to be made in cases where a constituent morph has been omitted from the
+dictionary.
+The grammatical function of suffixes allows suffix sequences to be
+checked for compatibility.
+The syntax of the sentence, together with suffix knowledge, can
+rule out other combinations.
+Semantic knowledge will occasionally be necessary (as in the "unionized"
+and "winding" examples above \(em compare a "winding road" with a "winding
+blow").
+Finally, Allen (1976) suggests that a preference structure on composition
+rules can be used to resolve ambiguity.
+.[
+Allen 1976 Synthesis of speech from unrestricted text
+.]
+.pp
+Once the morphological structure has been determined,
+the rest of the pronunciation
+process is relatively easy.
+A phonetic transcription of each morph may be stored in the morph dictionary,
+or else letter-to-sound rules can be used on individual morphs.
+These are likely to be quite successful because final-"e" processing can be
+now be done with confidence:  there are no hidden final "e"'s in the middle
+of morphs.
+In either case the resulting phonetic transcriptions of the individual morphs
+must be concatenated to give the transcription of the complete word.
+Although some contextual modification has to be accounted for,
+it is relatively straightforward and easy to predict.
+For example, the plural morphs "-s" and "-es" can be realized phonetically
+by
+.ul
+uh\ z,
+.ul
+s,
+or
+.ul
+z
+depending on context.
+Similarly the past-tense suffix "-ed" may be rendered as
+.ul
+uh\ d,
+.ul
+t,
+or
+.ul
+d.
+The suffixes "-ion" and "-ure" sometimes cause modification of the previous
+morph:  for example
+.LB
+.NI
+act + ion  \(em>  \c
+.ul
+a k t\c
+  + ion  \(em>  \c
+.ul
+a k sh uh n.
+.LE
+.pp
+The morph dictionary does not remove the need for a lexicon of exceptional
+words.
+The irregular final-"e" words mentioned earlier ("done", "anemone", "fete")
+need to be treated on an individual basis,
+as do words such as "quadruped" which have misleading endings
+(it should not be decomposed as "quadrup|ed").
+.rh "Pronunciation of languages other than English."
+Text-to-speech systems for other languages have been reported in
+the literature.
+(For example, French, Esperanto,
+Italian, Russian, Spanish, and German are covered
+by Lesmo
+.ul
+et al,
+1978; O'Shaughnessy
+.ul
+et al,
+1981; Sherwood, 1978;
+Mangold and Stall, 1978).
+.[
+Lesmo 1978
+.]
+.[
+O'Shaughnessy Lennig Mermelstein Divay 1981
+.]
+.[
+Sherwood 1978
+.]
+.[
+Mangold Stall 1978
+.]
+Generally speaking, these present fewer difficulties than does English.
+Esperanto is particularly easy because each letter in its orthography
+has only one sound, making the pronunciation problem trivial.
+Moreover, stress in polysyllabic words always occurs on the penultimate
+syllable.
+.pp
+It is tempting and often sensible when designing a synthesis system for
+English to use an utterance representation somewhere between phonetics and
+ordinary spelling.
+This may happen in practice even if it is not intended:  a user, finding
+that a given word is pronounced incorrectly, will alter the spelling to
+make it work.
+The Word English Spelling alphabet (Dewey, 1971), amongst others (Haas, 1966),
+is a simplified and apparently natural scheme which was developed by the
+spelling reform movement.
+.[
+Dewey 1971
+.]
+.[
+Haas 1966
+.]
+It maps very simply on to a phonetic representation, just like Esperanto.
+However, it can provide little help with the crucial problem of stress
+assignment, except perhaps by explicitly indicating reduced vowels.
+.sh "9.3  Discussion"
+.pp
+This chapter has really only touched the tip of a linguistic iceberg.
+I have given some examples of representations, rules, algorithms,
+and exceptions, to make the concepts more tangible; but a whole mass of
+detail has been swept under the carpet.
+.pp
+There are two important messages that are worth reiterating once more.
+The first is that the representation of the input \(em that is,
+whether it be a "concept"
+in some semantic domain, a syntactic description of an utterance, a
+decomposition into morphs, plain text or some contrived re-spelling of it \(em
+is crucial to the quality of the output.
+Almost any extra information about the utterance can be taken into account
+and used to improve the speech.
+It is difficult to derive such information if it is not provided explicitly,
+for the process of climbing the tree from text to semantic representation is
+at least as hard as descending it to a phonetic transcription.
+.pp
+Secondly, simple algorithms perform remarkably well \(em witness the
+punctuation-driven intonation assignment scheme, and word fragment rules
+for pronunciation.
+However, the combined degradation contributed by several imperfect
+processes is likely to impair speech quality very seriously.
+And great complexity is introduced when these simple algorithms are
+discarded in favour of more sophisticated ones.
+There is, for example, a world of difference between a pronunciation
+program that copes with 97% of common words and one that deals correctly
+with 99% of a random sample from a dictionary.
+.pp
+Some of the options that face the system designer are recapitulated in
+Figure 9.4.
+.FC "Figure 9.4"
+Starting from text, one can take the simple approach of lexically-based
+suffix-splitting, letter-to-sound rules, and prosodics derived
+from punctuation, to generate a phonetic transcription.
+This will provide a cheap system which is relatively easy to implement
+but whose speech quality will probably not be acceptable to any but the
+most dedicated listener
+(such as a blind person with no other access to reading material).
+.pp
+The biggest improvement in speech quality from such a system would
+almost certainly come from more intelligent prosodic
+control \(em particularly of intonation.
+This, unfortunately, is also by far the most difficult to make unless
+intonation contours, tonic stresses, and tone-group boundaries are hand-coded
+into the input.
+To generate the appropriate information from text one has to climb to the
+upper levels in Figure 9.4 \(em and even when these are reached, the problems
+are by no means over.
+Still, let us climb the tree.
+.pp
+For syntax analysis, part-of-speech information is needed; and for this
+the grammatical roles of individual words in the text must be ascertained.
+A morph dictionary is the most reliable way to do this.
+A linguist may prefer to go from morphs to syntax by way of morphemes;
+but this is not necessary for the present purpose.
+Just the information that
+the morph "went" is a verb can be stored in the dictionary, instead
+of its decomposition  [went]\ =\ [go]\ +\ [ed].
+.pp
+Now that we have the morphological structure of the text, stress assignment rules
+can be applied to produce more accurate speech rhythms.
+The morph decomposition will also allow improvements to be made to the
+pronunciation, particularly in the case of silent "e"'s in compound words.
+But the ability to assign intonation has hardly been improved at all.
+.pp
+Let us proceed upwards.
+Now the problems become really difficult.
+A semantic representation of the text is needed; but what exactly does this
+mean?
+We certainly must have
+.ul
+morphemic
+knowledge, for now the fact that "went" is a derivative of "go"
+(rather than any other verb) becomes crucial.
+Very well, let us augment the morph dictionary with morphemic information.
+But this does not attack the problem of semantic representation.
+We may wish to resolve pronoun references to help assign stress.
+Parts of the problem are solved in principle
+and reported in the artificial intelligence
+literature, but if such an ability is incorporated into the speech
+synthesis system it will become enormously complicated.
+In addition, we have seen that knowledge of antitheses in the text will greatly
+assist intonation assignment, but procedures for extracting this
+information constitute a research topic in their own right.
+.pp
+Now step back and take a top-down approach.
+What could we do with this semantic understanding and knowledge of the structure
+of the discourse if we had it?
+Suppose the input were a "concept" in some as yet undetermined representation.
+What are the
+.ul
+acoustic
+manifestations of such high-level features as anaphoric references or
+antithetical comparisons,
+of parenthetical or satirical remarks,
+of emotions:  warmth, sarcasm, sadness and despair?
+Can we program the art of elocution?
+These are good questions. 
+.sh "9.4  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "9.5  Further reading"
+.pp
+Books on pronunciation give surprisingly little help in designing
+a text-to-speech procedure.
+The best aid is a good on-line dictionary and flexible software to
+search it and record rules, examples, and exceptions.
+Here are some papers that describe existing systems.
+.LB "nn"
+.\"Ainsworth-1974-1
+.]-
+.ds [A Ainsworth, W.A.
+.ds [D 1974
+.ds [T A system for converting text into speech
+.ds [J IEEE Trans Audio and Electroacoustics
+.ds [V AU-21
+.ds [P 288-290
+.nr [P 1
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+.in-2n
+.\"Colby-1978-2
+.]-
+.ds [A Colby, K.M.
+.as [A ", Christinaz, D.
+.as [A ", and Graham, S.
+.ds [D 1978
+.ds [K *
+.ds [T A computer-driven, personal, portable, and intelligent speech prosthesis
+.ds [J Computers and Biomedical Research
+.ds [V 11
+.ds [P 337-343
+.nr [P 1
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+.in-2n
+.\"Elovitz-1976-3
+.]-
+.ds [A Elovitz, H.S.
+.as [A ", Johnson, R.W.
+.as [A ", McHugh, A.
+.as [A ", and Shore, J.E.
+.ds [D 1976
+.ds [K *
+.ds [T Letter-to-sound rules for automatic translation of English text to phonetics
+.ds [J IEEE Trans Acoustics, Speech and Signal Processing
+.ds [V ASSP-24
+.ds [N 6
+.ds [P 446-459
+.nr [P 1
+.ds [O December
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+.in-2n
+.\"Kooi-1978-4
+.]-
+.ds [A Kooi, R.
+.as [A " and Lim, W.C.
+.ds [D 1978
+.ds [T An on-line minicomputer-based system for reading printed text aloud
+.ds [J IEEE Trans Systems, Man and Cybernetics
+.ds [V SMC-8
+.ds [P 57-62
+.nr [P 1
+.ds [O January
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+.in-2n
+.\"Umeda-1975-5
+.]-
+.ds [A Umeda, N.
+.as [A " and Teranishi, R.
+.ds [D 1975
+.ds [K *
+.ds [T The parsing program for automatic text-to-speech synthesis developed at the Electrotechnical Laboratory in 1968
+.ds [J IEEE Trans Acoustics, Speech and Signal Processing
+.ds [V ASSP-23
+.ds [N 2
+.ds [P 183-188
+.nr [P 1
+.ds [O April
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+.in-2n
+.\"Umeda-1976-6
+.]-
+.ds [A Umeda, N.
+.ds [D 1976
+.ds [K *
+.ds [T Linguistic rules for text-to-speech synthesis
+.ds [J Proc IEEE
+.ds [V 64
+.ds [N 4
+.ds [P 443-451
+.nr [P 1
+.ds [O April
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 1 journal-article
+.in+2n
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "10  DESIGNING THE MAN-COMPUTER DIALOGUE"
+.ds RT "The man-computer dialogue
+.ds CX "Principles of computer speech
+.pp
+Interactive computers are being used more and more by non-specialist people
+without much previous computer experience.
+As processing costs continue to decline, the overall expense of providing
+highly interactive systems
+becomes increasingly dominated by terminal and communications equipment.
+Taken together, these two factors highlight the need for easy-to-use,
+low-bandwidth interactive terminals that make maximum use of the existing
+telephone network for remote access.
+.pp
+Speech output can provide versatile feedback from a computer at very low
+cost in distribution and terminal equipment.  It is attractive from several
+points of view.
+Terminals \(em telephones \(em are invariably in place already.
+People without experience of computers are accustomed to their use,
+and are not intimidated by them.
+The telephone network is cheap to use and extends all over the world.
+The touch-tone keypad (or a portable tone generator)
+provides a complementary data input device which will do for many
+purposes until the technology of speech recognition becomes better developed
+and more widespread.
+Indeed, many applications \(em especially information retrieval ones \(em need
+a much smaller bandwidth from user to computer than in the reverse direction,
+and voice output combined with restricted keypad entry provides a good match
+to their requirements.
+.pp
+There are, however, severe problems in implementing natural and useful
+interactive systems using speech output.
+The eye can absorb information at a far greater rate than can the ear.
+You can scan a page of text in a way which has no analogy in auditory terms.
+Even so, it is difficult to design a dialogue which allows you to search
+computer output visually at high speed.
+In practice, scanning a new report is often better done at your desk
+with a printed copy than at a computer terminal with a viewing program
+(although this is likely to change in the near future).
+.pp
+With speech, the problem of organizing output becomes even harder.
+Most of the information we learn using our ears is presented in a
+conversational way, either in face-to-face discussions or over the telephone.
+Verbal but non-conversational presentations, as in the
+university lecture theatre, are known to be a rather inefficient way
+of transmitting information.
+The degree of interaction is extremely high even in a telephone conversation,
+and communication relies heavily on speech gestures such as hesitations,
+grunts, and pauses; on prosodic features such as intonation, pitch range,
+tempo, and voice quality; and on conversational gambits such as interruption
+and long silence.
+I emphasized in the last two chapters the rudimentary state of knowledge
+about how to synthesize
+prosodic features, and the situation is even worse
+for the other, paralinguistic, phenomena.
+.pp
+There is also a very special problem with voice output, namely, the transient
+nature of the speech signal.
+If you miss an utterance, it's gone.
+With a visual display unit, at least the last few interactions usually remain
+available.
+Even then, it is not uncommon to look up beyond the top of the screen and
+wish that more of the history was still visible!
+This obviously places a premium on a voice response system's
+ability to repeat utterances.
+Moreover, the dialogue designer must do his utmost to ensure that the user
+is always aware of the current state of the interaction,
+for there is no opportunity to refresh the memory by glancing at earlier
+entries and responses.
+.pp
+There are two separate aspects to the man-computer interface in a voice
+response system.
+The first is the relationship between the system and the end user,
+that is, the "consumer" of the synthesized dialogue.
+The second is the relationship between the system and the applications
+programmer who creates the dialogue.
+These are treated separately in the next two sections.
+We will have more to say about the former aspect,
+for it is ultimately more important to more people.
+But the applications programmer's view is important, too; for without him
+no systems would exist!
+The technical difficulties in creating synthetic dialogues
+for the majority of voice systems probably
+explain why speech output technology is still greatly under-used.
+Finally we look at techniques for using small keypads such as those on
+touch-tone telephones,
+for they are an essential part of many voice response systems.
+.sh "10.1  Programming principles for natural interaction"
+.pp
+Special attention must be paid to be details of the man-machine interface
+in speech-output systems.
+This section summarizes experience of human factors considerations
+gained in developing the remote
+telephone enquiry service described in Chapter 1 (Witten and Madams, 1977),
+which employs an ordinary touch-tone keypad for input in conjunction with
+synthetic voice response.
+.[
+Witten Madams 1977 Telephone Enquiry Service
+.]
+Most of the principles which emerged were the result of natural evolution
+of the system, and were not clear at the outset.
+Basically, they stem from the fact that speech is both more intrusive
+and more ephemeral than writing, and so they are applicable in general to
+speech output information retrieval systems with keyboard or even voice
+input.
+Be warned, however, that they are based upon casual observation and
+speculation rather than empirical research.
+There is a desperate need for proper studies of user psychology in speech
+systems.
+.rh "Echoing."
+Most alphanumeric input peripherals echo on a character-by-character basis.
+Although one can expect quite a high proportion of mistakes with
+unconventional keyboards, especially when entering alphabetic data on a
+basically numeric keypad, audio character echoing is distracting and annoying.
+If you type "123" and the computer echoes
+.LB
+.NI
+"one ... two ... three"
+.LE
+after the individual key-presses, it is liable to divert your
+attention, for voice output is much more intrusive than a purely visual "echo".
+.pp
+Instead, an immediate response to a completed input line is preferable.
+This response can take the form or a reply to a query, or, if successive
+data items are being typed, confirmation of the data entered.
+In the latter case, it is helpful if the information can be generated in
+the same way that the user himself would be likely to verbalize it.
+Thus, for example, when entering numbers:
+.LB
+.nr x0 \w'COMPUTER:'
+.nr x1 \w'USER:'
+.NI
+USER:\h'\n(x0u-\n(x1u' "123#"	(# is the end-of-line character)
+.NI
+COMPUTER: "One hundred and twenty-three."
+.LE
+For a query which requires lengthy processing, the input should be
+repeated in a neat, meaningful format to give the user a chance to abort
+the request.
+.rh "Retracting actions."
+Because commands are entered directly without explicit confirmation,
+it must always be easy for the user to revoke his actions.
+The utility of an "undo" command is now commonly recognized for
+any interactive system, and it becomes even more important in speech
+systems because it is easier for the user to lose his place in the
+dialogue and so make errors.
+.rh "Interrupting."
+A command which interrupts output and returns to a known state
+should be recognized at every level of the system.
+It is essential that voice output be terminated immediately,
+rather than at the end of the utterance.
+We do not want the user to live in fear of the system embarking on
+a long, boring monologue that is impossible to interrupt!
+Again, the same is true of interactive dialogues which do not use speech,
+but becomes particularly important with voice response because it takes
+longer to transmit information.
+.rh "Forestalling prompts."
+Computer-generated prompts must be explicit and frequent enough
+to allow new users to understand what they are expected to do.
+Experienced users will "type ahead" quite naturally,
+and the system should suppress unnecessary prompts under these conditions
+by inspecting the input buffer before prompting.
+This allows the user to concatenate frequently-used commands into chunks whose
+size is entirely at his own discretion.
+.pp
+With the above-mentioned telephone enquiry service, for example,
+it was found that people often took advantage of the prompt-suppression
+feature to enter their
+user number, password, and required service number as a single keying
+sequence.
+As you becomes familiar with a service you quickly and easily learn to
+forestall expected prompts by typing ahead.
+This provides a very natural way for the system to adapt itself automatically
+to the experience of the user.
+New users will naturally wait to be prompted, and proceed through the dialogue
+at a slower and more relaxed pace.
+.pp
+Suppressing unnecessary prompts is a good idea in any interactive system,
+whether or not it uses the medium of speech \(em although it is hardly ever done
+in conventional systems.
+It is particularly important with speech, however, because an unexpected
+or unwanted
+prompt is quite distracting, and it is not so easy to ignore it as it is
+with a visual display.
+Furthermore, speech messages usually take longer to present
+than displayed ones, so that the user is distracted for more time.
+.rh "Information units."
+Lengthy computer voice responses are inappropriate for conveying information,
+because attention wanders if one is not actively involved in the conversation.
+A sequential exchange of terse messages, each designed to dispense one
+small unit of information, forces the user to take a meaningful part in the
+dialogue.
+It has other advantages, too, allowing a higher degree of input-dependent
+branching, and permitting rapid recovery from errors.
+.pp
+The following example from the "Acidosis program", an audio response system
+designed to help physicians to diagnose acidosis, is a good example
+of what
+.ul
+not
+to do.
+.LB
+"(Chime) A VALUE OF SIX-POINT-ZERO-ZERO HAS BEEN ENTERED FOR PH.
+THIS VALUE IS IMPOSSIBLE.
+TO CONTINUE THE PROGRAM, ENTER A NEW VALUE FOR PH IN THE RANGE
+BETWEEN SIX-POINT-SIX AND EIGHT-POINT-ZERO
+(beep dah beep-beep)"  (Smith and Goodwin, 1970).
+.[
+Smith Goodwin 1970
+.]
+.LE
+The use of extraneous noises (for example, a "chime" heralds an error message,
+and a "beep dah beep-beep" requests data input in the form
+<digit><point><digit><digit>)
+was thought necessary in the Acidosis program to keep the user awake
+and help him with the format of the interaction.
+Rather than a long monologue like this,
+it seems much better to design a sequential interchange of terse messages,
+so that the caller can be guided into a state where he can rectify his error.
+For example,
+.LB
+.nf
+.ne11
+.nr x0 \w'COMPUTER:'
+.nr x1 \w'CALLER:'
+CALLER:\h'\n(x0u-\n(x1u' "6*00#"
+COMPUTER: "Entry out of range"
+CALLER:\h'\n(x0u-\n(x1u' "6*00#"  (persists)
+COMPUTER: "The minimum acceptable pH value is 6.6"
+CALLER:\h'\n(x0u-\n(x1u' "9*03#"
+COMPUTER: "The maximum acceptable pH value is 8.0"
+.fi
+.LE
+This dialogue allows a rapid exit from the error situation in the likely
+event that the entry has simply been mis-typed.
+If the error persists, the caller is given just one piece of information
+at a time, and forced to continue to play an active role in the interaction.
+.rh "Input timeouts."
+In general, input timeouts are dangerous, because they introduce apparent
+acausality in the system seen by the user.
+A case has been reported where a user became "highly agitated and refused
+to go near the terminal again after her first timed-out prompt.
+She had been quietly thinking what to do and the terminal suddenly
+interjecting and making its
+own suggestions was just too much for her" (Gaines and Facey, 1975).
+.[
+Gaines Facey 1975
+.]
+.pp
+However, voice response systems lack the satisfying visual feedback
+of end-of-line on termination of an entry.
+Hence a timed-out reminder is appropriate if a delay occurs after some
+characters have been entered.
+This requires the operating system to support a character-by-character mode
+of input, rather than the usual line-by-line mode.
+.rh "Repeat requests."
+Any voice response system must support a universal "repeat last utterance"
+command, because old output does not remain visible.
+A fairly sophisticated facility is desirable, as repeat requests are
+very frequent in practice.
+They may be due to a simple inability to understand a response,
+to forgetting what was said, or to distraction of attention \(em which is
+especially common with office terminals.
+.pp
+In the telephone enquiry service two distinct commands were employed,
+one to repeat the last utterance in case of misrecognition,
+and the other to summarize the current state of the interaction
+in case of distraction.
+For the former, it is essential to avoid simply regenerating an utterance
+identical with the last.
+Some variation of intonation and rhythm is needed to prevent an annoying,
+stereotyped response.
+A second consecutive repeat request should trigger a paraphrased reply.
+An error recovery sequence could be used which presented the misunderstood
+information in a different way with more interaction, but experience
+indicates that this is of minor importance, especially if information units
+are kept small anyway.
+To summarize the current state of the interaction in response to the second
+type of repeat command necessitates the system maintaining a model of
+the user.
+Even a poor model, like a record of his last few transactions and their
+results, is well worth having.
+.rh "Varied speech."
+Synthetic speech is usually rather dreary to listen to.
+Successive utterances with identical intonations should be carefully avoided.
+Small changes in speaking rate, pitch range, and mean pitch level,
+all serve to add variety.
+Unfortunately, little is known at present about the role of intonation in
+interactive dialogue, although this is an active research area and
+new developments can be expected (for a detailed report of a recent
+research project relevant to this topic see Brown
+.ul
+et al,
+1980).
+.[
+Brown Currie Kenworthy 1980
+.]
+However, even random variations in certain parameters of the pitch contour
+are useful to relieve the tedium of repetitive intonation patterns.
+.sh "10.2  The applications programming environment"
+.pp
+The comments in the last section are aimed at the applications programmer
+who is designing the dialogue and constructing the interactive system.
+But what kind of environment should
+.ul
+he
+be given to assist with this work?
+.pp
+The best help the applications programmer can have is a speech generation
+method which makes it easy for him to enter new utterances and modify
+them on-line in cut-and-try attempts to render the man-machine dialogue
+as natural as possible.
+This is perhaps the most important advantage of synthesizing speech by rule
+from a textual representation.
+If encoded versions of natural utterances are stored, it becomes quite
+difficult to make minor modifications to the dialogue in the light of
+experience with it, for a recording session must be set up
+to acquire new utterances.
+This is especially true if more than one voice is used, or if the
+voice belongs to a person who cannot be recalled quickly by the programmer
+to augment the utterance library.
+Even if it is his own voice there will still be delays, for recording
+speech is a real-time job which usually needs a stand-alone processor,
+and if data compression is used a substantial amount of computation will
+be needed before the utterance is in a useable form.
+.pp
+The broad phonetic input required by segmental speech synthesis-by-rule
+systems is quite suitable for utterance representation.
+Utterances can be entered quickly from a standard computer terminal,
+and edited as text files.
+Programmers must acquire skill in phonetic transcription,
+but this is a small inconvenience.
+The art is easily learned in an interactive situation where the effect
+of modifications to the transcription can be heard immediately.
+If allophones must be represented explicitly in the input then the
+programmer's task becomes considerably more complicated because of the
+combinatorial explosion in trial-and-error modifications.
+.pp
+Plain text input is also quite suitable.
+A significant rate of error is tolerable if immediate audio feedback
+of the result is available, so that the operator can adjust his text
+to suit the pronunciation idiosyncrasies of the program.
+But it is acceptable, and indeed preferable, if prosodic features are
+represented explicitly in the input rather than being assigned automatically
+by a computer program.
+.pp
+The application of voice response to interactive computer dialogue is
+quite different to the problem of reading aloud from text.
+We have seen that a major concern with reading machines is how to glean
+information about intonation, rhythm, emphasis, tone of voice, and so on,
+from an input of ordinary English text.
+The significant problems of semantic processing, utilization of pragmatic
+knowledge, and syntactic analysis do not, fortunately, arise in interactive
+information retrieval systems.
+In these, the end user is communicating with a program which has been
+created by a person who knows what he wants it to say.
+Thus the major difficulty is in
+.ul
+describing
+the prosodic features rather than
+.ul
+deriving
+them from text.
+.pp
+Speech synthesis by rule is a subsidiary process to the main interactive
+procedure.
+It would be unwise to allow
+the updating of resonance parameter tracks to be interrupted by
+other calls on the system, and so the synthesis process needs to be executed
+in real time.
+If a stand-alone processor is used for the interactive dialogue, it may
+be able to handle the synthesis rules as well.
+In this case the speech-by-rule program could be a library procedure,
+if the system is implemented in a compiled language.
+An interesting alternative with an interpretive-language implementation,
+such as Basic, is to alter the language interpreter to add a new
+command, "speak", which simply transfers a string representing an utterance
+to an asynchronous process which synthesizes it.
+However, there must be some way for an intepreted program to abort the
+current synthesis in the event of an interrupt signal from the user.
+.pp
+If the main computer system is time-shared, the synthesis-by-rule
+procedure is best executed by an independent processor.
+For example, a 16-bit microcomputer controlling a hardware
+formant synthesizer has been used to run the
+ISP system in real time without too much difficulty (Witten and Abbess, 1979).
+.[
+Witten Abbess 1979
+.]
+An important task is to define an interface between the two which
+allows the main process to control relevant aspects of the prosody of
+the speech in a way which is appropriate to the state of the interaction,
+without having to bother about such things as matching the intonation contour
+to the utterance and the details of syllable rhythm.
+Halliday's notation appears to be quite suitable for this purpose.
+.pp
+If there is only one synthesizer on the system, there will be no
+difficulty in addressing it.
+One way of dealing with multiple synthesizers is to treat them as
+assignable devices in the same way that non-spooling peripherals
+are in many operating systems.
+Notice that the data rate to the synthesizer is quite low
+if the utterance is represented as text with prosodic markers,
+and can easily be handled by a low-speed asynchronous serial line.
+.pp
+The Votrax ML-I synthesizer which is discussed in the next chapter has an
+interface which interposes it between a visual display unit and the serial
+port that connects it to the computer.
+The VDU terminal can be used quite normally, except that a special sequence
+of two control characters will cause Votrax to intercept the following
+message up to another control character, and interpret it as speech.
+The fact that the characters which specify the spoken message do not appear
+on the VDU screen means that the operation is invisible to the user.
+However, this transparency can be inhibited by a switch on the synthesizer
+to allow visual checking of the sound-segment character sequence.
+.pp
+Votrax buffers up to 64 sound segments, which is sufficient to generate
+isolated spoken messages.
+For longer passages, it can be synchronized with the constant-rate
+serial output using the modem control lines of the serial interface,
+together with appropriate device-driving software.
+.pp
+This is a particularly convenient interfacing technique in cases when the
+synthesizer should always be associated with a certain terminal. 
+As an example of how it can be used,
+one can arrange files each of whose lines contain a printed message,
+together with its Votrax equivalent bracketed by the appropriate
+control characters.
+When such a file is listed, or examined with an editor program, the lines
+appear simultaneously in spoken and typed English.
+.pp
+If a phonetic representation is used for utterances, with real-time
+synthesis using a separate process (or processor), it is easy for
+the programmer to fiddle about with the interactive dialogue to get
+it feeling right.
+For him, each utterance is just a textual string which
+can be stored as a string constant within his program just as a VDU prompt
+would be.  He can edit it as part of his program, and "print" it to
+the speech synthesis device to hear it.
+There are no more technical problems to developing an interactive dialogue
+with speech output than there are for a conventional interactive program.
+Of course, there are more human problems, and the points discussed
+in the last section should always be borne in mind.
+.sh "10.3  Using the keypad"
+.pp
+One of the greatest advantages of speech output from computers is the
+ubiquity of the telephone network and the possibility of using it without
+the need for special equipment at the terminal.
+The requirement for input as well as output obviously presents something of a problem
+because of the restricted nature of the telephone keypad.
+.pp
+Figure 10.1 shows the layout of the keypad.
+.FC "Figure 10.1"
+Signalling is achieved by dual-frequency tones.
+For example, if key 7 is pressed, sinusoidal components at 852\ Hz and 1209\ Hz
+are transmitted down the line.
+During the process of dialling these are received by the telephone exchange
+equipment, which assembles the digits that form a number and attempts to route
+the call appropriately.
+Once a connection is made, either party is free to press keys if desired
+and the signals will be transmitted to the other end,
+where they can be decoded by simple electronic circuits.
+.pp
+Dial telephones signal with closely-spaced dial pulses.
+One pulse is generated for a "1", two for a "2", and so on.
+(Obviously, ten pulses are generated for a "0", rather than none!)  Unfortunately,
+once the connection is made it is difficult to signal with dial pulses.
+They cannot be decoded reliably at the other end because the telephone
+network is not designed to transmit such low frequencies.
+However, hand-held tone generators can be purchased for use with dial
+telephones.
+Although these are undeniably extra equipment, and one purpose of using speech
+output is to avoid this, they are very cheap and portable compared with other
+computer terminal equipment.
+.pp
+The small number of keys on the telephone pad makes it rather difficult
+to use for communicating with computers.
+Provision is made for 16 keys, but only 12 are implemented \(em the others
+may be used for some military purposes.
+Of course, if a separate tone generator is used then advantage can be taken
+of the extra keys, but this will introduce incompatibility with those
+who use unmodified touch-tone phones.
+More sophisticated terminals are available which extend the keypad \(em such
+as the Displayphone of Northern Telecommunications.
+However, they are designed as a complete communications terminal and
+contain their own visual display as well.
+.rh "Keying alphabetic data."
+Figure 10.2 shows the near-universal scheme for overlaying alphabetic letters
+on to the telephone keypad.
+.FC "Figure 10.2"
+Since more than one symbol occupies each key, it is obviously necessary
+to have multiple keystrokes per character if the input sequence is to be
+decodable as a string of letters.
+One way of doing this is to depress the appropriate button the number of
+times corresponding to the position of the letter on it.
+For example, to enter the letter "L" the user would key the "5" button
+three times in rapid succession.
+Keying rhythm must be used to distinguish the four entries "J\ J\ J",
+"J\ K", "K\ J", and "L", unless one of the bottom three buttons is used
+as a separator.
+A different method is to use "*", "0", and "#" as shift keys to indicate whether
+the first, second, or third letter on a key is intended.
+Then "#5" would represent "L".
+Alternatively, the shift could follow the key instead of preceding it,
+so that "5#" represented "L".
+.pp
+If numeric as well as alphabetic information may be entered, a mode-shift
+operation is commonly used to switch between numeric and alphabetic modes.
+.pp
+The relative merits of these three methods, multiple depressions, shift
+key prefix, and shift key suffix, have been investigated
+experimentally (Kramer, 1970).
+.[
+Kramer 1970
+.]
+The results were rather inconclusive.
+The first method seemed to be slightly inferior in terms of user accuracy.
+It seemed that preceding rather than following shifts gave higher accuracy,
+although this is perhaps rather counter-intuitive and may have been
+fortuitous.
+The most useful result from the experiments was that users exhibited
+significant learning behaviour, and a training period of at least two hours
+was recommended.
+Operators were found able to key at rates of at least three to four
+characters per second, and faster with practice.
+.pp
+If a greater range of characters must be represented then the coding problem
+becomes more complex.
+Figure 10.3 shows a keypad which can be used for entry of the full 64-character
+standard upper-case ASCII alphabet (Shew, 1975).
+.[
+Shew 1975
+.]
+.FC "Figure 10.3"
+The system is intended for remote vocabulary updating in a phonetically-based
+speech synthesis system.
+There are three modes of operation:  numeric, alphabetic, and symbolic.
+These are entered by "##", "**", and "*0" respectively.
+Two function modes, signalled by "#0" and "#*", allow some
+rudimentary line-editing and monitor facilities to be incorporated.
+Line-editing commands include character and line delete, and two kinds of
+read-back commands \(em one tries to pronounce the words in a line
+and the other spells out the characters.
+The monitor commands allow the user to repeat the effect of the last input line
+as though he had entered it again, to order the system to read back the
+last complete output line, and to query time and system status.
+.rh "Incomplete keying of alphanumeric data."
+It is obviously going to be rather difficult for the operator to key
+alphanumeric information unambiguously on a 12-key pad.
+In the description of the telephone enquiry service in Chapter 1,
+it was mentioned that single-key entry can be useful for alphanumeric data
+if the ambiguity can be resolved by the computer.
+If a multiple-character entry is known to refer to an item on a given
+list, the characters can be keyed directly according to the coding scheme
+of Figure 10.2.
+.pp
+Under most circumstances no ambiguity will arise.
+For example, Table 10.1 shows the keystrokes that would be entered for the
+first 50 5-letter words in an English dictionary.
+Only two clashes occur \(em between " adore" and "afore", and
+"agate" and "agave".
+.RF
+.nr x2 \w'abeam  'u
+.nr x3 \w'00000#    'u
+.nr x0 \n(x2u+\n(x3u+\n(x2u+\n(x3u+\n(x2u+\n(x3u+\n(x2u+\n(x3u+\n(x2u+\w'00000#'u
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta \n(x2u +\n(x3u +\n(x2u +\n(x3u +\n(x2u +\n(x3u +\n(x2u +\n(x3u +\n(x2u
+\l'\n(x0u\(ul'
+.sp
+aback	22225#	abide	22433#	adage	23243#	adore	23673#	after	23837#
+abaft	22238#	abode	22633#	adapt	23278#	adorn	23676#	again	24246#
+abase	22273#	abort	22678#	adder	23337#	adult	23858#	agape	24273#
+abash	22274#	about	22688#	addle	23353#	adust	23878#	agate	24283#
+abate	22283#	above	22683#	adept	23378#	aeger	23437#	agave	24283#
+abbey	22239#	abuse	22873#	adieu	23438#	aegis	23447#	agent	24368#
+abbot	22268#	abyss	22977#	admit	23648#	aerie	23743#	agile	24453#
+abeam	22326#	acorn	22676#	admix	23649#	affix	23349#	aglet	24538#
+abele	22353#	acrid	22743#	adobe	23623#	afoot	23668#	agony	24669#
+abhor	22467#	actor	22867#	adopt	23678#	afore	23673#	agree	24733#
+\l'\n(x0u\(ul'
+.in 0
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.FG "Table 10.1  Keying equivalents of some words"
+As a more extensive example, in a dictionary of 24,500 words, just under 2,000
+ambiguities (8% of words) were discovered.
+Such ambiguities would have to be resolved interactively by the system explaining
+its dilemma, and asking the user for a choice.
+Notice incidentally that although the keyed sequences do not have the same
+lexicographic order as the words,
+no extra cost will be associated with the table-searching
+operation if the dictionary is stored in inverted form, with each legal
+number pointing to its English equivalent or equivalents.
+.pp
+A command language syntax is also a powerful way of disambiguating
+keystrokes entered.
+Figure 10.4 shows the keypad layout for a telephone voice calculator
+(Newhouse and Sibley, 1969).
+.[
+Newhouse Sibley 1969
+.]
+.FC "Figure 10.4"
+This calculator provides the standard arithmetic operators,
+ten numeric registers, a range of pre-defined mathematical functions,
+and even the ability for a user to enter his own functions over the
+telephone.
+The number representation is fixed-point, with user control (through a system
+function) over the precision.
+Input of numbers is free format.
+.pp
+Despite the power of the calculator language, the dialogue is defined
+so that each keystroke is unique in context and never has to be disambiguated
+explicitly by the user.
+Table 10.2 summarizes the command language syntax in an informal and rather
+heterogeneous notation.
+.RF
+.nr x0 1.3i+1.7i+\w'some functions do not need the <value> part'u
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta 1.3i +1.7i
+\l'\n(x0u\(ul'
+construct	definition	explanation
+\l'\n(x0u\(ul'
+.sp
+<calculation>		a sequence of <operation>s followed by a
+		call to the system function  \fIE  X  I  T\fR
+.sp
+<operation>	<add> OR <subtract> OR
+	<multiply> OR <divide> OR
+	<function> OR <clear> OR
+	<erase> OR <answer> OR
+	<display-last> OR <display> OR
+	<repeat> OR <cancel>
+.sp
+<add>	+  <value>  #  OR  +  #  <function>
+.sp
+<subtract>
+<multiply>		similar to <add>
+<divide>
+.sp
+<value>	<numeric-value>  OR  \fIregister\fR <single-digit>
+.sp
+<numeric-value>		a sequence of keystrokes like
+		1  .  2  3  4  or  1  2  3  .  4  or  1  2  3  4
+.sp
+<function>	\fIfunction\fR <name>  #  <value>  #
+		some functions do not need the <value> part
+.sp
+<name>		a sequence of keystrokes like
+		\fIS  I  N\fR  or  \fIE  X  I  T\fR  or  \fIM  Y  F  U  N  C\fR
+.sp
+<clear>	\fIclear register\fR <single-digit>  #
+		clears one of the 10 registers
+.sp
+<erase>	\fIerase\fR  #	undoes the effect of the last operation
+.sp
+<answer>	\fIanswer register\fR <single-digit>  #
+		reads the contents of a register
+.sp
+<display-last>
+<display>		these provide "repeat" facilities
+<repeat>
+.sp
+<cancel>		aborts the current utterance
+\l'\n(x0u\(ul'
+.in 0
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.FG "Table 10.2  Syntax for a telephone calculator"
+A calculation is a sequence of operations followed by an EXIT function call.
+There are twelve different operations, one for each button on the keypad.
+Actually, two of them \(em
+.ul
+cancel
+and
+.ul
+function
+\(em share the same key so that "#" can be reserved for use as a
+separator; but the context ensures that they cannot be confused by the system.
+.pp
+Six of the operations give control over the dialogue.
+There are three different "repeat" commands; a command (called
+.ul
+erase\c
+)
+which undoes the effect of the last operation;
+one which reads out the value of a register;
+and one which aborts the current utterance.
+Four more commands provide the basic arithmetic operations of add,
+subtract, multiply, and divide.
+The operands of these may be keyed literal numbers, or register values,
+or function calls.
+A further command clears a register.
+.pp
+It is through functions that the extensibility of the language is achieved.
+A function has a name (like SIN, EXIT, MYFUNC) which is keyed with an
+appropriate single-key-per-character sequence (namely 746, 3948, 693862
+respectively).
+One function, DEFINE, allows new ones to be entered.
+Another, LOOP, repeats sequences of operations.
+TEST incorporates arithmetic testing.
+The details of these are not important:  what is interesting is the evident
+power of the calculator.
+.pp
+For example, the keying sequence
+.LB
+.NI
+5  #  1  1  2  3  #  2  1  .  2  #  9  #  6  #  2  1  .  4  #
+.LE
+would be decoded as
+.LB
+.NI
+.ul
+clear\c
+  +  123  \-  1.2  \c
+.ul
+display  erase\c
+  \-  1.4.
+.LE
+One of the difficulties with such a tight syntax is that almost any sequence
+will be intepreted as a valid calculation \(em syntax errors are nearly
+impossible.
+Thus a small mistake by the user can have a catastrophic effect on the
+calculation.
+Here, however, speech output gives an advantage over conventional
+character-by-character echoing
+on visual displays.
+It is quite adequate to echo syntactic units as they are decoded, instead
+of echoing keys as they are entered.
+It was suggested earlier in this chapter that confirmation of entry
+should be generated in the same way that the user would be likely to
+verbalize it himself.
+Thus the synthetic voice could respond to the above keying sequence as
+shown in the second line, except that the
+.ul
+display
+command would also state the result
+(and possibly summarize the calculation so far).
+Numbers could be verbalized as "one hundred and twenty-three"
+instead of as "one ... two ... three".
+(Note, however, that this will make it necessary to await the "#" terminator
+after numbers and function names before they can be echoed.)
+.sh "10.4  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.sh "10.5  Further reading"
+.pp
+There are no books which relate techniques of man-computer dialogue
+to speech interaction.
+The best I can do is to guide you to some of the standard works on
+interactive techniques.
+.LB "nn"
+.\"Gilb-1977-1
+.]-
+.ds [A Gilb, T.
+.as [A " and Weinberg, G.M.
+.ds [D 1977
+.ds [T Humanized input
+.ds [I Winthrop
+.ds [C Cambridge, Massachusetts
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+This book is subtitled "techniques for reliable keyed input",
+and considers most aspects of the problem of data entry by
+professional key operators.
+.in-2n
+.\"Martin-1973-2
+.]-
+.ds [A Martin, J.
+.ds [D 1973
+.ds [T Design of man-computer dialogues
+.ds [I Prentice-Hall
+.ds [C Englewood Cliffs, New Jersey
+.nr [T 0
+.nr [A 1
+.nr [O 0
+.][ 2 book
+.in+2n
+Martin concerns himself with all aspects of man-computer dialogue,
+and the book even contains a short chapter on  the use of
+voice response systems.
+.in-2n
+.\"Smith-1980-3
+.]-
+.ds [A Smith, H.T.
+.as [A " and Green, T.R.G.(Editors)
+.ds [D 1980
+.ds [T Human interaction with computers
+.ds [I Academic Press
+.ds [C London
+.nr [T 0
+.nr [A 0
+.nr [O 0
+.][ 2 book
+.in+2n
+A recent collection of contributions on man-computer systems and programming
+research.
+.in-2n
+.LE "nn"
+.EQ
+delim $$
+.EN
+.CH "11  COMMERCIAL SPEECH OUTPUT DEVICES"
+.ds RT "Commercial speech output devices
+.ds CX "Principles of computer speech
+.pp
+This chapter takes a look at four speech output peripherals that are
+available today.
+It is risky in a book of this nature to descend so close to the technology
+as to discuss particular examples of commercial products,
+for such information becomes dated very quickly.
+Nevertheless, having covered the principles of various types of speech
+synthesizer, and the methods of driving them from widely differing utterance
+representations, it seems worthwhile to see how these principles are
+embodied in a few products actually on the market.
+.pp
+Developments in electronic speech devices are moving so fast that it is
+hard to keep up with them, and the newest technology today will undoubtedly
+be superseded next year.
+Hence I have not tried to choose examples from the very latest technology.
+Instead, this chapter discusses synthesizers which exemplify rather different
+principles and architectures, in order to give an idea of the range of options
+which face the system designer.
+.pp
+Three of the devices are landmarks in the commercial adoption of speech
+technology, and have stood the test of time.
+Votrax was introduced in the early 1970's, and has been re-implemented
+several times since in an attempt to cover different market sectors.
+The Computalker appeared in 1976.
+It was aimed primarily at the burgeoning computer hobbies market.
+One of its most far-reaching effects was to stimulate the interest of
+hobbyists, always eager for new low-cost peripherals, in speech synthesis;
+and so provide a useful new source of experimentation and expertise
+which will undoubtedly help this heretofore rather esoteric discipline to
+mature.
+Computalker is certainly the longest-lived and probably still the most
+popular hobbyist's speech synthesizer.
+The Texas Instruments speech synthesis chip brought speech output technology to the
+consumer.
+It was the first single-chip speech synthesizer, and is still the biggest
+seller.
+It forms the heart of the "Speak 'n Spell" talking toy which appeared in
+toyshops in the summer of 1978.
+Although talking calculators had existed several years before, they were
+exotic gadgets rather than household toys.
+.sh "11.1  Formant synthesizer"
+.pp
+The Computalker is a straightforward implementation of a serial formant
+synthesizer.
+A block diagram of it is shown in Figure 11.1.
+.FC "Figure 11.1"
+In the centre is the main vocal tract path, with three formant filters
+whose resonant frequencies can be controlled individually.
+A separate nasal branch in parallel with the oral one is provided,
+with a nasal formant of fixed frequency.
+It is less important to allow for variation of the nasal formant
+frequency than it is for the oral ones, because the size and
+shape of the nasal tract is relatively fixed.
+However, it is essential to control the nasal amplitude, in particular to turn
+it off during non-nasal sounds.
+Computalker provides independent oral and nasal amplitude parameters.
+.pp
+Unvoiced excitation can be passed through the main vocal tract
+through the aspiration amplitude control AH.
+In practice, the voicing amplitudes AV and AN will probably always be zero when AH
+is non-zero, for physiological constraints prohibit simultaneous voicing
+and aspiration.
+A second unvoiced excitation path passes through a fricative formant filter
+whose resonant frequency can be varied, and has its amplitude independently
+controlled by AF.
+.rh "Control parameters."
+Table 11.1 summarizes the nine parameters which drive Computalker.
+.RF
+.nr x0 \w'address0'+\w'fundamental frequency of voicing00'+\w'0 bits0'+\w'logarithmic00'+\w'0000\-00000 Hz'
+.nr x1 (\n(.l-\n(x0)/2
+.in \n(x1u
+.ta \w'000'u \w'address0'u +\w'fundamental frequency of voicing00'u +\w'0 bits0'u +\w'logarithmic00'u
+address	meaning	width		\0\0\0range
+\l'\n(x0u\(ul'
+.sp
+\00	AV	amplitude of voicing	8 bits
+\01	AN	nasal amplitude	8 bits
+\02	AH	amplitude of aspiration	8 bits
+\03	AF	amplitude of frication	8 bits
+\04	FV	fundamental frequency of voicing	8 bits	logarithmic	\0\075\-\0\0470 Hz
+\05	F1	formant 1 resonant frequency	8 bits	logarithmic	\0170\-\01450 Hz
+\06	F2	formant 2 resonant frequency	8 bits	logarithmic	\0520\-\04400 Hz
+\07	F3	formant 3 resonant frequency	8 bits	logarithmic	1700\-\05500 Hz
+\08	FF	fricative resonant frequency	8 bits	logarithmic	1700\-14000 Hz
+\09		not used
+10		not used
+11		not used
+12		not used
+13		not used
+14		not used
+15	SW	audio on-off switch	1 bit
+\l'\n(x0u\(ul'
+.in 0
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.FG "Table 11.1  Computalker control parameters"
+Four of them control amplitudes, while the others control frequencies.
+In the latter case the parameter value is logarithmically related to
+the actual frequency of the excitation (FV) or resonance (F1, F2, F3, FF).
+The ranges over which each frequency can be controlled is shown in the Table.
+An independent calibration of one particular Computalker has shown that
+the logarithmic specifications are met remarkably well.
+.pp
+Each parameter is specified to Computalker as an 8-bit number.
+Parameters are addressed by a 4-bit code, and so a total of 12 bits
+is transferred in parallel to Computalker from the computer
+for each parameter update.
+Parameters 9 to 14 are unassigned ("reserved for future expansion" is
+the official phrase), and the last parameter, SW, governs the position of
+an audio on-off switch.
+.pp
+Computalker does not contain a clock that is accessible to the user,
+and so the timing of parameter updates is entirely up to the host computer.
+Typically, a 10\ msec interval between frames is used,
+with interrupts generated by a separate timer.
+In fact the frame interval can be anywhere between 2\ msec and 50\ msec,
+and can be changed to alter the rate of speaking.
+However, it is rather naive to view fast speech as slow
+speech speeded up by a linear time compression, for in human
+speech production the rhythm changes and elisions occur in a rather
+more subtle way.
+Thus it is not particularly useful to be able to alter the frame rate.
+.pp
+At each interrupt, the host computer transfers values for all of the nine
+parameters to Computalker, a total of 108 data bits.
+In theory, perhaps, it is only necessary to transmit those parameters
+whose values have changed; but in practice all of them should be updated
+regardless.
+This is because the parameters are stored for the duration of the frame
+in analogue sample-and-hold devices.  Essentially, the parameter value
+is represented as the charge on a capacitor.
+In time \(em and it takes only a short time \(em the values drift.
+Although the drift over 10\ msec is insignificant, it becomes very
+noticeable over longer time periods.
+If parameters are not updated at all, the result is a
+"whooosh" sound up to maximum amplitude, in a period of a second or two.
+Hence it is essential that Computalker be serviced by the computer regularly,
+to update all its parameters.
+The audio on-off switch is provided so that the computer can turn off
+the sound directly if another program, which does not use the device,
+is to be run.
+.rh "Filter implementation."
+It is hard to get definite information on the implementation
+of Computalker.
+Because it is a commercial device, circuit diagrams are not published.
+It is certainly an analogue rather than a digital implementation.
+The designer suggests that a configuration like that of Figure 11.2 is used
+for the formant filters (Rice, 1976).
+.[
+Rice 1976 Byte
+.]
+.FC "Figure 11.2"
+Control is obtained over the resonant frequency by varying the resistance
+at the bottom in sympathy with the parameter value.
+The middle two operational amplifiers can be modelled by a resistance
+$-R/k$ in the forward path, where k is the digital control value.
+This gives the circuit in Figure 11.3, which can be analysed to obtain
+the transfer function
+.LB
+.EQ
+- ~ k over {R~R sub 1 C sub 2 C sub 3} ~ . ~ {R sub 2 C sub 2 ~s ~+~1} over
+{ s sup 2 ~+~~
+( 1 over {R sub 3 C sub 3} ~+~ {k R sub 2} over {R~R sub 1 C sub 3})~s ~~+~
+k over {R~R sub 1 C sub 2 C sub 3}} ~ .
+.EN
+.LE
+.FC "Figure 11.3"
+.pp
+This expression has a DC gain of \-1, and the denominator is similar to those
+of the analogue formant resonators discussed in Chapter 5.
+However, unlike them the transfer function has a numerator which creates
+a zero at
+.LB
+.EQ
+s~~=~~-~ 1 over {R sub 2 C sub 2} ~ .
+.EN
+.LE
+If  $R sub 2 C sub 2$  is sufficiently small, this zero will have
+negligible effect at audio frequencies, and the filter has
+the following parameters:
+.LB
+centre frequency:    $~ mark
+1 over {2 pi}~~( k over {R~R sub 1 C sub 2 C sub 3} ~ ) sup 1/2$  Hz
+.sp
+bandwidth:$lineup
+1 over {2 pi}~~( 1 over {R sub 3 C sub 3}~+~
+{k R sub 2} over {R~R sub 1 C sub 3} ~ )$  Hz.
+.LE
+.pp
+Note first that the centre frequency is proportional to the square root of
+the control value $k$.
+Hence a non-linear transformation must be implemented on the control
+signal, after D/A conversion, to achieve the required logarithmic relationship
+between parameter value and resonant frequency.
+The formant bandwidth is not constant, as it should be (see Chapter 5),
+but depends upon the control value $k$.
+This dependency can be minimized by selecting component values such that
+.LB
+.EQ
+{k R sub 2} over {R~R sub 1 C sub 3}~~<<~~1 over {R sub 3 C sub 3}
+.EN
+.LE
+for the largest value of $k$ which can occur.
+Then the bandwidth is solely determined by the time constant  $R sub 3 C sub 3$.
+.pp
+The existence of the zero can be exploited for the fricative resonance.
+This should have zero DC gain, and so the component values for the fricative
+filter should make the time-constant  $R sub 2 C sub 2$  large enough to place
+the zero sufficiently near the frequency origin.
+.rh "Market orientation."
+As mentioned above, Computalker is designed for the computer hobbies market.
+Figure 11.4 shows a photograph of the device.
+.FC "Figure 11.4"
+It plugs into the S\-100 bus which has been a
+.ul
+de facto
+standard for hobbyists for several years, and has recently been adopted
+as a standard by the Institute of Electrical and Electronic Engineers.
+This makes it immediately accessible to many microcomputer systems.
+.pp
+An inexpensive synthesis-by-rule program, which runs on
+the popular 8080 microprocessor, is available to drive Computalker.
+The input is coded in a machine-readable version of the standard phonetic
+alphabet, similar to that which was introduced in Chapter 2 (Table 2.1).
+Stress digits may appear in the transcription, and the program caters for
+five levels of stress.
+The punctuation mark at the end of an utterance has some effect on pitch.
+The program is perhaps remarkable in that it occupies only 6\ Kbyte of storage
+(including phoneme tables), and runs on an 8-bit microprocessor
+(but not in real time).
+It is, however,
+.ul
+un\c
+remarkable in that it produces rather poor speech.
+According to a demonstration cassette,
+"most people find the speech to be readily intelligible,
+especially after a little practice listening to it,"
+but this seems extremely optimistic.
+It also cunningly insinuates that if you don't understand it, you yourself
+may share the blame with the synthesizer \(em after all,
+.ul
+most
+people do!
+Nevertheless, Computalker has made synthetic speech accessible to a large
+number of home computer users.
+.sh "11.2  Sound-segment synthesizer"
+.pp
+Votrax was the first fully commercial speech synthesizer, and at the time of
+writing is still the only off-the-shelf speech output
+peripheral (as distinct from reading machine) which is aimed
+specifically at synthesis-by-rule rather than storage of parameter tracks
+extracted from natural utterances.
+Figure 11.5 shows a photograph of the Votrax ML-I.
+.FC "Figure 11.5"
+.pp
+Votrax accepts as input a string of codes representing sound segments,
+each with additional bits to control the duration and pitch of the segment.
+In the earlier versions (eg model VS-6) there are 63 sound segments, specified
+by a 6-bit code, and two further bits accompany each segment to provide a
+4-level control over pitch.
+Four pitch levels are quite inadequate to generate acceptable intonation
+contours for anything but isolated words spoken in citation form.
+However, a later model (ML-I) uses an 8-level pitch specification,
+as well as a 4-level duration qualifier,
+associated with each sound segment.
+It provides a vocabulary of 80 sound segments, together with an additional
+code which allows local amplitude modifications and extra duration alterations
+to following segments.
+A further, low-cost model (VS-K) is now available which plugs in to the S\-100
+bus, and
+is aimed primarily at
+computer hobbyists.
+It provides no pitch control at all and is therefore
+quite unsuited to serious voice response applications.
+The device has recently been packaged as an LSI circuit (model SC\-01),
+using analogue switched-capacitor filter technology.
+.pp
+One point where the ML-I scores favourably over other speech synthesis
+peripherals is the remarkably convenient engineering of its
+computer interface, which was outlined in the previous chapter.
+.pp
+The internal workings of Votrax are not divulged by the manufacturer.
+Figure 11.6 shows a block diagram at the level of detail that they supply.
+.FC "Figure 11.6"
+It seems to be essentially a formant synthesizer with analogue function
+generators and parameter smoothing circuits that provide transitions between
+sound segments.
+.rh "Sound segments."
+The 80 segments of the high-range ML-I model
+are summarized in Table 11.2.
+.FC "Table 11.2"
+They are divided into phoneme classes according to the
+classification discussed in Chapter 2.
+The segments break down into the following categories.
+(Numbers in parentheses are the corresponding figures for VS-6.)
+.LB "00 (00) "
+.NI "00 (00) "
+11 (11) vowel sounds which are representative of the phonological
+vowel classes for English
+.NI "00 (00) "
+\09 \0(7) vowel allophones, with slightly different sound qualities from the
+above
+.NI "00 (00) "
+20 (15) segments whose sound qualities are identical to the segments above, but with
+different durations
+.NI "00 (00) "
+22 (22) consonant sounds which are representative of the phonological
+consonant classes for English
+.NI "00 (00) "
+11 \0(6) consonant allophones
+.NI "00 (00) "
+\04 \0(0) segments to be used in conjunction with unvoiced plosives to increase
+their aspiration
+.NI "00 (00) "
+\02 \0(2) silent segments, with different pause durations
+.NI "00 (00) "
+\01 \0(0) very short silent segment (about 5\ msec).
+.LE "00 (00) "
+Somewhat under half of the 80 elements
+can be put into one-to-one correspondence with the phonemes of English;
+the rest are either allophonic variations or additional sounds which can
+sensibly be combined with certain phonemes in certain contexts.
+The Votrax literature, and consequently Votrax users, persists in calling
+all elements "phonemes", and this can cause considerable confusion.
+I prefer to use the term "sound segment" instead, reserving "phoneme" for its
+proper linguistic use.
+.pp
+The rules which Votrax uses for transitions between sound segments are not
+made public by the manufacturer, and are embedded in encapsulated circuits
+in the hardware.
+They are clearly very crude.
+The key to successful encoding of utterances is to use the many
+non-phonemic segments in an appropriate way as transitions between the main
+segments which represent phonetic classes.  This is a tricky process, and
+I have heard of one commercial establishment giving up in despair at the
+extreme difficulty of generating the utterances it wanted.
+It probably explains the proliferation of letter-to-sound rules for
+Votrax which have been developed in research laboratories
+(Colby
+.ul
+et al,
+1978; Elovitz
+.ul
+et al,
+1976; McIlroy, 1974; Sherwood, 1978).
+.[
+Colby Christinaz Graham 1978
+.]
+.[
+Elovitz 1976 IEEE Trans Acoustics Speech and Signal Processing
+.]
+.[
+McIlroy 1974
+.]
+.[
+Sherwood 1978
+.]
+Nevertheless, with luck, skill, and especially persistence,
+excellent results can be
+obtained.  The ML-I manual (Votrax, 1976) contains a list of about 625 words and short phrases,
+and they are usually clearly recognizable.
+.[
+Votrax 1976
+.]
+.rh "Duration and pitch qualifiers."
+Each sound segment has a different duration.
+Table 11.2 shows the measured duration of the segments, although no
+calibration data is given by Votrax.
+As mentioned earlier, a 2-bit number accompanies each segment to modify
+its duration, and
+this was set to 3 (least duration) for the measurements.
+The qualifier has a multiplicative effect, shown in Table 11.3.
+.RF
+.nr x1 (\w'rate qualifier'/2)
+.nr x2 (\w'in Table 11.2 by'/2)
+.nr x0 \n(x1+2i+\w'00'+\n(x2
+.nr x3 (\n(.l-\n(x0)/2
+.in \n(x3u
+.ta \n(x1u +2i
+\l'\n(x0u\(ul'
+.sp
+.nr x2 (\w'multiply duration'/2)
+rate qualifier		\0\0\h'-\n(x2u'multiply duration
+.nr x2 (\w'in Table 11.2 by'/2)
+		\0\0\h'-\n(x2u'in Table 11.2 by
+\l'\n(x0u\(ul'
+.sp
+	3	1.00
+	2	1.11
+	1	1.22
+	0	1.35
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 11.3  Effect of the 2-bit per-segment rate qualifier"
+.pp
+As well as the 2-bit rate qualifier, each sound segment is accompanied by
+a 3-bit pitch specification.  This provides a linear control over fundamental
+frequency, and Table 11.4 shows the measured values.
+.RF
+.nr x1 (\w'pitch specifier'/2)
+.nr x2 (\w'pitch (Hz)'/2)
+.nr x0 \n(x1+1.5i+\n(x2
+.nr x3 (\n(.l-\n(x0)/2
+.in \n(x3u
+.ta \n(x1u +1.5i
+\l'\n(x0u\(ul'
+.sp
+pitch specifier	\h'-\n(x2u'pitch (Hz)
+\l'\n(x0u\(ul'
+.sp
+	0	\057.5
+	1	\064.1
+	2	\069.4
+	3	\075.8
+	4	\080.6
+	5	\087.7
+	6	\094.3
+	7	100.0
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 11.4  Effect of the 3-bit per-segment pitch specifier"
+The quantization interval varies from
+one to two semitones.
+Votrax interpolates pitch from phoneme to phoneme in a highly satisfactory
+manner, and this permits surprisingly sophisticated intonation contours
+to be generated considering the crude 8-level quantization.
+.pp
+The notation in which the Votrax manual defines utterances
+gives duration qualifiers and pitch specifications as digits
+preceding the sound segment, and separated from it by a slash (/).
+Thus, for example,
+.LB
+14/THV
+.LE
+defines the sound segment THV with duration qualifier 1 (multiplies the
+70\ msec duration of Table 11.2 by 1.22 \(em from Table 11.3 \(em to give 85\ msec)
+and pitch specification 4 (81 Hz).
+This representation of a segment is transformed into two ASCII characters before transmission
+to the synthesizer.
+.rh "Converting a phonetic transcription to sound segments."
+It would be useful to have a computer procedure to produce a specification for
+an utterance in terms of Votrax sound segments from a standard phonetic
+transcription.
+This could remove much of the tedium from utterance preparation
+by incorporating the contextual rules given in the Votrax manual.
+Starting with a phonetic transcription, each phoneme should be converted
+to its default Votrax representative.
+The resulting "wide" Votrax transcription must be
+transformed into a "narrow" one by application of contextual rules.
+Separate rules are needed for
+.LB
+.NP
+vowel clusters (diphthongs)
+.NP
+vowel transitions (ie consonant-vowel and vowel-consonant,
+where the vowel segment is altered)
+.NP
+intervocalic consonants
+.NP
+consonant transitions (ie consonant-vowel and vowel-consonant,
+where the consonant segment is altered)
+.NP
+consonant clusters
+.NP
+stressed-syllable effects
+.NP
+utterance-final effects.
+.LE
+Stressed-syllable effects (which include
+extra aspiration for unvoiced stops beginning stressed syllables)
+can be applied only if stress markers are included in the phonetic
+transcription.
+.pp
+To specify a rule, it is necessary to give a
+.ul
+matching part
+and a
+.ul
+context,
+which define at what points in an utterance it is applicable, and a
+.ul
+replacement part
+which is used to replace the matching part.
+The context can be specified in mathematical set notation using curly brackets.
+For example,
+.LB
+{G SH W K} OO		IU OO
+.LE
+states that the matching part OO is replaced by IU OO, after a G, SH, W, or K.
+In fact, allophonic variations of each sound segment
+should also be accepted as valid context, so this rule will also replace OO
+after .G, CH, .W, .K, or .X1 (Table 11.2 gives allophones of each segment).
+.pp
+Table 11.5 gives some rules that have been used for this purpose.
+.FC "Table 11.5"
+They were derived from careful study of the hints given in the
+ML-I manual (Votrax, 1976).
+.[
+Votrax 1976
+.]
+Classes such as "voiced" and "stop-consonant" in the context specify sets
+of sound segments in the obvious way.
+The beginning of a stressed syllable is marked in the input by ".syll".
+Parentheses in the replacement part have a significance which is explained in
+the next section.
+.rh "Handling prosodic features."
+We know from Chapter 8 the vital importance of prosodic features
+in synthesizing lifelike speech.
+To allow them to be assigned to Votrax utterances, an intermediate
+output from a prosodic analysis program like ISP can be used.
+For example,
+.LB
+1  \c
+.ul
+dh i s  i z  /*d zh aa k s  /h aa u s;
+.LE
+which specifies "this is Jack's house" in a declarative intonation with
+emphasis on the "Jack's", can be intercepted in the following form:
+.LB
+\&.syll
+.ul
+dh\c
+\ 50\ (0\ 110)
+.ul
+i\c
+\ 60
+.ul
+s\c
+\ 90\ (0\ 99)
+.ul
+i\c
+\ 60
+.ul
+z\c
+\ 60\ (50\ 110)
+\&.syll
+.ul
+d\c
+\ 50\ (0\ 110)
+.ul
+zh\c
+\ 50
+.ul
+aa\c
+\ 90
+.ul
+k\c
+\ 120\ (10\ 90)
+.ul
+s\c
+\ 90
+\&.syll
+.ul
+h\c
+\ 60
+.ul
+aa\c
+\ 140
+.ul
+u\c
+\ 60
+.ul
+s\c
+\ 140
+^\ 50\ (40\ 70) .
+.LE
+Syllable boundaries, pitches, and durations have been assigned by the
+procedures given earlier (Chapter 8).
+A number always follows each phoneme to specify its duration
+(in msec).
+Pairs of numbers in parentheses define a pitch specification at some
+point during the preceding phoneme:  the first number of the pair defines
+the time offset of the specification from the beginning
+of the phoneme, while the second gives the pitch itself (in Hz).
+This form of utterance specification can then be passed to a Votrax
+conversion procedure.
+.pp
+The phonetic transcription is converted
+to Votrax sound segments using the method described above.  The "wide" Votrax
+transcription is
+.LB
+\&.syll THV I S I Z .syll D ZH AE K S .syll H AE OO S PA0 ;
+.LE
+which is transformed to the following "narrow" one according to the rules
+of Table 11.5:
+.LB
+\&.syll THV I S I Z .syll D J (AE EH3) K S .syll H1 (AH1 .UH2) (O U)
+S PA0 .
+.LE
+The duration and pitch specifications are preserved by the transformation
+in their original positions in the string, although they are not shown above.
+The next stage uses them to expand the transcription by adjusting
+the segments to have durations as close as possible to the specifications, and
+computing pitch numbers to be associated with each phoneme.
+.pp
+Correct duration-expansion can, in general, require a great amount of
+computation.
+Associated with each sound segment is a set of elements with the same sound quality
+but different durations, formed by attaching each of the four duration
+qualifiers of Table 11.3 to the segment and any others which are
+sound-equivalents to it.  For example, the segment Z has the duration-set
+.LB
+{3/Z   2/Z   1/Z   0/Z}
+.LE
+with durations
+.LB
+{ 70   78   85   95}
+.LE
+msec respectively, where the initial numerals denote the duration qualifier.
+The segment I has the much larger duration-set
+.LB
+{3/I2   2/I2   1/I2   0/I2   3/I1   2/I1   1/I1   0/I1   3/I   2/I   1/I   0/I}
+.LE
+with durations
+.LB
+{ 58   64   71   78   83   92   101   112   118   131   144   159},
+.LE
+because segments I1 and I2 are sound-equivalents to it.
+Duration assignment is a matter of selecting elements from the
+duration-set whose total duration is as close as possible to that desired
+for the segment.
+It happens that Votrax deals sensibly with concatenations of more than one
+identical plosive, suppressing the stop burst on all but the last.
+Although the general problem of approximating durations in
+this way is computationally demanding, a simple recursive exhaustive search
+works in a reasonable amount of time because the desired duration is usually
+not very much greater than the longest member of the duration-set, and so
+the search terminates quite quickly.
+.pp
+At this point, the role of the parentheses which appear on the right-hand side
+of Table 11.5 becomes apparent.  Because durations are only associated with
+the input phonemes, which may each be expanded into several Votrax
+segments, it is necessary to keep track of the segments which have descended
+from a single phoneme.
+Target durations are simply spread equally across any parenthesized groups
+to which they apply.
+.pp
+Having expanded durations, mapping pitches on to the sound segments is
+a simple matter.  The ISP system for formant synthesizers (Chapters 7 and 8)
+uses linear interpolation between pitch specifications, and the frequency which
+results for each sound segment needs to be converted to a Votrax specification
+using the information in Table 11.4.
+.pp
+After applying these procedures to the example utterance, it becomes
+.LB
+14/THV  14/I1  03/S  14/I1  04/Z  04/D  04/J  33/AE  33/EH3  \c
+02/K  02/K  02/S  02/H1  01/AH2  01/.UH2  31/O2  31/U1  01/S  \c
+10/S  30/PA0  30/PA0  .
+.LE
+In several places, shorter sound-equivalents have been substituted
+(I1 for I, AH2 for AH1, O2 for O, and U1 for U), while doubling-up also occurs
+(in the K, S, and PA0 segments).
+.pp
+The speech which results from the use of these procedures with the
+Votrax synthesizer sounds remarkably similar to that generated by the
+ISP system which uses
+parametrically-controlled synthesizers.  Formal evaluation experiments have
+not been undertaken, but it seems clear from careful listening that it would
+be rather difficult, and probably pointless, to evaluate the Votrax conversion
+algorithm, for the outcome would be completely dominated by the success of the
+original pitch and rhythm assignment procedures.
+.sh "11.3  Linear predictive synthesizer"
+.pp
+The first single-chip speech synthesizer was introduced by
+Texas Instruments (TI) in the summer of 1978 (Wiggins and Brantingham, 1978).
+.[
+Wiggins Brantingham 1978
+.]
+It was a remarkable development, combining recent advances in signal processing
+with the very latest in VLSI technology.
+Packaged in the Speak 'n Spell toy (Figure 11.7), it was a striking demonstration
+of imagination and prowess in integrated electronics.
+.FC "Figure 11.7"
+It gave TI a long lead over its competitors and surprised many experts
+in the speech field.
+.EQ
+delim @@
+.EN
+Overnight, it seemed, digital speech technology had descended from
+research laboratories with their expensive and specialized equipment into
+a $50.00 consumer item.
+.EQ
+delim $$
+.EN
+Naturally TI did not sell the chip separately but only as part of their
+mass-market product; nor would they make available information on how to
+drive it directly.
+Only recently when other similar devices appeared on the market did they
+unbundle the package and sell the chip.
+.rh "The Speak 'n Spell toy."
+The TI chip (TMC0280) uses the linear predictive method of synthesis,
+primarily because of the ease of the speech analysis procedure and the known
+high quality at low data rates.
+Speech researchers, incidentally, sometimes scoff at what they perceive to be
+the poor quality of the toy's speech; but considering the data rate
+used (which averages 1200 bits per second of speech) it is remarkably good.
+Anyway, I have never heard a child complain! \(em although it is not uncommon
+to misunderstand a word.
+Two 128\ Kbit read-only memories are used in the toy to hold data for about
+330 words and phrases \(em lasting between 3 and 4 minutes \(em of speech.
+At the time (mid-1978) these memories were the largest that were available
+in the industry.
+The data flow and user dialogue are handled by a microprocessor,
+which is the fourth LSI circuit in the photograph of Figure 11.8.
+.FC "Figure 11.8"
+.pp
+A schematic diagram of the toy is given in Figure 11.9.
+.FC "Figure 11.9"
+It has a small display which shows upper-case letters.
+(Some teachers of spelling hold that the lack of lower case destroys
+any educational value that the toy may have.)  It
+has a full 26-key alphanumeric keyboard with 14 additional control keys.
+(This is the toy's Achilles' heel, for the keys fall out after extended use.
+More recent toys from TI use an improved keyboard.)  The
+keyboard is laid out alphabetically instead of in QWERTY order; possibly
+missing an opportunity to teach kids to type as well as spell.
+An internal connector permits vocabulary expansion with up to 14 more
+read-only memory chips.
+Controlling the toy is a 4-bit microprocessor (a modified TMS1000).
+However, the synthesizer chip does not receive data from the processor.
+During speech, it accesses the memory directly and only returns control
+to the processor when an end-of-phrase marker is found in the data stream.
+Meanwhile the processor is idle, and cannot even be interrupted from the
+keyboard.
+Moreover, in one operational mode ("say-it") the toy embarks upon a long
+monologue and remains deaf to the keyboard \(em it cannot even be turned off.
+Any three-year-old will quickly discover that a sharp slap solves the problem!
+A useful feature is that the device switches itself off if unused for more
+than a few minutes.
+A fascinating account of the development of the toy from the point of view
+of product design and market assessment has been published
+(Frantz and Wiggins, 1981).
+.[
+Frantz Wiggins 1981
+.]
+.rh "Control parameters."
+The lattice filtering method of linear predictive synthesis (see Chapter 6)
+was selected because of its good stability properties and guaranteed
+performance with small word sizes.
+The lattice has 10 stages.
+All the control parameters are represented as 10-bit fixed-point numbers,
+and the lattice operates with an internal precision of 14 bits (including
+sign).
+.pp
+There are twelve parameters for the device:  ten reflection coefficients,
+energy, and pitch.
+These are updated every 20\ msec.
+However, if 10-bit values were stored for each, a data rate of 120 bits
+every 20\ msec, or 6\ Kbit/s, would be needed.
+This would reduce the capacity of the two read-only memory chips to well
+under a minute of speech \(em perhaps 65 words and phrases.
+But one of the desirable properties of the reflection coefficients
+which drive the lattice filter is that they are amenable to quantization.
+A non-linear quantization scheme is used, with the parameter data addressing
+an on-chip quantization table to yield a 10-bit coefficient.
+.pp
+Table 11.6 shows the number of bits devoted to each parameter.
+.RF
+.in+0.3i
+.ta \w'repeat flag00'u +1.3i +0.8i
+.nr x0 \w'repeat flag00'+1.3i+\w'00'+(\w'size (10-bit words)'/2)
+\l'\n(x0u\(ul'
+.nr x1 (\w'bits'/2)
+.nr x2 (\w'quantization table'/2)
+.nr x3 0.2m
+parameter	\0\h'-\n(x1u'bits	\0\0\h'-\n(x2u'quantization table
+.nr x2 (\w'size (10-bit words)'/2)
+		\0\0\h'-\n(x2u'size (10-bit words)
+\l'\n(x0u\(ul'
+.sp
+energy	\04	\016	\v'\n(x3u'_\v'-\n(x3u'\z4\v'\n(x3u'_\v'-\n(x3u'  energy=0 means 4-bit frame
+pitch	\05	\032
+repeat flag	\01	\0\(em	\z1\v'\n(x3u'_\v'-\n(x3u'\z0\v'\n(x3u'_\v'-\n(x3u'  repeat flag =1 means 10-bit frame
+k1	\05	\032
+k2	\05	\032
+k3	\04	\016
+k4	\04	\016	\z2\v'\n(x3u'_\v'-\n(x3u'\z8\v'\n(x3u'_\v'-\n(x3u'  pitch=0 (unvoiced) means 28-bit frame
+k5	\04	\016
+k6	\04	\016
+k7	\04	\016
+k8	\03	\0\08
+k9	\03	\0\08
+k10	\03	\0\08	\z4\v'\n(x3u'_\v'-\n(x3u'\z9\v'\n(x3u'_\v'-\n(x3u'  otherwise 49-bit frame
+	__	___
+.sp
+	49 bits	216 words
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in-0.3i
+.FG "Table 11.6  Bit allocation for Speak 'n Spell chip"
+There are 4 bits for energy, and 5 bits for pitch and the first two
+reflection coefficients.
+Thereafter the number of bits allocated to reflection coefficients decreases
+steadily, for higher coefficients are less important for intelligibility
+than lower ones.
+(Note that using a 10-stage filter is tantamount to allocating
+.ul
+no
+bits to coefficients higher than the tenth.)  With a
+1-bit "repeat" flag, whose role is discussed shortly, the frame size
+becomes 49 bits.
+Updated every 20\ msec, this gives a data rate of just under 2.5\ Kbit/s.
+.pp
+The parameters are expanded into 10-bit numbers by a separate quantization
+table for each one.
+For example, the five pitch bits address a 32-word look-up table which
+returns a 10-bit value.
+The transformation is logarithmic in this case, the lowest pitch being
+around 50 Hz and the highest 190 Hz.
+As shown in Table 11.6, a total of 216 10-bit words suffices to hold all
+twelve quantization tables; and they are implemented on the synthesizer
+chip.
+To provide further smoothing of the control parameters,
+they are interpolated linearly from one frame to the next at eight points
+within the frame.
+.pp
+The raw data rate of 2.5\ Kbit/s is reduced to an average of 1200\ bit/s
+by further coding techniques.
+Firstly, if the energy parameter is zero the frame is silent,
+and no more parameters are transmitted (4-bit frame).
+Secondly, if the "repeat" flag is 1 all reflection coefficients are held
+over from the previous frame, giving a constant filter but with the ability
+to vary amplitude and pitch (10-bit frame).
+Finally, if the frame is unvoiced (signalled by the pitch value being zero)
+only four reflection coefficients are transmitted, because the ear is
+relatively insensitive to spectral detail in unvoiced speech (28-bit frame).
+The end of the utterance is signalled by the energy bits all being 1.
+.rh "Chip organization."
+The configuration of the lattice filter is shown in Figure 11.10.
+.FC "Figure 11.10"
+The "two-multiplier" structure (Chapter 6) is used, so the 10-stage filter
+requires 19 multiplications and 19 additions
+per speech sample.
+(The last operation in the reverse path at the bottom is not needed.)  Since
+a 10\ kHz sample rate is used, just 100\ $mu$sec are available for each
+speech sample.
+A single 5\ $mu$sec adder and a pipelined multiplier are implemented on
+the chip, and multiplexed among the 19 operations.
+The latter begins a new multiplication every 5\ $mu$sec, and finishes it
+40\ $mu$sec later.
+These times are within the capability of p-channel MOS technology,
+allowing the chip to be produced at low cost.
+The time slot for the 20'th, unnecessary, filter multiplication is used
+for an overall gain adjustment.
+.pp
+The final analogue signal is produced by an 8-bit on-chip D/A converter
+which drives a 200 milliwatt speaker through an impedance-matching
+transformer.
+These constitute the necessary analogue low-pass desampling filter.
+.pp
+Figure 11.11 summarizes the organization of the synthesis chip.
+.FC "Figure 11.11"
+Serial data enters directly from the read-only memories, although a control
+signal from the processor begins synthesis and another signal is returned
+to it upon termination.
+The data is decoded into individual parameters, which are used to address
+the quantization tables to generate the full 10-bit parameter
+values.
+These are interpolated from one frame to the next.
+The lower part of the Figure shows the speech generation subsystem.
+An excitation waveform for voiced speech is stored in read-only
+memory and read out repeatedly at a rate determined by the pitch.
+The source for unvoiced sounds is hard-limited noise provided by a digital
+pseudo-random bit generator.
+The sound source that is used depends on whether the pitch value is zero
+or not:  notice that this precludes mixed excitation for voiced fricatives
+(and the sound is noticeably poor in words like "zee").
+A gain multiplication is performed before the signal is passed through the
+lattice synthesis filter, described earlier.
+.sh "11.4  Programmable signal processors"
+.pp
+The TI chip has a fixed architecture, and is destined forever
+to implement the same vocal tract model \(em a 10'th order lattice filter.
+A more recent device, the Programmable Digital Signal Processor
+(Caldwell, 1980) from Telesensory Systems allows more flexibility
+in the type of model.
+.[
+Caldwell 1980
+.]
+It can serve as a digital formant synthesizer or a linear predictive
+synthesizer, and the order of model (number of formants, in the former case)
+can be changed.
+.pp
+Before describing the PDSP, it is worth looking at an earlier microprocessor
+which was designed for digital signal processing.
+Some industry observers have said that this processor, the Intel 2920,
+is to the analogue design engineer what the first microprocessor was to
+the random logic engineer way back in the mists of time (early 1970's).
+.rh "The 'analogue microprocessor'."
+The 2920 is a digital microprocessor.
+However, it contains an on-chip D/A converter, which can be used in
+successive approximation fashion for A/D conversion under program control,
+and its architecture is designed to aid digital signal processing calculations.
+Although the precision of conversion is 9 bits, internal arithmetic is
+done with 25 bits to accomodate the accumulation of round-off errors in
+arithmetic operations.
+An on-chip programmable read-only memory holds a 192-instruction program,
+which is executed in sequence with no program jumps allowed.
+This ensures that each pass through the program takes the same time,
+so that the analogue waveform is regularly sampled and processed.
+.pp
+The device is implemented in n-channel MOS technology, which makes it
+slightly faster than the pMOS Speak 'n Spell chip.
+At its fastest operating speed each instruction takes 400 nsec.
+The 192-instruction program therefore executes in 78.6\ $mu$sec, corresponding
+to a sampling rate of almost 13\ kHz.
+Thus the processor can handle signals with a bandwidth of 6.5\ kHz \(em ample
+for high-quality speech.
+However, a special EOP (end of program) instruction is provided which
+causes an immediate jump back to the beginning.
+Hence if the program occupies less than 192 instructions, faster sampling
+rates can be used.
+For example, a single second-order formant resonance
+requires only 14 instructions and so can
+be executed at over 150\ kHz.
+.pp
+Despite this speed, the 2920 is only marginally capable of synthesizing
+speech.
+Table 11.7 gives approximate numbers of instructions needed to do some
+subtasks for speech generation (Hoff and Li, 1980).
+.[
+Hoff Li 1980 Software makes a big talker
+.]
+.RF
+.nr x0 \w'parameter entry and data distribution0000'+\w'00000'
+.nr x1 \w'instructions'
+.nr x2 (\n(.l-\n(x0)/2
+.in \n(x2u
+.ta \w'parameter entry and data distribution0000'u
+\l'\n(x0u\(ul'
+.sp
+task	\0\0\0\0\0\h'-\n(x1u'instructions
+\l'\n(x0u\(ul'
+.sp
+parameter entry and data distribution	35\-40
+glottal pulse generation	\0\0\0\08
+noise generation	\0\0\011
+lattice section	\0\0\020
+formant filter	\0\0\014
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.in 0
+.FG "Table 11.7  2920 instruction counts for typical speech subsystems"
+The parameter entry and data distribution procedure
+collects 10 8-bit parameters from a serial input stream, at a frame rate of
+100 frames/s.
+The parameter data rate is 8\ Kbit/s, and the routine assumes that the
+2920 performs each complete cycle in 125\ $mu$sec to generate sampled speech
+at 8\ kHz.
+Therefore one bit of parameter data is accepted on every cycle.
+The glottal pulse program generates an asymmetrical triangular waveform
+(Chapter 5), while the noise generator uses a 17-bit pseudo-random feedback
+shift register.
+About 30% of the 192-instruction program memory is consumed by these
+essential tasks.
+A two-multiplier lattice section takes 20 instructions,
+and so only six sections can fit into the remaining program space.
+It may be possible to use two 2920's to implement a complete 10 or 12'th
+order lattice, but the results of the first stage must be passed to the
+second by transmitting analogue or digital data between each of the
+2920's analogue ports \(em not a terribly satisfactory method.
+.pp
+Since a formant filter occupies only 14 instructions, up to nine of them
+would fit in the program space left after the above-mentioned essential
+subsystems.
+Although other necessary house-keeping tasks may reduce this number
+substantially,
+it does seem possible to implement a formant synthesizer on a single 2920.
+.rh "The Programmable Digital Signal Processor."
+Whereas the 2920 is intended for general signal-processing jobs,
+Telesensory Systems' PDSP
+(Programmable Digital Signal Processor) is aimed specifically at speech
+synthesis.
+It comprises two separate chips, a control unit and an arithmetic unit.
+To build a synthesizer these must be augmented with external memory
+and a D/A converter, arranged in a configuration like that of Figure 11.12.
+.FC "Figure 11.12"
+.pp
+The control unit accepts parameter data from a host computer, one byte at a time.
+The data is temporarily held in buffer memory before being serialized and passed
+to the arithmetic unit.
+Notice that for the 2920 we assumed that parameters were presented
+to the chip already serialized and precisely timed:  the PDSP control unit
+effectively releases the host from this high-speed real-time operation.
+But it does more.
+It generates both a voiced and an unvoiced excitation source and passes them
+to the arithmetic unit, to relieve the latter of the general-purpose
+programming required for both these tasks and allow its instruction set
+to be highly specialized for digital filtering.
+.pp
+The arithmetic unit has rather a peculiar structure.
+It accomodates only 16 program steps and can execute the full 16-instruction
+program at a rate of 10\ kHz.
+The internal word-length is 18 bits, but coefficients and the digital output
+are only 10 bits.
+Each instruction can accomplish quite a lot of work.
+Figure 11.13 shows that there are four separate blocks of store in addition
+to the program memory.
+.FC "Figure 11.13"
+One location of each block is automatically associated with each program step.
+Thus on instruction 2, for example, two 18-bit scratchpad registers MA(2)
+and MB(2), and two 10-bit coefficient registers A1(2) and A2(2), are
+accessible.
+In addition five general registers, curiously numbered R1, R2, R5, R6, R7,
+are available to every program step.
+.pp
+Each instruction has five fields.
+A single instruction loads all the general registers and simultaneously
+performs two multiplications and up to three additions.
+The fields specify exactly which operands are involved in these operations.
+.pp
+The instructions of the PDSP arithmetic unit are really very powerful.
+For example, a second-order digital formant resonator requires only
+two program steps.
+A two-multiplier lattice stage needs only one step, and
+a complete 12-stage lattice filter can be implemented in the 16 steps available.
+An important feature of the architecture is that it
+is quite easy to incorporate more than one
+arithmetic unit into a system, with a single control unit.
+Intermediate data can be transferred digitally between arithmetic units
+since the D/A converter is off-chip.
+A four-multiplier normalized lattice (Chapter 6) with 12 stages can be implemented
+on two arithmetic units, as can a lattice filter which incorporates zeros
+as well as poles, and a complex series/parallel formant synthesizer
+with a total of 12 resonators whose centre frequencies and bandwidths
+can be controlled independently (Klatt, 1980).
+.[
+Klatt 1980
+.]
+.pp
+How this device will fare in actual commercial products is yet to be seen.
+It is certainly much more sophisticated than the TI Speak 'n Spell chip,
+and a complete system will necessitate a much higher chip count and consequently
+more expense.
+Telesensory Systems are committed to producing a text-to-speech
+system based upon it
+for use both in a reading machine for the blind and as a text-input
+speech-output computer peripheral.
+.sh "11.5  References"
+.LB "nnnn"
+.[
+$LIST$
+.]
+.LE "nnnn"
+.bp
+.ev2
+.ta \w'\fIsilence\fR 'u +\w'.EH100'u +\w'(used to change amplitude and duration)00'u +\w'00000000000test word'u
+.nr x0 \w'\fIsilence\fR '+\w'.EH100'+\w'(used to change amplitude and duration)00'+\w'00000000000test word'
+\l'\n(x0u\(ul'
+.sp
+.nr x1 (\w'Votrax'/2)
+.nr x2 (\w'duration (msec)'/2)
+.nr x3 \w'test word'
+	\h'-\n(x1u'Votrax		\0\h'-\n(x2u'duration (msec)	\h'-\n(x3u'test word
+\l'\n(x0u\(ul'
+.sp
+.nr x3 \w'hid'
+\fIi\fR	I		118	\h'-\n(x3u'hid
+	I1	(sound equivalent of I)	\083
+	I2	(sound equivalent of I)	\058
+	I3	(allophone of I)	\058
+	.I3	(sound equivalent of I3)	\083
+	AY	(allophone of I)	\065
+.nr x3 \w'head'
+\fIe\fR	EH		118	\h'-\n(x3u'head
+	EH1	(sound equivalent of EH)	\070
+	EH2	(sound equivalent of EH)	\060
+	EH3	(allophone of EH)	\060
+	.EH2	(sound equivalent of EH3)	\070
+	A1	(allophone of EH)	100
+	A2	(sound equivalent of A1)	\095
+.nr x3 \w'had'
+\fIaa\fR	AE		100	\h'-\n(x3u'had
+	AE1	(sound equivalent of AE)	100
+.nr x3 \w'hod'
+\fIo\fR	AW		235	\h'-\n(x3u'hod
+	AW2	(sound equivalent of AW)	\090
+	AW1	(allophone of AW)	143
+.nr x3 \w'hood'
+\fIu\fR	OO		178	\h'-\n(x3u'hood
+	OO1	(sound equivalent of OO)	103
+	IU	(allophone of OO)	\063
+.nr x3 \w'hud'
+\fIa\fR	UH		103	\h'-\n(x3u'hud
+	UH1	(sound equivalent of UH)	\095
+	UH2	(sound equivalent of UH)	\050
+	UH3	(allophone of UH)	\070
+	.UH3	(sound equivalent of UH3)	103
+	.UH2	(allophone of UH)	\060
+.nr x3 \w'hard'
+\fIar\fR	AH1		143	\h'-\n(x3u'hard
+	AH2	(sound equivalent of AH1)	\070
+.nr x3 \w'hawed'
+\fIaw\fR	O		178	\h'-\n(x3u'hawed
+	O1	(sound equivalent of O)	118
+	O2	(sound equivalent of O)	\083
+	.O	(allophone of O)	178
+	.O1	(sound equivalent of .O)	123
+	.O2	(sound equivalent of .O)	\090
+.nr x3 \w'who d'
+\fIuu\fR	U		178	\h'-\n(x3u'who'd
+	U1	(sound equivalent of U)	\090
+.nr x3 \w'heard'
+\fIer\fR	ER		143	\h'-\n(x3u'heard
+.nr x3 \w'heed'
+\fIee\fR	E		178	\h'-\n(x3u'heed
+	E1	(sound equivalent of E)	118
+\fIr\fR	R		\090
+	.R	(allophone of R)	\050
+\fIw\fR	W		\083
+	.W	(allophone of W)	\083
+\l'\n(x0u\(ul'
+.sp3
+.ce
+Table 11.2  Votrax sound segments and their durations
+.bp
+\l'\n(x0u\(ul'
+.sp
+.nr x1 (\w'Votrax'/2)
+.nr x2 (\w'duration (msec)'/2)
+.nr x3 \w'test word'
+	\h'-\n(1u'Votrax		\0\h'-\n(x2u'duration (msec)	\h'-\n(x3u'test word
+\l'\n(x0u\(ul'
+.sp
+\fIl\fR	L		105
+	L1	(allophone of L)	105
+\fIy\fR	Y		103
+	Y1	(allophone of Y)	\083
+\fIm\fR	M		105
+\fIb\fR	B		\070
+\fIp\fR	P		100
+	.PH	(aspiration burst for use with P)	\088
+\fIn\fR	N		\083
+\fId\fR	D		\050
+	.D	(allophone of D)	\053
+\fIt\fR	T		\090
+	DT	(allophone of T)	\050
+	.S	(aspiration burst for use with T)	\070
+\fIng\fR	NG		120
+\fIg\fR	G		\075
+	.G	(allophone of G)	\075
+\fIk\fR	K		\075
+	.K	(allophone of K)	\080
+	.X1	(aspiration burst for use with K)	\068
+\fIs\fR	S		\090
+\fIz\fR	Z		\070
+\fIsh\fR	SH		118
+	CH	(allophone of SH)	\055
+\fIzh\fR	ZH		\090
+	J	(allophone of ZH)	\050
+\fIf\fR	F		100
+\fIv\fR	V		\070
+\fIth\fR	TH		\070
+\fIdh\fR	THV		\070
+\fIh\fR	H		\070
+	H1	(allophone of H)	\070
+	.H1	(allophone of H)	\048
+\fIsilence\fR	PA0		\045
+	PA1		175
+	.PA1		\0\05
+
+	.PA2 (used to change amplitude and duration)	\0\0\-
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.sp3
+.ce
+Table 11.2  (continued)
+.bp
+.ta 0.8i +2.6i +\w'(AH1 .UH2)  (O U)000'u
+.nr x0 0.8i+2.6i+\w'(AH1 .UH2)  (O U)000'+\w'; i uh  \- here'
+\l'\n(x0u\(ul'
+.sp
+vowel clusters
+	EH I	A1 AY	; e i  \- hey
+	UH OO	O U	; uh u  \- ho
+	AE I	(AH1 EH3) I	; aa i  \- hi
+	AE OO	(AH1 .UH2) (O U)	; aa u  \- how
+	AW I	(O UH) E	; o i  \- hoi
+	I UH	E I	; i uh  \- here
+	EH UH	(EH A1) EH	; e uh  \- hair
+	OO UH	OO UH	; u uh  \- poor
+	Y U	Y1 (IU U)
+.sp
+vowel transitions
+	{F M B P} O	(.O1 O)
+	{L R} EH	(EH3 EH)
+	{B K T D R} UH	(UH3 UH)
+	{T D} A1	(EH3 A1)
+	{T D} AW	(AH1 AW)
+	{W} I	(I3 I)
+	{G SH W K} OO	(IU OO)
+	AY {K G T D}	(AY Y)
+	E {M T}	(E Y)
+	I {M T}	(I Y)
+	E {L}	(I3 UH)
+	EH {R N S D T}	(EH EH3)
+	I {R T}	(I I3)
+	AE {S N}	(AE EH)
+	AE {K}	(AE EH3)
+	A1 {R}	(A1 EH1)
+	AH1 {R P K}	(AH1 UH)
+	AH1 {ZH}	(AH1 EH3)
+.sp
+intervocalics
+	{voiced} T {voiced}	DT
+.sp
+consonant transitions
+	L {EH}	L1
+	H {U OO IU}	H1
+\l'\n(x0u\(ul'
+.sp3
+.ce
+Table 11.5  Contextual rules for Votrax sound segments
+.bp
+\l'\n(x0u\(ul'
+.sp
+consonant clusters
+	B {stop-consonant}	(B PA0)
+	P {stop-consonant}	(P PA0)
+	D {stop-consonant}	(D PA0)
+	T {stop-consonant}	(T PA0)
+	DT {stop-consonant}	(T PA0)
+	G {stop-consonant}	(G PA0)
+	K {stop-consonant}	(K PA0)
+	{D T} R	(.X1 R)
+	K R	.K (.X1 R)
+	{consonant} R	.R
+	{consonant} L	L1
+	K W	.K .W
+	D ZH	D J
+	T SH	T CH
+.sp
+initial effects
+	{.syll} P {vowel}	(P .PH)
+	{.syll} K {vowel}	(K .H1)
+	{.syll} T {vowel}	(T .S)
+	{.syll} L	L1
+	{.syll} H {U OO O AW AH1}	H1
+.sp
+terminal effects
+	E {PA0}	(E Y)
+\l'\n(x0u\(ul'
+.ta 0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i +0.8i
+.sp3
+.ce
+Table 11.5  (continued)
+.ev
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/geo b/src/test/java/org/xerial/snappy/testdata/calgary/geo
new file mode 100644
index 0000000..6ea4550
Binary files /dev/null and b/src/test/java/org/xerial/snappy/testdata/calgary/geo differ
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/news b/src/test/java/org/xerial/snappy/testdata/calgary/news
new file mode 100644
index 0000000..df56feb
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/news
@@ -0,0 +1,10059 @@
+#! rnews 1312
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!strath-cs!jml
+From: jml at cs.strath.ac.uk (Joseph McLean)
+Newsgroups: sci.math
+Subject: the extendability of digit sequences into primes
+Message-ID: <753 at stracs.cs.strath.ac.uk>
+Date: 2 Dec 87 10:36:33 GMT
+Reply-To: jml at cs.strath.ac.uk (Joseph McLean)
+Organization: Comp. Sci. Dept., Strathclyde Univ., Scotland.
+Lines: 19
+
+Is the following conjecture reasonable and/or provable? :
+
+Given a sequence of digits, starting with a non-zero digit, of arbitrary
+but finite length, is it always possible to extend this sequence by
+appending more digits, in such a way as to form a prime?
+
+e.g. the sequence 1 can be extended into a prime in an infinite number
+of ways, as in 13, 17, 19, 101, 1231, 1579, etc (there an infinite
+number of primes beginning with a 1 by Bertrand's postulate).
+However, it is far more difficult to try and locate a prime which
+starts with the sequence 1528296922945708 (although at least one is known).
+
+My personal opinion is that the conjecture is reasonable, simply because
+one can keep adding digits at the end and checking for primality ad
+infinitum, and the law of averages will do the rest. Of course this is
+totally groundless mathematically, so can anyone provide a heuristic
+argument with more weight?
+
+        jml, the mad mathematician.
+#! rnews 3077
+Path: alberta!mnetor!uunet!husc6!psuvax1!burdvax!bigburd!fritzson
+From: fritzson at bigburd.PRC.Unisys.COM (Richard Fritzson)
+Newsgroups: comp.editors
+Subject: Re: lisp environments (Structure vs. text editors)
+Message-ID: <3375 at bigburd.PRC.Unisys.COM>
+Date: 14 Dec 87 02:11:18 GMT
+References: <487 at PT.CS.CMU.EDU> <460 at cresswell.quintus.UUCP> <499 at PT.CS.CMU.EDU>
+Sender: news at bigburd.PRC.Unisys.COM
+Organization: Unisys Corporation, Paoli Research Center; Paoli, PA
+Lines: 56
+
+In article <499 at PT.CS.CMU.EDU> ralphw at IUS2.CS.CMU.EDU (Ralph Hyre) writes:
+>In article <460 at cresswell.quintus.UUCP> pds at quintus.UUCP (Peter Schachte) writes:
+>>Text editors CANNOT simulate structure editors.  They can do a rather
+>>feeble job of it.  Text editors fall down when context information is
+>
+>I disagree - a PROGRAMMABLE text editor can do anything you want.  This is
+>because it's programmable.  Whether you're happy with the performance or a
+
+Sure it can do anything. The best way for a programmable text editor to
+simulate a structure editor would be for it to build an internal 
+representation (or structure) or what was really being edited and then 
+use its text manipulating primitives to show the user the effect of his 
+editing commands on the structure that is "really" being edited. Now you've
+shown that mocklisp (for example) is a language in which you can implement
+a structure editor. I doubt if it is the best way to do it though.
+
+>>...For example:  a structure editor can supply different commands, different
+>>facilities, for editing comments and code.
+>Seems like there's the potential here for moby modefulness.  I can't see
+>why I would want different commands when I edit code compared with comments.
+
+I don't know about "commands", but Common Lisp comments are nothing
+like Common Lisp code (much to the shame of Common Lisp). I want the
+characters I type in as comments treated differently than those I type in 
+as parts of S-expressions.
+
+>My interest is in an pseudo-WYSIWYG editor which gives you the option
+>of entering/editing text without formatting attributes, then optionally 
+>displaying the text with them. <...>This sort of decoupling between editing a
+>document and a representation of a document could even be used to great
+>advantage in many environments:
+
+You're right. An editor which is really editing the structure underlying
+the visual presentation of it IS a useful thing. 
+
+>	A program code editor might actually be showing you variable names,
+>	statements, and S-expressions while it is really writing the P-code
+>	(or .lbin file) on the fly.
+>	This could result in 'instant' language interpreter facilities and 
+>	fast compilers.
+>	[I admit that this might be hairy to program in MockLisp.]
+
+But it is one of the reasons Xerox structure editor fans are fans.
+
+>[disclaimer: I've never used a 'structure editor' 
+
+No offense intended, but I could tell. If you write any Lisp you should
+look for an opportunity to try SEdit on a D-machine.
+
+
+
+
+-- 
+	-Rich Fritzson
+	 ARPA: fritzson at prc.unisys.com
+	 UUCP: {sdcrdcf,psuvax1,cbmvax}!burdvax!fritzson
+#! rnews 3135
+Path: alberta!mnetor!uunet!husc6!cmcl2!brl-adm!umd5!ames!sdcsvax!sdcc6!loral!dml
+From: dml at loral.UUCP (Dave Lewis)
+Newsgroups: rec.arts.movies
+Subject: Re: Live Action Amber Films
+Summary: Use Zelazny's descriptions!
+Message-ID: <1496 at loral.UUCP>
+Date: 14 Dec 87 06:41:04 GMT
+References: <349 at morningdew.BBN.COM> <2620001 at hpcvlx.HP.COM>
+Reply-To: dml at loral.UUCP (Dave Lewis)
+Followup-To: rec.arts.movies
+Distribution: na
+Organization: Loral Instrumentation, San Diego
+Lines: 59
+
+In article <2620001 at hpcvlx.HP.COM> markc at hpcvlx.HP.COM (Mark Cook) writes:
+>>/ hpcvlx:rec.arts.movies / dkovar at lf-server-2.BBN.COM (David Kovar) /  7:07 am  Dec  9, 1987 /
+>>
+>>  Well, someone else was wondering who would be the actors in a Tolkien
+>>film which brought to mind a favorite question of mine from a few years
+>>back: Who would play the parts of a Amber film? I used to have the
+
+>>Corwin: Mel Gibson
+
+Jonathan Pryce. From "Something Wicked This Way Comes".
+
+>  even better, how about Timothy Dalton (James Bond isn't the only thing he
+
+>>Brand: (Who's the guy from Kiss who was in Runaway?)
+
+>  You mean Gene Simmons.  Well, he could play the part but he has to look like
+
+  No way. Brand is "a figure both like Bleys and myself. My features, though
+smaller, my eyes, Bleys' hair. There was a quality of both strength and weak-
+ness, questing and abandonment about him." This is Corwin speaking, of course.
+
+  And Bleys is "a fiery bearded, flame-crowned man, dressed all in red and
+orange, mainly of silk stuff, and he held a sword in his right hand and a
+glass of wine in his left, and the devil himself danced behind his eyes, as
+blue as Flora's, or Eric's. His chin was slight, but the beard covered it."
+
+  I can't think of anyone offhand for either part, but I nominate Gene Simmons
+to play Caine: "Then came the swarthy, dark-eyed countenance of Caine, dressed
+all in satin that was black and green, wearing a dark three-cornered hat set
+at a rakish angle, a green plume of feathers trailing down the back." (Yeah,
+I got "Nine Princes in Amber" lying right next to the keyboard here)
+
+  Random: "a wily-looking little man, with a sharp nose and a laughing mouth
+and a shock of straw-colored hair." How about Dudley Moore (with his hair
+bleached, of course).
+
+  Dierdre: "a black-haired girl with [Flora's] blue eyes, and her hair hung
+long and she was dressed all in black, with a girdle of silver about her
+waist." Lee Meriwether or Kate Jackson.
+
+  Fiona: "with hair like Bleys or Brand, [Corwin's] eyes, and a complexion
+like mother of pearl.  Ann-Margret!
+
+  That's all for now; if people are interested I can type in the whole 2-1/2
+pages of descriptions so we'll REALLY have something to argue over.
+
+-------------------------------
+          Dave Lewis    Loral Instrumentation   San Diego
+
+  hp-sdd --\     ihnp4 --\
+  sdcrdcf --\      bang --\   kontron -\
+  csndvax ---\   calmasd -->-->!crash --\
+  celerity --->------->!sdcsvax!sdcc3 --->--->!loral!dml  (uucp)
+  dcdwest ---/                 gould9 --/
+
+  "I'm alive and he's dead and that's the way I wanted it."
+   -- Corwin, about Borel
+
+-------------------------------
+#! rnews 2421
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!strath-cs!jim
+From: jim at cs.strath.ac.uk (Jim Reid)
+Newsgroups: comp.mail.headers
+Subject: Re: RFC976 vs. the real world...
+Message-ID: <754 at stracs.cs.strath.ac.uk>
+Date: 2 Dec 87 12:51:51 GMT
+References: <18533 at amdahl.amdahl.com>
+Reply-To: jim at cs.strath.ac.uk
+Organization: Comp. Sci. Dept., Strathclyde Univ., Scotland.
+Lines: 40
+
+In article <18533 at amdahl.amdahl.com> tron at uts.amdahl.com (Ronald S. Karr) writes:
+>Some Introduction:
+>However, we have conflicting ideas concerning what to do with sender
+>addresses in headers.  We do, now, support the idea that a pure !-path
+>coming in can be left as a !-path, with the current hostname prepended
+>(this is optional and is a function of the destination).  However,
+>should I ever produce, in mail originated locally, a From: line in the
+>following form?
+>
+>	From: localhost!username
+
+The answer is perhaps. In an ideal world, everyone will adhere to one
+standard for mail headers - RFC822 possibly, but X.400 is more likely.
+Until that glorious day arrives (if it ever does), mailers at the mail
+'gateways' between networks will have little option but to munge
+addresses because of incompatible mail headers and addressing formats.
+
+What you mail system should do is rewrite mail headers into the
+appropriate form for transmission to a given host. In short, if your
+uucp neighbours only understand bang-style addresses, you mailer should
+only present bang-style paths to these sites. If some sites understand
+RFC822 (user at host.domain), then you should send them RFC822 style mail.
+What would be less easy for the mailer is separating your bang-stlye
+uucp neighbours from those who understand RFC822.
+
+The best mailers (MMDF or sendmail - no flames please!) take an input
+address, convert it to a canonical form and then rewrite the address in
+the appropriate style for the message transfer agent. This is the most
+sensible way of dealing with hybrid addresses like A!B at C. [Does that
+mean send by uucp to A for relaying to user B on host C or does it mean
+send to C for them to relay to user B on uucp host A? Then what if C
+(or A) doesn't like addresses with '!' (or '@') signs in them?]
+
+		Jim
+-- 
+ARPA:	jim%cs.strath.ac.uk at ucl-cs.arpa, jim at cs.strath.ac.uk
+UUCP:	jim at strath-cs.uucp, ...!seismo!mcvax!ukc!strath-cs!jim
+JANET:	jim at uk.ac.strath.cs
+
+"JANET domain ordering is swapped around so's there'd be some use for rev(1)!"
+#! rnews 3873
+Path: alberta!mnetor!uunet!husc6!cmcl2!brl-adm!umd5!ames!sdcsvax!sdcc6!loral!dml
+From: dml at loral.UUCP (Dave Lewis)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: One more long-gone show
+Summary: What S. F. movies should be
+Keywords: Questor
+Message-ID: <1497 at loral.UUCP>
+Date: 14 Dec 87 06:45:22 GMT
+References: <1672 at bsu-cs.UUCP>
+Reply-To: dml at loral.UUCP (Dave Lewis)
+Followup-To: rec.arts.sf-lovers
+Distribution: na
+Organization: Loral Instrumentation, San Diego
+Lines: 64
+
+In article <1672 at bsu-cs.UUCP> cfchiesa at bsu-cs.UUCP (Christopher F. Chiesa) writes:
+>Anyone remember a movie called _The_Questor_Tapes_ ?  Basic premise: gov't
+>project constructs an android according to eccentric scientist's specs; and-
+
+>C.Chiesa
+
+  Yea, verily, I recall The Questor Tapes. I've forgotten the scientist's
+name, but he was a very rich and secretive genius known for several major
+advances in robotics and cybernetics. About 2 years previous to the start
+of the movie, he had disappeared, leaving only a partially completed project
+he called Questor. Much of the work was complete, including a small fusion
+reactor, most of the brain, and a lot of the support machinery. He also left
+a BIG mag tape of programs, which some government idiot had partially erased
+while trying to decode it. Questor, when activated, did nothing; the team
+that assembled him figured it was because of the bad tape.
+
+  Late that night, Questor got up, used the 'finishing' molds to give himself
+human features, and walked out. The scientist had known one member of the
+Questor-assembly team and put his name and address on the program tape; by
+good fortune it had survived the attempted decoding. Questor knows only that
+he must find `a boat' -- other details have been erased.
+
+  The government catches up with them in a playground and some fool shoots
+Questor. Apparently the shock knocks some bits loose because when he sees
+a jungle gym that looks like Noah's Ark he remembers, "the boat, the boat
+of legend. [whatsisname] is waiting for me there." He also remembers that
+if he doesn't find the scientist within about two days, his fusion power
+supply is programmed to overload and blow up.
+
+  They patch him up and he leads them a merry chase to Mt. Ararat where he
+finds his creator in a cave hidden by a force barrier/hologram projection.
+There is a long row of metallic slabs suspended about a meter above the
+floor; on each lies a defunct robot. Each one wears clothing from a time
+far earlier than the next. Questor's creator lies on the second to last
+slab, still conscious but unable to move.
+
+  These robots have been watching over the human race for more than ten
+thousand years. Each one lasts two hundred years, then builds his successor.
+Questor's predecessor was brought to an early end by some combination of
+pollution and radiation exposure; he has provided Questor with extra
+shielding so he will last the full two centuries.
+
+  Questor is the last. By the end of his term, the human race will have
+reached a point where we can make our own decisions without guidance.
+The robots were placed here by some advanced aliens to see us through our
+racial childhood, to allow us a chance to mature and achieve whatever
+potential we have.
+
+  The Questor Tapes was an excellent movie, one makers of more recent films
+should take a lesson from. Very few other movies have impressed me as much
+as "2001: A Space Odyssey" and "The Questor Tapes". They show up the likes
+of"Close Encounters of the Third Kind" and "E.T." for the vapid silliness
+they are.
+
+-------------------------------
+          Dave Lewis    Loral Instrumentation   San Diego
+
+  hp-sdd --\     ihnp4 --\
+  sdcrdcf --\      bang --\   kontron -\
+  csndvax ---\   calmasd -->-->!crash --\
+  celerity --->------->!sdcsvax!sdcc3 --->--->!loral!dml  (uucp)
+  dcdwest ---/                 gould9 --/
+
+-------------------------------
+#! rnews 1384
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: M. John Harrison
+Message-ID: <1560 at brahma.cs.hw.ac.uk>
+Date: 2 Dec 87 18:20:17 GMT
+References: <1950 at charon.unm.edu>
+Reply-To: jack at cs.glasgow.ac.uk (Jack Campin)
+Organization: PISA Project, Glesga Yoonie
+Lines: 23
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+
+
+[ignore the above address and use my signature]
+
+
+By far the best thing I have read by MJH is a long short story called
+"Running Down", about a man with unwanted psychic powers that cause things
+to malfunction, decay and fall apart around him. It is set in a Britain
+in the near future of when the story was written (i.e. about now) in which
+the whole society reflects a similar dingy, pointless chaos - remarkably
+like Britain after 8 years of Thatcher, in fact.
+He's very good at describing that sort of situation - his novel "The Centauri
+Device" does it at length, though his suggested political solution is bloody
+stupid. His understanding of anarchism is about on a level with Robert Anton
+Wilson's.
+
+- jack
+
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 1188
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: rec.music.classical
+Subject: Re: Tippett
+Message-ID: <1561 at brahma.cs.hw.ac.uk>
+Date: 2 Dec 87 18:38:20 GMT
+References: <1950 at bath63.ux63.bath.ac.uk>
+Reply-To: jack at cs.glasgow.ac.uk (Jack Campin)
+Organization: PISA Project, Glesga Yoonie
+Lines: 15
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+
+[ignore the above email address and use my signature]
+Tippett moved on a LONG way musically after "A Child Of Our Time".
+I believe his masterpiece is the Triple Concerto for violin, viola and cello.
+There is a wonderful recording of it by Pauk, Imai and Kirschbaum with the LSO
+under Davis.
+A problem I find with a lot of his music is the silly words. The man really
+shouldn't have tried writing his own libretti that often.
+I believe he's got another opera in the pipeline, due for its premiere in the
+next few months.
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 894
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!jg
+From: jg at eagle.ukc.ac.uk (J.Grant)
+Newsgroups: comp.sys.mac
+Subject: The Spinning watch cursor
+Message-ID: <4023 at eagle.ukc.ac.uk>
+Date: 3 Dec 87 14:59:09 GMT
+Reply-To: jg at ukc.ac.uk (J.Grant)
+Organization: Computing Lab, University of Kent at Canterbury, UK.
+Lines: 11
+
+OK - I've changed my spinning watch back into the lovely sand-timer
+(remember the good old days?);  I've changed the CURS resource in the
+Finder and also in the System so that I have various quantities
+of sand in the top & bottom, but there is still a watch lurking!
+
+More precisely, where does the watch that says 9 o'clock live, as
+now I get the magic watch followed by the sand1->7, then the watch
+again as the cycle repeats.  This only happens in the Finder, so I
+suspect that there must be a watch lurking elsewhere, but where?
+
+Ps. system 4.2b(5?) & Finder 6.0 (Mac 512Ke)
+#! rnews 3539
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!csnjr
+From: csnjr at its63b.ed.ac.uk (Nick Rothwell)
+Newsgroups: rec.music.synth,rec.music.makers
+Subject: Casio MG500, Roland MT-32, MIDI bug? [LONG]
+Summary: Where's the MIDI bug in this lot?:
+Keywords: MG500 MT-32 MIDI
+Message-ID: <805 at its63b.ed.ac.uk>
+Date: 3 Dec 87 13:10:56 GMT
+Reply-To: nick%ed.lfcs at uk.ac.ucl.cs.nss (Nick Rothwell)
+Organization: LFCS, University of Edinburgh
+Lines: 46
+Xref: alberta rec.music.synth:1879 rec.music.makers:1070
+
+Last weekend a friend and I strolled into a music shop and ended up playing
+with the new Casio MG500 MIDI guitar linked into a Roland MT-32. I don't
+play guitar, and was just along for the curiosity, but I've got a few comments
+to make and a question about what I consider to be a MIDI bug in one of the
+instruments.
+   Firstly - the performance of the MG500. I wasn't actually playing it (I was
+just pushing buttons on the MT-32 instead), but I was impressed with its
+speed and tracking ability - it was fast and followed pitch accurately,
+responding to pitch bend and so on; it generally sounded pretty tight.
+There were a couple of things I didn't like - but maybe it's a generic
+weakness of all guitar-to-MIDI systems. Firstly, the guitar transmits
+velocity information (hit the string harder -> louder/brighter note), but
+gives no control (other than pitch-bend) once a note's sounding - there's
+nothing equivalent to aftertouch/modulation so once a note sounds you're
+at the mercy of the synth until you stop the string.
+Point two - You've got six strings, so you can only sound six synth voices.
+This is probably obvious, but playing a guitar patch through MIDI doesn't
+sound like a real guitar, because each touch of a string retriggers the voice
+on that string, sometimes in a rather distracting way. On a real (classical)
+guitar you have the resonance of the soundbox to hang on to notes so you
+aren't aware of this (I presume - comments?)
+Now for what is (in my opinion) a MIDI Bug! Play two different notes on
+two strings and you get two voices - ok so far. Play the same note on two
+different strings and you get one voice. Humm. Play two different notes on
+two strings and slide one note up to the other, and one of the voices is
+chopped off. I think this is a bug - something somewhere doesn't want to
+the same note more than once. Needless to say, this completely screws up
+a number of guitar chords.
+   We mentioned this to the guy in the shop. He seemed convinced that it's
+a problem with the MIDI spec. itself - if you play a keyboard synth, you
+have to release the middle C key to play it again, don't you? I think this
+is a load of dingos kidneys - if I send my D-50 two separate middle C
+note on messages, then I'll get two voices cycling through the envelopes at
+middle C pitch. This is what happens with the sustain pedal on, as well.
+   What's the verdict, net people? I think the guy was wrong (quite adamant,
+but wrong...) and there's a bug in one of the boxes. I suspect the MG500.
+If the MT-32 is anything like the D-50, then it doesn't care about playing
+the same note twice. (A quick note in passing that synths with less voices
+(Juno106 for instance) often won't double a voice, in an attempt to play
+chords properly without running out.)
+-- 
+Nick Rothwell,	Laboratory for Foundations of Computer Science, Edinburgh.
+		nick%lfcs.ed.ac.uk at nss.cs.ucl.ac.uk
+		<Atlantic Ocean>!mcvax!ukc!lfcs!nick
+~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
+"Nothing's forgotten. Nothing is ever forgotten."   - Herne
+#! rnews 1505
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!bath63!pes
+From: pes at ux63.bath.ac.uk (Smee)
+Newsgroups: comp.sys.atari.st
+Subject: Re: Resource file question
+Keywords: resource mwc rcs .rsc dri c
+Message-ID: <1963 at bath63.ux63.bath.ac.uk>
+Date: 3 Dec 87 10:33:26 GMT
+References: <1592 at wiley.UUCP>
+Reply-To: pes at ux63.bath.ac.uk (Smee)
+Organization: AUCC c/o University of Bath
+Lines: 19
+
+
+You might try looking to see if K-Resource is still available (by Kuma Software,
+who else?).  It's been out a long while.  It's now available bundled with some
+of the MetaComCo stuff (in particular the new Lattice C) but I believe that
+Kuma still do it separately as well.  Don't have a clue what it costs, but
+must be cheaper than a new compiler.
+
+It produces (by switch option) appropriate 'include' type files for C,
+FORTRAN, and 2 other languages which I've conveniently forgotten -- in
+addition to the expected .RSC file.  Will also produce a 'non-specific
+structured description' file (they say, I've never tried this) which is
+alleged to be pretty easy to massage into an appropriate 'include' for
+any unsupported language you might like.
+
+The documentation is written in a bit of a 'too-folksy' style for my liking,
+but the program is pretty intuitive to use which makes up for some of that.
+It does, however, assume that you have some sort of a clue as to what the
+various resource items/flags mean and do -- it doesn't teach you how to use
+RSC files or what they mean, but rather gives a handle for making them.
+#! rnews 1258
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!neil
+From: neil at cs.hw.ac.uk (Neil Forsyth)
+Newsgroups: comp.sys.atari.st
+Subject: Bug in bets test Gulam
+Keywords: none
+Message-ID: <1562 at brahma.cs.hw.ac.uk>
+Date: 3 Dec 87 09:46:32 GMT
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 28
+
+
+I think I have found a bug in the latest version of Gulam.
+
+         alias test 'echo $<'
+
+produces a couple of spurious charcters on the input line.
+
+         $<%&
+
+The characters are usually above $80. The alpha version didn't do this.
+I just delete them by backspacing anyway.
+
+         echo $<
+
+by itself works fine.
+
+-------------------------------------------------------------------------------
+"I think all right thinking people in this country are sick and tired of being
+told that ordinary decent people are fed up in this country with being sick and
+tired. I'm certainly not and I'm sick and tired of being told that I am!"
+- Monty Python
+
+ Neil Forsyth                           JANET:  neil at uk.ac.hw.cs
+ Dept. of Computer Science              ARPA:   neil at cs.hw.ac.uk
+ Heriot-Watt University                 UUCP:   ..!ukc!cs.hw.ac.uk!neil
+ Edinburgh
+ Scotland
+-------------------------------------------------------------------------------
+#! rnews 1009
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: comp.sys.mac
+Subject: Re: how strong of a magnet?
+Message-ID: <1564 at brahma.cs.hw.ac.uk>
+Date: 3 Dec 87 18:59:42 GMT
+References: <9554 at shemp.UCLA.EDU>
+Reply-To: jack at cs.glasgow.ac.uk (Jack Campin)
+Organization: PISA Project, Glesga Yoonie
+Lines: 12
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+
+[ignore the above email address and use my signature]
+This may be an FOAF story (urban folklore) but I have heard that the mag-lev
+train at Birmingham Airport lets enough field into the passenger compartment
+to wipe floppies.
+Then again, I have also heard that story about ordinary underground railways
+and it certainly isn't true of them.
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 988
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!csan
+From: csan at its63b.ed.ac.uk (Andie)
+Newsgroups: comp.sys.atari.st
+Subject: Re: Resource file question
+Keywords: Kuma
+Message-ID: <808 at its63b.ed.ac.uk>
+Date: 3 Dec 87 23:08:12 GMT
+References: <1592 at wiley.UUCP> <1298 at saturn.ucsc.edu>
+Reply-To: csan at its63b.ed.ac.uk (Andie)
+Organization: Computer Science Department, Edinburgh University
+Lines: 14
+
+In article <1298 at saturn.ucsc.edu> koreth at ssyx.ucsc.edu (Steven Grimm) writes:
+>
+>Kuma Software makes the best resource editor I've seen.  It's called
+>"K-Resource" and is a really friendly, well-thought-out piece of software.
+>
+I am in total agreement here. I use it in preference to any others I have.
+
+Andie Ness . Department of Computer Science ,Edinburgh University.
+
+ARPA:  csan%ed.itspna at nss.cs.ucl.ac.uk   UUCP:  ...!uunet!mcvax!ukc!itspna!csan
+                   	JANET: csan at uk.ac.ed.itspna
+
+% These are my own views and any resemblance to any coherent reasoning is
+% probably a typo.
+#! rnews 852
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!idec!howellg
+From: howellg at idec.stc.co.uk (Gareth Howell)
+Newsgroups: rec.ham-radio.packet,comp.protocols.tcp-ip
+Subject: NEEDED: KISS for TNC220
+Message-ID: <869 at idec.stc.co.uk>
+Date: 1 Dec 87 09:05:59 GMT
+Organization: ICL Network Systems, Stevenage, Herts. UK
+Lines: 12
+Xref: alberta rec.ham-radio.packet:767 comp.protocols.tcp-ip:1918
+
+I have a Pacomm TNC220 on which I want to run KISS and thence the KA9Q
+tcp/ip package.  Unfortunately I don't have a KISS for the TNC.
+Can anybody help.  I would prefer the co-resident bootstrap with a
+downloaded KISS module if possible.
+ta Gareth
+====
+
+-- 
+Gareth Howell  <howellg at idec.stc.co.uk>  G6KVK @ IO91VX
+ICL NS PNBC, England, SG1 1YB    Tel:+44 (0)438 738294
+howellg%idec%ukc at mcvax.uucp, mcvax!ukc!idec!howellg at uunet.uu.net
+G6KVK @ G4SPV (uk packet 144.650MHz)
+#! rnews 710
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!hilda
+From: hilda at tcom.stc.co.uk ( Jeff Tracey )
+Newsgroups: rec.arts.sf-lovers
+Subject: Thunderbirds are GO!!!
+Keywords: FAB
+Message-ID: <1503 at arran.tcom.stc.co.uk>
+Date: 2 Dec 87 10:54:39 GMT
+Organization: STC Telecoms, London N11 1HB.
+Lines: 14
+
+A few quick trivia questions on Thunderbirds :-
+
+1) Does anybody know what the phrase 'FAB' stands for ??? 
+
+2) What's the first mission that International Rescue accomplished ?
+
+3) What's the Butler's name on the Island AND who is his daughter ? 
+
+
+Regards,
+
+Steve Hillyer.  <hilda at tcom.stc.co.uk> || ...uunet!mcvax!ukc!stc!hilda
+STC Telecommunications, Oakleigh Rd South, London N11 1HB. 
+Phone : +44 1 368 1234 x3358
+#! rnews 1159
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!btnix!crouch
+From: crouch at btnix.axion.bt.co.uk (Chris Rouch)
+Newsgroups: comp.os.vms
+Subject: callable TPU?
+Keywords: TPU callable editor
+Message-ID: <632 at btnix.axion.bt.co.uk>
+Date: 3 Dec 87 11:33:58 GMT
+Organization: British Telecom Research Labs, Martlesham Heath, IPSWICH, UK
+Lines: 17
+
+I read somewhere that there is a callable version of EDT, available by using
+EDT$EDIT(...). Does anyone know if there is a similar function for the TPU
+editor and/or other commands such as MAIL, PRINT etc. If somebody could
+also point me in the direction of the VMS manual which contains this
+information (assuming there is one), I would be very grateful.
+
+		Chris Rouch
+
+--------------------------------------------------------------------------------
+vax to vax (UUCP)       CRouch at axion.bt.co.uk (...!ukc!btnix!crouch)
+desk to desk            RT3124, 310 SSTF,
+			British Telecom Research Laboratories,
+			Martlesham Heath, IPSWICH, IP5 7RE, UK.
+voice to voice          +44 473 646093
+
+	"Ours is not to look back, ours to continue the crack."
+--------------------------------------------------------------------------------
+#! rnews 1090
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!pete
+From: pete at tcom.stc.co.uk (Peter Kendell)
+Newsgroups: rec.music.classical
+Subject: Durufle virgin seeks advice
+Message-ID: <483 at stc-f.tcom.stc.co.uk>
+Date: 3 Dec 87 11:50:35 GMT
+Organization: STC Telecoms, London N11 1HB.
+Lines: 25
+
+
+	Being curious, as the name was completely new to me, I borrowed 
+	the Hyperion CD of Durufle's Requiem from my local public 
+	library. I enjoyed it very much and would like to find out more
+	about him, so :-
+
+	- What else has he written? (I believe he's not been very prolific)
+	
+	- What else has been recorded?
+	
+	- Is his other work similar to the Requiem; it is better, worse or
+	  just different?
+
+	- I thought I heard a Holst influence; is this typical?
+
+	- Are there other 20th Century composers in a similar vein that I
+	  should try?
+
+	
+	
+-- 
+------------------------------------------------------------------------------
+|		  Peter Kendell <pete at tcom.stc.co.uk>	        	     |
+|				...{uunet!}mcvax!ukc!stc!pete		     |
+------------------------------------------------------------------------------
+#! rnews 1235
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!praxis!gauss!drb
+From: drb at praxis.co.uk (David Brownbridge)
+Newsgroups: comp.unix.wizards
+Subject: Re: //host vs "mount point"
+Message-ID: <1606 at newton.praxis.co.uk>
+Date: 3 Dec 87 12:42:36 GMT
+References: <648 at tut.cis.ohio-state.edu> <1668 at tut.cis.ohio-state.edu> <38c15248.4580 at hi-csc.UUCP> <9559 at mimsy.UUCP> <411 at PT.CS.CMU.EDU>
+Sender: nobody at praxis.co.uk
+Reply-To: drb%praxis.uucp at ukc.ac.uk(David Brownbridge)
+Organization: Praxis Systems plc, Bath, UK
+Lines: 19
+
+In article <411 at PT.CS.CMU.EDU> jgm at K.GP.CS.CMU.EDU (John Myers) writes:
+>Just to add to the confusion, let me put in a plug in for the Carnegie-Mellon
+>University Computer Science Department's syntax:
+>
+>/../host
+
+We built a system which also allowed super-super-roots and so on ad infinitum.
+
+ /../NearbyHost
+ /../../OtherSite/host
+ /../../../OtherCountry/AnotherSite/host
+
+"/.." makes sense to me which is why I promoted it as the "University of
+Newcastle upon Tyne Computing Laboratory's syntax" :-) Some old-timers must
+remember the "Newcastle Connection" distributed UNIX system which Lindsay
+Marshall and I wrote in 1981-2.
+
+"Not for the iron fist but for the helping hand" 
+[Billy Bragg/Oyster Band "Between The Wars"]
+#! rnews 1785
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!datlog!slxsys!jpp
+From: jpp at slxsys.specialix.co.uk (John Pettitt)
+Newsgroups: comp.unix.xenix
+Subject: Re: smail2.5
+Summary: smail on xenix without writing new programs
+Keywords: At last, a 'real' mailer for Xenix (are you listening SCO) :-)
+Message-ID: <106 at slxsys.specialix.co.uk>
+Date: 3 Dec 87 06:44:07 GMT
+References: <484 at rel.eds.com>
+Reply-To: jpp at slxsys.UUCP (John Pettitt)
+Organization: Specialix International, London, UK.
+Lines: 27
+
+In article <484 at rel.eds.com> bob at rel.eds.com (Bob Leffler) writes:
+>During the last several weeks there have been numerous solutions posted to
+>the net to resolved the interface problem with Xenix and smail 2.5.  I
+>have tried all the solutions that I am aware of and my conclusion for the
+>best approach is a combination of two.
+
+	lots of stuff about how to install smail deleted.
+
+I have just installed smail 2.5 on Xenix 386.  The solution I used
+here was to replace /usr/lib/mail/execmail with a link to (copy of)
+/bin/smail.  I also moved the old sco execmail to execmail.sco and used
+it as the local delivery agent.  The above will not work as it stands
+because the command syntax for execmail is not the same as smail. This
+can be corrected by swapping the meaning of the -F and -f switches in
+smail (main.c and defs.h).   The local delivery macro in defs.h should
+be set to give /usr/lib/mail/execmail.com -f from to.   With this
+setup you get the sco mailer (mailx) and smail with both From and From:
+lines correct.  Also as execmail is still used for 'local' delivery
+micnet (sco's RS232 "LAN") still works.
+
+
+
+
+-- 
+John Pettitt G6KCQ, CIX jpettitt, Voice +44 1 398 9422
+UUCP:  ...uunet!mcvax!ukc!pyrltd!slxsys!jpp  (jpp at slxsys.co.uk)
+Disclaimer: I don't even own a cat to share my views !
+#! rnews 1287
+Path: alberta!mnetor!uunet!mcvax!lambert
+From: lambert at cwi.nl (Lambert Meertens)
+Newsgroups: sci.math
+Subject: Re: Least-squares fitting
+Message-ID: <135 at piring.cwi.nl>
+Date: 5 Dec 87 14:41:10 GMT
+References: <1823 at culdev1.UUCP>
+Organization: CWI, Amsterdam
+Lines: 28
+
+In article <1823 at culdev1.UUCP> drw at culdev1.UUCP (Dale Worley) writes:
+) Is is known how to perform least-squares fitting where the "error" is
+) the perpendicular distance between the point and the line?
+
+This least-squares fit still passes through the "center of gravity" of the
+data points, so assume that the data has been reduced such that the
+averages of the x- and y-coordinates are both zero.  Let the equation of
+the line to be determined be
+
+    x*(sin phi) - y*(cos phi) = 0,
+
+that is, it is the line making an angle phi with the x-axis.  Put
+
+    XX = SUM_i x[i]^2,
+    XY = SUM_i x[i]*y[i],
+    YY = SUM_i y[i]^2.
+
+Then tan(2*phi) = 2*XY/(XX-YY).
+
+This gives two solutions for phi.  Take the one such that the point
+(XX-YY, 2*XY) lies on the ray through the origin with angle 2*phi.
+(Remark.  It is possible to solve the coefficients for x and y
+algebraically, without going through the arctan routine, but it is harder
+then to get the signs correct.)
+
+-- 
+
+Lambert Meertens, CWI, Amsterdam; lambert at cwi.nl
+#! rnews 852
+Path: alberta!mnetor!uunet!mcvax!inria!imag!bordier
+From: bordier at imag.UUCP (Jerome Bordier)
+Newsgroups: comp.sys.mac
+Subject: Re: Arabic Wordprocessing / Publishing
+Message-ID: <2285 at imag.UUCP>
+Date: 4 Dec 87 10:24:35 GMT
+Reply-To: bordier at imag.UUCP (Jerome Bordier)
+Organization: IMAG, University of Grenoble, France
+Lines: 14
+
+"Winsoft", a small firm developping and selling software for the Macintosh,
+has made "Wintext", a word processor fully compatible with the "Arabic
+Macintosh+" (you have to obtain the Arabic keyboard distributed by Apple).
+Their address is:
+	Winsoft
+	34 boulevard de l'Esplanade
+	38000 GRENOBLE   France
+Phone no.:   76.87.56.01
+
+-- 
+Jerome BORDIER   Laboratoire Structures Discretes  Institut IMAG
+		 B.P.68 - 38402 SAINT MARTIN D'HERES CEDEX   France
+E.Mail:
+bordier at imag.imag.fr   or   {uunet.uu.net|mcvax}!imag!bordier
+#! rnews 1182
+Path: alberta!mnetor!uunet!mcvax!inria!rouaix
+From: rouaix at inria.UUCP (Francois Rouaix)
+Newsgroups: comp.sys.amiga
+Subject: POPCLI III Another Bug
+Keywords: left-amiga-esc timing
+Message-ID: <587 at inria.UUCP>
+Date: 5 Dec 87 17:45:19 GMT
+Organization: INRIA, Rocquencourt. France
+Lines: 20
+
+
+	Well, it seems there is another bug in Popcli III.
+	Just try 
+		1> run popcli 30
+	and then press Left-Amiga-Esc: the drive (where c: is) spins for
+	a moment and nothing happens.
+	The new 'screen-blanker' works all right but the automatic launch
+	is defeated.
+	Same for values of 10 and 40 seconds.
+	I didn't have time to figure out the limit value for which Popcli will
+	work (it works with default value and 240s).
+	Anyway, despite I *love* the new feature (let's keep the secret :-),
+	I'd rather have the old screen-blanker : at least I can sleep while
+	the Amiga is still on and working, and also it won't eat CPU-time I
+	need for Ray-tracing !!
+-- 
+
+*- Francois Rouaix                    /       When the going gets tough,     *
+*- USENET:rouaix at inria.inria.fr     \/            the guru goes meditating...*
+*  SYSOP of Sgt. Flam's Lonely Amigas Club. (33) (1) 39-55-84-59 (Videotext) *
+#! rnews 539
+Path: alberta!mnetor!uunet!husc6!uwvax!rutgers!lll-lcc!ames!sdcsvax!ucsdhub!hp-sdd!ncr-sd!crash!pnet01!hhaller
+From: hhaller at pnet01.cts.com (Harry Haller)
+Newsgroups: comp.dcom.modems
+Subject: Re: Facsimile on PC
+Message-ID: <2140 at crash.cts.com>
+Date: 14 Dec 87 04:36:13 GMT
+Sender: news at crash.cts.com
+Organization: People-Net [pnet01], El Cajon, CA
+Lines: 4
+
+There is a board you can plug into the backplane that purports to give you
+full FAX capability with editing. Of course, I forget the name, but if you
+look in the literature...
+()
+#! rnews 1436
+Path: alberta!mnetor!uunet!husc6!uwvax!rutgers!lll-lcc!ames!sdcsvax!ucsdhub!hp-sdd!ncr-sd!crash!pnet01!dm
+From: dm at pnet01.cts.com (Dan Melson)
+Newsgroups: rec.aviation
+Subject: Re: ARSA transition phraseology
+Message-ID: <2141 at crash.cts.com>
+Date: 14 Dec 87 06:16:11 GMT
+Sender: news at crash.cts.com
+Organization: People-Net [pnet01], El Cajon, CA
+Lines: 21
+
+The question was asked why an ARSA controller might want to know your
+destination.
+
+Actually, what they really want to know is where you're going *now*, like
+'direct PMD' or 'following I5 northbound' (I have *no* idea of what type of
+airspace that will take you through at any given altitude) or whatever course,
+heading, or whatever you intend to take through the ARSA.
+
+Now, if you're going to get flight following, the controller is going to want
+to know your complete route of flight for which you want flight following,
+so that it can be entered into the machine and the autumated handoffs can be
+used between sectors and facilities.
+
+As for why, that's very simple.  For purposes of calling traffic, which I
+consider to be sufficient, if no one else does.  The same reason the
+controller at the VFR tower asks your direction of departure.  If nothing
+else, the controller can always tell the left downwind departures 'traffic a
+(whatever) reported 6 SE for a left base entry', or whatever is appropriate.
+
+MY opinions ONLY!
+                                              DM
+#! rnews 2759
+Path: alberta!mnetor!uunet!mcvax!diku!iesd!jacob
+From: jacob at iesd.uucp (Jacob stergaard B{kke)
+Newsgroups: comp.ai
+Subject: job search, Comp. eng.
+Summary: I'm looking for a job
+Keywords: Job, Computer. eng., Computer. sci., M.S.
+Message-ID: <152 at iesd.uucp>
+Date: 2 Dec 87 13:20:07 GMT
+Reply-To: jacob at iesd.UUCP (Jacob \stergaard B{kke)
+Organization: Dept. of Comp. Sci., Aalborg University, Denmark (student)
+Lines: 69
+
+I'm looking for a job in Computer Engineering to begin around July
+1988. I'm getting my Master of Science in Computer Engineering June
+1988 and at present holding a degree equal to BS in Electronic
+Engineering. My BS studies have included:
+	
+	Computer hardware (hands-on knowledge with mc68k),
+	Analog electronic 
+	Control engineering (analog and digital control)
+
+My MS studies have included:
+
+	Software development (man-machine interface, what people want
+			      from programs) 
+	Compiler construction (an expertsystem shell) 
+	Program environment (for CCS programming) 
+	Distributed operating systems (in UNIX)
+ 	Compiler mapping object-orinted language on parallel computers
+
+Furthermore I do have experience in conventional programming (PASCAL,
+C, postscript, UNIX (awk, shell-scripts(C-shell) and yacc/lex) (and Basic)),
+functional programming (LISP and ML) and logical programming (Prolog)
+and knowledge about object-oriented programming. And I
+have also attended courses in VLSI design, databases, etc. I have been
+working with CDC under NOS/Telex, VAX 11/750 under Ultrix, SUN 3 under
+Sun OS 4.3 (UNIX), MacIntosh (LISA) under Finder and IBM S36 under IBM
+property operating system.  
+
+My spoken English is excellent and my written English is satisfactory,
+good knowledge of the Scandinavian languages (Danish (of course),
+Swedish and Norwegian), some speaking and reading knowledge of German
+and limited knowledge of French and Spanish (and Latin). 
+
+I have 5 years experience in group project work in engineering and
+computer scinence areas, broad social interest, good health.
+
+My interest include computer hardware and software, operating system
+design, expertsystems, distributed, concurrency and teaching.
+
+I'm open on location (outside Denmark) but I have relatives or other
+reasons to be especially intereted in:
+
+	Canada (British Colombia or Toronto)
+	USA (New England or Pacific Coast)
+	Pacific (New Zealand or Oceania)
+	Thailand
+	Scotland (Highlands)
+
+I'll look forward to any reponds.
+
+		Yours sincerely
+			
+			Jacob Baekke, Denmark
+
+For further information:
+
+Reply to:     	jacob at iesd.uucp, {...}!mcvax!diku!ised!jacob  or
+		 
+at Univ:	Jacob Baekke 
+		S9D (in spring S10)
+		Strandvejen 19
+		AUC
+		DK--9000 Aalborg
+		Denmark
+
+private:	Jacob Baekke
+		Davids Alle 48
+		DK--9000 Aalborg
+		Denmark
+		Tel. 45-(0)8102673
+#! rnews 2425
+Path: alberta!mnetor!uunet!husc6!bbn!rochester!cornell!uw-beaver!uw-june!uw-entropy!dataio!suvax1!hirayama
+From: hirayama at suvax1.UUCP (Pat Hirayama)
+Newsgroups: rec.arts.anime
+Subject: Re: Speed Racer and the Mach 5
+Message-ID: <810 at suvax1.UUCP>
+Date: 14 Dec 87 05:28:25 GMT
+References: <1103 at jumbo.dec.com>
+Organization: Seattle University, Seattle, WA.
+Lines: 45
+
+in article <1103 at jumbo.dec.com>, schubert at jumbo.dec.com (Ann Schubert) says:
+> Posted: Thu Dec 10 15:26:21 1987
+> 
+> 
+>       THIS IS A RE-POST FROM REC.ARTS.TV
+> 
+> 
+> In article <4540011 at wdl1.UUCP> (James Y. Nakamura) writes:
+> 
+> I have a question about Speed.  We can't figure out all the neato gadgets his
+> car had I think it went like:
+> 	1:	Jacks that also made the car able to jump.
+> 	2:	???
+> 	3:	Saw blades that cut through stuff	
+> 	4:	Closes off the top so the Mach 5 becomes a sub..
+> 	5:	Homing pidgeon on a rope.
+> 
+
+        Don't forget the special treads which would appear on his tires
+        to allow for climbing up rough ground or driving near vertical.
+        
+        Every now and then, I remember that they would add a new option
+        (boy, don't you wish your friendly neighborhood dealership would
+         offer some of these for your car?).  Unfortunately, it has been
+        many years since I last saw Speed Racer, but I do remember one 
+        episode which added little winglets which would come out from under-
+        neath the doors.  This added a little gliding ability.  Any one
+        else remember any?
+        
+
+> Also why did Speed have a G on his shirt?  Go doesn't really wash with me and
+> I don't know enough Japanese to equate letters. 
+> 
+
+        I used to know this but I can't remember anymore, though I
+        suspect that it might have to do with the original name of
+        the character/title of the show in Nihongo.  Help anyone?
+
+*******************************************************************************
+*                                          --Pat Hirayama                     *
+*                                          --Seattle University               *
+*                                                                             *
+* "Yamato Hasshin!" - Kodai Susumu                                            *
+*                                                                             *
+*******************************************************************************
+#! rnews 684
+Path: alberta!mnetor!uunet!mcvax!inria!axis!matra!godefroy
+From: godefroy at matra.UUCP (Eric Godefroy)
+Newsgroups: comp.unix.wizards
+Subject: 8 bits on a pseudo-tty
+Message-ID: <252 at matra.matra.UUCP>
+Date: 3 Dec 87 13:33:27 GMT
+Reply-To: godefroy at matra.UUCP (Eric Godefroy)
+Organization: Matra Datasysteme
+Lines: 9
+
+On 4.2 bsd, it seems difficult to set a pseudo-tty (ptyp / ttyp) in
+the pass8 mode. Is it impossible really or how can I do that ?
+
+----------------------------------------------------------
+
+ Eric Godefroy				UUCP: mcvax!inria!matra!godefroy
+ Matra Datasysteme			Tel:  (33-1) 30 58 98 00
+ 1, av Niepce				Fax:  (33-1) 30 45 41 59
+ 78180 Montigny-le-Bretonneux   France
+#! rnews 2663
+Path: alberta!mnetor!uunet!husc6!bbn!rochester!cornell!uw-beaver!uw-june!uw-entropy!dataio!suvax1!hirayama
+From: hirayama at suvax1.UUCP (Pat Hirayama)
+Newsgroups: rec.arts.sf-lovers,rec.arts.anime
+Subject: Re: Old TV shows
+Message-ID: <811 at suvax1.UUCP>
+Date: 14 Dec 87 05:54:39 GMT
+References: <4254 at dandelion.CI.COM>
+Organization: Seattle University, Seattle, WA.
+Lines: 40
+Xref: alberta rec.arts.sf-lovers:9224 rec.arts.anime:249
+
+in article <4254 at dandelion.CI.COM>, david at dandelion.CI.COM (David M. Watson) says:
+> Xref: suvax1 rec.arts.sf-lovers:7102 rec.arts.anime:235
+> 
+> 
+> I have foggy but pleasant memories of three other converted Japanese
+> 	- (not anime, but...) Ultraman! (Was it: "Hiyata! The beta capsule!"?)
+> 		He was a large silver "good-monster" with a red light
+> 		mounted on his chest that would blink whenever his batteries	
+> 		were getting low.  And in his valiant, exhausting fights
+> 		against the dinosaur types that frequently showed up to
+> 		menace the World, he almost always came close to running out!
+> 		And I remember a obligatory post-crisis trip to the jewelery
+> 		store for Hiyata and friend!
+> 
+> Would anyone like to refresh my memory about any of these three?
+> 
+       - Ultraman was one of several incredibly popular shows in Japan during
+         the late 60s/early 70s/early 80s.  Actually, there were several shows
+         each featuring one or more of the "Ultra" brothers, of whom Ultraman
+         was the "leader/head/eldest (you get the idea)".  There was also
+         Ultra 5 and a bunch of others which I can't remember and it would 
+         take a long time to dig out the books.  There was something of a
+         revival when UltraMan 80 (?) was released in Japan.  
+
+         Of these, I believe that only the original Ultraman was released
+         and dubbed for the American market.
+
+       - By the way, Hayata would be the way to spell his name (though it
+         would be more accurately pronounced by you gaijin as "Hiyata".
+         
+       - Of course, there is nary a trace of him now in Japan.  Programs
+         have this incredible tendency of grabbing hold of everyone, then
+         they drop it for something new.  
+
+*****************************************************************************
+*                                          -Pat Hirayama                    *
+*                                          -Seattle University              *
+*                                                                           *
+* > No messages or quotes right now <                                       *
+*****************************************************************************
+#! rnews 1910
+Path: alberta!mnetor!uunet!mcvax!enea!tut!santra!nispa
+From: nispa at hutcs.hut.fi (Tapani Lindgren)
+Newsgroups: comp.unix.wizards,comp.unix.questions
+Subject: Unattended dumps (BSD4.3)
+Message-ID: <9032 at santra.UUCP>
+Date: 4 Dec 87 15:19:19 GMT
+Sender: news at santra.UUCP
+Followup-To: comp.unix.wizards
+Organization: Helsinki University of Technology, Finland
+Lines: 28
+Xref: alberta comp.unix.wizards:5739 comp.unix.questions:4767
+
+I have encountered a problem trying to make a shell script that would
+make incremental backups at nighttime without operator attendance.
+The problem results from dump(8) program requiring occasional
+responses from the operator through /dev/tty.  The script is
+run from another script, /usr/adm/daily, under cron control and has no
+controlling terminal, so it just hangs trying to read /dev/tty.  It would
+be ok if dump just aborted when facing a situation that would require
+operator intervention. The script should never hang in a loop under
+any circumstances, because /usr/adm/daily must do other things too
+and finish after a reasonable time.
+
+Currently I have the dump script run a background subshell that sleeps for
+an hour and then kills the dump script (if it still runs) and all dump
+processes.  This is very complicated, however, and the watchdog process
+is almost 50% of the whole script.  It is also very slow - I would
+like it to stop immediately if it finds an error, report it to log file,
+rewind the tape, and let /usr/adm/daily continue its work.
+
+Has anyone out there in the Netland have any suggestions of what to do?
+Can yes(1) somehow be piped to a program that reads /dev/tty?
+Could dump(8) be modified to abort at errors without any questions?
+What kind of unattended backup systems do you have?
+
+---
+Tapani Lindgren, Helsinki Univ. of Technology, CS dept.
+INTERNET:	nispa at hutcs.hut.fi
+UUCP:		mcvax!santra!hutcs!nispa
+BITNET:		nispa%hutcs.UUCP at fingate.BITNET
+#! rnews 2315
+Path: alberta!mnetor!uunet!husc6!bbn!oberon!pollux.usc.edu!kurtzman
+From: kurtzman at pollux.usc.edu (Stephen Kurtzman)
+Newsgroups: rec.food.cooking
+Subject: Re: Cooking Wines
+Message-ID: <5698 at oberon.USC.EDU>
+Date: 14 Dec 87 11:38:44 GMT
+References: <4628 at pyr.gatech.EDU> <10722 at sri-unix.ARPA> <2028 at ttrdc.UUCP>
+Sender: nobody at oberon.USC.EDU
+Reply-To: kurtzman at pollux.usc.edu (Stephen Kurtzman)
+Organization: University of Southern California, Los Angeles, CA
+Lines: 37
+
+In article <2028 at ttrdc.UUCP> levy at ttrdc.UUCP (Daniel R. Levy) writes:
+>
+>2) (more seriously) I've seen bottles of "wine for cooking" that have had
+>   salt (and vinegar?) added.  These might be OK for sauces (yeah, the
+>   snootier gourmets wouldn't want anything to do with them) but they
+>   would obviously be horrible to drink.
+
+I think that these wines would be particularly bad for sauces that require
+wine as a major component and require reducing the wine. There are two
+reasons that come to mind:
+
+1) What is normally labeled as cooking wine is usually wine that is not good
+enough to sell as table wine. If the taste is not the best, reducing it will
+only concentrate its flaws.
+
+2) Cooking wines contain salt. Reducing a cooking wine will concentrate the
+salt. This could really ruin the sauce. 
+
+There best reason I have seen for using a good wine to cook with was given
+by Alexis Bespaloff in the "New Signet Book of Wine", which states
+
+ "Furthermore, it is actually uneconomical to buy cheap wine for cooking.
+  Say that an elaborate lobster dish calls for a spoonful or two of sherry
+  to heighten its flavor. A cook who runs out to buy a bottle of cheap
+  sherry will diminish the taste of an expensive and time-consuming dish with
+  a quarter's worth of wine. What's more, because the wine is a poor example
+  of its type, it may not be enjoyable to drink, so the spoonful of wine has,
+  in fact, cost the full price of the bottle."
+
+That is fairly sound reasoning. Of course, the last sentence does not
+necessarily follow. You could keep the cheap wine around to diminish several
+meals.
+
+BTW, I recommend the "New Signet Book of Wine" to anyone who wants to learn
+more about wine. It is available for $4.50 as a paperback. Quite a value
+when you compare it to the $20-or-more, glossy coffee-table wine books out
+on the market.
+#! rnews 1809
+Path: alberta!mnetor!uunet!mcvax!enea!luth!d2c-usg
+From: d2c-usg at sm.luth.se (Ulrik"Rick"Sandberg)
+Newsgroups: rec.music.misc
+Subject: Re: Yes and ELP questions......
+Keywords: Tales from Topographic Oceans
+Message-ID: <435 at psi.luth.se>
+Date: 4 Dec 87 18:28:34 GMT
+References: <748 at augusta.UUCP> <434 at psi.luth.se>
+Reply-To: Ulrik"Rick"Sandberg <d2c-usg at psi.luth.se>
+Organization: University of Lulea, Sweden
+Lines: 28
+UUCP-Path: {uunet,mcvax}!enea!psi.luth.se!d2c-usg
+
+
+In article <434 at psi.luth.se> I wrote:
+>In article <748 at augusta.UUCP> bs at augusta.UUCP (Burch Seymour) writes:
+>>been looking for Tales on CD without success. To get to the point, is
+>>it (Tales) on CD?  
+>
+>One of my friends ordered it from a Recordshop in Gothenburg, but got
+>the answer that it was sold out. However, they didn't say that the
+>record isn't existing on CD. He was supposed to recieve it later.
+>Any wiser of that?
+>
+
+Correction:
+
+Received is spelled received, not recieved. :-)
+
+My friend told me that they said "Tales.. is not on CD." That's why he didn't
+get it. Sorry for the confusing information.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+~                                                                             ~
+~  Ulrik 'Rick' Sandberg  d2c-usg at luth.UUCP (or)                              ~
+~  Computer Technology	  d2c-usg at psi.luth.se (or)                            ~
+~  University of Lulea    {uunet,mcvax}!enea!psi.luth.se!d2c-usg              ~
+~  Sweden                                                                     ~
+~  phone: (0920)-977 90 (home)       "I feel lost in the city..."             ~
+~                                       --  Jon Anderson  --                  ~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+#! rnews 1128
+Path: alberta!mnetor!uunet!husc6!rutgers!lll-lcc!pyramid!decwrl!cssaus.dec.com!bell
+From: bell at cssaus.dec.com (Peter Bell, SNA-2, Sydney)
+Newsgroups: rec.music.classical
+Subject: Hogwood
+Message-ID: <8712141101.AA04882 at decwrl.dec.com>
+Date: 15 Dec 87 05:23:00 GMT
+Organization: Digital Equipment Corporation
+Lines: 15
+
+I have just finished singing (in choir) under Hogwood, it was an experience. We
+sang Schuberts Mass in G, (as Schubert wrote it, missing a few phrases of the
+Credo). Hogwood knew exactly what he wanted, and worked till we did it right.
+Then as we tidied up the last few problems, he would let us sing through whole
+sections, then go back and point out all the problems.
+
+We also sang the Messiah (not with Hogwood unfortunately) the delight of
+those performances was Elizabeth Cambells singing "He was despised..."
+
+In this performance the two trumpeters waited off stage until just before their
+appearances in each half, the first trumpet parts were played by a large
+trumpeter (in nice to see that Sydney musicains are not starving) on what
+looked like a very small valved trumpet (trumpet in F??).
+
+Peter.
+#! rnews 1252
+Path: alberta!mnetor!uunet!mcvax!dutrun!winffhp
+From: winffhp at dutrun.UUCP (Frits Post and/or Andrew Glassner)
+Newsgroups: comp.graphics
+Subject: abstracts wanted
+Keywords: ray tracing, abstracts
+Message-ID: <190 at dutrun.UUCP>
+Date: 2 Dec 87 09:14:55 GMT
+Organization: Delft University of Technology,The Netherlands
+Lines: 21
+
+I am preparing a list of technical memos, technical notes,
+internal reports, and other such low-circulation documents
+that deal with ray tracing.  I'm interested in documents
+both large and small.  The documents need not be expressly
+about ray tracing; the criterion is that the information in
+the document be useful to ray tracing researchers in some way.
+
+If you have prepared such a document, please send me enough
+information to digest it.  That would at least include your
+name and organization, the document's title, perhaps a reference
+number, and (very important!) an abstract.  
+
+All contributors will receive a complete copy of the final list.
+
+-Andrew Glassner
+  email until 15 December: uunet!mcvax!dutrun!frits
+  email after 15 December: glassner at unc.cs.edu  ,  unc!glassner
+-- 
+             ...mcvax!dutrun!frits    
+             Faculty of Mathematics and Informatics
+             Delft University of Technology
+#! rnews 593
+Path: alberta!mnetor!uunet!mcvax!lambert
+From: lambert at cwi.nl (Lambert Meertens)
+Newsgroups: sci.lang
+Subject: Re: Acquiring native accents
+Message-ID: <136 at piring.cwi.nl>
+Date: 5 Dec 87 22:56:44 GMT
+Organization: CWI, Amsterdam
+Lines: 8
+
+When I speak English I hear no Dutch accent in my voice.  But if my voice
+is recorded and played back to me I find the Dutch accent unmistakable.  If
+this phenomenon is a general one, it goes a good deal towards explaining
+why adult learners of a new language do not fully master the native accent.
+
+-- 
+
+Lambert Meertens, CWI, Amsterdam; lambert at cwi.nl
+#! rnews 6735
+Path: alberta!mnetor!uunet!mcvax!philmds!leffe!janpo
+From: janpo at leffe.UUCP (janpo)
+Newsgroups: rec.music.misc
+Subject: Re: Ideas for improving the debate (was: Digital vs. Analog music)
+Summary: Digital versus Analog
+Keywords: CDs expensive audiophile equip. fourier analysis
+Message-ID: <43 at leffe.UUCP>
+Date: 4 Dec 87 13:55:04 GMT
+References: <574 at ucdavis.ucdavis.edu> <522 at altura.srcsip.UUCP> <3051 at batcomputer.tn.cornell.edu>
+Organization: Philips I&E DTS Eindhoven
+Lines: 123
+
+
+
+1) Mr. Konar, press the 'n' key immediately! There's another arrogant
+   audiophile going to pollute the net with his view on the Digital vs.
+   Analog issue.
+
+2) I'm not very much acquainted with the news stuff on the net, but it
+   seems we don't receive the rec.audio newsgroup here in Europe. Can
+   something be done about that?
+
+3) Now let me come to the point.
+   In article <3051 at batcomputer.tn.cornell.edu> eacj at batcomputer.tn.cornell
+   (Julian Vrieslander) he writes:
+>Konar than goes on to comment about the "arrogance" of audiophiles who still
+>prefer analog recordings to digital.  He says the issue should be laid to rest
+>, the implicit assumption being that the case has been proven that analog 
+>recording is obsolete.
+
+>I for one think that the issue is still an open (and interesting) one, but I
+>am a bit surprised at how polarized and closed the recent comments to this
+>thread have been.  
+
+I agree with him, so let me do my bit now. A technology not being perfect
+, or getting close to that, is still worth a discussion. Remember that it
+took about a 100 years of thorough research from Edison's first grammophone
+to the modern high quality turntables. Don't expect digital audio to be
+perfect now only a few years after its introduction, no matter what the
+commercial guys say. They are only interested in your hard-earned $$$$.
+
+Until now I have only been in the opportunity to make a good comparison
+between a high-end turntable and some first genaration. I'll summarize
+the pros and cons of which I think are important and which I can think of
+now. Many of them are well known, others may not.
+
+PROS OF ANALOG:
+- Cheap records.
+- As John Vrieslander mentioned: More real, more spatious, more delicate,
+  more emotionally involving. I won't try to find other words for this
+  description 'cause I can't think of a better one. Unfortunately, this
+  can only be heard on good, say > $2k-$3k systems without an infinite
+  number of knobs, lights and other gadgets normally found in aeroplane
+  cockpits.
+
+CONS OF ANALOG:
+- More hissy, rumble,scratches,sound degrading after many times of
+  playing the record. This counts less when you have good records
+  (Japanese ones are most often excellent but hard to get now.) and take
+  good care of them.
+- No flat frequency response, especially at the low and high end.
+- Phase distortion.
+- Harmonic distortion increases with amplitude.
+
+PROS OF DIGITAL:
+- Longer durability than records (?). Less hissy, no rumble or ticks of
+  scratches.
+- Almost no phase distortion, flat frequency response within the audio
+  range.
+- Easy to use.
+- Slightly (!) more dynamic. Why only slightly? Well, the 96 dB dynamic
+  range theoretically possible with a CD is not very practical. In reality
+  it is compressed, as far as I know, to some 40-60 dB depending on the
+  music (Pop, Jazz, Classic) because:
+  a) No one wants to run continuously to his volume knob to adjust the
+     volume.If not compressed the music will either be banging through your 
+     living room and of your neighbours or it will drown in the inevitable 
+     background noise.
+  b) Studio equipment has a dynamic range of less than, say, 70 to 80 dB
+     when you assume the Signal to Noise ratio being equal to the dynamic
+     range.
+  c) Sound gets to distorted at low levels. (See also cons)
+  d) A dynamic headroom of 10 dB is desired.
+  With all this limitations the dynamic range of CD's is not much different
+  with that of a good record.
+- Excellent bass response. Deep and well defined.
+- Very stable stereo image.
+
+CONS OF DIGITAL:
+- Expensive records.
+- When listening to a CD, it seems as if there is no "space" around around
+  the instruments and voices. It sounds cold and not very lively.
+- First generation players and the cheaper CD players nowadays suffer from
+  very distorted high tones. They sound harsh. Cymbals for instance sound
+  like someone is sawing them into pieces instead giving it a gentle hit
+  with a drum-stick. They do not sound crisp and clear.
+- Distortion increases dramatically with lower amplitudes (!). It can be
+  more than 1.5 % at low levels. And it's a very nasty kind of distortion.
+- CD players produce (digital) noise above the audio range. This noise itself
+  can not be heard but other audio equipment may suffer from intermodulation
+  distortion which brings this noise back in the audio range. 
+- Many CD players, especially the first ones, do not seem to be very reliable
+  mechanically.
+- I've heard that digital audio recording is quite different from analog.
+  I mean in terms of how it has to be done properly. I don't mean the
+  equipment needed, that's quite obvious. Not all studio crew seem to know
+  how to make a good digital recording. Does anyone know more about that?
+
+Well, this must be enough stuff to think and talk about.
+
+The above mentioned cons of digital audio may be overcome in the latest
+players but I have not had the opportunity until now to carefully listen
+to them and to compare them. According to some serious audio magazines
+available here in Holland they seem to be improved. Many top-of-the-line
+models now have separated power supplys for the digital and analog
+circuitry, opto-couplers between those circuits, an additional analog filter
+to filter out > 20 kHz noise, 16 bit with with n times oversampling, stable
+and rigid chassis and improved error correction. All this may have solved
+(some) of the cons I mentioned but I'm not sure. Players which have one or
+more of these improvements and thus may be of interest (At least for Julian
+Vrieslander and me) are: Philips (Magnavox in the USA I believe) CD 650 and
+CD 960, Nakamichi, Mission, Meridian and if memory serves me well, Acoustical
+Research (Or Audio Research. Don't know anymore). The latter two may be
+difficult to get in the USA, they are made in the UK. No doubt that there
+are more good CD players but can't think of others now. These are the
+players I consider buying when normal LP's are no longer available.
+
+Pooh! That was more than I intended to write but still far less than I can
+tell about this stuff.
+
+                                        Kind regards from
+                                        Jan Postma
+
+
+And on the seventh day, God went surfing!
+#! rnews 1424
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!heiser
+From: heiser at ethz.UUCP (Gernot Heiser)
+Newsgroups: comp.emacs
+Subject: Setting terminal-emulator's environment
+Keywords: GNU Emacs function `terminal-emulator'
+Message-ID: <261 at bernina.UUCP>
+Date: 5 Dec 87 13:42:37 GMT
+Reply-To: heiser at ethz.UUCP (Gernot Heiser)
+Organization: ETH Zuerich, Switzerland
+Lines: 18
+
+
+Using the  GNU emacs terminal-emulator   to run interactive  programs  would be
+quite limited if the parent emacs  can't be used  for editing (when the program
+run under the emulator starts up an editor).  While some  programs  (like `rn')
+allow to explicitely specify the  editor, a general  solution would require  to
+specify `emacsclient'  in the `EDITOR'   environment  variable of  the  process
+running under the terminal emulator.
+
+Naturally this could be done by running  the  shell under the emulator, setting
+the   environment of  the shell, and  then running   the program  we are really
+interested  in.  A  better way  would be    to set  the   environment from  the
+`terminal-mode-hook'. Is there any means to achieve this???? (I'm running GNU
+Emacs version 18.49.)
+-- 
+Gernot Heiser                   Phone:       +41 1/256 23 48
+Integrated Systems Laboratory   CSNET/ARPA:  heiser%ifi.ethz.ch at relay.cs.net
+ETH Zuerich                     EARN/BITNET: GRIDFILE at CZHETH5A
+CH-8092 Zuerich, Switzerland    EUNET/UUCP:  {uunet,...}!mcvax!ethz!heiser
+#! rnews 1617
+Path: alberta!mnetor!uunet!mcvax!enea!sommar
+From: sommar at enea.UUCP (Erland Sommarskog)
+Newsgroups: rec.music.misc
+Subject: Re: another net.question
+Message-ID: <2496 at enea.UUCP>
+Date: 5 Dec 87 16:46:48 GMT
+References: <251 at ho7cad.ATT.COM>
+Reply-To: sommar at enea.UUCP(Erland Sommarskog)
+Followup-To: rec.music.misc
+Organization: ENEA DATA Svenska AB, Sweden
+Lines: 27
+
+P.CLARK (prc at ho7cad.ATT.COM) writes:
+>	Should a band play the entire new album when they do a concert?
+
+
+No, why should they? There may be songs on the album that are 
+very good listening to at home, but just doesn't make it live,
+just as there are songs with the opposite character; good live, 
+but just a bore on disc.
+
+Deep Purple and Marillion and good example of extremes in both
+ends. When I saw D.P. in February this year, they played three 
+of the ten songs from "The House of Blue Light", their latest 
+album. That is a quite decent product, but I didn't miss those
+songs anyway. (I, and everyone else, would have been much more 
+disappointed if they had left out "Smoke on the Water".) 
+  Marillion on the other hand; on the two tours they made after
+"Misplaced Childhood", they insisted on playing entire album
+as one long song. There are many parts on that album that just
+becomes dead passages where nothing happens when they are played
+live. ("Bitter Suite" and "Blind Curve" for instance.) Marillion
+is no good live band, and playing obsolete material does not
+make things better.
+-- 
+Erland Sommarskog       
+ENEA Data, Stockholm    
+sommar at enea.UUCP        
+                   C, it's a 3rd class language, you can tell by the name.
+#! rnews 4410
+Path: alberta!mnetor!uunet!mcvax!enea!sommar
+From: sommar at enea.UUCP (Erland Sommarskog)
+Newsgroups: rec.music.misc
+Subject: Re: More than Yes
+Message-ID: <2502 at enea.UUCP>
+Date: 5 Dec 87 19:18:59 GMT
+References: <22034 at ucbvax.BERKELEY.EDU>
+Reply-To: sommar at enea.UUCP(Erland Sommarskog)
+Followup-To: rec.music.misc
+Organization: ENEA DATA Svenska AB, Sweden
+Lines: 72
+
+Grady Toss (ebm at ernie.Berkeley.EDU) writes:
+>Whenever this newsgroup gets around to discussing 70's/80's fusion (the
+>current go-round sparked by the proof that Yes is Best), the content
+>seems to be limited to the same 5 or 6 groups (Yes, Rush, ELP, King
+>Crimson, Pink Floyd, Genesis, etc.).  
+
+Grady seems to be confusing the issue a bit here. He talks about fusion and 
+the mentions groups that belong(ed) to the symphonic-rock genre. (I prefer
+that term instead of "progressive") For me "fusion" is a synonym with 
+jazz-rock. Anyway, that is more of question of semantics, the two genres 
+have a lot in common. (The main difference maybe being that symphony-rock 
+is European and fusion American.)
+
+The reason why these groups are being discussed the most is probably that
+they have gained the greatest commercial succes. This may or may not 
+be correlated to the fact they are the best. 
+
+>Doesn't (didn't) anyone listen to
+>some of the (apparently) lesser-known fusion greats?  Bands and artists
+>like Arti + Mestieri, Brand X, Arthur Brown & Kingdom Come, Egg, Gilgamesh,
+>Hatfield & The North, Henry Cow, Alain Markusfeld, National Health, PFM,
+>Quiet Sun, Return to Forever, Seventh Wave, The Soft Machine, UK and
+>Weather Report.  
+
+Being quite fond of this kind of music, I feel obliged to comment. It's
+a real mixture Grady presents and I must admit there are names I have 
+never heard. Anyway, I think he is a bit unfair, some of them have 
+certainly been discussed on the net. For instance, I posted a discograhpy 
+on Brand X some month ago. Some comments to the other names:
+  PFM (Premiata Forneria Marconi) have been mentioned from time to time,
+the Italian answer on Genesis, which developed in a different way. Now
+disbanded, I believe. One day or another may be I'll post a discography.
+  Quiet Sun. The band in which Phil Manzanera played before he joined
+Roxy Music. Their "Mainstream" is rather like jazz, but not mainstream.
+  Seventh Wave. This is the name I never expected to see on the net! I
+bought their "Things to Come" when I was 15 and I was really fond of it
+then. These days I don't find that amount of synthesizers so exciting as
+I did then.
+  Wheather Report. Quite well-known. But really, you do only need "Heavy
+Wheather", the one with "Birdland". May be some more, "Mysterious Traveller"
+perhaps, but then you'll find that they all sound the same.
+
+>As I said before, I find much of Yes and ELP to be very dull, and un-
+>affecting.  I like Rush, though more live than on record.  
+
+As you can guess, I don't share Grady's view here. Yes has made good
+music, yet never really touched my soul, probably due to their utterly
+stupid and semi-religious lyrics. "Brain Salad Surgery" is a very good
+record, the rest of what ELP have done is so-so. Rush don't turn me on 
+at all, on the other hand. The net discussion inspired me to try 
+"A Farewell to Kings" (A random choice). May be I would have liked them 
+10 years ago, but not today with those lyrics and that voice.
+
+>So, were Yes, ELP, Pink Floyd, King Crimson, Genesis and Rush really "it"
+>as far as most progrock fans go, or did some of these "lesser known" artists
+>(and all the others I forgot or never knew) filter out to larger audiences?
+
+Depends on how you define your terms here, but I can easily think 
+of more groups, some of them succesful, some of them not, some of them
+good, some them not so good:
+Kansas, Saga, Asia, Jethro Tull, Roxy Music, Gentle Giant, Van Der Graaf
+Generator, George Duke, Billy Cobham, Al DiMeola, Herbie Hancock, Dixie
+Dregs, Ange, (Mahavishnu) John McLaughlin, Santana, Bill Bruford etc
+  I think that most of these people have had their share of the discussion
+on the net. So to conclude, I do not really share Grady's initial obser-
+vation. However some particular groups are certainly being over-discussed,
+namely Rush, Yes and recently also Pink Floyd.
+-- 
+Erland Sommarskog       
+ENEA Data, Stockholm    
+sommar at enea.UUCP        
+                   C, it's a 3rd class language, you can tell by the name.
+#! rnews 916
+Path: alberta!mnetor!uunet!mcvax!enea!tut!santra!clinet!waldo
+From: waldo at clinet.FI (Tuomas Siltala)
+Newsgroups: rec.music.synth
+Subject: Siel DK80 sequenceer
+Keywords: How to use?
+Message-ID: <553 at clinet.FI>
+Date: 5 Dec 87 21:36:23 GMT
+Reply-To: waldo at clinet.UUCP (Tuomas Siltala)
+Organization: City Lines Oy, Helsinki, Finland
+Lines: 17
+
+My friend bought a Siel DK80 synthesizer and now he is wondering how
+the sequencer in that machine works.
+ 
+ 
+Unfortunately we don't have any manuals for it.
+ 
+Could somebody kindly send me information concerning this problem?
+ 
+Thank you!
+ 
+------------------------------------------------------------------------------
+ 
+  Tuomas Siltala                                 Internet: waldo at clinet.FI
+  Kalevankatu 51 B 37
+  SF-00180 Helsinki, Finland                     Telephone: +358-0-6947735
+ 
+------------------------------------------------------------------------------
+#! rnews 1655
+Path: alberta!mnetor!uunet!mcvax!enea!luth!d2c-czl
+From: d2c-czl at sm.luth.se (Caj Zell)
+Newsgroups: rec.music.misc
+Subject: Re: Black Sabbath songs
+Message-ID: <437 at psi.luth.se>
+Date: 6 Dec 87 01:38:40 GMT
+References: <1208 at gumby.wisc.edu> <3590 at h.cc.purdue.edu>
+Reply-To: Caj Zell <d2c-czl at psi.luth.se>
+Organization: University of Lulea, Sweden
+Lines: 25
+UUCP-Path: {uunet,mcvax}!enea!psi.luth.se!d2c-czl
+
+
+In article <3590 at h.cc.purdue.edu> acu at h.cc.purdue.edu.UUCP (Floyd McWilliams)
+writes:
+
+>	While we're talking about Sabbath, does anyone know who does the
+>vocals on "Solitute" (from the Master of Reality album) and "It's All Right"
+>(from Technical Ecstasy)?  It sure doesn't sound like the Oz...
+
+I would like to add another song:"Swinging The Chain" on _Never Say Die!_.
+Who the hell does the vocals here?
+
+By the way,has anybody heard the new album?
+
+
+      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+      X                                                            X
+      X                                                            X
+      X   Caj Zell                 	 ________________________  X
+      X   University of Lulea            :                      :  X
+      X   Sweden                         : Jazz is not dead,    :  X
+      X  				 : it just smells funny :  X
+      X   mail: d2c-czl at psi.luth.se	 : -Frank Zappa         :  X
+      X                                  :                      :  X
+      X                                  -----------------------:  X
+      X                                                            X
+      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+#! rnews 760
+Path: alberta!mnetor!uunet!mcvax!unido!gmdka!florin
+From: florin at gmdka.UUCP
+Newsgroups: comp.windows.x
+Subject: C++ re-hacks of X11 include files - (nf)
+Message-ID: <2800001 at gmdka.UUCP>
+Date: 3 Dec 87 13:16:00 GMT
+Lines: 14
+Nf-ID: #N:gmdka:2800001:000:458
+Nf-From: gmdka!florin    Dec  3 14:16:00 1987
+
+Hi there,
+
+I'm actually working on C++ re-hacks of the X11 include files.
+There are some problems with Xlib.h. In structures
+Visual, XWindowAttributes and XColormapEvent there are variables named
+``class'' and ``new'' which cause serious problems (C++ keywords) !
+
+For the moment I've changed the names, but this is an awful hack. Does anybody
+know a better solution ?
+
+     -- Florin
+
+UUCP:  ...!uunet!unido!gmdka!florin
+X.400: florin at karlsruhe.gmd.dbp.de
+#! rnews 4069
+Path: alberta!mnetor!uunet!mcvax!ukc!reading!onion!riddle!domo
+From: domo at riddle.UUCP (Dominic Dunlop)
+Newsgroups: comp.unix.xenix,comp.sys.att,comp.sys.intel
+Subject: How to load AT&T 6300 Plus packages to generic UNIX V.3
+Summary: Here's a shell script to do it for you
+Keywords: Intel, 386/ix, Microport, Prime
+Message-ID: <522 at riddle.UUCP>
+Date: 4 Dec 87 17:47:52 GMT
+Reply-To: domo at riddle.UUCP (Dominic Dunlop)
+Followup-To: comp.unix.xenix
+Organization: Sphinx Ltd., Maidenhead, England
+Lines: 106
+Xref: alberta comp.unix.xenix:1170 comp.sys.att:1825 comp.sys.intel:379
+
+[If there's a Microport newsgroup, it doesn't come here]
+
+				Background
+
+AT&T's generic UNIX V.3 for the 80386 (as sold in binary form by AT&T,
+Bell Technologies, Intel, Interactive Systems, Microport, Prime etc.)
+will run binaries created for UNIX V.2 on the 80286.  A large number of
+packages exists for AT&T's 6300 Plus, an 80286-based system running V.2.
+These can be run on 80386-based systems while you're waiting for
+software authors to come up with native 80386 ports of their products.
+
+				Problem
+
+You are supposed to load packages onto your 6300 Plus using the system's
+administration procedures.  These handle weird multi-volume cpio diskette
+sets, which are a pig to load unless you have the installation software.
+Which you don't if you're trying to load the software onto an 80386-based
+system running 386/ix, Microport, or whatever.
+
+				Solution
+
+Here's a shell script which does the job.  If you want to know the details,
+it reads 350k, starting at offset 9k, from each 360k diskette in the
+installation set, piping the result into cpio -c.  It the fires off the
+Install program which should be part of the application package.  As the
+comments remark, there's not a lot of error checking, as it's essentially
+a quick hack.  Also, testing is about at the ``worked twice in a row''
+level.  Despite all that, I hope it's useful to somebody out there.
+
+Dominic Dunlop
+domo at sphinx.co.uk  domo at riddle.uucp
+
+++++cut here++++++++cut here++++++++cut here++++++++cut here++++
+:
+# load_script
+#
+#   Shell script to load software packages delivered in AT&T PC
+#   6300+ UNIX V.2 format on systems where the PC 6300+
+#   installation procedure is not available (eg 386/ix).
+#   The script can be executed by any user who can read the raw
+#   diskette device.  However, the root password is requested
+#   before files are moved to their final destinations if this
+#   script is not run by the super-user.
+#
+#   Note that this script does NOT check that sufficient space is
+#   available to load the package.  In general, your /usr file
+#   system should have at least (700 * diskettes_in_package)
+#   blocks free before installation.  Note also that there is no
+#   check that the diskettes are in the correct format, or that
+#   they are inserted in the correct order.
+#
+# 871204 DFD	Created
+
+# Change the following device assignment if the 360kB raw
+# diskette device on your system has a different name.
+DEV=${DEV-/dev/rdsk/f0d9dt}
+
+if [ ! -r $DEV -o ! -c $DEV ]
+then
+	 cat << E_O_F
+Can't read $DEV.  Check raw diskette device name and/or your
+access permissions.
+E_O_F
+exit 1
+fi
+
+cd /usr/tmp
+mkdir install 2>/dev/null
+cd install
+IT="the first diskette of the package"
+
+trap "echo Installation aborted.; rm -r /usr/tmp/install; exit 1" 2 15
+(
+	while echo "Insert $IT and hit return >\c" 1>&2  \
+		&& read ANS
+	do
+		IT="next diskette"
+		echo "The following files are being loaded:" 1>&2
+		dd if=$DEV ibs=1k obs=5k skip=9 count=350 2>/dev/null
+	done
+) | cpio -icvmudB 1>&2
+
+chmod +x Install
+
+trap 2 15
+
+cat << E_O_F
+Files read from diskettes.  You may remove the last diskette from
+the drive.  If you are not already logged in as the super-user,
+Please enter the root password to continue with installation.
+E_O_F
+if su root -c ./Install
+then
+	cat << E_O_F
+Installation complete.  You should execute
+	rm -r /usr/tmp/install
+to remove installation scratch files at a convenient time.
+E_O_F
+else
+	cat << E_O_F
+Installation failed.  To retry,
+	su
+	cd /usr/tmp/install
+	./Install
+E_O_F
+fi
+#! rnews 1801
+Path: alberta!mnetor!uunet!mcvax!ukc!reading!onion!bru-me!ralph
+From: ralph at me.brunel.ac.uk (Ralph Mitchell)
+Newsgroups: comp.graphics,sci.space,sci.space.shuttle
+Subject: Re: 3d digitized shuttle data
+Message-ID: <338 at Pluto.me.brunel.ac.uk>
+Date: 4 Dec 87 09:49:43 GMT
+References: <509 at otto.cvedc.UUCP>
+Reply-To: ralph at me.brunel.ac.uk (Ralph Mitchell)
+Organization: Brunel University, Uxbridge, UK
+Lines: 26
+Xref: alberta comp.graphics:1381 sci.space:3674 sci.space.shuttle:445
+
+In article <509 at otto.cvedc.UUCP> billa at otto.UUCP (Bill Anderson) writes:
+>In article <> apollo at ecf.toronto.edu (Vince Pugliese) writes:
+>>
+>>As well I will be include a very simple C program, hacked together by fellow group member
+>> [...]
+>
+>If anyone out there in netland converts this C program so that it can be
+>run on suns, please post the results of your work to the net.
+
+It has already been done.  The program should be in /usr/demo/SRC/shaded.c,
+the shuttle data is in /usr/demo/DATA/space.dat.  There are notes on running
+it in /usr/demo/README.  The program displays 2 windows with cursor lines, to
+enable you to select the 3d viewpoint, and there's a pop-up menu for setting
+fill style and colour, &c.  For monochrome you need to select the "edges" (I
+think) fill style or it'll look pretty wierd.  Also, if your display surface
+doesn't support hidden surface removal, you'll get a wireframe effect that
+can be confusing to the eye.
+
+/usr/demo/DATA also contains data files for an icosahedron, a pyramid, a
+ball and a Klein bottle.
+
+--
+ From:  Ralph Mitchell at Brunel University, Uxbridge, UB8, 3PH, UK
+ JANET: ralph at uk.ac.brunel.cc	  ARPA:  ralph%cc.brunel.ac.uk at cwi.nl
+ UUCP:  ...ukc!cc.brunel!ralph   PHONE: +44 895 74000 x2561
+ "There's so many different worlds, so many different Suns" -- Dire Straits
+#! rnews 1156
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!bob
+From: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: SPACE WAR BLUES (was Re: Gibson)
+Message-ID: <809 at its63b.ed.ac.uk>
+Date: 4 Dec 87 12:49:58 GMT
+References: <8711211710.AA02986 at decwrl.dec.com>
+Reply-To: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 17
+
+In article <8711211710.AA02986 at decwrl.dec.com> boyajian at akov68.dec.com (JERRY BOYAJIAN) writes:
+>(Oh, before anyone asks the obvious question, the author was Richard
+>Lupoff, who is one of the best unknown science fiction writers around.)
+
+I find this statement hard to believe, based on the quality
+of his book "Circumpolar". It is full of characters which
+barely qualify as two dimensional, offensive racial stereotypes
+and various other assorted characters whose collective IQ doesn't get
+into double figures. I rated this book as -****.
+
+I cannot believe that someone who turned out such complete
+drivel could improve enough in other books to even qualify
+as average.
+
+I am however, willing to be surprised. What other books of
+his would people recommend?
+	Bob.
+#! rnews 1599
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!bob
+From: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Newsgroups: sci.misc
+Subject: Re: Grey Goo that's too smart for its own good
+Keywords: nanotechnology foresight drexler
+Message-ID: <810 at its63b.ed.ac.uk>
+Date: 4 Dec 87 13:10:07 GMT
+References: <799 at sbcs.sunysb.edu> <2698 at drivax.UUCP> <1063 at sugar.UUCP> <2411 at watcgl.waterloo.edu> <1445 at m-net.UUCP> <1526 at mmm.UUCP> <2783 at drivax.UUCP>
+Reply-To: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 23
+
+In article <2783 at drivax.UUCP> macleod at drivax.UUCP (MacLeod) writes:
+>In article <1526 at mmm.UUCP> cipher at mmm.UUCP (Andre Guirard) writes:
+>>In article <1445 at m-net.UUCP> russ at m-net.UUCP (Russ Cage) writes:
+>>>In <2411 at watcgl.waterloo.edu> kdmoen at watcgl.waterloo.edu (Doug Moen) writes:
+>>>>[...]  If it *does* turn out to be possible to build Grey Goo,
+>>>>then by the time fabrication technology catches up, perhaps we can have
+>>>>a wide spectrum of Goo killing techniques already available.
+>
+>Goo seems almost inevitable. It should not be a big problem, of itself;
+>the definition of Goo (for those not familiar with the problem) is that
+>of a nanomachine that will use any available energy and raw material to
+>reproduce itself periodically.  If it reproduces at 2x per year you have
+>one problem, relatively minor; if it reproduces at 512x per minute, you have 
+>quite another.
+
+I can hear the squeals from the anti-nuclear type lobby already
+
+	Can you PROVE it is safe?
+	Campaign against the Grey Goo!
+	prevent Nano-technology!
+
+and not a :-> in sight.
+	Bob.
+#! rnews 3115
+Path: alberta!mnetor!uunet!mcvax!ukc!cheviot!robert
+From: robert at cheviot.newcastle.ac.uk (Robert Stroud)
+Newsgroups: comp.unix.wizards
+Subject: Re: //host vs "mount point"
+Message-ID: <2584 at cheviot.newcastle.ac.uk>
+Date: 4 Dec 87 16:22:51 GMT
+References: <648 at tut.cis.ohio-state.edu> <1668 at tut.cis.ohio-state.edu> <38c15248.4580 at hi-csc.UUCP> <9559 at mimsy.UUCP> <411 at PT.CS.CMU.EDU> <6769 at brl-smoke.ARPA>
+Reply-To: robert at cheviot (Robert Stroud)
+Organization: Computing Laboratory, U of Newcastle upon Tyne, UK NE17RU
+Lines: 62
+
+In article <6769 at brl-smoke.ARPA> gwyn at brl.arpa (Doug Gwyn (VLD/VMB) <gwyn>) writes:
+>In article <411 at PT.CS.CMU.EDU> jgm at K.GP.CS.CMU.EDU (John Myers) writes:
+>>Just to add to the confusion, let me put in a plug in for the Carnegie-Mellon
+>>University Computer Science Department's syntax:
+>>/../host
+>
+>Stolen from the Newcastle Connection.
+>
+>>"/.." is known as the "super-root".  It seems logically consistent to me...
+>
+>So, what is the result of
+>	$ cd /..
+>	$ pwd
+
+/.. of course!!
+
+If you add directories above root (and remember that with the Newcastle
+Connection, /.. was just a directory rather than some mysterious 
+"super-root") so that it is possible for your current directory to
+be in an uncle or cousin relationship with root (rather than a direct
+descendent), then you have to modify the pwd algorithm accordingly.
+
+pwd assumes that if you go up the tree with ".." enough times you will
+get to root. If your current directory is in a sideways relationship
+to root, this assumption will no longer be valid.
+
+The modified pwd algorithm should work like this:
+
+(1) Go up the tree with .. from your current directory until you
+find / or reach the base of the tree (a directory which is its own
+parent).
+
+(2) If you didn't reach / in (1), then starting from / go up to
+the base of the tree with .. and prefix the appropriate number of
+/..'s to the string from (1).
+
+For example, after cd /../../C/D, step (1) will give /C/D and step (2)
+will give /../.. so the answer is /../../C/D.
+
+This is relatively straightforward to implement. I've made the necessary
+modifications to the System V /bin/pwd and sh (which has a built-in pwd)
+for use with a kernel implementation of the Newcastle Connection.
+
+The tricky bit is getting the shortest possible pathname. For example,
+if / corresponds to /../../A/B in the global naming tree, then after
+cd /../C, the modified pwd algorithm would give /../../A/C which is
+correct but redundant. (/../../A is the same as /.. if / is /../../A/B).
+
+This can be fixed if you keep a record of everywhere you visit in (1) and
+stop in (2) when you reach somewhere you've visited before, but since in
+an infinite naming tree this would require an infinite amount of storage
+and isn't very efficient in any case, it is easier to simply implement
+the algorithm given (which also requires an infinite amount of storage
+in the general case of course!) and ignore this problem.
+
+Robert J Stroud,
+Computing Laboratory,
+University of Newcastle upon Tyne.
+
+ARPA robert%cheviot.newcastle at nss.cs.ucl.ac.uk
+UUCP ...!ukc!cheviot!robert
+JANET robert at newcastle.cheviot
+#! rnews 835
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!nott-cs!pyr1.cs.ucl.ac.uk!awylie
+From: awylie at pyr1.cs.ucl.ac.uk
+Newsgroups: comp.sys.ibm.pc
+Subject: Re: Standard date bug
+Message-ID: <39500002 at pyr1.cs.ucl.ac.uk>
+Date: 4 Dec 87 13:58:00 GMT
+References: <7457 at eddie.MIT.EDU>
+Lines: 12
+Nf-ID: #R:eddie.MIT.EDU:7457:pyr1.cs.ucl.ac.uk:39500002:000:432
+Nf-From: pyr1.cs.ucl.ac.uk!awylie    Dec  4 13:58:00 1987
+
+
+I have a Taiwanese XT clone with some strange BIOS and MSDOS 3.2 and the
+bug has annoyed me some time. This is NOT the 'subtle' bug mentioned in
+another reply, but a simple non-increment of the date at midnight. This
+wreaks havoc with MAKE!
+   I shall try CLOCKFIX.SYS tonight. Thanks very much to the poster, his
+was the only really useful solution proposed.
+
+Andrew Wylie
+University of London Computer Centre
+
+awylie at uk.ac.ucl.cs
+#! rnews 847
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!bath63!sc_dra
+From: sc_dra at ux63.bath.ac.uk (Dave Allum)
+Newsgroups: comp.sys.atari.st
+Subject: Hard Disk Optimisers
+Summary: Recommendations wanted
+Message-ID: <1972 at bath63.ux63.bath.ac.uk>
+Date: 4 Dec 87 15:53:49 GMT
+Reply-To: sc_dra at ux63.bath.ac.uk (Dave Allum)
+Organization: SWURCC, University of Bath, U.K.
+Lines: 13
+
+
+Does anyone have any recommendations for and/or experience of hard disk
+optimisers for the ST?
+
+The only ones I have come across are Simon Poole's DLII and Michtron's
+Tune Up! (their exclamation mark, not mine).
+
+I have tried neither (DLII did some strange things with a ram disk I 
+tested it on, and I'd rather not pay for Tune Up! until I have some
+favorable reports on it) and would be very interested in  anyone's
+experiences with the above or any other such beasts.
+
+Thanks.
+#! rnews 1573
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!bob
+From: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Newsgroups: sci.physics
+Subject: Re: GR question
+Message-ID: <811 at its63b.ed.ac.uk>
+Date: 4 Dec 87 17:31:49 GMT
+References: <4688 at cit-vax.Caltech.Edu> <895 at ubc-vision.UUCP>
+Reply-To: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 28
+
+In article <895 at ubc-vision.UUCP> majka at ubc-vision.UUCP (Marc Majka) writes:
+>would see the "poor fellow's" delta-t getting longer.  The poor fellow
+>crosses the Absolute Event Horizon in a finite amount of (his) time.
+>The observer sees the poor fellow falling more and more slowly (while
+>also seeing him getting exponentially red-shifted) toward r=2M, but
+>never getting there.  I liked the presentation of this in my GR textbook:
+
+The observer, if he waited around long enough, would also
+see the black hole evaporate by Hawkins' radiation.
+
+But, from the point of view of the observer, the "poor fellow"
+can never cross the event horizon before the hole evaporates
+away from under him.
+
+Therefore, the "poor fellow" must observe one of two things.
+Either he crosses the event horizon in a finite amount of
+time, or he will observe the black hole to vanish as he
+approaches.
+
+1. sets up a paradox, but 2. implies that anything falling
+into a black hole can't get into the black hole before it
+evaporates. i.e. the black hole can't form in the first
+place. It just get very close to it.
+
+
+Would someone please comment on the above. I am sure I must
+be missing something. (I'm no physicist)
+	Bob.
+#! rnews 2122
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!zen!frank
+From: frank at zen.UUCP (Frank Wales)
+Newsgroups: news.config
+Subject: Updated map entry for zen
+Keywords: new host computer
+Message-ID: <787 at zen.UUCP>
+Date: 3 Dec 87 22:20:52 GMT
+Organization: Zengrange Limited, Leeds, England
+Lines: 47
+
+
+It's a bit late  again,  we've been  running  the new system for about 3
+months now, but here is our updated map entry:
+
+#N	zen
+#S	HP 9000 Model 840; HP-UX 1.1 (V.2)
+#O	Zengrange Limited
+#C	Julian Perry, Frank Wales
+#E	jules at zen.co.uk ...!mcvax!ukc!zen.co.uk!jules
+#T	+44 532 489048
+#P	Greenfield Road, Leeds, West Yorkshire, England, LS9 8DB
+#L	01 31 22 W / 53 47 42 N
+#R
+#
+zen	hwcs(DAILY)
+
+
+Who we are and what we do:
+
+As a company, we produce  custom  solutions  on  hand-held  and portable
+equipment,  primarily   customising   Hewlett-Packard   hand-helds.  For
+example, we recently installed almost 6 000 HP-71 hand-held computers as
+networked  terminals in 430 DHSS offices as part of a Document  Tracking
+System developed by us to a DHSS specification.
+
+We're not just a software  house, but also develop custom  packaging and
+electronics where necessary too.  Our customers are primarily government
+departments  (here and abroad), but we have also  produced  products for
+individual sale through dealers (such as the Zenwand-71 barcode wand for
+the HP-71, which span off of the DHSS contract).
+
+Although our products are almost exclusively  related to hand-helds, our
+expertise  stretches through to custom chip design and  mainframe-hosted
+software  packages  (mainly  under Unix).  As a  consequence,  we regard
+ourselves as a solutions  house, rather than being specific to software,
+hardware, design or whatever.
+
+We have one  office [in  Leeds],  have been  around for seven  years and
+employ over 40 people at present.  Is that a reasonable summary?
+
+Jules & Frank
+
+Julian Perry               [ jules at zen.co.uk  ...!mcvax!ukc!zen.co.uk!jules ]
+Frank Wales                [ frank at zen.co.uk  ...!mcvax!ukc!zen.co.uk!frank ]
+System Managers
+Zengrange Limited          Phone: +44 532 489048 ext 217
+Leeds, England.
+#! rnews 1158
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: rec.music.classical
+Subject: Re: re repeat repeating pieces
+Message-ID: <1567 at brahma.cs.hw.ac.uk>
+Date: 4 Dec 87 18:18:28 GMT
+References: <8712011820.AA18589 at decwrl.dec.com>
+Reply-To: jack at cs.glasgow.ac.uk (Jack Campin)
+Organization: PISA Project, Glesga Yoonie
+Lines: 13
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+
+[ignore the above email address and use my signature]
+I may have missed some of this thread, but I haven't heard anyone mention
+Satie yet. His Vexations for piano is meant to be repeated 840 times
+(it takes about 18 hours to perform). He also wrote some pieces of music
+to be played in particular spaces - "Music for a Boardroom" is one
+that comes to mind - which go round and round in circles. (I think that one
+would produce some #@$% aggressive board meetings).
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 1124
+Path: alberta!mnetor!uunet!mcvax!ukc!stl!dww
+From: dww at stl.stc.co.uk (David Wright)
+Newsgroups: comp.os.vms
+Subject: Problem with VMS 4.6 if your uVAX has EMULEX CS02's
+Message-ID: <596 at acer.stl.stc.co.uk>
+Date: 4 Dec 87 21:54:38 GMT
+Reply-To: dww at stl.UUCP (David Wright)
+Organization: STL,Harlow,UK.
+Lines: 16
+
+Our System Manager has reported that there is a problem with using EMULEX CS02
+QBUS comms cards which are not at the latest revision level, under VMS 4.6.   
+These cards appeared to work fine under VMS 4.5 and earlier.
+
+The EMULEX CS02 card, configured as two DHV-11 8-line muxs, gives phantom
+devices when running SHOW DEVICE.   For example, TXC0 to TXC7 become TXC0 to
+TXC15.  There are problems in using the lines - for example Control-Y acts
+on the group of lines not just one!  There are other problems known to EMULEX. 
+
+The solution is to upgrade the firmware PROM on the card to at least
+revision P.  Emulex may make a charge for this.
+
+-- 
+Regards,
+        David Wright           STL, London Road, Harlow, Essex  CM17 9NA, UK
+dww at stl.stc.co.uk <or> ...uunet!mcvax!ukc!stl!dww <or> PSI%234237100122::DWW
+#! rnews 384
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!root44!jgh
+From: jgh at root.co.uk (Jeremy G Harris)
+Newsgroups: comp.sys.amiga
+Subject: New Kickstart
+Keywords: Kickstart workbench janus
+Message-ID: <489 at root44.co.uk>
+Date: 4 Dec 87 19:05:27 GMT
+Organization: Root Computers Ltd., London, England
+Lines: 3
+
+Will the Workbench-less Kickstart initialise Janus?
+-- 
+Jeremy Harris			jgh at root.co.uk
+#! rnews 1018
+Path: alberta!mnetor!uunet!mcvax!unido!stollco!til
+From: til at stollco.UUCP (tilgner)
+Newsgroups: sci.astro
+Subject: The current state of Hubble Constant?
+Keywords: Cosmology
+Message-ID: <142 at stollco.UUCP>
+Date: 5 Dec 87 18:32:42 GMT
+Organization: Stollmann Gmbh, D 2000 Hamburg 50
+Lines: 17
+
+I am just preparing a 'semi-popular' lecture on how the
+value of the Hubble Constant is determined.
+
+As is generally
+known, the values of different authors fluctuates between
+ca. 50 to 100 km/(sec Mpc). The latest discussion of this
+problem which I know of is M. Rowan-Robinson's book
+"The Cosmological Distance Ladder" (Freeman 1985). He
+advocates 67 km/(sec Mpc) after a detailed discussion of
+the different distance indicators.
+
+Now I would like to know: What is the current state of
+affairs? The responses of the advocates of the various
+values, for example by Sandage & Tammann or de Vaucouleurs
+(= the grand old men of this topic)? Somehow I missed
+their reactions. Can anybody give me a hint via e-mail?
+I'll summarize.
+#! rnews 2734
+Path: alberta!mnetor!uunet!mcvax!enea!ttds!draken!zap
+From: zap at draken.nada.kth.se (Svante Lindahl)
+Newsgroups: comp.unix.wizards,comp.emacs
+Subject: Re: Emacs csh alias
+Message-ID: <235 at draken.nada.kth.se>
+Date: 6 Dec 87 07:00:31 GMT
+References: <10672 at brl-adm.ARPA>
+Reply-To: zap at nada.kth.se (Svante Lindahl)
+Followup-To: comp.emacs
+Organization: The Royal Inst. of Techn., Stockholm
+Lines: 49
+Xref: alberta comp.unix.wizards:5741 comp.emacs:2402
+
+[Warning: Extensive inclusion, but I have included a new newsgroup in
+ the newsgroups-line, and directed followups to it (comp.emacs)]
+
+In article <10672 at brl-adm.ARPA> dsill at NSWC-OAS.arpa (Dave Sill) writes:
+>I've been trying to set up a C-Shell (4.2 BSD) alias for Emacs (GNU
+>17.64, not that it matters) which, when run the first time will
+>actually run Emacs, but after suspending Emacs with C-z, will bring
+>the background Emacs job to the foreground.  The catch is that I'd
+>also like the alias to re-load emacs if I exit with C-x C-c.  Simply
+>stated, I want an alias named "emacs" which will load Emacs if it
+>isn't already loaded, but will foreground a background Emacs if one
+>exists.
+>
+>I know I could do this with a script (if I assume the Emacs job is
+>always job %1), but I'd prefer an alias since they're faster.  It
+>would be especially nice to determine which background job was the
+>Emacs job and foreground *it*, instead of just assuming job %1.
+>
+>Any ideas or alternate approaches?  Should I just put up with the
+>occasional "fg: No such job." message?
+
+Here is something which should do part of what you want. It doesn't
+accomplish to start a new emacs process if you exited the last one
+with C-x C-c - unless the first one had never been suspended!
+Whenever you get "fg: No such job" just type ``i!!'', reinvoking the
+commandline prefixed with an "i", "iemacs" standing for "init emacs".
+
+alias emacs iemacs
+alias iemacs 'alias emacs remacs; "emacs" \!* ; alias emacs iemacs'
+alias remacs fg %emacs
+
+Here we use a special version of suspend-emacs, that will look for a
+file ".emacs_pause" in the user's home directory when emacs is
+resumed. In this file suspend-emacs expects to find the current
+working directory and an optional "command line" that is parsed like
+the initial command line.  Very useful!
+This could be done using "suspend-resume-hook", but the hook wasn't
+available in 17.?? when this was first implemented here.
+
+These are the aliases I use together with the special version of
+suspend-emacs.
+
+alias emacs iemacs
+alias remacs 'echo `pwd` \!* >\! ~/.emacs_pause ; %emacs'
+alias iemacs 'alias emacs remacs; "emacs" \!* ; alias emacs iemacs'
+alias kemacs 'alias emacs iemacs; remacs -kill'
+
+
+Svante Lindahl		zap at nada.kth.se		uunet!nada.kth.se!zap
+#! rnews 2721
+Path: alberta!mnetor!uunet!mcvax!diku!iesd!jpc
+From: jpc at iesd.uucp (Jens P. Christensen)
+Newsgroups: comp.unix.questions,comp.unix.wizards,sci.math.stat
+Subject: Problems with S statistical package
+Summary: Cannot make S work properly on Sun-3
+Keywords: S AT&T Sun-3 SunOS 3.4
+Message-ID: <162 at iesd.uucp>
+Date: 5 Dec 87 19:41:09 GMT
+Reply-To: jpc at iesd.UUCP (Jens P. Christensen)
+Followup-To: comp.unix.questions
+Organization: Dept. of Comp. Sci., Aalborg University, Denmark
+Lines: 58
+Xref: alberta comp.unix.questions:4768 comp.unix.wizards:5742 sci.math.stat:213
+
+Could anyone please shed light on a problem I have in compiling the S
+statistical package from AT&T on our Sun-3 system:
+
+System specifics: Sun 3/260 under SunOS 3.4 using the m4 macro
+processor supplied with the S system. S version date: Fri Feb 28 1986
+
+Using the hints on compiling with BSD4.2 systems I only get apparently
+harmless warnings under the compilation. This could for example be:
+
+Warning on line 84 of hcp.f: local variable i never used
+Warning on line 96 of stems.f: statement cannot be reached
+f77: Warning: File with unknown suffix (/usr/local/src/s/S/newfun/lib/grz)
+     passed to ld
+or
+"dprint.c", line 20: warning: illegal combination of pointer and integer, op =
+
+Furthermore there are problems with the utility routine scandata.C, which
+fails with error: too many local variables. This is fixed by making the
+declaration of "table" global. Not pretty, but it works.
+
+These are all the kinds of problems that appear during the
+compilation, and it *will* result in an executable, except....
+The f...ing system doesn't even know how to add two numbers, as seen in
+the following:
+
+One-time initialization for new S user in /usr.MC68020/iesd/tap/jpc ...
+Directories swork and sdata created
+> 1 + 2
+Bad operator: +
+Error in +
+> 
+
+Running the tests supplied with the system ($A/DOTEST ALL) will not
+give better results. This is an excerpt from $TEST/current/apply:
+
+> prefix("apply.")    # test of apply and multivariate stuff, some time-series
+> $Random.seed_c(57,0,3,0,0,0,49,16,0,0,0,0)	# to initialize at same spot
+> matr_matrix(rnorm(100),20,5)
+Invalid distribution: rnorm
+Error in rnorm
+Dumped
+> print(cm_apply(matr,2,"mean")); apply(matr,2,"var")
+apply.matr not found
+Dumped
+ .
+ .
+and more depressing errors...
+Why does the prefix command work, while the matr_matrix(rnorm... stuff don't?
+
+So, have *anybody* made this run on a Sun system, and how did you do it?
+All suggestions or pointers to which direction I should go, are welcome.
+
+regards,
+-- 
+Jens Peter Christensen                               jpc at iesd.uucp
+Department of Math. and Computer Science             {...}!mcvax!diku!iesd!jpc
+Aalborg University Centre
+Denmark
+#! rnews 1496
+Path: alberta!mnetor!uunet!mcvax!lambert
+From: lambert at cwi.nl (Lambert Meertens)
+Newsgroups: sci.math.symbolic
+Subject: Bug in Macsyma SOLVE
+Message-ID: <137 at piring.cwi.nl>
+Date: 6 Dec 87 21:50:53 GMT
+Organization: CWI, Amsterdam
+Lines: 39
+
+This is UNIX MACSYMA Release 309.2.
+
+(c1) x^12-12*x^11+48*x^10-40*x^9-193*x^8+392*x^7+44*x^6+8*x^5-977*x^4
+     -604*x^3+2108*x^2+4913;
+
+      12       11       10       9        8        7       6      5        4
+(d1) x   - 12 x   + 48 x   - 40 x  - 193 x  + 392 x  + 44 x  + 8 x  - 977 x
+                                                             3         2
+                                                      - 604 x  + 2108 x  + 4913
+
+(c2) solve(%);
+                      6       5       4        3        2
+(d2)          [0 = - x  + 12 x  - 47 x  + 188 x  - 527 x  - 4913]
+
+That looks wrong, but let's check if it factors (d1):
+
+(c3) part(%,1,2);
+                    6       5       4        3        2
+(d3)             - x  + 12 x  - 47 x  + 188 x  - 527 x  - 4913
+
+(c4) gcd(%,d1);
+
+(d4)                                   1
+
+No, it does not.  Let's have a look at the real roots of (d1) and (d3):
+
+(c5) realroots(d1)$ %,numer;
+
+(d6) [x = - 1.960768669843674, x = - 1.544090360403061, x = 3.544090360403061,
+                                                         x = 3.960768669843674]
+(c7) realroots(d3)$ %,numer;
+
+(d8)           [x = 5.472395747900009, x = 7.766151040792465]
+
+Way off.
+
+-- 
+
+Lambert Meertens, CWI, Amsterdam; lambert at cwi.nl
+#! rnews 989
+Path: alberta!mnetor!uunet!mcvax!unido!tub!actisb!bernd
+From: bernd at actisb.UUCP (Gunter Nitzler)
+Newsgroups: comp.sources.bugs
+Subject: Re: Starchart printing problem
+Message-ID: <116 at actisb.UUCP>
+Date: 6 Dec 87 15:55:23 GMT
+References: <3554 at ames.arpa>
+Reply-To: bernd at actisb.UUCP (Bernd-Gunter Nitzler)
+Organization: Actis in Berlin GmbH, W. Germany
+Lines: 19
+
+In article <3554 at ames.arpa> yee at ames.UUCP (Peter E. Yee) writes:
+>I compiled and ran the starchart program.  The starpost version prints out
+>the outline of the chart and the legend.  Nothing more.  No stars, no planets,
+>no nebulas.  Nothing.  Is it just me, or has anyone else had this problem?
+
+I had the same problem and have found two bugs:
+
+In starchart.c, line 243 old:
+	char ras[2], ....
+new:
+	char ras[20], ...
+
+In starchart.c, line 757 old:
+	    sscanf(cbuf, "%*5s%f%f%f %[^\n]", &ra, &de, &sc, legend);
+new:
+	    sscanf(cbuf, "%*5s%lf%lf%lf %[^\n]", &ra, &de, &sc, legend);
+
+This two changes fixes the bugs.
+Bernd.
+#! rnews 2244
+Path: alberta!mnetor!uunet!mcvax!enea!tut!santra!jmunkki
+From: jmunkki at santra.UUCP (Juri Munkki)
+Newsgroups: comp.sys.mac
+Subject: Color CopyBits Is Too Slow!
+Keywords: Mac II Color QuickDraw Animation Speed Optimization
+Message-ID: <9130 at santra.UUCP>
+Date: 6 Dec 87 21:13:10 GMT
+Organization: Helsinki University of Technology, Finland
+Lines: 76
+
+
+I experimented with offscreen pixmaps today. It seems that Color
+Quickdraw is very flexible, but too slow for good animation. Most of the
+overhead comes from color matching and conversion. I guess I could write
+my own color matching routine, but I think there should be a fast way to
+do a simple copy operation.
+
+In most painting programs the actual painting could be done on an
+offscreen bitmap with the same color table as the best gDevice.
+
+It takes about twice as much time to do a copybits in srcCopy mode than
+it takes in the srcXor mode. Below is a short program that draws to an
+offscreen pixmap and then copies it back to the screen. Try different
+transfer modes and note the speed difference. The code is written in LS
+C 2.13. Even srcXor, which is the fastest usable mode, is too slow for
+really high quality animation.
+
+How can it be done faster?
+
+#include <MacTypes.h>
+#include <QuickDraw.h>
+#include <Color.h>
+#include <WindowMgr.h>
+
+WindowPtr	onScreen;
+CGrafPtr	offS;
+RGBColor	temp;
+PixMapPtr	offP;
+
+void	main()
+{
+	int	i;
+	
+	InitGraf(&thePort);	InitCursor();
+	InitFonts();		InitWindows();
+		
+	onScreen=GetNewWindow(1000,0L,-1);
+
+	offS=(CGrafPtr)NewPtr(sizeof(*offS));
+
+	OpenCPort(offS);
+	HLock(offS->portPixMap);
+	offP=*(offS->portPixMap);
+
+	SetRect(&offP->bounds,0,0,256,256);
+	PortSize(256,256);
+	offP->rowBytes=32768L+256;
+
+	offP->baseAddr=NewPtr(65536L);
+
+	EraseRect(&offS->portRect);
+	temp.blue=65535;
+	temp.red=0;
+	temp.green=0;
+	RGBForeColor(&temp);
+	for(i=0;i<256;i+=4)
+	{	MoveTo(i,0);
+		LineTo(255-i,255);
+	}
+
+	SysBeep(10);
+	HideCursor();
+	for(i=100;i;i--)
+		CopyBits(&((GrafPtr)offS)->portBits,&onScreen->portBits,
+				 &offS->portRect,&offS->portRect,srcXor,0);
+	SysBeep(10);
+	while(!Button());
+}
+
+Juri Munkki
+jmunkki at santra.hut.fi
+jmunkki at fingate.bitnet
+lk-jmu at finhut.bitnet
+
+P.S. The window is longword aligned and a color table was copied from the
+     system file.
+#! rnews 617
+Path: alberta!mnetor!uunet!mcvax!enea!chalmers!benke
+From: benke at chalmers.UUCP (Bengt-Eric Ericson)
+Newsgroups: comp.sys.ibm.pc
+Subject: Re: WARNING! FASTBACK may corrupt your hard disk!
+Message-ID: <2239 at chalmers.UUCP>
+Date: 6 Dec 87 21:16:48 GMT
+References: <703 at vaxine.UUCP> <3225 at bnrmtv.UUCP> <7024 at sunybcs.UUCP>
+Reply-To: benke at chalmers.UUCP (Bengt-Eric Ericson)
+Organization: Dept. of CS, Chalmers, Sweden
+Lines: 3
+Keywords:Computer Shopper
+
+
+In some article in this group there is said something about
+"Computer Shopper". Is this a magazine or what? Please
+enlight us guys here in the land of Polar bears. :-)
+#! rnews 2432
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!kjws
+From: kjws at eagle.ukc.ac.uk (K.J.W.Smithers)
+Newsgroups: comp.sys.amiga
+Subject: Re: A2090A HD controller
+Message-ID: <4038 at eagle.ukc.ac.uk>
+Date: 6 Dec 87 14:46:00 GMT
+References: <5474 at oberon.USC.EDU> <6575 at ccicpg.UUCP> <2903 at cbmvax.UUCP>
+Reply-To: kjws at ukc.ac.uk (K.J.W.Smithers)
+Organization: Computing Lab, University of Kent at Canterbury, UK.
+Lines: 56
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+In article <2903 at cbmvax.UUCP> you write:
+>
+>This is one of the things that the updated hddisk device I announced
+>awhile ago (and will mail to people over usenet) fixes.  If you don't
+>have have a 2090 card, the software that comes with your 2090 is
+>the new driver, so it will work fine in overscan.
+>-- 
+>andy finkel		{ihnp4|seismo|allegra}!cbmvax!andy 
+>Commodore-Amiga, Inc.
+>
+
+I have an A2090 card and a CSA68020/68881 board with no 32 bit ram.
+ 
+ They will Not work together. (but both work seperately)
+
+I think the driver (hddisk) is dated  1986 , is this the latest driver?
+(If not could you please e-mail me the latest version)
+
+The problem is when I run binddrivers that task stops, (binddrivers
+never exits). It seems to fallover on a particular call to execbase.
+The last instruction (displayed by MetaScope) is  mov a2,(a0)
+
+If i move the hddisk from expansion draw , to hddisk.device in the
+devs draw, i can mount the harddisk (dh0:) , but when i do a
+cd dh0: , the cd command displays 'Cant find dh0:'
+
+I am running morerows, 672*266 on a B2000 rev 4.0 board (pal) with
+2Mbytes expansion ram , 2*3.5inch drives, and (hopefully) A2090 +
+20 Mbyte hard disk, and a CSA 68020/68881 board.
+
+I have also done the wire-link modification to the main B2000 board,
+as required by CSA for the 68020 board on Rev4.0 and later boards.
+
+Slots are as follows :-
+
+     I  I  E  E  E  M  H     6
+     B  B  M  M  M  E  A     8
+     M  M  P  P  P  M  R     0
+           T  T  T  O  D     2
+	   Y  Y  Y  R  D     0
+                    Y  I     C
+                       S     P
+                       K     U
+
+   Thanks in advance for any help
+		
+	Kit Smithers
+
+____________________________________________________________________________
+   Kit Smithers			kjws at ukc.ac.uk
+				kjws at ukc.UUCP
+				!mcvax!ukc!kjws
+
+The man who can not stay fast and hard at the same time !
+Live for ever, or die in the attempt.
+______________________________________________________________________________
+#! rnews 1572
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!ajcd
+From: ajcd at its63b.ed.ac.uk (Angus Duggan, Department of Computer Science, University of Edinburgh,)
+Newsgroups: rec.games.hack
+Subject: pickup option - suggestion
+Keywords: pickup HACKOPTIONS
+Message-ID: <813 at its63b.ed.ac.uk>
+Date: 6 Dec 87 11:47:56 GMT
+Reply-To: ajcd at its63b.ed.ac.uk (Angus Duggan)
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 23
+
+Here's a suggestion for an improvement (at least I think it is :-) to the
+"pickup" option in nethack, which someone who is familiar with the source
+code might like to implement -
+
+Make the "pickup" option a composite option like "packorder", and re-write
+the picking up code so that the types of objects specified will be
+automatically picked up. All other objects could still be picked up by ','.
+
+e.g. "pickup:?+/=!)"  would pick up scrolls, spellbooks, wands, rings,
+                                   potions, and weapons.
+
+This would be useful for those of us who don't like carrying hoards of
+gold around, and also to prevent picking up dead cockatrices while still
+picking up other objects.
+
+BTW, does anyone know what the options "null" and "news" do?
+-- 
+Angus Duggan, Department of Computer Science, University of Edinburgh,
+James Clerk Maxwell Building, The King's Buildings, Mayfield Road,
+Edinburgh, EH9 3JZ, Scotland, U.K.
+JANET:  ajcd at uk.ac.ed.ecsvax  ARPA: ajcd%ecsvax.ed.ac.uk at cs.ucl.ac.uk
+USENET: ajcd at ecsvax.ed.ac.uk  UUCP: ...!seismo!mcvax!ukc!ecsvax.ed.ac.uk!ajcd
+BITNET: psuvax1!ecsvax.ed.ac.uk!ajcd or ajcd%ecsvax.ed.ac.uk at earn.rl.ac.uk
+#! rnews 4243
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!simon
+From: simon at its63b.ed.ac.uk (ECSC68 S Brown CS)
+Newsgroups: comp.lang.c
+Subject: Re: stdio error detection
+Message-ID: <814 at its63b.ed.ac.uk>
+Date: 6 Dec 87 17:35:07 GMT
+References: <10649 at brl-adm.ARPA>
+Reply-To: simon%lfcs.ed.ac.uk at nss.cs.ucl.ac.uk (Simon Brown)
+Organization: LFCS, University of Edinburgh
+Lines: 87
+
+In article <10649 at brl-adm.ARPA> dsill at NSWC-OAS.arpa (Dave Sill) writes:
+>>I used to be rather fond of C, but this error stuff is quite
+>>incredibly bad.  The problem isn't really the language; it's
+>>the libraries.
+>
+>Rather than messing with errno, I think a new variable, say, liberr,
+>should be used.  An include file, say liberr.h, could contain macro
+>definitions for the various types of errors.  A macro named LIBERR
+>could also be defined in liberr.h so code could be written that would
+>take advantage of liberr if it was available or handle errors in the
+>usual way if it's not.  Even better would be to have LIBERR be a
+>predefined macro like ANSI, unix, vax, et cetera.
+>
+
+This still has the same problem as with "errno"- namely that you're trying
+to describe a general ``error condition'' using a single number! I'm told
+that VMS (but it's a good idea for all that...) provides a stack of error 
+values which allows a program to search backward to find out what the "real" 
+error was, depending on what kind of detail is required. If you have several
+levels of library calls between you and the system call that failed, this
+can be extremely useful- it's not really much use having an error-value
+if you can't even tell what system call it came from (let alone what parameters
+were *passed* to that system call to cause it to fail!).
+
+A *decent* error-returning mechanism would describe:
+
+	1. What call (syscall or library call) failed.
+	   This could be a number- you could use something like internet
+	   addressing to put some kind of structure into it:
+		libc.stdio.fopen
+	2. Why it failed.
+	   Simple E-numbers will do for this (although I suppose they'd
+	   have to be grouped for different libraries):
+		E_STDIO.E_CANNOT_OPEN_FILE
+	3. What value it returned.
+		(FILE *)NULL
+	3. What parameters were passed to it.
+	   This is the most difficult one, because it would have to have
+	   some kind of idea as to the types involved. It could (I suppose)
+	   deal only with string types (and convert any other type into
+	   "printable" form by doing the equivalent of sprintf()'ing it).
+	   It also has to be a "list", which means it would probably have
+	   to be done using something like "argc,argv":
+		argc: 2
+		argv: "mumble.splat", "r"
+
+If the error is not "dealt with", then this information should propogate
+down (together with the info from the callee's failure), and so on...
+
+So, If you do a
+	fopen("mumble.splat","r")
+and it fails, then the following would be left on the stack (in some format
+or other) to be dealt with by some error-diagnosing function:
+
+	kernel.open:
+		param 1: "mumble.splat" [string]
+		param 2: 0 [int]
+		returns: -1 [int]
+		error: E_KERNEL.ENOENT
+	libc.stdio.fopen:
+		param 1: "mumble.splat" [string]
+		param 2: "r" [string]
+		returns: 0 [FILE *]
+		error: E_LIBC.E_STDIO.E_CANNOT_OPEN_FILE
+
+The error-diagnosing stuff could then print something *useful* such as
+	stdio fopen: couldn't open file "mumble.splat" for reading, because:
+	    kernel open: no file or directory "mumble.splat"
+
+(and of course the format of these messages could be user-configurable, so
+that noddies would just get the information they need, whereas people who
+understand what they're doing could get reams and reams of info- just by setting
+some environment parameter to the appropriate value).
+
+Of course, all this stuff would have to be known by the compiler, and I'm sure
+it'd be dead slow to execute!
+
+-- 
+--------------------------------------------------
+| Simon Brown                                    |
+| Laboratory for Foundations of Computer Science |
+| Department of Computer Science                 |
+| University of Edinburgh, Scotland, UK.         |
+--------------------------------------------------
+ UUCP:  uunet!mcvax!ukc!lfcs!simon
+ ARPA:  simon%lfcs.ed at nss.cs.ucl.ac.uk      "Life's like that, you know"
+ JANET: simon at uk.ac.ed.lfcs
+#! rnews 665
+Path: alberta!mnetor!uunet!mcvax!henk
+From: henk at cwi.nl (Henk Schouten)
+Newsgroups: rec.games.board
+Subject: diplomacy
+Keywords: pbm
+Message-ID: <138 at piring.cwi.nl>
+Date: 7 Dec 87 08:36:16 GMT
+Organization: CWI, Amsterdam
+Lines: 9
+
+A local group is going to start a diplomacy game by mail. We have
+only few players so I would like to take part in the game myself.
+To do so, I would like to have the moves evaluated by a
+program. Before writing such a program myself, I would like to
+ask if anyone has or knows of such a program in the public
+domain, preferrably written in C. Code or pointers to it will be
+greatly appreciated.
+				Henk Schouten
+				..!nl!cwi!henk
+#! rnews 1298
+Path: alberta!mnetor!uunet!mcvax!varol
+From: varol at cwi.nl (Varol Akman)
+Newsgroups: sci.crypt
+Subject: Re: NSA advertisment
+Summary: Somewhat naive, huh?
+Message-ID: <139 at piring.cwi.nl>
+Date: 7 Dec 87 08:59:02 GMT
+References: <4781 at cit-vax.Caltech.Edu>
+Organization: CWI, Amsterdam
+Lines: 22
+
+palmer at tybalt.caltech.edu.UUCP (David Palmer) writes:
+>I just read a magazine add seeking people to work at the NSA (pg. 80R of
+>Dec. 1987 IEEE Spectrum)
+>The graphic is 10,000,0... (100 zeros) written on three lines.  The first
+>paragraph of the text reads:
+>	You're looking at a "googol." Ten raised to the 100th power.
+>	One followed by 100 zeros.  Counting 24 hours a day, you would
+>	need 120 years to reach a googol.  Two lifetimes.  It's a
+>	number that's impossible to grasp.  A number beyond our imagination.
+>... material deleted ...
+
+This strikes me as quite odd.  I mean, if something can be done in two lifetimes
+then, darn it, it is well within my imagination.
+If it can be done within 20 lifetimes
+I can still grasp how difficult it should be.  A real difficult thing would
+be something that takes say 10^100 lifetimes.
+
+In short, I find the above ad quite naive.  NSA guys should probably
+have something better than this for the inspring encryption student.
+What do you say?
+
+-Varol Akman
+#! rnews 1520
+Path: alberta!mnetor!uunet!mcvax!prlb2!ronse
+From: ronse at prlb2.UUCP (Christian Ronse)
+Newsgroups: sci.math
+Subject: Re: Least-squares fitting
+Summary: see Duda & Hart, Chapter 9, for a solution
+Keywords: ``eigenvector line fitting''
+Message-ID: <387 at prlb2.UUCP>
+Date: 7 Dec 87 09:22:11 GMT
+References: <1823 at culdev1.UUCP> <528 at amethyst.ma.arizona.edu>
+Organization: Philips Research Laboratory, Brussels
+Lines: 21
+
+From article <528 at amethyst.ma.arizona.edu> by hdunne at amethyst.ma.arizona.edu:
+< In article <1823 at culdev1.UUCP> drw at culdev1.UUCP (Dale Worley) writes:
+	[deleted ...]
+< }Is is known how to perform least-squares fitting where the "error" is
+< }the perpendicular distance between the point and the line?
+< }
+< If the point is (x_i,y_i) and the line is y = a*x + b, then the square of the
+< perpendicular distance is [(y_i - a*x_i - b)^2]/(1 + a^2) (assuming the line
+< isn't vertical). Taking the sum of the squared distances and setting the
+< partial derivatives wrt. a and b equal to zero, you get the same equations 
+< for a and b as you get from the usual least-squares procedure.
+
+See the book ``Pattern Classification and Scene Analysis'' by R.O. Duda & P.E.
+Hart, Chapter 9. Section 9.2.1 introduces the usual least square fitting
+(``minimum-squared-error line fitting''), and 9.2.2 the one asked by Dale
+(``eigenvector line fitting''). There the problem is solved.
+
+Christian Ronse		maldoror at prlb2.UUCP
+{uunet|philabs|mcvax|...}!prlb2!{maldoror|ronse}
+
+	STAT ROSA PRISTINA NOMINE, NOMINA NUDA TENEMUS
+#! rnews 977
+Path: alberta!mnetor!uunet!mcvax!ukc!stl!stc!idec!camcon!mb
+From: mb at camcon.uucp (Mike Bell)
+Newsgroups: comp.sys.ibm.pc
+Subject: Re: Neat voice|gag program
+Summary: How does HELPME work?
+Message-ID: <1107 at titan.camcon.uucp>
+Date: 2 Dec 87 14:25:07 GMT
+References: <3692 at uwmcsd1.UUCP>
+Distribution: all
+Organization: Cambridge Consultants Ltd., Cambridge, UK
+Lines: 15
+
+in article <3692 at uwmcsd1.UUCP>, cmaag at csd4.milw.wisc.edu 
+(posting to comp.binaries.ibm.pc)  says:
+
+> Here is a neat little program I found on a local bbs.  It uses the speaker
+> to generate a very-realistic (the best I've heard on a PC!) voice that
+> says something to the effect of "Help!  I'm locked in this computer!
+> Let me out! Help!".  
+
+I just played it, and was much impressed. Given the rudimentary
+nature of IBM PC's, can anybody explain how it achieves its
+effect?
+-- 
+---------------		UUCP:  ...mcvax!ukc!camcon!mb
+-- Mike Bell --		or:    mb%camcon.uucp
+---------------		Phone: +44 223 358855
+#! rnews 710
+Path: alberta!mnetor!uunet!mcvax!ukc!stl!stc!idec!camcon!mb
+From: mb at camcon.uucp (Mike Bell)
+Newsgroups: comp.sources.bugs
+Subject: Re: v12i071:  StarChart program (Minor correction)
+Message-ID: <1114 at titan.camcon.uucp>
+Date: 4 Dec 87 15:48:15 GMT
+References: <1110 at artemis3.camcon.uucp>
+Organization: Cambridge Consultants Ltd., Cambridge, UK
+Lines: 10
+
+in article <1110 at artemis3.camcon.uucp>, mb at camcon.uucp (Mike Bell) says:
+> 	(Problem found on Sun 4.3 BSD Unix)
+
+Sorry, that should have been Sun Release 3.4 of 4.2 BSD... (well it
+was correct within an order of magnitude:-)
+
+-- 
+---------------		UUCP:  ...mcvax!ukc!camcon!mb
+-- Mike Bell --		or:    mb%camcon.uucp
+---------------		Phone: +44 223 358855
+#! rnews 2447
+Path: alberta!mnetor!uunet!mcvax!tuvie!rcvie
+From: rcvie at tuvie (ELIN Forsch.z.)
+Newsgroups: comp.lang.c
+Subject: Re: Autoincrement question
+Message-ID: <548 at tuvie>
+Date: 7 Dec 87 10:00:58 GMT
+References: <1507 at ogcvax.UUCP>
+Organization: TU Vienna EDP-Center, Vienna, AUSTRIA
+Lines: 58
+
+In article <1507 at ogcvax.UUCP>, schaefer at ogcvax.UUCP (Barton E. Schaefer) writes:
+> (I realize this might be similar to another question asked recently, but ...)
+> 
+> Another student here at OGC recently came to me with a question about the
+> C autoincrement operator.  The following program is representative of the
+> code he wrote, which did not do what he expected:
+> 
+>     struct foo { struct foo *tmp; char junk[32]; } foolist[4];
+> 
+>     main ()
+>     {
+> 	struct foo *bar;
+> 
+> 	bar = foolist;
+> 	/* Do something with bar */
+> 	bar->tmp = bar++;		/* This is the problem line */
+> 	/* Do something else */
+>     }
+> 
+
+This is really dangerous programming. The points where the left and where the
+right "bar" are evaluated are implementation defined. The problem is similar to
+another one, which a friend of mine had some time ago. He tried to pack as much
+as possible into the control part of a while loop using the following statement:
+
+while (a[i]=b[i++])
+  ;
+
+Things were even worse here, as the program behaved even differently depending
+on whether it was compiled with the optimization option or not. Non optimized
+everything worked as expected but in the optimized version only for the first
+assignment "i" was incremented after the assignment, for all the following
+assignments it was incremented after the evaluation of "b[i]" but before the 
+assignment. Nevertheless this behaviour was in the sense of both K&R and ANSI.
+The only thing you can trust on, is that the *operand* of the increment
+operator is evaluated before its incrementation. One way to achieve the desired
+behaviour is, as you suggested yourself, to write:
+
+> What he really wanted was the equivalent of
+> 	bar->tmp = bar;
+> 	bar++;
+
+and not (for the same reasons stated above):
+
+> 	(bar++)->tmp = bar;
+
+If there is any necessity to have the whole semantic in one *expression*, use
+the comma operator, as
+
+bar->tmp = bar, bar++;
+
+This operator *guarantees* the sequential evaluation of its operands from
+left to right.
+
+In real life: Dipl.Ing. Dietmar Weickert
+              ALCATEL Austria - ELIN Research Center
+              Floridusg. 50
+          A - 1210 Vienna / Austria
+#! rnews 1822
+Path: alberta!mnetor!uunet!mcvax!steven
+From: steven at cwi.nl (Steven Pemberton)
+Newsgroups: comp.sys.atari.st
+Subject: Re: Alcyon C Bug N++
+Message-ID: <140 at piring.cwi.nl>
+Date: 7 Dec 87 14:59:48 GMT
+References: <8712051307.AA12109 at ucbvax.Berkeley.EDU>
+Reply-To: steven at cwi.nl (or try mcvax!steven.uucp)
+Organization: CWI, Amsterdam
+Lines: 38
+
+For people interested, here are a couple of bugs in the Alcyon
+compiler that we've been hitting our heads against for the last few
+weeks:
+
+	1) The compiler doesn't seem able to cope with nested
+	   initialisations. For instance, a struct with an array in
+	   the middle:
+		static struct foo table[] = {
+			{ ...... {.....} ......},
+			...
+		}
+	   The compiler complains about mismatched braces.
+	   Cure: 'unwrap' the struct declaration, so it's all at the
+		 same level.
+
+	2) In a construct like
+		bar *p = (expression1, expression2);
+	   the result of expression2 gets coerced to int, and then
+	   back to bar *, meaning basically that you get bombs on the
+	   screen when you try to use p, due to a wrong address.
+	   Cure: use
+		bar *p = (expression1, (bar *) expression2);
+
+	3) We believe that 'complicated' initialisations to auto
+	   variables in functions (for instance where the
+	   initialisation involves a call to another function) often
+	   come out wrong. However, by this point, we despaired, and
+	   stopped using the compiler, so we never followed up on it.
+
+I might point out that we're trying to compile a BIG program: 30,000
+lines of C, so just trying to trace bug 2 took us a LOT of time.
+
+By the way, just for interest: to compile the lot from scratch, using
+a ram disk for temporaries would take 4 hours. When we reinitialised
+the disk partition, and copied the files back, a recompile only took
+1.5 hours!
+
+Steven Pemberton, CWI, Amsterdam; steven at cwi.nl
+#! rnews 1265
+Path: alberta!mnetor!uunet!mcvax!mhres!jv
+From: jv at mhres.mh.nl (Johan Vromans)
+Newsgroups: comp.sys.hp
+Subject: Re: syslogd on HP-UX
+Summary: I have one
+Message-ID: <1495 at mhres.mh.nl>
+Date: 7 Dec 87 12:19:02 GMT
+References: <641 at ucdavis.ucdavis.edu>
+Sender: jv at mhres.mh.nl
+Reply-To: jv at mhres.mh.nl (Johan Vromans)
+Organization: Multihouse N.V., The Netherlands
+Lines: 20
+
+In article <641 at ucdavis.ucdavis.edu> arons at iris.ucdavis.edu (Tom Arons) writes:
+>Has anyone successfully ported syslog(3) and syslogd from 4.2 or
+>4.3 BSD to HP-UX 5.3 running on a 9000 series 300?
+>
+>It doesn't look like it would be too hard to do, but I don't want to
+>reinvent the wheel.
+
+I once implemented a syslogd for HP-UX using message queues. I have posted
+it to comp.sources.unix some time ago, but I can mail it if you cannot find
+it.
+
+Features: (almost) BSD compatible, no network support, runs as a daemon,
+communicates with message queues.
+If no daemon is running, calling 'syslog' is effectivily a no-op.
+I have used it when I tried to get sendmail running.
+
+
+
+-- 
+Johan Vromans                              | jv at mh.nl via European backbone
+Multihouse N.V., Gouda, the Netherlands    | uucp: ..{uunet!}mcvax!mh.nl!jv
+"It is better to light a candle than to curse the darkness"
+#! rnews 1036
+Path: alberta!mnetor!uunet!mcvax!botter!wundt!michael
+From: michael at wundt.psy.vu.nl (M.A.M. Michael)
+Newsgroups: comp.sys.mac
+Subject: Address for update of VersaTerm requested
+Message-ID: <164 at wundt.psy.vu.nl>
+Date: 7 Dec 87 16:30:39 GMT
+Reply-To: michael at psy.vu.nl.UUCP (M.A.M. Felt)
+Organization: VU Psychologie, Amsterdam
+Lines: 24
+
+!!!!!!!!!!!!!!!!!!!!!!!!!
+Please reply via e-mail.
+!!!!!!!!!!!!!!!!!!!!!!!!!
+
+When I purchased VersaTerm 2+ years ago I didn't bother to register.
+Now I wish I had. It's about time for an update.
+
+The manual lists the address:
+Peripherals Computers & Supplies Inc
+2232 Perkiomen Avenue
+Mt. Penn, PA 19606
+
+Is this still current (other VersaTerm Users)?
+
+In either case, an e-mail reply will be appreciated.
+The dealer (I bought it from) here is still selling
+the same version of two years ago. (1.42)
+
+Thanks, michael felt
+-- 
+Michael Felt	Psychology Dept, Vrije Universiteit, Amsterdam, Netherlands
+InterNet:	michael at psy.vu.nl
+UUCP:		...!mcvax!vupsy!michael , michael at vupsy.UUCP
+AppleLink:	HOL0038
+#! rnews 600
+Path: alberta!mnetor!uunet!mcvax!inria!axis!alastair
+From: alastair at axis.fr (Alastair Adamson)
+Newsgroups: comp.text
+Subject: To break or not to break
+Summary: br command in [nt]roff
+Message-ID: <348 at axis.fr>
+Date: 7 Dec 87 08:33:25 GMT
+Organization: Axis Digital, Paris
+Lines: 9
+
+I have long wondered at the ubiquitous [nt]roff request
+	'br
+found in the mm macros and elsewhere. Could someone
+please elucidate the use of the break request with
+the no-break command character ' used?
+
+Thanks in advance, Alastair Adamson,
+	alastair at axis.fr
+	Axis Digital, 135 rue d'Aguesseau, 92100, Boulogne, France
+#! rnews 8193
+Path: alberta!mnetor!uunet!mcvax!botter!ast
+From: ast at cs.vu.nl (Andy Tanenbaum)
+Newsgroups: comp.os.minix
+Subject: New program: treecmp.c
+Message-ID: <1774 at botter.cs.vu.nl>
+Date: 7 Dec 87 20:53:16 GMT
+Reply-To: ast at cs.vu.nl (Andy Tanenbaum)
+Organization: VU Informatica, Amsterdam
+Lines: 321
+
+
+I have written a program to recursively compare the contents of two given
+directories, file for file.  The program descends the tree and reports about
+files that are missing or different.  Some day, if I ever get around to
+producing V1.3 of MINIX, I will make a tree of the current version next to
+the V1.2 tree, and then run this program to get a list of all files that
+are different.  Then I can make diff listings etc.  In reality, the reason
+I wrote it however, is that I had just copied my MINIX tree from one part
+of the disk to another, and I wanted to make sure nothing was forgotten.
+I am sure there are other uses as well.    One could no doubt write a shell
+script to do this same thing, or perhaps use find, but this program is
+much faster, being able to compare two 8 megabyte trees in about 12
+minutes on a Z-248.
+
+Please post any bugs you find.
+
+Andy Tanenbaum (ast at cs.vu.nl)
+
+----------------------------- treecmp.c ---------------------------------
+/* treecmp - compare two trees		Author: Andy Tanenbaum */
+
+/* This program recursively compares two trees and reports on differences.
+ * It can be used, for example, when a project consists of a large number
+ * of files and directories.  When a new release (i.e., a new tree) has been
+ * prepared, the old and new tree can be compared to give a list of what has
+ * changed.  The algorithm used is that the first tree is recursively
+ * descended and for each file or directory found, the corresponding one in
+ * the other tree checked.  The two arguments are not completely symmetric
+ * because the first tree is descended, not the second one, but reversing
+ * the arguments will still detect all the differences, only they will be
+ * printed in a different order.  The program needs lots of stack space
+ * because routines with local arrays are called recursively. The call is
+ *    treecmp [-v] dir1 dir2
+ * The -v flag (verbose) prints the directory names as they are processed.
+ */
+
+#include <stat.h>
+
+#define BUFSIZE 4096		/* size of file buffers */
+#define MAXPATH 128		/* longest acceptable path */
+#define DIRENTLEN 14		/* number of characters in a file name */
+
+struct dirstruct {		/* layout of a directory entry */
+  unsigned inum;
+  char fname[DIRENTLEN];
+};
+
+struct stat stat1, stat2;	/* stat buffers */
+
+char buf1[BUFSIZE];		/* used for comparing bufs */
+char buf2[BUFSIZE];		/* used for comparing bufs */
+
+int verbose;			/* set if mode is verbose */
+
+main(argc, argv)
+int argc;
+char *argv[];
+{
+  char *p;
+
+  if (argc < 3 || argc > 4) usage();
+  p = argv[1];
+  if (argc == 4) {
+	if (*p == '-' && *(p+1) == 'v') 
+		verbose++;
+	else
+		usage();
+  }
+
+  if (argc == 3)
+	compare(argv[1], argv[2]);
+  else
+	compare(argv[2], argv[3]);
+
+  exit(0);
+}
+
+compare(f1, f2)
+char *f1, *f2;
+{
+/* This is the main comparision routine.  It gets two path names as arguments
+ * and stats them both.  Depending on the results, it calls other routines
+ * to compare directories or files.
+ */
+
+  int type1, type2;
+
+  if (stat(f1, &stat1)  < 0) {
+	printf("Cannot stat %s\n", f1);
+	return;
+  }
+
+  if (stat(f2, &stat2)  < 0) {
+	printf("Missing file: %s\n", f2);
+	return;
+  }
+
+  /* Examine the types of the files. */
+  type1 = stat1.st_mode & S_IFMT;
+  type2 = stat2.st_mode & S_IFMT;
+  if (type1 != type2) {
+	printf("Type diff: %s and %s\n", f1, f2);
+	return;
+  }
+
+  /* The types are the same. */
+  switch(type1) {
+	case S_IFREG:	regular(f1, f2);
+			break;
+
+	case S_IFDIR:	directory(f1, f2);
+			break;
+
+	case S_IFCHR:
+	case S_IFBLK:	break;
+
+	default:	printf("Unknown file type %o\n", type1);
+  }
+  return;
+}
+
+regular(f1, f2)
+char *f1, *f2;
+{
+/* Compare to regular files.  If they are different, complain. */
+
+  int fd1, fd2, n1, n2, i;
+  unsigned bytes;
+  long count;
+  char *p1, *p2;
+
+  if (stat1.st_size != stat2.st_size) {
+	printf("Size diff: %s and %s\n", f1, f2);
+	return;
+  }
+
+  /* The sizes are the same.  We actually have to read the files now. */
+  fd1 = open(f1, 0);
+  if (fd1 < 0) {
+	printf("Cannot open %s for reading\n", f1);
+	return;
+  }
+
+  fd2 = open(f2, 0);
+  if (fd2 < 0) {
+	printf("Cannot open %s for reading\n", f2);
+	return;
+  }
+
+  count = stat1.st_size;
+  while (count > 0L) {
+	bytes = (unsigned) (count > BUFSIZE ? BUFSIZE : count);	/* rd count */
+	n1 = read(fd1, buf1, bytes);
+	n2 = read(fd2, buf2, bytes);
+	if (n1 != n2) {
+		printf("Length diff: %s and %s\n", f1, f2);
+		close(fd1);
+		close(fd2);
+		return;
+	}
+
+	/* Compare the buffers. */
+	i = n1;
+	p1 = buf1;
+	p2 = buf2;
+	while (i--) {
+		if (*p1++ != *p2++) {
+			printf("File diff: %s and %s\n", f1, f2);
+			close(fd1);
+			close(fd2);
+			return;
+		}
+	}
+	count -= n1;
+  }
+  close(fd1);
+  close(fd2);
+}
+
+directory(f1, f2)
+char *f1, *f2;
+{
+/* Recursively compare two directories by reading them and comparing their
+ * contents.  The order of the entries need not be the same.
+ */
+
+  int fd1, fd2, n1, n2, ent1, ent2, i, used1 = 0, used2 = 0;
+  char *dir1buf, *dir2buf;
+  char name1buf[MAXPATH], name2buf[MAXPATH];
+  struct dirstruct *dp1, *dp2;
+  unsigned dir1bytes, dir2bytes;
+  extern char *malloc();
+
+  /* Allocate space to read in the directories */
+  dir1bytes = (unsigned) stat1.st_size;
+  dir1buf = malloc(dir1bytes);
+  if (dir1buf == 0) {
+	printf("Cannot process directory %s: out of memory\n", f1);
+	return;
+  }
+
+  dir2bytes = (unsigned) stat2.st_size;
+  dir2buf = malloc(dir2bytes);
+  if (dir2buf == 0) {
+	printf("Cannot process directory %s: out of memory\n", f2);
+	free(dir1buf);
+	return;
+  }
+
+  /* Read in the directories. */
+  fd1 = open(f1, 0);
+  if (fd1 > 0) n1 = read(fd1, dir1buf, dir1bytes);
+  if (fd1 < 0 || n1 != dir1bytes) {
+	printf("Cannot read directory %s\n", f1);
+	free(dir1buf);
+	free(dir2buf);
+	if (fd1 > 0) close(fd1);
+	return;
+  }
+  close(fd1);
+
+  fd2 = open(f2, 0);
+  if (fd2 > 0) n2 = read(fd2, dir2buf, dir2bytes);
+  if (fd2 < 0 || n2 != dir2bytes) {
+	printf("Cannot read directory %s\n", f2);
+	free(dir1buf);
+	free(dir2buf);
+	close(fd1);
+	if (fd2 > 0) close(fd2);
+	return;
+  }
+  close(fd2);
+
+  /* Linearly search directories */
+  ent1 = dir1bytes/sizeof(struct dirstruct);
+  dp1 = (struct dirstruct *) dir1buf;
+  for (i = 0; i < ent1; i++) {
+	if (dp1->inum != 0) used1++;
+	dp1++;
+  }
+
+  ent2 = dir2bytes/sizeof(struct dirstruct);
+  dp2 = (struct dirstruct *) dir2buf;
+  for (i = 0; i < ent2; i++) {
+	if (dp2->inum != 0) used2++;
+	dp2++;
+  }
+
+  if (verbose) printf("Directory %s: %d entries\n", f1, used1);
+
+  /* Check to see if any entries in dir2 are missing from dir1. */
+  dp1 = (struct dirstruct *) dir1buf;
+  dp2 = (struct dirstruct *) dir2buf;
+  for (i = 0; i < ent2; i++) {
+	if (dp2->inum == 0 || strcmp(dp2->fname, ".") == 0 || 
+		strcmp(dp2->fname, "..") == 0) {
+			dp2++;
+			continue;
+	}
+	check(dp2->fname, dp1, ent1, f1);
+	dp2++;
+  }
+
+  /* Recursively process all the entries in dir1. */
+  dp1 = (struct dirstruct *) dir1buf;
+  for (i = 0; i < ent1; i++) {
+	if (dp1->inum == 0 || strcmp(dp1->fname, ".") == 0 || 
+		strcmp(dp1->fname, "..") == 0) {
+			dp1++;
+			continue;
+	}
+	if (strlen(f1) + DIRENTLEN >= MAXPATH) {
+		printf("Path too long: %s\n", f1);
+		free(dir1buf);
+		free(dir2buf);
+		return;
+	}
+	if (strlen(f2) + DIRENTLEN >= MAXPATH) {
+		printf("Path too long: %s\n", f2);
+		free(dir1buf);
+		free(dir2buf);
+		return;
+	}
+	
+	strcpy(name1buf, f1);
+	strcat(name1buf, "/");
+	strncat(name1buf, dp1->fname, DIRENTLEN);
+	strcpy(name2buf, f2);
+	strcat(name2buf, "/");
+	strncat(name2buf, dp1->fname, DIRENTLEN);
+ 
+	/* Here is the recursive call to process an entry. */
+	compare(name1buf, name2buf);	/* recursive call */
+	dp1++;
+  }
+
+  free(dir1buf);
+  free(dir2buf);
+}
+
+check(s, dp1, ent1, f1)
+char *s;
+struct dirstruct *dp1;
+int ent1;
+char *f1;
+{
+/* See if the file name 's' is present in the directory 'dirbuf'. */
+  int i;
+
+  for (i = 0; i < ent1; i++) {
+	if (strncmp(dp1->fname, s, DIRENTLEN) == 0) return;
+	dp1++;
+  }
+  printf("Missing file: %s/%s\n", f1, s);
+}
+
+usage()
+{
+  printf("Usage: treecmp [-v] dir1 dir2\n");
+  exit(0);
+}
+#! rnews 1196
+Path: alberta!mnetor!uunet!mcvax!prlb2!kulcs!kdv
+From: kdv at kulcs.UUCP (Karel De Vlaminck)
+Newsgroups: comp.text
+Subject: Laserprinters for troff on NCR Tower
+Message-ID: <1066 at kulcs.UUCP>
+Date: 7 Dec 87 19:18:01 GMT
+Reply-To: kdv at kulcs.UUCP ()
+Organization: Katholieke Universiteit Leuven, Dept. Computer Science
+Lines: 22
+
+
+1) We want to connect a laserprinter for use with troff
+on a NCR Tower System. Has anyone experience with this?
+
+2) We will have access to a KYOCERA F-1000 or F-1200 laser printer.
+Does anyone know about the existence of a filter for the
+troff output to the laserprinter (which uses 'Prescribe').
+
+3) This laserprinter also has an HP Laserjet Plus emulation.
+Another solution would then be to use a troff output filter
+for the HP Laserjet.  So I will ask the same question
+about the existence for this filter.
+
+Please mail responses directly to me. If there are usefull
+responses, I will post a summary to the net.
+
+Karel De Vlaminck
+
+                                | K. U. Leuven
+  kdv at kulcs.uucp                | Department of Computer Science
+  or ...!mcvax!prlb2!kulcs!kdv  | Celestijnenlaan 200 A
+  Phone:  +(32) 16-200656 x3565 | B-3030 Leuven (Heverlee), Belgium
+#! rnews 685
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!solaris!wyle
+From: wyle at solaris.ifi.ethz.ch@relay.cs.net (Mitchell Wyle)
+Newsgroups: comp.unix.questions,comp.text
+Subject: Scribe, GML
+Keywords: Generalized Mark-up Languages, Scribe
+Message-ID: <194 at A14A.solaris.ifi.ethz.ch@relay.cs.net>
+Date: 7 Dec 87 17:14:05 GMT
+Organization: SOT sun cluster, ETH Zuerich
+Lines: 7
+Xref: alberta comp.unix.questions:4769 comp.text:1344
+
+Where can I buy Scribe?  Are there other implementations of
+a standard Markup Language on BSD Unix?  What is Scribe?
+
+Please respond via e-mail; if there are enough "me too's,"
+I'll post.
+
+-Mitch Wyle  (wyle at solaris.uucp |  wyle at ethz.uucp  | ...!cernvax!ethz!wyle
+#! rnews 1896
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!simon
+From: simon at its63b.ed.ac.uk (ECSC68 S Brown CS)
+Newsgroups: comp.unix.wizards
+Subject: Re: Setting process groups
+Message-ID: <815 at its63b.ed.ac.uk>
+Date: 7 Dec 87 10:30:32 GMT
+References: <1765 at unc.cs.unc.edu> <910 at mcgill-vision.UUCP> <1261 at saturn.ucsc.edu> <3134 at psuvax1.psu.edu> <2990 at hcr.UUCP>
+Reply-To: simon at lfcs.ed.ac.uk (Simon Brown)
+Organization: LFCS, University of Edinburgh
+Lines: 29
+
+In article <2990 at hcr.UUCP>  writes:
+>Actually SVID setpgrp() has an "extra feature" that Berkeley setpgrp(getpid())
+>does not have - it detaches the process from its controlling terminal.  This
+>does tend to make it "difficult" to create a pipeline attached to your terminal
+>but with its own process group.
+
+Well, you can do that by making each such pipeline belong to it's own SXT
+device, and have all these SXT's multiplexed onto your *real* terminal.
+Instant job-control!
+
+BTW, SVR2 (and 3?) setpgrp() doesn't fully detach a process from its 
+controlling tty if this process has already done a setpgrp() previously
+(as is the case for a login-shell -- this comes from init and getty).
+What it does in this case is to "partially" detach -- so that if you try 
+to set up a new controlling terminal, it's not actually a controlling terminal 
+at all -- things like terminal-generated signals don't get sent to the process.
+Presumably this is just a cretinous bug, and not something more sophisticated.
+
+
+-- 
+--------------------------------------------------
+| Simon Brown                                    |
+| Laboratory for Foundations of Computer Science |
+| Department of Computer Science                 |
+| University of Edinburgh, Scotland, UK.         |
+--------------------------------------------------
+ UUCP:  uunet!mcvax!ukc!lfcs!simon
+ ARPA:  simon%lfcs.ed at nss.cs.ucl.ac.uk      "Life's like that, you know"
+ JANET: simon at uk.ac.ed.lfcs
+#! rnews 1126
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!adrian
+From: adrian at cs.hw.ac.uk (Adrian Hurt)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: NCC, USS, Klingons, etc...
+Summary: She was a Klingon
+Message-ID: <1568 at brahma.cs.hw.ac.uk>
+Date: 7 Dec 87 10:33:54 GMT
+References: <8712011928.AA04370 at topaz.rutgers.edu> <1632 at bsu-cs.UUCP> <19321 at teknowledge-vaxc.ARPA>
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 15
+
+In article <19321 at teknowledge-vaxc.ARPA>, hshiffma at teknowledge-vaxc.ARPA (Hank Shiffman) writes:
+> 
+> Why do you think she was a Klingon?  As I recall, she looked human.
+> You weren't assuming that she was a Klingon just because she had
+> something going with the Christoper Lloyd character, were you?  For
+> shame!
+
+In the book of the film, Valkris was definitely a Klingon, out to do something
+valiant to redeem her family's honour. She became very friendly with another
+alien on board that ship because of that alien's warrior traditions.
+-- 
+ "Keyboard? Tis quaint!" - M. Scott
+
+ Adrian Hurt			     |	JANET:  adrian at uk.ac.hw.cs
+ UUCP: ..!ukc!cs.hw.ac.uk!adrian     |  ARPA:   adrian at cs.hw.ac.uk
+#! rnews 1332
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!adrian
+From: adrian at cs.hw.ac.uk (Adrian Hurt)
+Newsgroups: rec.games.frp
+Subject: Re: Star Wars:  the RPG
+Summary: Pictures
+Message-ID: <1569 at brahma.cs.hw.ac.uk>
+Date: 7 Dec 87 10:42:12 GMT
+References: <1570 at cup.portal.com> <13450021 at acf4.UUCP> <1676 at cup.portal.com> <1799 at cup.portal.com>
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 21
+
+In article <1799 at cup.portal.com>, Nightstalker at cup.portal.com writes:
+> 
+> Hi!  Does anyone know if the force skills can be learned by any PC like
+> a smuggler or outlaw for example, or can they only be taught to the
+> jedi classes and NPCs?  Thank you.
+>    Jason Wallace
+> 
+
+Any character may learn the Force skills from a master, and the rulebook even
+encourages players using the Jedi characters to do some teaching, provided that
+the pupil hasn't got any Dark Side points. Remember, Luke Skywalker was a
+"Brash Pilot" type until Obi-Wan (OB1? :-) got to him.
+
+Now for my question. There are some really nice pictures in the rulebook. Can I
+get separate copies of these? They would be great posters, especially the
+Imperial Navy recruiting poster and the R2 advert.
+-- 
+ "Keyboard? Tis quaint!" - M. Scott
+
+ Adrian Hurt			     |	JANET:  adrian at uk.ac.hw.cs
+ UUCP: ..!ukc!cs.hw.ac.uk!adrian     |  ARPA:   adrian at cs.hw.ac.uk
+#! rnews 1047
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!bob
+From: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Klingon females
+Message-ID: <816 at its63b.ed.ac.uk>
+Date: 7 Dec 87 12:36:36 GMT
+References: <8712042225.AA03829 at topaz.rutgers.edu> <3490 at hoptoad.uucp>
+Reply-To: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 13
+
+In article <3490 at hoptoad.uucp> tim at hoptoad.UUCP (Tim Maroney) writes:
+>I like the fact that the Klingons are portrayed as sexist scumbags, but it
+>disturbs me that all major sentient races except humans and Romulans put
+>women in a subservient role (Klingons, Vulcans, Ferrengi).  It almost seems
+>as if we are being told that female subservience is part of the natural
+>order of sentience.  There are no major female-dominated sentient races, two
+>semi-egalitarian races, and three male-dominated races, a clear imbalance in
+>favor of male dominance.
+
+Then who was T'pau supposed to be?
+
+She was vulcan, and very obviously in charge of things.
+	Bob.
+#! rnews 1313
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!bob
+From: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Max Headroom
+Message-ID: <817 at its63b.ed.ac.uk>
+Date: 7 Dec 87 13:10:09 GMT
+References: <82*quale at si.uninett> <3333 at ihlpl.ATT.COM>
+Reply-To: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Distribution: rec.arts.sf-lovers
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 18
+
+In article <3333 at ihlpl.ATT.COM> barth at ihlpl.UUCP (BARTH RICHARDS) writes:
+>The problem is that the first few episodes were *re*made by an American
+>production company for broadcast on ABC (not the Australian ABC).  As I
+>understand it, the first ABC run of six shows (winter/spring of 1987) were
+>all reworkings of episodes already done by the British.  The second run
+>(fall 1987) were stories newly developed by the American producers.
+
+Sorry, there was only ever one original Max Headroom
+programme. That was a one-off TV film made by the BBC.
+Any episodes beyond the original story did not originate
+with the BBC, although Maxs' creators may have been involved.
+
+Max then re-appeared on Channel 4 as host of a chat show for two
+short seasons. (interviewing guest stars about their views
+on Golf, music, life and, most importantly, Golf :->)
+
+He then crossed the atlantic to be re-made by ABC.
+	Bob.
+#! rnews 1152
+Path: alberta!mnetor!uunet!mcvax!ukc!warwick!jeff
+From: jeff at warwick.UUCP (Jeff Smith)
+Newsgroups: comp.lang.c++
+Subject: cfront runs too fast (and fix)
+Keywords: cfront fix
+Message-ID: <586 at ubu.warwick.UUCP>
+Date: 7 Dec 87 14:49:10 GMT
+Organization: Computer Science, Warwick University, UK
+Lines: 27
+
+If you can persuade cfront to finish in less than a second with the
++S option on, then the calculation of the number of lines processed
+per second generates a divide-by-zero! On a SUN-3 with 1.2.1,
+typing
+        cfront +S </dev/null
+will demonstrate the problem.
+
+Fix main.c thus:
+
+		fprintf(stderr,"real time delay %ld: %d lines per second\n",
+#ifdef	CFRONTTOOFASTFIX
+			stop_time-start_time,
+			stop_time-start_time > 0 ?
+				Nline/(stop_time-start_time) : Nline);
+#else	!CFRONTTOOFASTFIX
+			stop_time-start_time, Nline/(stop_time-start_time) );
+#endif	CFRONTTOOFASTFIX
+		fflush(stderr);
+
+
+Jeff
+warwick!jeff
+
+PS. Does anyone have a fix to simpl.c for the null dereference
+on Pfct f = Pfct(Pptr(q->tp)->typ) caused by the pointer to member function
+problem? The problem's been noted a couple of times in comp.lang.c++, by
+Paul Calder and others..
+#! rnews 1114
+Path: alberta!mnetor!uunet!mcvax!ukc!warwick!strgh
+From: strgh at daisy.warwick.ac.uk (J E H Shaw)
+Newsgroups: rec.music.misc
+Subject: Re: More than Yes (really Egg)
+Message-ID: <357 at daisy.warwick.ac.uk>
+Date: 7 Dec 87 17:57:56 GMT
+References: <22034 at ucbvax.BERKELEY.EDU> <19826 at yale-celray.yale.UUCP>
+Reply-To: strgh at daisy.warwick.ac.uk (J E H Shaw)
+Organization: Computing Services, Warwick University, UK
+Lines: 14
+
+----------
+Egg released at least one other album before `Civil Surface', I think it
+was called `the Polite Force'.  They were very good.
+
+Their drummer (Clive Brooks?) joined the Groundhogs.
+Their bassist (Mont Campbell?) played sometimes with some of the other
+  Canterbury scene people: National Health, U.K. or similar (mid 70's).
+Their organist, Dave Stewart, became a pop star (`It's My Party'), and
+  also played with National Health, Hatfield & the North, etc.
+
+Apologies for any wrong names - the above is all based on memory.
+-- 
+J.E.H.Shaw  Department of Statistics, University of Warwick, Coventry CV4 7AL
+$$\times\times\qquad\top\gamma\alpha\omega\exists\qquad{\odot\odot\atop\smile}$$
+#! rnews 1231
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!icdoc!qmc-cs!nickd
+From: nickd at cs.qmc.ac.uk (Nick Dunlavey)
+Newsgroups: comp.cog-eng
+Subject: Touch-screen research
+Message-ID: <348 at sequent.cs.qmc.ac.uk>
+Date: 4 Dec 87 10:52:55 GMT
+References: <19 at gollum.Columbia.NCR.COM> <290 at rd1632.Dayton.NCR.COM>
+Reply-To: nickd at qmc.ac.uk (Nick Dunlavey)
+Organization: Sch Of C+IT, Thames Polytechnic, Woolwich, London, UK
+Lines: 19
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+Distribution:
+
+Keywords:
+
+
+I know that the CEGB (for those outside the UK, this is the
+UK's Central Electricity Generating Board) has done some work
+on this in the Scientific Services Department in its
+North-eastern Region.  A report was produced called:
+
+"A Touch-Sensitive Screen As An Interface For On-Line Control",
+by Sutherland, Pringle and Carlin.
+
+It documents the use of an upgraded VT103 in a power station
+for operator control.
+-- 
+-------------
+Nick Dunlavey                 ARPA: nickd at cs.qmc.ac.uk    (gw: cs.ucl.edu)
+School Of Computing & IT      UUCP: nickd at qmc-cs.UUCP
+Thames Polytechnic            Tel:  01-854 2030 Ext 339
+Wellington Street
+Woolwich                      Thanks to Queen Mary College for
+LONDON                        net access
+SE18 6PF
+#! rnews 1563
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!adrian
+From: adrian at cs.hw.ac.uk (Adrian Hurt)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: ST:TNG posters
+Summary: Tolerance, please
+Message-ID: <1570 at brahma.cs.hw.ac.uk>
+Date: 7 Dec 87 13:24:11 GMT
+References: <5226 at zen.berkeley.edu>
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 27
+
+In article <5226 at zen.berkeley.edu>, iverson at cory.Berkeley.EDU (Tim Iverson) writes:
+> 
+> ...			Not only that, but these article made no mention of
+> ST:TNG in the subject line or header, so I couldn't kill them easily.
+> 
+> ...					The simple fact is that there is
+> newsgroup for all of you to communicate in, and if the rest of us wanted to
+> listen, then we would.
+> 
+ 
+Oh no, not again. Remember last time, when the number of articles complaining
+about ST articles outnumbered the articles concerned (and every other single
+type of article as well)?
+
+There is a ST group, but not for "all of us". Some of us can't get at it. But
+your point about headers is valid. In the interests of preventing Flame War III
+I suggest that those of us who wish to put ST (and Dr. Who, etc) articles here
+make sure that "ST" (or Dr. Who, etc) or some similar warning appears in the
+header. And those who wish to complain about such postings should also always
+put some clear warning in the header, so those of us who aren't interested can
+kill their articles easily.
+
+-- 
+ "Keyboard? Tis quaint!" - M. Scott
+
+ Adrian Hurt			     |	JANET:  adrian at uk.ac.hw.cs
+ UUCP: ..!ukc!cs.hw.ac.uk!adrian     |  ARPA:   adrian at cs.hw.ac.uk
+#! rnews 782
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: comp.os.misc
+Subject: incorporating processes into file systems
+Message-ID: <1572 at brahma.cs.hw.ac.uk>
+Date: 7 Dec 87 20:36:40 GMT
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 9
+
+I believe there has been at least one OS that manages the naming of
+processes and files in the same way - so 'ps' would become yet another
+option to 'ls'. I forget which. Can anyone enlighten me? References?
+
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 1538
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: sci.physics,rec.games.programmer,comp.sys.mac
+Subject: simulating relativistic motion
+Keywords: relativity, graphics, flight simulators
+Message-ID: <1573 at brahma.cs.hw.ac.uk>
+Date: 7 Dec 87 21:00:08 GMT
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 18
+Xref: alberta sci.physics:2410 rec.games.programmer:44 comp.sys.mac:10006
+
+A long time ago I read about a program developed at MIT that produced
+images of the way ordinary scenes (a street) would look at speeds nearing
+c. I don't know if it used a plotter or calligraphic display, but it was
+so long ago that whatever it did should surely be possible now in real time
+on a Mac or equivalent. Does anything like that exist? - a sort of flight
+simulator for cosmic ray particles, that would let you define a scene
+with a 3D graphics editor and then look at it at various fractions of c.
+(Colour would be a nice optional extra). The MIT program produced weirdly
+drooping lampposts.
+More ambitiously: what about general relativity? Here I am thinking about
+some of the descriptions in Kaufmann's "The Cosmic Frontiers of General
+Relativity" about how the world would look from near a black hole.
+
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 737
+Path: alberta!mnetor!uunet!mcvax!enea!kuling!nicke
+From: nicke at kuling.UUCP (Niclas Holm)
+Newsgroups: comp.lang.c++
+Subject: Anyone ported c++ to UNISYS 50xx ?
+Message-ID: <569 at kuling.UUCP>
+Date: 6 Dec 87 16:33:36 GMT
+Reply-To: nicke at kuling.UUCP (Niclas Holm)
+Organization: Dept. of Computer Systems, Uppsala University, Sweden
+Lines: 7
+
+I am interested in running c++ on a UNISYS 50xx (read NCR Tower ..).
+Has someone successfully ported it, or need I do it myself ?
+
+-- 
+ Niclas F. Holm    |  UUCP:  nicke at kuling ({seismo!mcvax}!enea!kuling!nicke)
+ Idrottsg. 21 II   |   or    nicke at umecs  ({seismo!mcvax}!enea!umecs!nicke) 
+ S-753 35 Uppsala  |  Phone: +46 - 18 13 36
+ SWEDEN            |            Famous Last Words: Look, no hands!
+#! rnews 1584
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!datlog!slxsys!jpp
+From: jpp at slxsys.specialix.co.uk (John Pettitt)
+Newsgroups: comp.sys.ibm.pc
+Subject: Re: anyone have info on "multilink"?
+Summary: Get it from: TSL, Atlanta Ga.
+Keywords: remote modem multilink
+Message-ID: <108 at slxsys.specialix.co.uk>
+Date: 7 Dec 87 20:01:09 GMT
+References: <167 at iisat.UUCP>
+Reply-To: jpp at slxsys.UUCP (John Pettitt)
+Organization: Specialix International, London, UK.
+Lines: 31
+
+In article <167 at iisat.UUCP> iis at iisat.UUCP (Paul Gauthier) writes:
+>i am trying to locate information on a program called mutlilink. i have
+>heard that it permits one to run software on an ibm from a remote (dumb)
+>terminal. is this correct? does anyone know of other software that will
+>accomplish the same? any and all help would be appreciated. thank you.
+
+Multilink will allow several serial screens to run dos programs.
+
+More info from:
+	The Software Link
+	3577 Parkway Lane
+	Atlanta  GA 30092
+	(404) 448 5465
+
+They also have a product call PC-MOS that does the same thing on
+386 boxes.  
+
+Other software that lets you run multi user dos includes QNX,
+Concurrent DOS (from Digital Research - remember CP/M :-),
+Xenix (vp/ix comming soon), Unix V (ISC and Microport, with
+vp/ix and locus merge respectivly).
+
+Disclaimer: I don't sell any of the above - just write serial
+driver's for them - not easy in some cases :-(
+	
+
+
+-- 
+John Pettitt - 144.5 MHz: G6KCQ, CIX: jpettitt,  Voice: +44 1 398 9422
+UUCP:  ...uunet!mcvax!ukc!pyrltd!slxsys!jpp  (jpp at slxsys.specialix.co.uk)
+Disclaimer: I don't even own a cat to share my views !
+#! rnews 1792
+Path: alberta!mnetor!uunet!mcvax!targon!wim
+From: wim at targon.UUCP (Wim C. J. van Eerdt)
+Newsgroups: comp.lang.c++
+Subject: Bug bug? solved (?)
+Keywords: inline local variables
+Message-ID: <367 at targon.UUCP>
+Date: 8 Dec 87 09:22:14 GMT
+Reply-To: wim at targon.UUCP (Wim C. J. van Eerdt)
+Organization: Nixdorf Computer BV., OSP, P.O. Box 29,Vianen, The Netherlands
+Lines: 34
+
+As long as the department does not have an uucp-feed,
+you can e-mail me, the poster.
+Success!
+
+	Wim van Eerdt                   E-mail: mcvax!targon!wim
+	OSP, Nixdorf Computer Bv, Postbus 29, 4130 EA Vianen
+	Nederland. Tel.: +31 3473 62211.
+
+----------------News article got:-------------------------------------
+Author: Gerard van Dorth
+Subject:  Bug bug? solved (?)
+Keywords: inline local variables
+
+> ... Redeclaration of "_au2__Xt_val_global"
+
+The conditional statement on the lines 161/162 "if ( base == BLOCK  &&
+	n->lex_level < ( (Pfct(expand_fn->tp)->memof) ? 3 : 2 ) )"
+in file expand.c has to be changed in:
+"if (  base == BLOCK && n->lex_level < 'function-defined-in-class' ? 3 : 2  )".
+
+For a function defined in a class the lex_level is raised by the curly brace
+of the class itself. Not only member functions (memof = member of) can be
+defined inline, friends can also.
+(Note that funny declarations of local variables did appear in case a member
+function which needs locals is declared inline but not defined in the class
+itself).
+
+The most simple way to tell whether a function is defined in a class is the
+use of a global variable (the more globals the more fun), set and reset 
+(embracing the first loop) in the routine classdef::simpl() in file simpl.c
+-- 
+	Wim van Eerdt                   E-mail: mcvax!targon!wim
+	OSP, Nixdorf Computer Bv, Postbus 29, 4130 EA Vianen
+	Nederland. Tel.: +31 3473 62211.
+#! rnews 1196
+Path: alberta!mnetor!uunet!mcvax!unido!infbs!hild
+From: hild at infbs
+Newsgroups: rec.music.classical
+Subject: Re: K. u. K. - (nf)
+Message-ID: <24200003 at infbs.UUCP>
+Date: 7 Dec 87 10:26:00 GMT
+References: <19123 at amdahl.UUCP>
+Lines: 17
+Nf-ID: #R:amdahl:19123:infbs:24200003:000:873
+Nf-From: infbs!hild    Dec  7 11:26:00 1987
+
+This is only partly true.
+
+"K.u.K." is short for "Kaiserlich und Koeniglich", that's right.
+But it has nothing to do with the king of prussia.
+
+At the time "K.u.K." was used, the king of Austria was also the
+king of Hungary and the emperor of "Oestreich-Ungarn" (Austria and
+Hungary. When thinking of K.u.K., I have the picture of
+Kaiser Franz Josef, a fatherly man who kept his nation in a long
+period of prosperous (sp?) peace, especially good for the arts.
+
+BTW, Otto von Bismarck is remembered as a man who united Germany
+(with an iron hand, that's true), which at that time was divided
+into many small parts, all of them having a duke, different legislation
+and borders between them. This meant having to pay customs very often,
+thus disallowing free trade, which in turn was necessary for the
+upcoming industrial revolution. So you might regard OvB a good statesman.
+#! rnews 1564
+Path: alberta!mnetor!uunet!mcvax!nikhefh!t68
+From: t68 at nikhefh.UUCP (Jos Vermaseren)
+Newsgroups: comp.sys.atari.st
+Subject: Re: FOLDERXXXXX
+Summary: FOLDRXXX may not do the job either.
+Message-ID: <410 at nikhefh.UUCP>
+Date: 8 Dec 87 10:44:50 GMT
+References: <637 at aucs.UUCP>
+Organization: Nikhef-H, Amsterdam (the Netherlands).
+Lines: 22
+
+In article <637 at aucs.UUCP>, 870646c at aucs.UUCP (barry comer) writes:
+> After I posted my message about the GEMBOOT prg. not working properly, I
+> received a message stating that GEMBOOT will not work properly with the new ROMS,well he also stated that there is a prg. call something like "FOLDRXXX.TOS",
+> will this prg. work with the new ROMS? If it will do the trick could someone
+> that has it please sent it to me in a reply msg. PLEASE do not send it via
+> the binaries section I will never get it. 
+> Thanx in advance
+> Barry
+
+FOLDRXXX starts up with a little table of ROM versions and corresponding
+to each version an address. At that address it inserts a list of memory
+pieces to be used. If you use new ROM's these addresses have been changed
+so you cannot use FOLDRXXX unless you figure out the new address you need
+and substitute the necessary information into the binary of FOLDRXXX ( or
+a disassembly ). On the other hand: the new version of the ROMs for the
+Mega has a much larger OSpool from which these memory blocks are taken.
+It used to be 6000 bytes, but the new size is 16000 bytes. I don't know
+whether this makes FOLDRXXX superfluous. Maybe Allan Pratt can comment
+on that.
+
+Jos Vermaseren
+T68 at nikhefh.uucp
+#! rnews 793
+Path: alberta!mnetor!uunet!mcvax!nikhefk!marcel
+From: marcel at nikhefk.UUCP (Marcel Corbeek)
+Newsgroups: rec.music.classical
+Subject: Question
+Message-ID: <291 at nikhefk.UUCP>
+Date: 8 Dec 87 11:19:26 GMT
+Reply-To: marcel at nikhefk.UUCP (Marcel Corbeek)
+Organization: Nikhef-K, Amsterdam (the Netherlands).
+Lines: 15
+
+In the film "Once upon a time in America" an ouverture of Rossini is played.
+Is there anyone who can tell me which one this is ?
+
+Marcel Corbeek,			Arpanet : marcel at nikhefk.uucp
+NIKHEF-K, Amsterdam.		Bitnet  : v59u0002 at hasara11.bitnet
+Home address :
+Aletta Jacobsstraat 48,
+1628 NP Hoorn,
+The Netherlands.
+Marcel Corbeek,			Arpanet : marcel at nikhefk.uucp
+NIKHEF-K, Amsterdam.		Bitnet  : v59u0002 at hasara11.bitnet
+Home address :
+Aletta Jacobsstraat 48,
+1628 NP Hoorn,
+The Netherlands.
+#! rnews 2545
+Path: alberta!mnetor!uunet!mcvax!prlb2!ronse
+From: ronse at prlb2.UUCP (Christian Ronse)
+Newsgroups: sci.math
+Subject: Re: Putnam Exam (SPOILER)
+Summary: another proof for the x<25 solution
+Keywords: Putnam
+Message-ID: <388 at prlb2.UUCP>
+Date: 8 Dec 87 10:03:24 GMT
+References: <16863 at topaz.rutgers.edu> <16864 at topaz.rutgers.edu> <3482 at husc6.harvard.edu>
+Organization: Philips Research Laboratory, Brussels
+Lines: 69
+
+In article <3482 at husc6.harvard.edu>, elkies at huma1.HARVARD.EDU (Noam Elkies) writes:
+< [Problem A-6 of the 48th Annual W.L.Putnam Contest, Dec. 5, 1987: ]
+< >> For each positive integer n, let a(n) be the number of zeros in the
+< >> base 3 representation of n.  For which positive real numbers x does
+< >> the series
+< >> 
+< >> 			 inf
+< >> 			-----	x^a(n)
+< >> 			\	------
+< >> 			/	 n^3
+< >> 			-----
+< >> 			n = 1
+< >> 
+< >> converge?
+
+> Actually the correct interval of convergence is x<25.  Indeed, in the 
+> partial sum corresponding to 3^k<=n<3^(k+1), the coefficients n^(-3) are
+> within a factor of 27 of 27^(-k), and the sum of x^a(n) is easily seen to
+> be 2(x+2)^k, so by comparison with the geometric series sum(r^k,k,0,inf)
+> with r=(x+2)/27 we find that the series converges if and only if r<1,
+> i.e. x<25.
+
+This is correct, but the way the proof is written is not easy to understand. I
+give below another proof.
+
+For n>0 let
+
+T(n) = x^a(n)/n^3	and 	U(n) = T(3n) + T(3n+1) + T(3n+2)
+
+and for k>=0 let
+
+Z(k) = sum {n=3^k to 3^(k+1)-1} T(n)
+
+We have
+
+Z(k+1)	= sum {n=3^(k+1) to 3^(k+2)-1} T(n)
+	= sum {n=3^k to 3^(k+1)-1} [T(3n) + T(3n+1) + T(3n+2)]
+	= sum {n=3^k to 3^(k+1)-1} U(n)
+
+Let us compare U(n) to T(n). We have a(3n)=a(n)+1 and a(3n+1)=a(3n+2)=a(n).
+Thus
+
+U(n) = x^[a(n)+1]/(3n)^3 + x^a(n)/(3n+1)^3 + x^a(n)/(3n+2)^3
+
+and so U(n) has as upper bound
+
+x^a(n) * (x+2)/(3n)^3 = T(n) * (x+2)/27
+
+and as lower bound
+
+x^a(n) * (x+2)/(3n+2)^3 = T(n) * (x+2)/(3+2/n)^3
+
+in other words U(n) = T(n) * (x+2)/(27+e(n)), where e(n)<(3+2/n)^3-27 tends to
+0 when n tends to infinity. It follows then that
+
+Z(k+1)= Z(k)*(x+2)/(27+f(k))
+
+where f(k)<(3+2/3^k)^3-27 tends to 0 for n tending to infinity.
+
+Now the series is the sum of all Z(k). Thus for x>25 we have Z(k+1)>Z(k) for k
+large enough, and the series diverges; for x<25 we have Z(k+1)< r * Z(k) (with
+r=(x+2)/27<1) for every k, and the series converges. For x=25 the series
+diverges too (I think so), because Z(k+1)/Z(k) tends to 1 for k tending to
+infinity.
+
+Christian Ronse		maldoror at prlb2.UUCP
+{uunet|philabs|mcvax|...}!prlb2!{maldoror|ronse}
+
+		Time is Mona Lisa
+#! rnews 1248
+Path: alberta!mnetor!uunet!mcvax!botter!star!sater
+From: sater at cs.vu.nl (Hans van Staveren)
+Newsgroups: comp.dcom.lans,comp.sys.ibm.pc
+Subject: Need info on hardware Western Digital EtherCard PLUS
+Keywords: moron suppliers, Ethernet, IBM PC's
+Message-ID: <608 at sater.cs.vu.nl>
+Date: 8 Dec 87 14:11:10 GMT
+Organization: V.U. Informatica, Amsterdam, the Netherlands
+Lines: 18
+Xref: alberta comp.dcom.lans:906 comp.sys.ibm.pc:9572
+
+We recently acquired some Western Digital EtherCard PLUS cards for IBM PC's.
+We were planning to write MINIX drivers for them and we wanted the hardware
+documentation from the supplier. We were indeed promised that.
+However, as one might expect, we only got the documentation that stated
+where to plug in the cable, and we are more interested in which IO-ports there
+are, and what they do. Our supplier is not very helpful at the moment.
+
+We will continue to nag our supplier, but in the meantime, does anyone have
+the hardware info on this board?
+We know there is a NatSemi DP8390 on there, and we have the datasheet on that
+one, but there should also be an Ethernet Address Rom, plus some other things
+on the board.
+
+As they say, thanks in advance.
+
+				Hans van Staveren
+				Vrije Universiteit
+				Amsterdam, Holland
+#! rnews 742
+Path: alberta!mnetor!uunet!mcvax!nikhefk!marcel
+From: marcel at nikhefk.UUCP (Marcel Corbeek)
+Newsgroups: rec.music.synth
+Subject: Question
+Message-ID: <292 at nikhefk.UUCP>
+Date: 8 Dec 87 15:59:15 GMT
+Reply-To: marcel at nikhefk.UUCP (Marcel Corbeek)
+Organization: Nikhef-K, Amsterdam (the Netherlands).
+Lines: 15
+
+Is there anybody who can give me some information about the WERSI
+stageperformer?
+
+Marcel Corbeek,			Arpanet : marcel at nikhefk.uucp
+NIKHEF-K, Amsterdam.		Bitnet  : v59u0002 at hasara11.bitnet
+Home address :
+Aletta Jacobsstraat 48,
+1628 NP Hoorn,
+The Netherlands.
+Marcel Corbeek,			Arpanet : marcel at nikhefk.uucp
+NIKHEF-K, Amsterdam.		Bitnet  : v59u0002 at hasara11.bitnet
+Home address :
+Aletta Jacobsstraat 48,
+1628 NP Hoorn,
+The Netherlands.
+#! rnews 1193
+Path: alberta!mnetor!uunet!mcvax!targon!wim
+From: wim at targon.UUCP (Wim C. J. van Eerdt)
+Newsgroups: comp.lang.c++
+Subject: Another C++ problem, solved (?)
+Message-ID: <368 at targon.UUCP>
+Date: 8 Dec 87 15:33:45 GMT
+Reply-To: wim at targon.UUCP (Wim C. J. van Eerdt)
+Organization: Nixdorf Computer BV., OSP, P.O. Box 29,Vianen, The Netherlands
+Lines: 27
+
+I did get yet another file from my colleague Gerard.
+As in other articles stated send he is not reachable by e-mail.
+I shall forward your mail!
+Success and have fun!
+
+		Wim
+--------Fix---------------------------------------------------------
+Author: Gerard van Dorth
+Subject:  Another C++ problem, solved (?)
+
+> Yet another crazy C++ problem
+> ...
+> The below code is a generalization of a problem we are seeing with C++
+> ...
+
+Substitute the line
+		Pfct f = Pfct(Pptr(q->tp)->typ);
+in routine call::simpl of the file simpl.c by
+		Ptype pt = q->tp;
+		while (pt->base == TYPE) pt = Pbase(pt)->b_name->tp;
+		Pfct f = Pfct(Pptr(pt)->typ);	// for basic type only.
+
+(Simpl(e) turns out to be hard).
+-- 
+	Wim van Eerdt                   E-mail: mcvax!targon!wim
+	OSP, Nixdorf Computer Bv, Postbus 29, 4130 EA Vianen
+	Nederland. Tel.: +31 3473 62211.
+#! rnews 1046
+Path: alberta!mnetor!uunet!mcvax!cogpsi!tom
+From: tom at cogpsi.UUCP (Tom Vijlbrief)
+Newsgroups: comp.unix.wizards
+Subject: Re: Unattended dumps (BSD4.3)
+Message-ID: <327 at cogpsi.UUCP>
+Date: 8 Dec 87 15:51:57 GMT
+References: <9032 at santra.UUCP>
+Reply-To: tom at cogpsi.UUCP (Tom Vijlbrief)
+Organization: TNO Institute for Perception, Soesterberg, The Netherlands
+Lines: 21
+
+In article <9032 at santra.UUCP> nispa at hutcs.hut.fi (Tapani Lindgren) writes:
+>Can yes(1) somehow be piped to a program that reads /dev/tty?
+>Could dump(8) be modified to abort at errors without any questions?
+
+If you want dump to read the output from e.g. yes(1)
+then you'll have to use a pty(4).
+
+You should arrange that this pty is the control terminal of the
+dump program and then write (redirect) the output of yes(1) to the pty.
+
+Setting the control terminal of dump is done by writing a program which:
+
+A) Removes the association with its control terminal by:
+
+   ioctl(f, TIOCNOTTY, 0);
+
+B) Opens the pty.
+
+C) Exec's the dump program.
+
+The above applies to Berkeley Unix 4.X
+#! rnews 1034
+Path: alberta!mnetor!uunet!mcvax!botter!ark!maart
+From: maart at cs.vu.nl (Maarten Litmaath)
+Newsgroups: comp.unix.wizards
+Subject: Re: Emacs csh alias -- better solution than the first posted (2)
+Summary: this time really faster
+Keywords: this time really faster
+Message-ID: <1160 at ark.cs.vu.nl>
+Date: 8 Dec 87 16:55:49 GMT
+References: <brl-adm.10672> <1508 at ogcvax.UUCP> <1159 at ark.cs.vu.nl>
+Reply-To: maart at cs.vu.nl (Maarten Litmaath)
+Organization: VU Informatica, Amsterdam
+Lines: 17
+
+Of course the alias had to be:
+
+alias emacs \
+'jobs > /tmp/jobs; grep emacs /tmp/jobs > /dev/null && fg %?emacs || /bin/emacs'
+                                                           ^         ^^^^^
+                                                           !         !!!!!
+or
+
+      !!
+      vv
+alias em \
+'jobs > /tmp/jobs; grep emacs /tmp/jobs > /dev/null && fg %emacs || emacs'
+
+Sorry.
+-- 
+Time flies like an arrow, fruit flies |Maarten Litmaath @ Free U Amsterdam:
+like an orange.      (seen elsewhere) |maart at cs.vu.nl, mcvax!botter!ark!maart
+#! rnews 691
+Path: alberta!mnetor!uunet!mcvax!botter!ark!maart
+From: maart at cs.vu.nl (Maarten Litmaath)
+Newsgroups: comp.unix.wizards
+Subject: Re: Emacs csh alias -- better solution than the first posted
+Summary: faster
+Keywords: faster
+Message-ID: <1159 at ark.cs.vu.nl>
+Date: 8 Dec 87 15:41:32 GMT
+References: <brl-adm.10672> <1508 at ogcvax.UUCP>
+Reply-To: maart at cs.vu.nl (Maarten Litmaath)
+Organization: VU Informatica, Amsterdam
+Lines: 7
+
+alias emacs \
+'jobs > /tmp/jobs; grep emacs /tmp/jobs > /dev/null && fg %emacs || emacs'
+
+BTW, long live vi!
+-- 
+Time flies like an arrow, fruit flies |Maarten Litmaath @ Free U Amsterdam:
+like an orange.      (seen elsewhere) |maart at cs.vu.nl, mcvax!botter!ark!maart
+#! rnews 987
+Path: alberta!mnetor!uunet!mcvax!mhres!jv
+From: jv at mhres.mh.nl (Johan Vromans)
+Newsgroups: comp.unix.questions
+Subject: Re: UCB 2.9 LISP goes illegal
+Summary: sysmac.sml? RT-11
+Message-ID: <1498 at mhres.mh.nl>
+Date: 8 Dec 87 21:16:13 GMT
+References: <10712 at brl-adm.ARPA>
+Organization: Multihouse N.V., The Netherlands
+Lines: 12
+
+In article <10712 at brl-adm.ARPA> PAAAAAR%CALSTATE.BITNET at CUNYVM.CUNY.EDU writes:
+>We are trying to make LISP run on an 11/24 (yes they still exist)
+>What is sysmac.sml, for instance?
+
+That reminds me to the goold old days, when PDP-11's ran only RSX,
+RT-11 or RSTS. Sysmac.sml is a macro library, which contains the definitions
+for the RT-11 "Programmed Requests" (nowadays known as system calls).
+Don't think it's equivalent exists on Unix ...
+-- 
+Johan Vromans                              | jv at mh.nl via European backbone
+Multihouse N.V., Gouda, the Netherlands    | uucp: ..{uunet!}mcvax!mh.nl!jv
+"It is better to light a candle than to curse the darkness"
+#! rnews 6100
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!srp
+From: srp at ethz.UUCP (Scott Presnell)
+Newsgroups: rec.games.hack,comp.sources.d
+Subject: Re: Compilation of Nethack 2.2
+Keywords: AAARGH.
+Message-ID: <262 at bernina.UUCP>
+Date: 8 Dec 87 06:13:59 GMT
+References: <9714 at shemp.UCLA.EDU>
+Reply-To: srp at bernina.UUCP (Scott Presnell)
+Organization: Chem. Dept., Swiss Federal Inst. of Tech. (ETH-Zurich)
+Lines: 211
+Xref: alberta rec.games.hack:1746 comp.sources.d:1578
+
+In article <9714 at shemp.UCLA.EDU> claus at CS.UCLA.EDU (Claus Giloi) writes:
+
+>I just downloaded Nethack 2.2 from the net and compiled it on my AT
+>at home.
+>There were only a few small problems, then it came to linking the 
+>monster. An executable was produced, but I get a "Stack Overflow" 
+>error when I try to run the 350K executable, and changing the
+>value of (STACK:) to outlandish figures (8000, 3fff) didn't change
+>that. Someone out there must have gotten it to run, please tell me
+>what value you used to link it. (I am using MSC 4.0)
+
+Here's the makefile that I used to get Nethack up under MSC 4.0... NB: the
+CFLAGS macro and the link command.  I was able to play a couple of levels
+without stack errors or hangups, however there are some problems,
+(everything seems to be identified, inventory not displayed correctly,
+color not quite right (but overall it works)) so i did not "install" it.
+
+"good luck, jim"
+
+Scott Presnell 						Organic Chemistry
+Swiss Federal Institute of Technology  (ETH-Zentrum)
+CH-8092 Zurich, Switzerland.
+uucp:seismo!mcvax!cernvax!ethz!srp (srp at ethz.uucp); bitnet:Benner at CZHETH5A
+
+
+
+#	SCCS Id: @(#)Makefile.pc	2.2	87/11/11
+# 	Makefile for NetHack (PC) version 1.0 written using
+#	Microsoft(tm) "C" v3.0 or better.
+# 
+# Large memory model, register bug, remove stack probes:
+WIZARD=
+V = 22
+#CFLAGS = -A$(MODEL) -DREGBUG -DLINT_ARGS -DVER=$V $(WIZARD) -Ot -Gs -Gt100
+CFLAGS = -nologo -A$(MODEL) -DLINT_ARGS -DVER=$V -Ox -Gt10
+CC = cl
+LIBS =
+LFLAGS =
+MODEL = L
+SETARGV = #$(LIB)\$(MODEL)SETARGV
+.SUFFIXES: .exe .obj .c
+.c.obj:; cl $(CFLAGS) -c $*.c
+.c.exe:;
+    cl $(CFLAGS) -c $*.c
+    link $*.obj $(SETARGV), $@,, $(LIBS) $(LFLAGS);
+
+# The game name
+GAME = hack.exe
+
+# The game directory
+GAMEDIR = \h
+
+# All object modules
+OBJS = decl.obj apply.obj bones.obj cmd.obj do.obj dothrow.obj\
+	do_name.obj do_wear.obj dog.obj dogmove.obj eat.obj end.obj \
+	engrave.obj fight.obj fountain.obj hack.obj invent.obj \
+	lev.obj main.obj makemon.obj mhitu.obj mklev.obj \
+	mkmaze.obj mkobj.obj mkshop.obj mon.obj monmove.obj\
+	monst.obj o_init.obj objnam.obj options.obj \
+	pager.obj polyself.obj potion.obj pray.obj pri.obj prisym.obj\
+	read.obj rip.obj rumors.obj save.obj \
+	search.obj shk.obj shknam.obj sit.obj spell.obj steal.obj \
+	termcap.obj timeout.obj topl.obj topten.obj track.obj trap.obj \
+	tty.obj unix.obj u_init.obj vault.obj wield.obj \
+	wizard.obj worm.obj worn.obj write.obj zap.obj \
+	version.obj rnd.obj alloc.obj msdos.obj
+
+# The main target - you may want to try both of these alternatives.
+#
+$(GAME) : $(OBJS)
+#	link $(OBJS), $(GAME) /NOIG /STACK:4000 /CP:1;
+	link $(OBJS), $(GAME) /NOIG /STACK:10000 /SEG:512;
+	
+
+#	variable auxilary files.
+#
+VARAUX = data rumors
+
+install : $(GAME) $(VARAUX)
+	- exepack $(GAME) $(GAMEDIR)\$(GAME)
+	- exemod $(GAMEDIR)\$(GAME) /max 1
+
+clean :
+	erase $(GAME)
+
+spotless: clean
+	erase *.obj
+	erase main.c
+	erase tty.c
+	erase unix.c
+
+srcs :
+	copy makefile \tmp
+	copy *.c \tmp
+	copy *.h \tmp
+	copy \local\make\make.doc \tmp
+	copy \local\make\make.ini \tmp
+	copy \bin\make.exe \tmp
+	cd \tmp
+	time
+	touch *.*
+	arc m hack$Vs * *.*
+	cd $(CWD)
+
+
+#	Other dependencies
+#
+RUMORFILES= rumors.bas rumors.kaa rumors.mrx
+
+makedefs.exe:	makedefs.c alloc.obj config.h
+	cl -AL makedefs.c alloc.obj
+
+
+rumors :  config.h $(RUMORFILES) makedefs.exe
+	makedefs.exe -r
+
+data :  config.h data.bas makedefs.exe
+	makedefs.exe -d
+
+onames.h :  config.h objects.h makedefs.exe
+	makedefs.exe -o
+
+#	Below is a kluge.  date.h should actually depend on any source
+#	module being changed. (but hack.h is close enough for most).
+#
+date.h :  hack.h makedefs.exe
+	makedefs.exe -D
+
+trap.h :  config.h makedefs.exe
+	makedefs.exe -t
+
+main.obj :  pcmain.c hack.h
+	$(CC) $(CFLAGS) -Fo$@ -c pcmain.c
+
+tty.obj :  pctty.c hack.h msdos.h
+	$(CC) $(CFLAGS) -Fo$@ -c pctty.c
+
+unix.obj :  pcunix.c hack.h mkroom.h
+	$(CC) $(CFLAGS) -Fo$@ -c pcunix.c
+
+decl.obj :  hack.h mkroom.h
+apply.obj :  hack.h edog.h mkroom.h
+bones.obj :  hack.h
+hack.obj :  hack.h
+cmd.obj :  hack.h func_tab.h
+do.obj :  hack.h
+do_name.obj :  hack.h
+do_wear.obj :  hack.h
+dog.obj :  hack.h edog.h mkroom.h
+dogmove.obj :  hack.h mfndpos.h edog.h mkroom.h
+dothrow.obj :  hack.h
+eat.obj :  hack.h
+end.obj :  hack.h
+engrave.obj :  hack.h
+fight.obj :  hack.h
+fountain.obj :  hack.h mkroom.h
+invent.obj :  hack.h wseg.h
+ioctl.obj :  config.h
+lev.obj :  hack.h mkroom.h wseg.h
+makemon.obj :  hack.h
+mhitu.obj :  hack.h
+mklev.obj :  hack.h mkroom.h
+mkmaze.obj :  hack.h mkroom.h
+mkobj.obj :  hack.h
+mkshop.obj :  hack.h mkroom.h eshk.h
+mon.obj :  hack.h mfndpos.h
+monmove.obj :  hack.h mfndpos.h
+monst.obj :  hack.h eshk.h
+msdos.obj : msdos.h
+o_init.obj :  config.h objects.h onames.h
+objnam.obj :  hack.h
+options.obj :  hack.h
+pager.obj :  hack.h
+polyself.obj : hack.h
+potion.obj :  hack.h
+pray.obj :  hack.h
+pri.obj :  hack.h
+prisym.obj :  hack.h wseg.h
+read.obj :  hack.h
+rip.obj :  hack.h
+rumors.obj :  hack.h
+save.obj :  hack.h
+search.obj :  hack.h
+shk.obj :  hack.h mfndpos.h mkroom.h eshk.h
+shknam.obj :  hack.h
+sit.obj : hack.h
+spell.obj :  hack.h
+steal.obj :  hack.h
+termcap.obj :  hack.h
+timeout.obj :  hack.h
+topl.obj :  hack.h
+topten.obj :  hack.h
+track.obj :  hack.h
+trap.obj :  hack.h edog.h mkroom.h
+u_init.obj :  hack.h
+vault.obj :  hack.h mkroom.h
+wield.obj :  hack.h
+wizard.obj :  hack.h
+worm.obj :  hack.h wseg.h
+worn.obj :  hack.h
+write.obj :  hack.h
+zap.obj :  hack.h
+version.obj :  hack.h date.h
+extern.h: config.h spell.h obj.h
+	touch extern.h
+hack.h: extern.h flag.h gold.h monst.h objclass.h rm.h trap.h you.h 
+	touch hack.h
+objects.h:  config.h objclass.h
+	touch objects.h
+you.h: config.h onames.h permonst.h 
+	touch you.h
+#! rnews 3561
+Path: alberta!mnetor!uunet!mcvax!cernvax!jmg
+From: jmg at cernvax.UUCP (jmg)
+Newsgroups: comp.protocols.appletalk
+Subject: Kinetics/NCSA problems
+Message-ID: <581 at cernvax.UUCP>
+Date: 8 Dec 87 10:01:07 GMT
+Reply-To: jmg at cernvax.UUCP ()
+Organization: CERN European Laboratory for Particle Physics, CH-1211 Geneva, Switzerland
+Lines: 58
+
+This is a bit of a flame, which I hope does not upset some people
+too much. I have tried sending the comments privately, but have had
+no reply.
+I got a Kinetics internal Ethernet interface for a Mac SE, plus the
+ethernet driver, test software and NCSA telnet version 1.12.
+In order to try out this software in a safe manner I created a mini-
+-Ethernet with the Mac and an Ethernet monitor. Am I glad that I did
+this!
+The test software, when run, tends to throw out a large number of
+broadcast packets in a very short space of time. Sometimes one can
+control the frequency, other times not. At least one test threw out
+about 200 broadcast packets in much less than one second. If I had
+been on the real CERN Ethernet then a few hundred users would have
+had to deal with these!
+FLAME ON
+When will people writing test software avoid the intensive use of
+broadcast packets? Multicast would be slightly better, but even then
+the software should establish the address of those other computers
+with which it can run a test, and then address them directly.
+FLAME OFF (for a while)
+I then tried to run NCSA telnet. This also started out with about
+70 immediate broadcasts. These started out with a set of three
+types of broadcast:
+  1. arp with source ip address 0.0.0.255, looking for 0.0.0.127
+  2. something with type field 80f3 (what the hell is this?)
+  3. some other arp-type (type field 809b) with sender as 0.0.0.127
+These three are repeated about 20 times at intervals of about
+10 milliseconds (yes, milliseconds!). There are then a few more type
+809b broadcasts at reasonable (a few hundred milliseconds!) intervals
+before telnet starts to arp for the real host that I asked for.
+FLAME ON
+Why does software often insist on repeating packets at very short
+intervals on vey reliable LANs (and have you seen the Sun lately!)?
+FLAME OFF
+Despite all the above, I waited for a quiet moment before connecting
+onto the real Ethernet. I then tried telnet to our Ultrix Vax.
+Immediate remark: keyboard in application mode does not work for us.
+I then thought to run the vt100 test program (which some of you might
+also have picked up off usenet). What a disaster: the emulation fails
+all over the place!
+Never mind, let us see if I can connect to our IBM VM system. Of course,
+I have to go via a Spartacus KNET, because there is no NCSA tn3270
+(is anyone working on this?). Complete failure: Spartacus has a bit of
+a peculiar telnet setup (though Ultrix, bsd4.2 and FTP Inc. telnet on
+a PC work fine) which seems to screw NCSA telnet.
+Final try: go through an IBM 7171 front-end, which has 3270 to VT100
+built in. Sort of works (using ESC n for PF key n), but since the
+application keypad mode fails there is no way that I could get PA2
+for clear screen. Merde (which the French will understand.
+FLAME ON
+I know that NCSA is now at version 2.0. Why did I get version 1.12
+from Kinetics? (and why must only a Kinetics agent modify their Mac SCSI
+box for a European power supply?). How do I get an updated version
+quickly (no, I cannot do anonymous FTP!). Why have these simple tests
+never been reported before? etc. etc.
+FLAME OFF
+I would be delighted if someone could tell me that all the above problems
+are fixed in the current release!
+#! rnews 1102
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!wanner
+From: wanner at ethz.UUCP (Juerg Wanner)
+Newsgroups: rec.games.misc
+Subject: Re: The Pawn help
+Message-ID: <263 at bernina.UUCP>
+Date: 8 Dec 87 14:48:50 GMT
+References: <2884 at cbmvax.UUCP> <2299 at killer.UUCP> <2910 at cbmvax.UUCP>
+Reply-To: wanner at owf.UUCP (Juerg Wanner)
+Organization: OWF AG, Switzerland
+Lines: 17
+Keywords:
+
+
+In article <2910 at cbmvax.UUCP> daveb at cbmvax.UUCP (Dave Berezowski) writes:
+>How does one assure that they get the chest?  Wait around for Kronos at the
+>beginning of the game after you've delivered the note?
+
+After delivering the note? Hmmm... that might be too late.
+
+>I've been told that there is a bug in the game such that you must get to
+>the pedestal asap else the blue key won't be there (this is what has happended
+>to me).  If I do go to the pedestal first, will I miss the Adventuer and
+>Kronos?  ie. should I wait around for Kronos, give the adventuer (with the
+>chest I guess), and then go for the blue key?
+
+I've neither encountered that bug, nor did I first get the key. There's a lot
+one can do before.
+
+
+Juerg Wanner
+#! rnews 2241
+Path: alberta!mnetor!uunet!mcvax!nikhefk!paulm
+From: paulm at nikhefk.UUCP (Paul Molenaar)
+Newsgroups: comp.sys.mac
+Subject: Re: HyperCard Find
+Summary: Here's the solution (well...)
+Message-ID: <293 at nikhefk.UUCP>
+Date: 8 Dec 87 23:45:24 GMT
+References: <1262 at runx.ips.oz>
+Organization: Nikhef-K, Amsterdam (the Netherlands).
+Lines: 50
+
+In article <1262 at runx.ips.oz>, clubmac at runx.ips.oz (Macintosh Users Group) writes:
+> 
+> I was asked this question by a guy on the weekend, and was unable to help
+> him.  Any of you Hypercard gurus able to answer??
+> 
+> "I want to have a BACKGROUND button which has a script that tries to FIND
+> an arbitrary text.  However, when I try it, it only finds the text in
+> BACKGROUND fields, not FOREGROUND.  The FIND works properly when you use
+> the MESSAGE box.. how come?"
+> 
+> Jeff Laing (where for art thou comp.sys.mac.hypercard?)
+> 
+Same problem here. I noticed that strange Find bug too. My
+solution is a real kludge, but it works.
+
+Instead of issuing the FIND command in script, TYPE the FIND command
+with all the arguments into the message box and then (again
+from script) add a return. Like:
+
+on mouseUp
+   type "FIND" && quote & key & quote && "in background field id" && number &
+   return
+end mouseUp
+
+This also makes the repeated FIND easier.
+
+I made a stack that needed a search option on partial keys. So I wanted
+HC to keep on looking when the user stated that the item found wasn't
+the right one.
+
+I made a script to do this (if interested I can mail/post it) that
+expects a second field for every field to be looked in. The item found
+is put in the second field (named something like showName). When
+the user says he wants to keep on searching, the next item found is
+compared to the contents of showName. If it's the same, my script
+says that 'it's all there is'. And cancels the search. Otherwise
+a repeated search would be impossible.
+
+If you like I can upload the lot. To comp.sys.mac.hypercard maybe?
+
+To Apple:
+Why do you reply to all the easy answers in comp.sys.mac.hypercard
+bu happily skip all the possibly difficult ones? Seems like
+the HyperCard group chooses the easy way out. Too many bugs in HC
+perhaps?
+-- 
+        Paul Molenaar
+
+	"Just checking the walls"
+		- Basil Fawlty -
+#! rnews 704
+Path: alberta!mnetor!uunet!mcvax!enea!tut!santra!kolvi!jku
+From: jku at kolvi.UUCP (Juha Kuusama)
+Newsgroups: comp.sys.ibm.pc
+Subject: Screen dump from Hercules to Laserjet wanted
+Message-ID: <31 at kolvi.UUCP>
+Date: 8 Dec 87 12:19:56 GMT
+Reply-To: jku at kolvi.UUCP (Juha Kuusama)
+Organization: Helsinki University of Technology, Finland
+Lines: 10
+
+Could some kind soul over there send me a program/a reference to a program,
+that would allow me to print a graphics dump from a Hercules screen to a
+HP Laserjet printer It should
+
+	a) not distort the image (circles as circles, not ovals)
+
+	b) send its output to a file (so I can import it to my text).
+
+--
+Juha Kuusama, jku at kolvi.UUCP ( ...!mcvax!tut!kolvi!jku )
+#! rnews 1093
+Path: alberta!mnetor!uunet!mcvax!enea!tut!santra!jmunkki
+From: jmunkki at santra.UUCP (Juri Munkki)
+Newsgroups: comp.sys.mac
+Subject: Re: Development Environment Advice Wanted
+Keywords: Development, MacII Debuggers
+Message-ID: <9206 at santra.UUCP>
+Date: 8 Dec 87 16:51:43 GMT
+References: <687 at howtek.UUCP> <3456 at husc6.harvard.edu>
+Reply-To: jmunkki at santra.UUCP (Juri Munkki)
+Organization: Helsinki University of Technology, Finland
+Lines: 16
+
+In article <3456 at husc6.harvard.edu> singer at endor.UUCP (THINK Technologies) writes:
+>The current version of MacsBug, version 5.5, works fine on a Mac II -
+>even disassembles 68020 and 68881 opwords, and works with or without
+And it slows down the 68881 by about 50%. Can anyone else verify this?
+I moved to TMON mainly because it does not affect the speed of my Mac.
+
+I hope none of the Byte or MacTutor benchmarks were run under MacsBug.
+
+Still, ES works better in MacsBug than it does in TMON.
+
+Juri Munkki
+jmunkki at santra.hut.fi
+jmunkki at fingate.bitnet
+lk-jmu at finhut.bitnet
+
+Disclaimer: I'm just a freelance programmer, you shouldn't listen to me anyway.
+#! rnews 1288
+Path: alberta!mnetor!uunet!mcvax!diku!rancke
+From: rancke at diku.UUCP (Hans Rancke-Madsen.)
+Newsgroups: rec.games.frp
+Subject: Re: Re: Characters with two classes
+Message-ID: <3567 at diku.UUCP>
+Date: 7 Dec 87 15:31:25 GMT
+References: <26561S9S at PSUVMA> <81800077 at uiucdcsp>
+Organization: DIKU, U of Copenhagen, DK
+Lines: 23
+
+In article <81800077 at uiucdcsp> jenks at uiucdcsp.cs.uiuc.edu writes:
+
+>                       The PHB doesn't specifically forbid doing this
+>more than once, nor does it say what the "prime stat" is for Paladinks,
+>Rangers, Monks, etc.
+
+I seem to recall having seen a statement like "since <one of
+those sub-classes  -  I forget which> has no prime requisite,
+you can't switch to/from it." The implication being that any of
+the sub-classes that require more than one minimum is out as
+regards dual-class characters. So you could be a "fighter-turned-
+magician" but not a "ranger-turned-magician". I think it was in
+one of THE BOOKS, but I'm not certain. One thing you could do
+is to require 15 or 17 in ALL the requisites with minimums.
+That will restrict the number of assasin/illusionists!!!
+
+   Hans Rancke, University of Copenhagen
+          ..mcvax!diku!rancke
+
+--=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+- I hate it when people call me paranoid.
+  It makes me feel persecuted.
+#! rnews 456
+Path: alberta!mnetor!uunet!mcvax!diku!iesd!torbennr
+From: torbennr at iesd.uucp (Torben N. Rasmussen)
+Newsgroups: comp.sources.wanted
+Subject: Wanted: Microemacs part 8
+Message-ID: <166 at iesd.uucp>
+Date: 7 Dec 87 08:15:25 GMT
+Reply-To: torbennr at neumann.UUCP (Torben N. Rasmussen)
+Organization: Dept. of Comp. Sci., Aalborg University, Denmark
+Lines: 7
+
+
+Could someone please send me part 8 of the sources for Microemacs.
+
+-- 
+
+
+				Torben Rasmussen (torbennr)
+#! rnews 1138
+Path: alberta!mnetor!uunet!mcvax!diku!dde!jk
+From: jk at dde.uucp (Jens Kjerte)
+Newsgroups: comp.sources.wanted,comp.text
+Subject: Sourcecode for dca2troff wanted.
+Keywords: DCA conversion.
+Message-ID: <277 at Aragorn.dde.uucp>
+Date: 8 Dec 87 09:11:32 GMT
+Organization: Dansk Data Elektronik A/S, Herlev, Denmark
+Lines: 18
+Xref: alberta comp.sources.wanted:2716 comp.text:1345
+
+
+	We are right now starting a project, that involves translating
+	IBM DCA documents to and from a wordprocessing package.
+	A program called dca2troff was posted sometime ago.
+	This program, as the name says, was able to
+	convert from DCA format to troff format.
+	Would somebody having that source, please e-mail it to me.
+
+	Other information about software regarding DCA conversion,
+	Public Domain or not, would be appreciated. 
+
+	Thanks in advance
+
+-- 
++---------------------------------------------------------------------------+
+|   Jens Kjerte  @ Dansk Data Elektronik A/S, Systems Software Department   |
+|   E-mail:      ..!uunet!mcvax!diku!dde!jk  or  jk at dde.uucp                |
++---------------------------------------------------------------------------+
+#! rnews 1323
+Path: alberta!mnetor!uunet!mcvax!diku!dde!ct
+From: ct at dde.uucp (Claus Tondering)
+Newsgroups: sci.physics
+Subject: Maxwell's daemon
+Message-ID: <279 at Aragorn.dde.uucp>
+Date: 8 Dec 87 13:57:45 GMT
+Organization: Dansk Data Elektronik A/S, Herlev, Denmark
+Lines: 26
+
+Consider the following variant of Maxwell's daemon:
+
+You have the following two items:
+    1) a metal block,
+    2) a bowl with a liquid.
+Both items have the same temperature and are placed close together, they
+may, however, be thermally isolated from one another.
+
+Now into the bowl you drop a very small magnet. The motion of the
+molecules in the liquid will cause the magnet to move slightly. This
+will induce a (very small) current in the metal block. This current will
+cause the temperature of the metal block to rise. The current will also
+try to stop the movements of the magnet; this will in turn slow down the
+motion of the molecules, and the liquid will cool.
+
+The result: The metal block will grow warmer and warmer, and the liquid
+will grow colder and colder.
+
+This contradicts the second law of thermodynamics, and has the "advantage"
+over Maxwell's daemon that no intelligence is involved.
+
+What is wrong with the above argument?
+-- 
+Claus Tondering
+Dansk Data Elektronik A/S, Herlev, Denmark
+E-mail: ct at dde.uucp   or  ...!uunet!mcvax!diku!dde!ct
+#! rnews 2476
+Path: alberta!mnetor!uunet!mcvax!enea!sommar
+From: sommar at enea.UUCP (Erland Sommarskog)
+Newsgroups: rec.music.misc
+Subject: Swedish prog-rock (was Re: More than Yes)
+Message-ID: <2505 at enea.UUCP>
+Date: 8 Dec 87 23:22:11 GMT
+References: <19949 at yale-celray.yale.UUCP>
+Reply-To: sommar at enea.UUCP(Erland Sommarskog)
+Followup-To: rec.music.misc
+Organization: ENEA DATA Svenska AB, Sweden
+Lines: 42
+
+No isn't that an obscure subject line? But I must correct my 
+fellow-countryman here.
+
+Bjorn Lisper (lisper at yale-celray.UUCP) writes:
+>Bo Hansson, to be correct. Gee, I didn't know that he was known outside
+>Sweden. This guy was a keyboard player who was active mainly in the late
+>sixties and early seventies. He is remembered for having made the very
+>first record for the first Swedish independent non-profit label "Silence".
+>Unexpectedly the record became a hit and the income helped financing a lot
+>of records with early Swedish prog-rock that would otherwise not have been
+>economically possible to make. Thus his importance for Swedish rock music
+>cannot be overestimated.
+
+So he is the one being guilty to it all. Grr. You see, in Sweden 
+"progressive" music had nothing to do with the music. When we speak -
+or spoke at that time - of "progressive" groups, we talked of groups
+that played quite regular rock or pop. There were just one difference
+to the ordinary hit music, the lyrics. They were naive, trivial and 
+uttermost boring political texts of a communistic nature. (Which does
+not imply that they were paid by KGB or something.) I must admit I 
+didn't listen to much to them, their proganda was too much for me.
+
+Now, this kind of people dominated this non-profit companies that Bjorn
+talked of. For them ideological purity was much more important than
+interesting than good music. Not to be denied, *some* good music was 
+actually released on Silence and MNW (the other big non-profit), but 
+also a lot of true crap. And I can easily imagine that groups with
+interesting music was refused beacuse they voted with the wrong party.
+(They would never have released Yes, that are right wing if anything.)
+
+Finally, I should admit that despite the poorness of Silence, they
+had the most interesting music in Sweden at that time. But that more
+gives an indication of bad the rest was. (Abba, do you remember?)
+
+
+
+
+-- 
+Erland Sommarskog       
+ENEA Data, Stockholm    
+sommar at enea.UUCP        
+                   C, it's a 3rd class language, you can tell by the name.
+#! rnews 2310
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!forty2!poole
+From: poole at forty2.UUCP (Simon Poole)
+Newsgroups: comp.sys.atari.st
+Subject: Re: GEMBOOT and the Megas
+Message-ID: <122 at forty2.UUCP>
+Date: 8 Dec 87 14:19:44 GMT
+References: <608 at aucs.UUCP> <900 at atari.UUCP>
+Reply-To: poole at forty2.UUCP (Simon Poole)
+Organization: Exp. Physics University Zuerich
+Lines: 39
+
+
+In article <900 at atari.UUCP> apratt at atari.UUCP (Allan Pratt) writes:
+>in article <608 at aucs.UUCP>, 870646c at aucs.UUCP (barry comer) says:
+>> 
+>> Hi all, well my Mega2 just landed on my desk, really nice. I've got a question for all other Mega owners using the hard disks, I have been using GEMBOOT with
+>> my 1040ST all along, when I boot up the Mega two bombs appear then disappear
+>> after GEMBOOT has done its thing.
+>
+>DO NOT USE GEMBOOT.  Use FOLDRXXX from Atari.  HINSTALL should be available,
+>too... It makes your hard disk bootable (no "boot floppy" needed).
+>
+The lastest version of GEMBOOT which was distributed something like
+half a year ago, allows you to set the location of the sole undocumented
+variable that Konrad uses in GEMBOOT. Matter of fact I used GEMBOOT
+without problems on one of the first Mega's that arrived in Switzerland
+after changing the GEMBOOT startup file. 
+
+>patches the appropriate location in the OS.  In the case of the Mega
+>ROMs, he actually added a pointer in the OS header which points to
+>the necessary spot, so FOLDRXXX will work for all future ROM releases.
+                                               ^^^^^^^^^^^^^^
+Didn't Atari claim it was working on a new '40 folder bug'less OS?                               
+
+>Even old TOS ROM users should probably not use GEMBOOT... I certainly
+>wouldn't trust it, and with FOLDRXXX and HINSTALL available, you just
+>don't need it.
+Hmmmm, as Landon Dyer once said (a long time ago) FOLDRXXX does NOT fix
+the other problem with GEMDOS management of the internal directory
+list (mutiple bad copies of the same block), GEMBOOT does provide
+a workaround  for this problem (so I wouldn't trust FOLDRXXX) plus
+a lot of other nice things.
+
+
+                            Simon Poole
+                 UUCP: ....mcvax!cernvax!forty2!poole
+                 Bitnet:             K538915 at CZHRZU1A
+
+*
+***************When will Atari annouce PC-6 to PC-10?****************
+*
+#! rnews 1572
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!bob
+From: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Blake's, all 7 of them!
+Message-ID: <818 at its63b.ed.ac.uk>
+Date: 8 Dec 87 10:08:31 GMT
+References: <6320 at ihlpa.ATT.COM> <1572 at cup.portal.com> <1372 at aurora.UUCP>
+Reply-To: bob at its63b.ed.ac.uk (ERCF08 Bob Gray)
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 28
+
+In article <1372 at aurora.UUCP> timelord at aurora.UUCP (G. "Murdock" Helms) writes:
+>In article <1572 at cup.portal.com>, Isaac_K_Rabinovitch at cup.portal.com writes:
+>> Whoops.  After the Star One episode, the actor who played
+>> Blake got a job with the National Shakespeare Company, so Blake essentially
+>> disappears until the "last" episode.  
+>
+>The second Travis, the one with the really thick Cockney accent,
+>was spotted in the BBC movie "Edge of Darkness" recently broadcast
+>in California.
+
+Something else to watch out for. The recently concluded
+series "Knights of God" on independant television was
+notable only for having Gareth Thomas (Blake himself) playing
+the part of the leader of a band of rebels trying to
+overthrow the harsh Goverment sometime in the future UK.
+Almost a reprise of his part as blake, but he isn't even
+one of the major characters. His name comes about eighth
+on the credits.
+
+Now we know what he was doing while he was missing from
+Blake's Seven. :->
+
+Also look out for the second Dr Who, Patrick Troughton, in a
+supporting role.
+
+Note: I do Not recommend this series for any other reson
+than the above mentioned curiosity value.
+	Bob
+#! rnews 2656
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!csnjr
+From: csnjr at its63b.ed.ac.uk (Nick Rothwell)
+Newsgroups: comp.lang.lisp,comp.lang.scheme,comp.lang.misc
+Subject: Re: Applicative languages?  Anyone?
+Keywords: ML interpreter typechecker
+Message-ID: <819 at its63b.ed.ac.uk>
+Date: 8 Dec 87 12:40:13 GMT
+References: <1409 at mind.UUCP> <584 at zippy.eecs.umich.edu> <1202 at uoregon.UUCP>
+Reply-To: nick%ed.lfcs at uk.ac.ucl.cs.nss (Nick Rothwell)
+Organization: LFCS, University of Edinburgh
+Lines: 37
+Xref: alberta comp.lang.lisp:566 comp.lang.scheme:85 comp.lang.misc:886
+
+In article <1202 at uoregon.UUCP> markv at drizzle.UUCP (Mark VandeWettering) writes:
+>In article <584 at zippy.eecs.umich.edu> dwt at zippy.eecs.umich.edu (David West) writes:
+>>Applicativity has its advantages, but it needs
+>>1) ...
+>>2) Some syntactic means for preventing argumentsfrom getting unreadably
+>>   numerous just to pass something down to where it's finally used. 
+>
+>	Hmmm, not a bad idea.  I have just acquired "Implementation of
+>	Functional Programming Languages by Simon L. Peyton Jones, and
+>	am much impressed by the depth/level of the text.  Seeing as I
+>	have to do a final thesis/project sometime :-) I might be
+>	tempted to try a hand at an ML interpreter/compiler.  I would
+>	like to hear from anyone who is trying/has tried similar
+>	projects.
+
+ML gives you objects with modifiable state, so that you don't need to
+pass a state structure around with you. The disadvantage, of course, is
+that you smash the applicative behaviour of the language -
+whether it's worth it depends what you're trying to do.
+   Another way around this is to use type abstraction. That way, your
+state structure is an abstract object with a few access functions to get
+at the bits you need. I've always used the former approach, so I don't know
+how far the latter approach gets you. It's quite possible to take non-
+applicative features like assignment and abstract over them to build
+structured objects with varying state, a la Smalltalk perhaps. This isn't
+"dirty" functional programming - it's just using a functional language as if
+it were a language of a different kind. I recently dedicated a lecture to the
+structured use of side-effects in ML.
+   By the way, I have various little typecheckers and interpreters for tiny
+functional languages lying around on-line somewhere, if you're interested.
+All written in ML, of course.
+-- 
+Nick Rothwell,	Laboratory for Foundations of Computer Science, Edinburgh.
+		nick%lfcs.ed.ac.uk at nss.cs.ucl.ac.uk
+		<Atlantic Ocean>!mcvax!ukc!lfcs!nick
+~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
+"Nothing's forgotten. Nothing is ever forgotten."   - Herne
+#! rnews 1368
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!csnjr
+From: csnjr at its63b.ed.ac.uk (Nick Rothwell)
+Newsgroups: rec.music.synth
+Subject: D-50, D-550, MT-32, ???
+Message-ID: <820 at its63b.ed.ac.uk>
+Date: 8 Dec 87 13:01:30 GMT
+References: <633 at elxsi.UUCP> <5470012 at hplsla.HP.COM>
+Reply-To: nick%ed.lfcs at uk.ac.ucl.cs.nss (Nick Rothwell)
+Organization: LFCS, University of Edinburgh
+Lines: 17
+
+In article <5470012 at hplsla.HP.COM> steveb at hplsla.HP.COM (Steve Bye) writes:
+>The MT-32 is not a product of Roland's professional music products group.
+>It is a product of their home keyboards (upscale toys) department.  It uses
+>technology develped for the D-50 and D-550.  There is no comparison in 
+>actual ussuage between a D-550 and an MT-32.
+
+I recently read a report from a British music journalist visiting Roland in
+Japan. Apparently (but *don't* quote me on this :-)) Roland are working on
+a rack-mount box with the same sorts of features as the MT-32 but aimed a
+bit more at the Pro market - presumably related to the MT-32 as the TX81Z is
+to the FB01. I'm keeping my wallet closed and my eyes open...
+-- 
+Nick Rothwell,	Laboratory for Foundations of Computer Science, Edinburgh.
+		nick%lfcs.ed.ac.uk at nss.cs.ucl.ac.uk
+		<Atlantic Ocean>!mcvax!ukc!lfcs!nick
+~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
+"Nothing's forgotten. Nothing is ever forgotten."   - Herne
+#! rnews 1563
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!icdoc!doc.ic.ac.uk!aw
+From: aw at doc.ic.ac.uk (Andrew Weeks)
+Newsgroups: comp.emacs
+Subject: uEmacs 3.9 - Function keys on Suns
+Message-ID: <144 at gould.doc.ic.ac.uk>
+Date: 8 Dec 87 17:16:50 GMT
+Sender: aw at doc.ic.ac.uk
+Reply-To: aw at doc.ic.ac.uk (Andrew Weeks)
+Organization: Dept. of Computing, Imperial College, London, UK.
+Lines: 40
+
+I have implemented, as an extension to the "VT100" option, some extra
+code to allow uEmacs to recognise the top, left and right function keys
+on Sun 3 consoles.  ( I imagine they will work on Sun 2s as well). 
+
+These keys, except for the cursor keys (R8,R10,R12 & R14), return a
+string of the form <ESC>[ followed by 3 digits followed by 'z'.  By
+interpreting the digits as an integer, and subtracting 128 to get a
+character, all the function keys can be made to simulate 'FN?' keys. 
+Which they return depends on how the Sun keyboard is set up (with
+setkeys(1)). 
+
+They won't work if you use Sun-windows and have a .ttyswrc file.
+
+Anyway - Here are the diffs:
+
+*** input.c	Mon Nov 30 12:57:21 1987
+--- input.c.orig	Mon Nov 30 12:54:37 1987
+***************
+*** 364,376 ****
+  #if	VT100
+  		if (c == '[' || c == 'O') {
+  			c = get1key();
+! 			if ( c >= 'A' )
+! 				return(SPEC | c);
+! 			c = c - 48;
+! 			c = (c*10) + get1key() - 48;
+! 			c = (c*10) + get1key() - 176;
+! 			get1key();
+! 			return ( SPEC | c );
+  		}
+  #endif
+  		return(META | c);
+--- 364,370 ----
+  #if	VT100
+  		if (c == '[' || c == 'O') {
+  			c = get1key();
+! 			return(SPEC | c);
+  		}
+  #endif
+  		return(META | c);
+#! rnews 1248
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!jam
+From: jam at comp.lancs.ac.uk (John A. Mariani)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Max Headroom
+Message-ID: <454 at dcl-csvax.comp.lancs.ac.uk>
+Date: 8 Dec 87 18:47:18 GMT
+References: <82*quale at si.uninett> <3333 at ihlpl.ATT.COM>
+Reply-To: jam at comp.lancs.ac.uk (John A. Mariani)
+Distribution: rec.arts.sf-lovers
+Organization: Department of Computing at Lancaster University, UK.
+Lines: 16
+
+Having observed chat about the American Max series and comparisons with the
+UK series, I would like to point out that we (in the
+UK) have only seen the Pilot in
+terms of an action/adventure episode. Our Max series have really featured
+Max as a video DJ, and later as a talk show host.
+
+So, I have kept silent till now, but I reckon the action/adventure series
+you guys in the US of A are discussing must be worth watching! Anyone care
+to hazard a guess as to why we in the UK don't get your Max show; and
+do you get ours?
+
+-- 
+"You see me now a veteran of a thousand psychic wars .. "
+UUCP:  ...!seismo!mcvax!ukc!dcl-cs!jam | DARPA: jam%lancs.comp at ucl-cs
+JANET: jam at uk.ac.lancs.comp   | Post : University of Lancaster, Department of
+Phone: +44 524 65201 ext 4467 |	Computing, Bailrigg, Lancaster, LA1 4YR, UK.
+#! rnews 1017
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: rec.music.classical
+Subject: Minimalist recorder music, anyone?
+Message-ID: <1575 at brahma.cs.hw.ac.uk>
+Date: 8 Dec 87 19:29:14 GMT
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 14
+
+What minimalist music is performable by a recorder consort? Terry Riley's
+In C is the one and only thing I've found so far (almost no published
+minimal music is available in the UK - I have drawn a virtually complete
+blank at every major library and music shop in Scotland).
+
+I guess this resolves into two questions: does it exist, and if it does,
+can I get it? Do Glass et al have the same attitude to scores that AT&T
+does to source code?
+
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 1165
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: comp.sys.mac
+Subject: mathematical laser fonts
+Keywords: font, logic, PostScript, laser printer, symbols
+Message-ID: <1576 at brahma.cs.hw.ac.uk>
+Date: 8 Dec 87 19:43:07 GMT
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 21
+
+
+What mathematical laser fonts are available?
+
+What I need is:
+
+	- logic and theoretical computer science symbols (like the old Ophir
+	  bitmap font, but with the squared-off set theory symbols used in
+	  domain theory);
+	  
+	- symbols for the better known algebraic structures (N, Z, Q, A, R, C)
+	  (is there a font that looks like these do as usually printed?);
+	
+	- subscripts and superscripts with little enough leading not to
+	  sabotage inter-line spacing in programs like WriteNow;
+	  
+	- maybe some of the more useful German capital letters.
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 1030
+Path: alberta!mnetor!uunet!mcvax!ukc!cheviot!eas
+From: eas at cheviot.newcastle.ac.uk (Edward Scott)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Obscure TV SF shows
+Message-ID: <2588 at cheviot.newcastle.ac.uk>
+Date: 8 Dec 87 15:19:25 GMT
+References: <871201124327980.ABWD at Mars.UCC.UMass.EDU> <4100001 at hpcllf.HP.COM>
+Reply-To: eas at cheviot (Edward Scott)
+Organization: Computing Laboratory, U of Newcastle upon Tyne, UK NE17RU
+Lines: 12
+
+In article <4100001 at hpcllf.HP.COM> jws at hpcllf.HP.COM (John Stafford x75743) writes:
+>Re: UFO
+>   The wigs worn by the women on moonbase were of a purple hue and were
+>   described (at least in the books the followed the series if not
+>   actually on the air) as "anti-static wigs".
+
+About ten years ago I got a second hand copy of "UFO 1: Flesh Hunters" by
+Robert Miall. It is a Warner Paperback Library edition, printed with 
+permission from Pan books (who presumably did the UK edition). I have't seen
+any since then.
+How many of these UFO novels were there?
+Did Robert Miall write anything else?
+#! rnews 542
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!pete
+From: pete at tcom.stc.co.uk (Peter Kendell)
+Newsgroups: rec.arts.sf-lovers
+Subject: No More Mel
+Message-ID: <488 at stc-f.tcom.stc.co.uk>
+Date: 8 Dec 87 09:14:20 GMT
+Organization: STC Telecoms, London N11 1HB.
+Lines: 7
+
+
+	Hurrah, Hurrah!!
+-- 
+------------------------------------------------------------------------------
+|		  Peter Kendell <pete at tcom.stc.co.uk>	        	     |
+|				...{uunet!}mcvax!ukc!stc!pete		     |
+------------------------------------------------------------------------------
+#! rnews 660
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!btnix!psanders
+From: psanders at btnix.axion.bt.co.uk (Bob-Cut Maniac)
+Newsgroups: comp.sys.mac
+Subject: SMALLTALK wanted
+Keywords: Mac SMALLTALK
+Message-ID: <635 at btnix.axion.bt.co.uk>
+Date: 8 Dec 87 12:53:54 GMT
+Organization: British Telecom Research Labs, Martlesham Heath, IPSWICH, UK
+Lines: 10
+
+
+Does anyone know of a PD SMALLTALK system for the Mac ??
+
+Answers to me and I'll summarise on the Net.
+
+Paul.
+-- 
+E-mail (UUCP)	PSanders at axion.bt.co.uk (...!ukc!btnix!psanders)
+Organisation	British Telecom Research Laboratories, Ipswich UK.
+"This mime of mortal life, in which we are apportioned roles we misinterpret..."
+#! rnews 628
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!root44!hrc63!trw
+From: trw at hrc63.co.uk (Trevor Wright Marconi Baddow)
+Newsgroups: comp.sys.ibm.pc
+Subject: M.Magee AUTOMENU - any knowledge
+Message-ID: <475 at hrc63.co.uk>
+Date: 8 Dec 87 10:39:57 GMT
+Organization: GEC Hirst Research Centre, Wembley, England.
+Lines: 10
+
+
+We have seen a demo of a tiny MS-DOS utility called AUTOMENU which
+makes building menus for PC users simple. We want to find who is the
+vendor of this utility, the cost, and any details of the command characters
+for the menu definition file.
+
+Any help appreciated.
+
+Trevor Wright
+yc23%a.gec-mrc.co.uk at nss.cs.ucl.ac.uk
+#! rnews 2646
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!datlog!dlhpedg!cl
+From: cl at dlhpedg.co.uk (Charles Lambert)
+Newsgroups: comp.lang.c
+Subject: Re: Address of array
+Message-ID: <329 at dlhpedg.co.uk>
+Date: 8 Dec 87 13:30:45 GMT
+References: <126 at citcom.UUCP> <163 at mccc.UUCP> <422 at xyzzy.UUCP>
+Sender: news at dlhpedg.co.uk
+Reply-To: cl at .co.uk (Charles Lambert)
+Organization: FSG at Data Logic Ltd, Queens House, Greenhill Way, Harrow, London.
+Lines: 56
+
+In article <422 at xyzzy.UUCP> throopw at xyzzy.UUCP (Wayne A. Throop) writes:
+>> pjh at mccc.UUCP (Peter J. Holsberg)
+>> OK - perhaps you had better tell us neophytes what you mean by the
+>> address of an array!
+>
+>Same as address of anything else.  It is an address which, when
+>indirected, yields an array, and when "N" is added to it, yields the
+>address of an array which is itself a member of an array "N" elements
+>away from the array yielded by an indirection.
+> 
+> [ several abstruse observations ]
+>
+>What could be simpler?
+
+Well, several other forms of explanation, I guess.  This one confused me,
+and I *understand* the address of an array. (Just teasing)
+
+To put it another way....
+
+Any object, of any type (integer, structure, array, etc.), has an address.
+Usually, if it is an object that occupies several words of memory, it is the
+address at which it begins. (Compiler theorists may be itching to tell me it
+might mean something else entirely; let's keep this simple.)  The address of
+an object is the compiler's handle for manipulating it.   You think of an
+object by its name; the compiler "thinks" of it by its address.
+
+The "address of an array" is the address that the compiler uses to access
+that array and to calculate the position of any element in the array.
+
+In C,  the address of an array is the same as the address of its first
+element (array[0]).  If you want to set up a pointer to the array, you
+get its address simply by naming it. Hence:
+
+	pa = array;	/* pa now contains the address of "array" */
+
+which is exactly the same as
+
+	pa = &array[0]; /* "&" means "address of", so pa contains the
+				address of element [0] of "array" */
+
+Now this is a slight quirk in C - the name of the array being a synonym for
+its address;  for any other object (notably a struct) that is not true.  If
+you want the address of a structure you must write
+
+	ps = &mystruct;	/* NOT ps = mystruct */
+
+So we get back to the discussion from whence we came: why can't we be
+consistent and get the address of an array by
+
+	pa = &array;	?
+
+To which the answer is:  you can, with some compilers.
+
+[Further reading: The C Programming Language; Kernighan & Ritchie; pp.93-95]
+--------------------------
+Charles Lambert
+#! rnews 1652
+Path: alberta!mnetor!uunet!mcvax!unido!iaoobelix!vogt
+From: vogt at iaoobelix
+Newsgroups: comp.sys.dec
+Subject: Bug in BASIC-PLUS for RSTS V8.0? - (nf)
+Message-ID: <9900003 at iaoobelix.UUCP>
+Date: 8 Dec 87 18:36:00 GMT
+Lines: 43
+Nf-ID: #N:iaoobelix:9900003:000:1342
+Nf-From: iaoobelix!vogt    Dec  8 19:36:00 1987
+
+I think I found a bug in BASIC-PLUS of RSTS V8.0. The following program
+isn't working in the right way. I tried to read some records from a file
+and to store them in an array. But after I read and stored all records,
+the array was completely empty.
+
+> 10 ON ERROR GOTO 1000
+> 15 DIM IN$(100%)
+> 20 FIELD #1%, 3% as a$, 20% as i$, 15% as q$
+> 30 OPEN 'foobar' as file #1%, recordsize 38%
+> 40 Z% = 0%
+> 50 Z% = Z% + 1%
+> 60 GET #15%, RECORD Z%
+> 70 IN$(Z%) = I$
+> 75 PRINT IN$(Z%)
+> 80 GOTO 50
+> 90 CLOSE #1%
+> 100 PRINT IN$(I%)  FOR I% = 1% TO Z% - 1%
+> 110 GOTO 32767
+> 1000 IF ERR = 11 THEN RESUME 90
+> 1010 ON ERROR GOTO 0
+> 32767 END
+
+The outputs in line 75 are alright, but those in line 100 aren't.
+Only blank lines appear there.
+
+I found out that if you change line 70 to 'IN$(Z%) = LEFT$(I$, 20%)'
+- which does nearly nothing different - it works correctly.
+
+Does anybody know a patch for this bug? Or does anybody know how to
+avoid this in an other way?
+
+Thanks in advance
+
+Gerald Vogt
+
+--------------------------------------------------------------------------
+Fraunhofer Institut fuer Arbeitswirtschaft und Organisation
+Holzgartenstrasse 17
+D-7000 Stuttgart 1         UUCP:   ...{uunet!unido,pyramid}!iaoobel!vogt
+W-Germany
+
+Phone: (W-Germany) 711 6648191
+--------------------------------------------------------------------------
+#! rnews 3127
+Path: alberta!mnetor!uunet!mcvax!hafro!gst!gunnar
+From: gunnar at gst.UUCP (Gunnar Stefnsson)
+Newsgroups: sci.math
+Subject: Re: Least-squares fitting
+Message-ID: <428 at gst.UUCP>
+Date: 8 Dec 87 15:25:35 GMT
+References: <1823 at culdev1.UUCP> <22191 at cca.CCA.COM> <2301 at utastro.UUCP>
+Reply-To: gunnar at gst.UUCP (Gunnar Stefansson)
+Organization: Marine Research Institute, Reykjavik
+Lines: 56
+
+In article <2301 at utastro.UUCP> bill at astro.UUCP (William H. Jefferys) writes:
+>In article <22191 at cca.CCA.COM> g-rh at CCA.CCA.COM.UUCP (Richard Harter) writes:
+>~In article <1823 at culdev1.UUCP> drw at culdev1.UUCP (Dale Worley) writes:
+>~>The normal least-squares fitting of a line to a set of points in the
+>~>plane assumes that the x-coordinates of the points are known to be
+>~>exact, and the y-coordinates have all the error.  That is, chi^2 is
+>~>the sum of the squares of the distances from the points to the line in
+>~>a vertical direction.  This introduces assymetry between the
+>~>coordinates.
+>~>
+>~>Is is known how to perform least-squares fitting where the "error" is
+>~>the perpendicular distance between the point and the line?
+>
+>
+>Actually, if both coordinates have error, it is essential that this
+>fact be taken into account. If you fail to do this, the result will be
+>*biased* -- the slope will be systematically underestimated, and
+>this bias will not go to zero as you take more and more points
+
+Hold on, isn't this statement a bit too strong? The answer to which method
+should be used ultimately depends on what the purpose of the estimations
+is. 
+
+In fact, if the purpose is to estimate y for a given x, then ordinary
+least squares will do. In this case one is not really interested in
+getting the best estimates of the parameters but only in getting a good
+prediction.
+
+I claim that there are very few regression examples where one really
+cares whether or not the parameters are biased. In the large majority of
+cases one is much more interested in the goodness of prediction. In this
+case, one is interested in E[Y|X]. So if we model this quantity as
+linear in X, then the OLS estimates are BLUE. This will also give
+variances etc, all valid conditionally on X.
+
+It is my feeling that a lot of books overemphasize the so-called bias,
+since that is very often totally irrelevant.  For example, some
+textbooks talk about biased parameter estimates when some variables
+are missing in a multiple regression. In reality OLS is estimating a
+better set of parameters than would the corresponding "unbiased"
+estimator (OLS in this case will give an unbiased estimate of the best
+surface based on the reduced set of variables). Certainly in this case,
+one can make a strong argument that all the talk about biasses is
+totally irrelevant.
+
+Of course if the true purpose is to estimate parameters, e.g. to assess
+the effect of a change in X on Y, then indeed one needs to worry a bit
+about the effects of X being random.
+
+Gunnar
+
+-- 
+
+-----------------------------------------------------------------------------
+Gunnar Stefansson                       {mcvax,enea}!hafro!gunnar 
+Marine Research Institute, Reykjavik    gunnar at hafro.UUCP
+#! rnews 528
+Path: alberta!mnetor!uunet!mcvax!unido!tub!ao
+From: ao at tub.UUCP (Arnfried Ossen)
+Newsgroups: comp.mail.misc
+Subject: Path to UMass Amherst
+Message-ID: <318 at tub.UUCP>
+Date: 7 Dec 87 13:29:49 GMT
+Reply-To: ao at tub.UUCP (Arnfried Ossen)
+Organization: Technical University of Berlin, Germany
+Lines: 7
+
+Anybody out there who knows the PATH to
+
+   University of Massachusetts, Amherst Campus, COINS Department
+
+It should allow access from USENET or BITNET.
+
+Arnfried, ao at tub.UUCP, ao at db0tui6.BITNET, TU Berlin, Berlin, Fed.Rep.Germany
+#! rnews 2902
+Path: alberta!mnetor!uunet!mcvax!varol
+From: varol at cwi.nl (Varol Akman)
+Newsgroups: sci.math
+Subject: Re:   computational geometry / finding segment intersections
+Summary: Try adaptive grid ...
+Keywords: segment intersection
+Message-ID: <141 at piring.cwi.nl>
+Date: 9 Dec 87 11:14:57 GMT
+References: <4369 at sdcsvax.UCSD.EDU>
+Organization: CWI, Amsterdam
+Lines: 50
+
+<4369 at sdcsvax.UCSD.EDU> maiden at sdcsvax.UCSD.EDU (VLSI Layout Project) writes:
+>
+>Consider a path embedded into the Cartesian plane, where for convenience
+>all vertices of the path are lattice points in the positive quadrant.
+>All edges are line segments.
+>So, the path will look like < (x1,y1) , (x2,y2) , ... , (xn,yn) >.  
+>Question:    What is the fastest method of determining *ALL* self-
+>	     intersections of this path?
+>This may have been beaten to death by computational geometers, so I'll
+>append some extra conditions:
+>Suppose there are **many** vertices in the path, and that edges are
+>for the most part very short.    For example, there could be 10000
+>points in a 200 by 200 square, with most edges less than 3 units long.
+>Furthermore, assume that there are not very many self-intersections
+>to be found.    Now, what would the fastest method be???   Any ideas
+>welcome.
+
+There are, as you've guessed several papers in computational geometry
+on line segment intersections.  You may look at the books by Shamos
+and Preparata, and also the book by Edelsbrunner for references.
+
+My favorite method to solve your problem though is an excellent
+method invented by Randolph Franklin at RPI.  It is called ''adaptive
+grid'' and works as follows.  First you overlay a regular, say G by G
+integer grid on your scene.  Then you enter your edges into respective
+cells of the grid  (similar to the bucketing idea!)  Then you make a pass
+thru all the cells and find the intersections in each cell.  If an
+intersection falls on a grid cell boundary you should be careful to
+treat it so the integrity is kept intact.
+
+I'm not very good in describing things in a hurry (especially Email)
+but let me tell that I've wide experience with this stuff and it works
+very well.  It is especially excellent for a scene made of short edges
+with a rather homogeneous distribution.  Write me for details.
+Also you may try Franklin at franklin at csv.rpi.edu.  Here is a short bibl.
+
+W.R. Franklin  An exact hidden sphere algorithm that operates
+               in real time  COMP. GRAPHICS AND IMAGE PROC. 15(4), 1981
+
+-------------  A linear time exact hidden surface algorithm SIGGRAPH'80
+
+------------- and V. Akman A simple and efficient haloed line algorithm
+                           for hidden line elimination COMPUTER GRAPHICS
+                           FORUM, 1987
+
+-------------------------- Adaptive grid for polyhedral visibility in
+                           object space: an implementation BJC 1987, to appear
+
+-Varol Akman
+CWI, Amsterdam
+#! rnews 2392
+Path: alberta!mnetor!uunet!mcvax!jack
+From: jack at cwi.nl (Jack Jansen)
+Newsgroups: comp.os.misc,comp.unix.wizards
+Subject: Re: Command interfaces
+Message-ID: <142 at piring.cwi.nl>
+Date: 9 Dec 87 15:41:45 GMT
+References: <1257 at boulder.Colorado.EDU> <6840002 at hpcllmv.HP.COM> <9555 at mimsy.UUCP> <798 at rocky.STANFORD.EDU> <432 at cresswell.quintus.UUCP> <3161 at psuvax1.psu.edu> <5565 at oberon.USC.EDU>
+Organization: AMOEBA project, CWI, Amsterdam
+Lines: 43
+Xref: alberta comp.os.misc:339 comp.unix.wizards:5747
+
+In article <5565 at oberon.USC.EDU> blarson at skat.usc.edu (Bob Larson) writes:
+> [Discussing primos wildcards versus unix wildcards]
+>For example, how would you do the equivelent of this in unix:
+>
+>cmpf *>old>@@.(c,h) == -report ==.+cmpf -file
+>
+>(Explanation: compare all files in the old sub-directory ending in .c or
+>.h with the file of the same name in the current directory, and put
+>the output in the file of the same name with .cmpf appended.  Non-files
+>(directories and segment directories) ending in .c or .h are ignored.
+>[I do prefer the output of diff -c to that of cmpf, but that isn't
+>what I'm talking about here.]
+
+Uhm, yes, unfortunately I find the 'feature' quite unusable.
+I *never* come up with the correct sequence of == and @@, so I have to type
+the command three times before I get it right. (really retype, that is.
+'History mechanism' is something primos has never heard about).
+
+I definitely prefer
+for i in *.[ch]; do
+    diff old/$i $i >$i.diff
+done
+
+(and you can add an 'if [ -d $i ]' if you really care about directories
+ending in .c or .h. I don't, because I don't *have* directories ending
+in .c or .h).
+
+And, to continue some gripes on primos wildcards:
+- I would expect them to work *always*. I.e. if I do
+  TYPE @@
+  (TYPE is primos echo) I would expect a list of all files, *not* '@@'.
+- If I want all arguments on one line, and I use [WILD @@.TMP], and the
+  result doesn't fit in 80 characters, I DO DEFINITELY NOT WANT IT TO TRUNCATE
+  IT AT EIGHTY CHARS! I lost an important file that way: it was trying
+  to generate a list containing PRECIOUSFILE.TMP, but, unfortunately,
+  the .TMP started at position 81. So, it removed PRECIOUSFILE in stead.
+  sigh.
+  
+Sorry, there are some neat ideas in primos, but the command processor and
+it's wildcards is definitely *not* one of them.
+-- 
+	Jack Jansen, jack at cwi.nl (or jack at mcvax.uucp)
+	The shell is my oyster.
+#! rnews 1552
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!csbg
+From: csbg at its63b.ed.ac.uk (Andie)
+Newsgroups: comp.windows.news
+Subject: Windows and menus through the CPS interface
+Keywords: NeWS windowing, menus, CPS interface
+Message-ID: <821 at its63b.ed.ac.uk>
+Date: 9 Dec 87 00:15:36 GMT
+Reply-To: csbg at its63b.ed.ac.uk (Bruce)
+Organization: Computer Science Department, Edinburgh University
+Lines: 26
+
+Hi everybody !
+
+I'm a final year student at Edinburgh University and as part of my final
+year project I am using NeWS to build up a document composition system.
+Alas, I'm new to NeWS and the NeWS manual does seem to be rather sketchy,
+especially when it comes to using the CPS interface.
+
+Having had a look at the stuff that is floating around in this newsgroup
+I think that someone out there will be able to help me.
+
+Point 1 : How can I control the litewin.ps and litemenu.ps packages through
+          the CPS interface - especially, how do I get notification to the
+          C program that something is happening ?
+
+Point 2 : This may be trivial, but when I create an overlay for the purposes
+          of rubber-banding, using the getclick family of operators, I can
+          never get the overlay to disappear again. What is happening and 
+          how should it be done ?
+
+If these points have already been raised in the past then I will be happy to
+receive direct e-mail from anybody who can answer any part of the above
+queries.
+
+As they say: When the going gets tough, I get the hell out of it !
+
+Bruce Gilmour (CS4 student at Edinburgh University)
+#! rnews 1134
+Path: alberta!mnetor!uunet!mcvax!botter!ast
+From: ast at cs.vu.nl (Andy Tanenbaum)
+Newsgroups: comp.os.minix
+Subject: Re: Problems with serial TTY driver
+Message-ID: <1778 at botter.cs.vu.nl>
+Date: 9 Dec 87 15:36:52 GMT
+References: <2314 at encore.UUCP>
+Reply-To: ast at cs.vu.nl (Andy Tanenbaum)
+Organization: VU Informatica, Amsterdam
+Lines: 16
+
+In article <2314 at encore.UUCP> paradis at encore.UUCP (Jim Paradis) writes:
+>Is there some limit to how fast MINIX will take interrupts? 
+>If one takes them too fast, will messages get lost?
+>
+If you try to force feed MINIX from an Ethernet at 10 Mbps it will probably
+drop stuff.  There is undoubtedly a limit on how many interrupts per second
+it can handle, but an AT it should be over 1000 per second.
+
+The original tty driver was very carefully written to deal with exactly
+this issue.  When characters come in, they are buffered, even if it is
+not possible to send a message to the tty task.  This code is on lines
+3528 to 3552 of the book.  Assuming you are still using this mechanism,
+you ought to be able to accept characters at say 2400 baud without losing
+any.
+
+Andy Tanenbaum (ast at cs.vu.nl)
+#! rnews 915
+Path: alberta!mnetor!uunet!mcvax!botter!ast
+From: ast at cs.vu.nl (Andy Tanenbaum)
+Newsgroups: comp.os.minix
+Subject: P-H has MINIX in stock (finally)
+Message-ID: <1779 at botter.cs.vu.nl>
+Date: 9 Dec 87 15:46:14 GMT
+Reply-To: ast at cs.vu.nl (Andy Tanenbaum)
+Organization: VU Informatica, Amsterdam
+Lines: 11
+
+
+I talked to P-H yesterday.  Version 1.2 of MINIX in 256K & 640K PC, 512K AT, 
+mag tape, and the IBM slipcase version with the abridged book are all
+in stock.  If it is of any consolation to the people who have had to wait
+and wait and wait, one of the corporate vice presidents was so unhappy
+about the poor service to customers that he fired the person who was in charge
+of managing the MINIX inventory.  He has been replaced by someone else who has 
+clear instructions to make sure it doesn't go out of stock again.  They are now
+shipping to everyone whose order got backlogged.
+
+Andy Tanenbaum (ast at cs.vu.nl)
+#! rnews 841
+Path: alberta!mnetor!uunet!mcvax!prlb2!lln-cs!gf
+From: gf at lln-cs.UUCP (Frank Grognet)
+Newsgroups: rec.games.misc,rec.games.frp,rec.games.board
+Subject: WARGAMING!
+Keywords: wargame,rule,figurine,game
+Message-ID: <796 at lln-cs.UUCP>
+Date: 9 Dec 87 15:19:13 GMT
+Organization: Computer Science Dept., Louvain-la-Neuve Belgium
+Lines: 11
+Xref: alberta rec.games.misc:1150 rec.games.frp:1652 rec.games.board:543
+
+
+	I want to start wargaming but I don't know how!
+
+I won't be playing wargames on a board, but with 15mm or 25mm
+figurines.
+I would like to find addresses in Europe (especially Belgium)
+of good figurine manufacturers and also references to rule
+books for the Napoleonic period.
+I am also interested in rules contained on the net or in files at
+other sites, if they exist!
+I anybody can help me, please reply to ..!mcvax!prlb2!lln-cs!gf
+#! rnews 1656
+Path: alberta!mnetor!uunet!mcvax!nikhefk!frankg
+From: frankg at nikhefk.UUCP (Frank Geerling)
+Newsgroups: comp.sys.atari.st
+Subject: Re: the perfect ram disk
+Keywords: ramdisk, resizeable, reset-survivable
+Message-ID: <294 at nikhefk.UUCP>
+Date: 9 Dec 87 19:53:23 GMT
+References: <427 at dukempd.UUCP>
+Reply-To: frankg at nikhefk.UUCP (Frank Geerling)
+Organization: Nikhef-K, Amsterdam (the Netherlands).
+Lines: 42
+
+In article <427 at dukempd.UUCP> gpm at dukempd.UUCP (Guy Metcalfe) writes:
+>I have Mike's Ramdisk v. .95, and like the idea of what it's trying to do.
+>It has a dialogue box as if it were resizable, but it's very buggy.  Could
+>someone send me a later version that works like it's dialogue implies it
+>should.  What I would like best of all is an eternal ram disk that I can
+>size up and down as I see fit, but which sizes down without letting me 
+>destroy any data I may have on the disk.  If anybody has and would send me
+>or knows where I could get such a beast, I would be grateful.  Thanks.
+>-- 
+>	Guy Metcalfe                            gpm at dukempd.uucp  
+
+
+Please send it to me too, I also have Mike's Ramdisk and the resize doesn't
+work it doesn't return allocated memory when you resize to a smaller amount
+of memory.
+
+Thanx in advance
+
+
+			   Frank Geerling
+			(frankg at nikhefk.uucp)
+
+
+Usenet:		{seismo, philabs, decvax}!mcvax!frankg at nikhefk
+
+Normal mail:	Frank Geerling
+		NIKHEF-K (DIGEL)
+		Postbus 4395
+		1009 AJ Amsterdam
+		The Netherlands
+
+			   Frank Geerling
+			(frankg at nikhefk.uucp)
+
+
+Usenet:		{seismo, philabs, decvax}!mcvax!frankg at nikhefk
+
+Normal mail:	Frank Geerling
+		NIKHEF-K (PIMU)
+		Postbus 4395
+		1009 AJ Amsterdam
+		The Netherlands
+#! rnews 2666
+Path: alberta!mnetor!uunet!mcvax!prlb2!kulcs!luc
+From: luc at kulcs.UUCP (Luc Van Braekel)
+Newsgroups: comp.lang.pascal
+Subject: Re: self-replicating programs?
+Summary: here is a self-replicating pascal program
+Message-ID: <1070 at kulcs.UUCP>
+Date: 9 Dec 87 08:31:27 GMT
+References: <1400 at tulum.swatsun.UUCP>
+Organization: Kath.Univ.Leuven, Comp. Sc., Belgium
+Lines: 37
+
+In article <1400 at tulum.swatsun.UUCP>, hirai at swatsun (Eiji "A.G." Hirai) writes:
+> 	In our recent ACM programming contest (regionals), one of the
+> problems was to write a self-replicating program.  That is, we had to
+> write a program whose output was itself, the source code.  No alterations
+> of the original code during execution was allowed (I think).
+> 	Does anyone have any code for this problem?  We have one but
+> it looks inelegant.  I've also see bery bery short Prolog code for this.
+> Help, we are looking for good codes to study!  And yes, the contest is
+> over (we ain't cheating).
+
+Here is a self-replicating Pascal program I wrote a few years ago.
+The program looks dirty but it works !
+
+program self (output);                                     
+var i,j: integer;                                          
+    a: array[1..8] of packed array[1..59] of char; begin   
+  a[1] := 'program self (output);                                     ';
+  a[2] := 'var i,j: integer;                                          ';
+  a[3] := '    a: array[1..8] of packed array[1..59] of char; begin   ';
+  a[4] := 'for i := 1 to 3 do writeln(a[i]);                          ';
+  a[5] := 'for i := 1 to 8 do begin write(''  a['',i:0,''] := '',chr(39));';
+  a[6] := 'for j := 1 to 59 do begin write(a[i][j]);if a[i][j]=chr(39)';
+  a[7] := 'then write(a[i][j]) end; writeln(chr(39),'';'') end;         ';
+  a[8] := 'for i := 4 to 8 do writeln(a[i]) end.                      ';
+for i := 1 to 3 do writeln(a[i]);                          
+for i := 1 to 8 do begin write('  a[',i:0,'] := ',chr(39));
+for j := 1 to 59 do begin write(a[i][j]);if a[i][j]=chr(39)
+then write(a[i][j]) end; writeln(chr(39),';') end;         
+for i := 4 to 8 do writeln(a[i]) end.                      
+
++-----------------------------------+------------------------------------+
+| Name   : Luc Van Braekel          |  Katholieke Universiteit Leuven    |
+| UUCP   : luc at kulcs.UUCP           |  Department of Computer Science    |
+| BITNET : luc at blekul60.bitnet      |  Celestijnenlaan 200 A             |
+| Phone  : +(32) 16 20 0656 x3563   |  B-3030 Leuven (Heverlee)          |
+| Telex  : 23674 kuleuv b           |  Belgium                           |
++-----------------------------------+------------------------------------+
+#! rnews 1678
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!zu
+From: zu at ethz.UUCP (Urs Zurbuchen)
+Newsgroups: comp.sys.ibm.pc
+Subject: Re: Oooh Yeccheo. How Does This One Really Work?!?
+Message-ID: <264 at bernina.UUCP>
+Date: 9 Dec 87 12:16:51 GMT
+References: <164300022 at uiucdcsb> <412 at wa3wbu.UUCP> <13091 at beta.UUCP> <1269 at phoenix.Princeton.EDU>
+Reply-To: zu at bernina.UUCP (Urs Zurbuchen)
+Organization: ETH Zuerich, CS Department, Switzerland
+Lines: 41
+
+In article <1269 at phoenix.Princeton.EDU> rjchen at phoenix.Princeton.EDU (Raymond Juimong Chen) writes:
+>In article <13091 at beta.UUCP> it was written:
+>What you'd probably want is something like
+>
+>AUTOEXEC.BAT:
+>  doit
+>
+>DOIT.BAT:
+>  copy \autoexec.ddd \autoexec.bat
+>  del \autoexec.ddd
+>  do other stuff
+>  reboot.
+>
+>AUTOEXEC.DDD:
+>  same as before
+
+You could the same thing without changing your AUTOEXEC.BAT. With the solution
+presented above you will execute the same second version of AUTOEXEC.BAT each
+time you reboot your machine (perhaps that's really what you want, but my
+imagination doesn't go that far. If so, just disregard this article).
+
+My solution: In the startup file you include the following:
+
+if exist <filename_like_gaga.gag_or_whatever_you_want_to_call_it> goto second
+<here included all the stuff you want executed when booted for the first time>
+echo gaga > <filename_like_gaga.gag_or_whatever_you_want_to_call_it>
+:second
+<now follows the rest of the story (i.e. your autoexec.ddd)>
+
+That's it. If you want to toggle between the two boot modes just add a line
+like:
+
+del <filename_like_gaga.gag_or_whatever_you_want_to_call_it>
+
+
+		I hope this will help anybody :-)
+
+			...urs
+
+
+UUCP: ...seismo!mcvax!cernvax!ethz!zu
+#! rnews 420
+Path: alberta!mnetor!uunet!mcvax!inria!irisa!michaud
+From: michaud at irisa.UUCP (Michaud Franck INSA BN205)
+Newsgroups: comp.protocols.tcp-ip
+Subject: virtual circuit
+Keywords: tcp, socket
+Message-ID: <202 at irisa.UUCP>
+Date: 9 Dec 87 20:05:21 GMT
+Organization: IRISA, Rennes (Fr)
+Lines: 7
+
+
+	I'd like to have a good definition of :
+- virtual circuit.
+
+ 	If you have a good definition, send me a mail.
+		thanck you.
+	franck
+#! rnews 758
+Path: alberta!mnetor!uunet!mcvax!enea!liuida!dat08
+From: dat08 at butterix.liu.se
+Newsgroups: rec.games.frp
+Subject: Re: New rules for AD&D
+Message-ID: <686 at butterix.liu.se>
+Date: 9 Dec 87 03:53:09 GMT
+References: <26788S9S at PSUVMA>
+Organization: CIS Dept, Univ of Linkoping, Sweden
+Lines: 11
+
+In article <26788S9S at PSUVMA> S9S at PSUVMA.BITNET (Steven A. Schrader) writes:
+>New Rules for TSR.   [...] Does anyone know when these rules will be out
+>and how much they will cost?
+
+According to Harold Johnson of TSR (at a local convention in Sweden) the new
+rules will be out in 89.
+ 
+BTW -- Any reactions about the new (again!) Gamma World? I haven't tried it
+yet but I like their idea of one-table-system for everything.
+ 
+Per Westling         dat08 at majestix.liu.se
+#! rnews 968
+Path: alberta!mnetor!uunet!mcvax!enea!tut!tolsun!reini
+From: reini at tolsun.oulu.fi (Jukka Reinikainen)
+Newsgroups: comp.sys.ibm.pc,comp.sources.wanted
+Subject: Hercules graphic characters
+Keywords: hercules, text, MASM, MSC
+Message-ID: <246 at tolsun.oulu.fi>
+Date: 8 Dec 87 15:32:30 GMT
+Organization: University of Oulu, Finland
+Lines: 14
+Xref: alberta comp.sys.ibm.pc:9576 comp.sources.wanted:2717
+
+
+ 
+Help wanted: how to create text in Hercules graphic mode?
+ 
+I have a program written in MSC (parts coded with MASM) which does
+quite nice things with grapichs but suffers lack of characters.
+According to my knowledge the only way to get characters in Herc graphic
+mode is to draw them on screen by lightning a set of pixels, right?
+ 
+Somebody *must* have written a program which draws characters and
+other symbols, so please help me.  C and/or ASM sources and/or ideas
+will be *very* appreciated.
+ 
+       >      Jukka Reinikainen         reini at tolsun.oulu.fi       <
+#! rnews 935
+Path: alberta!mnetor!uunet!mcvax!enea!liuida!andka
+From: andka at smidefix.liu.se (Andreas K}gedal)
+Newsgroups: rec.music.synth
+Subject: Yamaha CLP - pf question
+Keywords: Yamaha pf85 CLP300
+Message-ID: <687 at smidefix.liu.se>
+Date: 9 Dec 87 15:36:48 GMT
+Organization: CIS Dept, Univ of Linkoping, Sweden
+Lines: 13
+
+
+ I'm thinking of getting one of those new sampled pianos and would like
+to get som info. From the net and from my own experience in my local
+piano store, I've understood that the Yamaha Clavinova CLP 300 is
+a pretty good choise. But I seem to remember a rumor about something
+called Yamaha pf85 wich would be some kind of stageversion of the CLP 300.
+Has anyone seen it, played it, compared it with the CLP 300? What are the
+differences in price, sound, keyboard?
+
+My local pianopusher here in Sweden hadn't heard of it. Is this because
+it is so new or because it is a local phenomenon in the states?
+
+    /Andreas Kagedal
+#! rnews 2816
+Path: alberta!mnetor!uunet!mcvax!enea!ttds!draken!sics!erikn
+From: erikn at sics.se (Erik Nordmark)
+Newsgroups: comp.unix.questions
+Subject: Re: Need help with interprocess communications
+Keywords: Pipes, Ptys, Buffering, I/O
+Message-ID: <1639 at sics.se>
+Date: 9 Dec 87 21:21:43 GMT
+References: <8117 at steinmetz.steinmetz.UUCP>
+Reply-To: erikn at sics.UUCP (Erik Nordmark)
+Organization: Swedish Institute of Computer Science, Kista
+Lines: 60
+
+[[ I tried sending this as mail using different addresses, but failed! ]]
+
+In article <8117 at steinmetz.steinmetz.UUCP> you write:
+>
+>
+>I have tried using "fcntl(fd,F_SETFL,FASYNC)" as well as setting up an
+>interrupt handler to handle SIGIO signals (via "sigvec(2)"), and this works
+>fine when I'm reading from the terminal, but does not seem to work at all
+>when I try it from a pipe.
+>
+>
+>Well, the SIGIO handler works fine to detect input from places like stdin, but
+>never sees anything coming down the pipe.  When it gets invoked (generally
+>by me banging on the <RETURN> key causing an interrupt from stdin), it 
+>does find that there is data available in the pipe (as well as stdin) and
+>has no problem reading it.
+>
+>
+>Does anyone out there know how I can fix this problem?
+>
+
+>From looking at the BSD4.3 sources I found out the following:
+When a tty is opened the associated process group is set to
+that of the creator. The signals that the tty driver generate (e.g. caused
+by ^C) are sent to this process group.
+
+However, for sockets (a pipe is implemented as a pair of sockets in BSD4.3
+and maybe elsewhere!) the associated process group is not set automatically.
+
+So what you have to do is to set it before you can get ant SIGIO's! Use
+   int pgrp = getpid();
+   if (fcntl(fd, F_SETOWN, pgrp) == -1) {
+	perror("fnctl");
+	exit(1);
+   }
+or
+       ioctl(fd, SIOCSPGRP, &pgrp)	/* note: & */
+
+I think this should work even if pipes aren't implemented as a pair of
+sockets, but I haven't tried any of it.
+
+>Also:  Is there a way that I can determine WHICH file descriptor caused
+>a SIGIO interrupt to be invoked, or by which I can set up a different
+>interrupt handler for each descriptor?
+>
+
+See select(2). (Just a detail: select will tell you that there is data
+to read if there actually is data to read or if the other end(s) have
+closed the pipe. In the latter case read() will return an EOF - this
+stuff caused me some trouble before I read the *real* documentation -
+the OS source code!!)
+
+-------------------------------------------------------------------------
+Erik Nordmark
+Swedish Institute of Computer Science, Box 1263, S-163 13  SPANGA, Sweden
+Phone: +46 8 750 79 70	Ttx: 812 61 54 SICS S	Fax: +46 8 751 72 30
+
+uucp:	erikn at sics.UUCP or {seismo,mcvax}!enea!sics!erikn
+Domain: erikn at sics.se
+-------------------------------------------------------------------------
+#! rnews 2508
+Path: alberta!mnetor!uunet!mcvax!enea!luth!d2c-czl
+From: d2c-czl at sm.luth.se (Caj Zell)
+Newsgroups: rec.music.misc
+Subject: Re: Ace-Screamingest Guitar Solos on Record
+Keywords: guitar, flames (regrettably)
+Message-ID: <438 at psi.luth.se>
+Date: 9 Dec 87 14:51:22 GMT
+References: <1725 at s.cc.purdue.edu>
+Reply-To: Caj Zell <d2c-czl at psi.luth.se>
+Organization: University of Lulea, Sweden
+Lines: 44
+UUCP-Path: {uunet,mcvax}!enea!psi.luth.se!d2c-czl
+
+
+In article <1725 at s.cc.purdue.edu> rsk at s.cc.purdue.edu (Rich Kulawiec) writes:
+>I thought I'd make up a very hasty list of what I
+>thought were some of the best solos I've heard, and then ask y'all to
+>contribute further.
+
+Good idea,I love making up lists!
+
+>Money (Pink Floyd), David Gilmour
+>Cracked Actor (David Bowie), Earl Slick
+>Don't Take Me Alive (Steely Dan), Jeff 'Skunk' Baxter?
+>All Along the Watchtower Jimi Hendrix
+>Aqualung (Jethro Tull), Martin Barre
+>Highway 61, Johnny Winter
+
+Agree,but how about these:
+
+Muffin Man (Frank Zappa)              (I think FZ was the most underrated)
+Son of Mr. Green Genes (Frank Zappa)  (guitarist there ever has been.But,)
+Son of Orange County (Frank Zappa)    (he can't play anymore,too bad.    )
+Push Comes To Show (Van Halen) Eddie Van Halen
+Crossroads (Cream) Eric Clapton (The 2nd solo,of course)
+Astronomy (Blue \yster Cult) Donald Roeser (on "Some Enchanted Evening")
+Lazy (Deep Purple) Ritchie Blackmore
+Fat Time (Miles Davis) Mike Stern
+
+I know that when I get home I will kill myself for not adding more solos,
+but these are the ones I can think of without looking at my records.
+But maybe that's a good sign indicating that these are really my favourites.
+
+I'd be very glad to see some reactions on the list.
+
+
+      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+      X                                                            X
+      X                                                            X
+      X   Caj Zell                 	 ________________________  X
+      X   University of Lulea            :                      :  X
+      X   Sweden                         : Jazz is not dead,    :  X
+      X  				 : it just smells funny :  X
+      X   mail: d2c-czl at psi.luth.se	 : -Frank Zappa         :  X
+      X                                  :                      :  X
+      X                                  -----------------------:  X
+      X                                                            X
+      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+#! rnews 1389
+Path: alberta!mnetor!uunet!mcvax!enea!kuling!peterf
+From: peterf at kuling.UUCP (Peter Fagerberg)
+Newsgroups: comp.sys.mac
+Subject: More memory for Mac+...?
+Message-ID: <570 at kuling.UUCP>
+Date: 9 Dec 87 15:08:48 GMT
+Organization: DoCS, Uppsala University, Sweden
+Lines: 23
+
+
+Hello. I've been wondering how to get a little extra memory for my
+Macintosh Plus (needed in these days of Hypercard and Multifinder).
+
+I was wondering if the normal brute-force method could be used;
+  Just solder 1M memory chips on top of the existing one (piggyback)
+  and attach CS (chip-select) and whatever else is needed from the
+  adressbus to select the appropiate chip. I haven't really checked
+  out the memorychips but maybe an inverter is needed for some signals.
+
+  If I'm correctly informed there are 22 bit defining the adress on
+  a MC68000, making it possible to have 4M of memory.
+
+*If* this is possibly, would programs take advantage of it?
+
+Well, maybe this is one of the most stupid questions asked to USENET
+since it all began and if so - please forgive my ignorance...
+
+                                 Peter-- 
+==============================================================================
+Peter Fagerberg             UUCP: {seismo,enea,mcvax,decwrl,...}!kuling!peterf
+Applied Computer Science    ARPA: kuling!peterf at seismo.css.gov
+Uppsala University          Analog: +46 18-128286 or 8-102927
+#! rnews 1429
+Path: alberta!mnetor!uunet!mcvax!botter!klipper!biep
+From: biep at cs.vu.nl (J. A. "Biep" Durieux)
+Newsgroups: soc.culture.jewish
+Subject: Re: Jews in soc.culture.jewish?
+Message-ID: <958 at klipper.cs.vu.nl>
+Date: 10 Dec 87 09:07:28 GMT
+References: <4765 at spool.wisc.edu> <2086 at ucbcad.berkeley.edu> <2264 at encore.UUCP> <5779 at cisunx.UUCP> <2872 at sphinx.uchicago.edu> <5861 at cisunx.UUCP>
+Reply-To: biep at cs.vu.nl (J. A. "Biep" Durieux)
+Organization: VU Informatica, Amsterdam
+Lines: 23
+
+In article <5861 at cisunx.UUCP> dlhst at unix.cis.pittsburgh.edu.UUCP,
+	(David L. Heyman) writes:
+>Don't kid yourself.  the Constitution is one thing but reality is
+>another.  National Christmas tree, etc.
+                    ^^^^^^^^^^^^^^
+
+You are not trying to say that the US are German-mythological qua
+religion, are you? :-)
+
+No, but seriously: what does that tree have to do with Christianity?
+(Or, what does the mean US Christmas have to do with it at all - but
+that's another story)
+Is Santa Claus Christian? The Easter Bunny and its eggs?
+
+While I agree that the dates of these festivities originally come from
+the church, the things which are generally celebrated have no origin in
+Christian doctrine, and no one pretends so.
+
+Sorry if I offended anyone by this - I am not commenting on those who do
+use those times for prayer and as memorial days.
+-- 
+						Biep.  (biep at cs.vu.nl via mcvax)
+	To be the question or not to be the question, that is.
+#! rnews 1323
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!icdoc!ivax!shb
+From: shb at ivax.doc.ic.ac.uk (Simon Brock)
+Newsgroups: comp.sys.mac
+Subject: Re: uw/Multifinder?
+Message-ID: <146 at gould.doc.ic.ac.uk>
+Date: 9 Dec 87 10:08:38 GMT
+References: <174400085 at uxc.cso.uiuc.edu>
+Sender: news at doc.ic.ac.uk
+Reply-To: shb at doc.ic.ac.uk (Simon Brock)
+Organization: Dept. of Computing, Imperial College, London, UK.
+Lines: 22
+
+In article <174400085 at uxc.cso.uiuc.edu> dorner at uxc.cso.uiuc.edu writes:
+>
+>I can't get uw to work under Multifinder.  ...
+>I have an SE, and am running the latest system software (obviously).
+>I'm using uw version 4.1.
+>
+>Is anybody successfully using uw under Multifinder?
+Yes.  I'm using uw4.1 on an SE with System 4.1/Finder 6.0 and a beta version 
+of MF (1.0b6).  (As an aside, we can't get System Tools 5.0 in the UK until 
+early next year, unless you know different to me !)
+
+UW runs but I do character losses at 9600 baud.  I can't work out why, and
+I'm not convinced its UW's fault.  I wrote to John Bruner, the author, who
+says other people were reporting the same problem.
+
+				Simon.
+
+Simon H Brock, Dept. of Computing, Imperial College, London SW7 2AZ
+Tel	: 01 589 5111 x4993
+BitNet	: shb at doc.ic.ac.uk (or shb%uk.ac.ic.doc at AC.UK)
+UUCP	: shb at icdoc.uucp (...siesmo!mcvax!ukc!icdoc!shb)
+JANET	: shb at uk.ac.ic.doc
+#! rnews 1446
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!icdoc!cam-cl!am
+From: am at cl.cam.ac.uk (Alan Mycroft)
+Newsgroups: comp.lang.c
+Subject: Re: closing stdout
+Keywords: Yes it IS a buggy library
+Message-ID: <1115 at jenny.cl.cam.ac.uk>
+Date: 9 Dec 87 10:38:55 GMT
+References: <442 at cresswell.quintus.UUCP>
+Reply-To: am at cl.cam.ac.uk (Alan Mycroft)
+Organization: U of Cambridge Comp Lab, UK
+Lines: 19
+
+In article <442 at cresswell.quintus.UUCP> ok at quintus.UUCP (Richard A. O'Keefe) writes:
+>There's an old joke with the punch-line "We've already established what
+>you are, madam.  Now we're just haggling over the price."
+>		result = getchar();
+>		errno = 0;
+>		result = putc(result, stdin);
+>		printf("result = %d, errno = %d\n", result, errno);
+>The bug is that depending on where you are in the buffer, putc() MIGHT
+>notice the mistake, but it usually won't.
+>... the bug is a pretty fundamental one in the UNIX stdio implementation,
+Richard, The bug is not in the slightest bit fundamental and could be fixed
+in less than 1 day once and for all.  I have done it for a ANSI unix-like I/O
+library:
+Merely separate the _cnt field
+of struct FILE into a _icnt and an _ocnt, change getc/putc to use _icnt/_ocnt.
+Fix _filbuf/_flsbuf to use the right one, and to whinge when _icnt/_ocnt
+goes -ve when you expect the other one to.
+This for free also enables the library to police the "fflush/fseek between
+change of direction for I/O" restriction and avoids chaos there.
+#! rnews 1094
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!icdoc!cam-cl!lg
+From: lg at cl.cam.ac.uk (Li Gong)
+Newsgroups: soc.culture.china
+Subject: Change of Policy After Beginnig Signing Contrct ?
+Message-ID: <1114 at jenny.cl.cam.ac.uk>
+Date: 9 Dec 87 10:37:41 GMT
+Organization: U of Cambridge Comp Lab, UK
+Lines: 19
+
+
+   Is there anybody out there who has info about whether the Chinese
+government has changed the policy regarding students aboard and how
+it is changed, because from this April, all students sent by the
+government are asked to sign contracts between him/her and his/her
+institution.
+
+   What do these contracts mean ?  Does this imply that those who came
+out before this April (thus did not sign) then have a somewhat different
+status (for example, can not be asked to go back to carry out a certain
+contract) ?
+
+   E-mail to me and I'll summurize OR post to the newsgroup.  I believe
+there are other people who are also interested in this issue.
+
+                                    Martin
+-----------------------------------------------------------------------
+lg at uk.ac.cam.cl
+---------------
+#! rnews 1315
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!root44!cdwf
+From: cdwf at root.co.uk (Clive D.W. Feather)
+Newsgroups: rec.arts.sf-lovers
+Subject: Eric Frank Russell - was Re: Misc questionings
+Message-ID: <492 at root44.co.uk>
+Date: 9 Dec 87 15:03:01 GMT
+References: <362 at n8emr.UUCP> <2481 at pbhyf.UUCP>
+Reply-To: cdwf at root44.UUCP (Clive D.W. Feather)
+Organization: Root Computers Ltd, London, England
+Lines: 23
+
+In article <2481 at pbhyf.UUCP> djl at pbhyf.UUCP (Dave Lampe) writes:
+>In article <362 at n8emr.UUCP> lwv at n8emr.UUCP (Larry W. Virden) writes:
+>>
+>>5.	Finally, and perhaps most important.  I am looking for author and
+>>anthology names for a short story (perhaps longer than thtat?) called I 
+>>believe "MYOB".
+>>The title stands for "Mind Your Own Business".
+>
+>The story is in a book called "The Great Explosion" by Eric Frank
+>Russell in 1962. It is a collection of 3 or 4 stories telling
+>of an attempt by Earth to recontact colonies that had been lost
+>for a long time and that had evolved into unusual societies.
+
+I have come across "The Great Explosion", but I also have this part of it
+in a collection whose name I have forgotten, under the title "And then there
+were none.". Great story. THE BEST AUTHOR EVER.
+
+[Kill the line counter]
+[Kill Mel]
+[Keep Adric Dead]
+[Kill the line counter]
+[Kill Mel]
+[Keep Adric Dead]
+#! rnews 849
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!root44!cdwf
+From: cdwf at root.co.uk (Clive D.W. Feather)
+Newsgroups: sci.misc
+Subject: Re: Color
+Message-ID: <493 at root44.co.uk>
+Date: 9 Dec 87 15:46:24 GMT
+References: <162300002 at uiucdcsb> <162300004 at uiucdcsb>
+Reply-To: cdwf at root44.UUCP (Clive D.W. Feather)
+Organization: Root Computers Ltd, London, England
+Lines: 13
+
+
+Carl Kadie
+Inductive Learning Group
+University of Illinois at Urbana-Champaign
+writes:
+>ii.       There is "no such color" as purple! Mixing red and blue ink 
+>          causes your eye to react in a way which is not reproducible 
+>	  by any single wavelength of light.
+
+The eye can see colours (for example, in afterimages) that cannot be
+reproduced by any combination of wavelengths of light !
+There was an article in Scientific American c.1970 entitled "Phosphenes"
+that went into this.
+#! rnews 795
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!datlog!dlhpedg!cl
+From: cl at dlhpedg.co.uk (Charles Lambert)
+Newsgroups: rec.games.empire,comp.sources.bugs
+Subject: Re: conquest newsletter #3
+Message-ID: <330 at dlhpedg.co.uk>
+Date: 9 Dec 87 14:27:16 GMT
+References: <4886 at mhuxd.UUCP> <6899 at apple.UUCP>
+Sender: news at dlhpedg.co.uk
+Reply-To: cl at .co.uk (Charles Lambert)
+Organization: FSG at Data Logic Ltd, Queens House, Greenhill Way, Harrow, London.
+Lines: 8
+Xref: alberta rec.games.empire:292 comp.sources.bugs:563
+
+>In article <4886 at mhuxd.UUCP>, smile at mhuxd.UUCP (Edward Barlow) writes:
+>> 3) Still have not thought of a new name for the game.  Best so far is 
+>> 	<Midguard> (need to check spelling).  Comments?
+
+I've missed something here;  what was wrong with "conquest"?
+
+---------------
+Charlie Lambert
+#! rnews 819
+Path: alberta!mnetor!uunet!mcvax!weijers
+From: weijers at cwi.nl (Eric Weijers)
+Newsgroups: comp.lang.c++
+Subject: another error in vector.h 1.3
+Message-ID: <143 at piring.cwi.nl>
+Date: 10 Dec 87 13:27:06 GMT
+Organization: CWI, Amsterdam
+Lines: 22
+
+In "vector.h 1.3" the following definition of the X(X&) constructor
+is given:
+
+vector(type).vector(type)(vector(type)& a)
+{
+	register i = a.sz;
+	sz = a.sz; 			/* ADD THIS LINE */
+	v = new type[i];
+	register type* vv = &v[i];
+	register type* av = &a.v[i];
+	while (i--) *--vv = *--av;
+}
+
+You should add the indicated line in order to set the size of
+the new vector. If that is not done you get "vector index out of
+range" errors.
+
+I found two other errors in this header file, I posted
+earlier. If you are interested in them just send a reply (r).
+
+Eric Weijers.
+weijers at cwi.nl
+#! rnews 830
+Path: alberta!mnetor!uunet!mcvax!botter!klipper!biep
+From: biep at cs.vu.nl (J. A. "Biep" Durieux)
+Newsgroups: soc.culture.jewish
+Subject: Anything positive about Jewish genes? (Was: Jewish genetic diseases)
+Message-ID: <959 at klipper.cs.vu.nl>
+Date: 10 Dec 87 09:50:15 GMT
+References: <4362 at ig.ig.com> <4374 at ig.ig.com>
+Reply-To: biep at cs.vu.nl (J. A. "Biep" Durieux)
+Organization: VU Informatica, Amsterdam
+Lines: 12
+
+I suppose the exclusive intermarriage among Jews must also have
+spared them for many genetic diseases found among "the rest of us".
+Does anyone have any data on that?
+
+~~~
+I understand nobody is interested in discussing the Dead Sea scrolls?
+
+And nobody knows what the "Jewish region" in the far SE of Siberia is?
+~~~
+-- 
+						Biep.  (biep at cs.vu.nl via mcvax)
+	To be the question or not to be the question, that is.
+#! rnews 960
+Path: alberta!mnetor!uunet!mcvax!unido!ecrcvax!johng
+From: johng at ecrcvax.UUCP (John Gregor)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Old SF Shows
+Summary: Yet another show I can't remember the name of...
+Message-ID: <463 at ecrcvax.UUCP>
+Date: 9 Dec 87 13:57:35 GMT
+References: <04.Dec.87.11:29:45.GMT.ZZASSGL at UK.AC.UMRCC.CMS> <18784 at linus.UUCP> <1046 at bc-cis.UUCP> <19026 at linus.UUCP>
+Reply-To: johng at ecrcvax.UUCP (John Gregor)
+Organization: ECRC, Munich 81, West Germany
+Lines: 10
+
+There was a show on sometime between the late 70's and early 80's (1 season).
+And I can't remember the name.  It was actually two (or more) shows in one
+with each sub-show taking a fraction of the time slot.  One part was a 
+modern day dracula.  Another dealt with a society living underground.  They
+couldn't come up to the surface without special filters due to dust/pollution
+or some such.  Ring any bells?  It was NBC, I think.
+
+				John
+
+		johng%ecrcvax.UUCP at germany.CSNET
+#! rnews 756
+Path: alberta!mnetor!uunet!mcvax!botter!ark!maart
+From: maart at cs.vu.nl (Maarten Litmaath)
+Newsgroups: comp.bugs.4bsd
+Subject: Re: 4.3BSD: using control-m in .exrc file
+Summary: More ^V's are needed (won't the editor get enough of it ? :-)
+Keywords: 4.3bsd  .exrc  control-m ^V
+Message-ID: <1161 at ark.cs.vu.nl>
+Date: 10 Dec 87 18:44:07 GMT
+References: <133 at telesoft.UUCP>
+Reply-To: maart at cs.vu.nl (Maarten Litmaath)
+Organization: VU Informatica, Amsterdam
+Lines: 8
+
+Try preceding each ^M by *another* ^V (which in turn is escaped by ^V) !
+Type:
+	map , ^V^V^V^M^V^V^V^M^V^V^V^M
+
+BTW, death to emacs !
+-- 
+Time flies like an arrow, fruit flies |Maarten Litmaath @ Free U Amsterdam:
+like an orange.      (seen elsewhere) |maart at cs.vu.nl, mcvax!botter!ark!maart
+#! rnews 1079
+Path: alberta!mnetor!uunet!mcvax!inria!shapiro
+From: shapiro at inria.UUCP (Marc Shapiro)
+Newsgroups: comp.lang.c++
+Subject: Re: Is there a "real" C++ compiler available?
+Summary: There is a native C++, with debugger support
+Message-ID: <589 at inria.UUCP>
+Date: 10 Dec 87 17:55:27 GMT
+References: <2097 at ucbcad.berkeley.edu>
+Organization: INRIA, Rocquencourt. France
+Lines: 14
+
+In article <2097 at ucbcad.berkeley.edu>, faustus at ic.Berkeley.EDU (Wayne A. Christopher) writes:
+> [...].  Is there a C++
+> compiler available now that will compile directly into asm
+> code, instead of into C?  Alternatively, is there a good way
+> to use dbx with C++ programs (i.e, using the c++ source instead
+> of the c files)?  
+
+The answer to both questions is yes.  The Free Software Foundation (you
+know, the GNU Emacs people) will distribute (soon?) a modified version of
+their C compiler which does C++.  Their debugger GDB (a dbx-lookalike) knows
+how to handle it.
+
+I haven't used either of these so I have no opinions to whether they are
+in any way adequate.  Just passing useful information along.
+#! rnews 1269
+Path: alberta!mnetor!uunet!mcvax!enea!ttds!draken!zap
+From: zap at draken.nada.kth.se (Svante Lindahl)
+Newsgroups: comp.os.misc,comp.unix.wizards
+Subject: Re: Command interfaces
+Message-ID: <239 at draken.nada.kth.se>
+Date: 10 Dec 87 04:54:11 GMT
+References: <1257 at boulder.Colorado.EDU> <6840002 at hpcllmv.HP.COM> <9555 at mimsy.UUCP> <798 at rocky.STANFORD.EDU> <432 at cresswell.quintus.UUCP> <3161 at psuvax1.psu.edu> <5565 at oberon.USC.EDU>
+Reply-To: zap at nada.kth.se (Svante Lindahl)
+Organization: The Royal Inst. of Techn., Stockholm
+Lines: 21
+Xref: alberta comp.os.misc:340 comp.unix.wizards:5748
+
+In article <5565 at oberon.USC.EDU> blarson at skat.usc.edu (Bob Larson) writes:
+#For example, how would you do the equivelent of this in unix:
+#
+#cmpf *>old>@@.(c,h) == -report ==.+cmpf -file
+
+I can do it using either /bin/sh or csh, but it does require more
+typing than in Primos. The test for existence of the file is not
+necessary so these examples could be simplified at the expense of
+risking a few error messages to the terminal.
+
+C-shell:
+% foreach i (`cd old; ls *.[ch]`)
+> if (-r $i) diff -c old $i > $i.cmpf
+> end
+
+Bourne-shell:
+$ for i in `cd old; ls *.[ch]` ; do
+> if [ -r $i ] ; then diff -c old $i > $i.cmpf ; fi
+> done
+
+Svante Lindahl	    zap at nada.kth.se	uunet!nada.kth.se!zap
+#! rnews 2030
+Path: alberta!mnetor!uunet!mcvax!enea!ttds!draken!sics!lhe
+From: lhe at sics.se (Lars-Henrik Eriksson)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: ST:TNG posters, GET OUT!
+Keywords: Why
+Message-ID: <1640 at sics.se>
+Date: 10 Dec 87 11:50:40 GMT
+References: <5226 at zen.berkeley.edu> <2011 at charon.unm.edu>
+Reply-To: lhe at sics.se (Lars-Henrik Eriksson)
+Organization: Swedish Institute of Computer Science, Kista
+Lines: 32
+
+In article <2011 at charon.unm.edu> cs3631cg at hydra.UUCP (Mark Giaquinto) writes:
+>Two points here, interesting is a *very* relative term, what is
+>interesting to you may not be to me and  visa versa.  Secondly I
+>agree, that if you have a ST posting put it in the header, for people
+>who don't want to read this stuff.
+>
+>>If there was no group for star trek fans to converse in without pestering
+>>the rest of the sf world, I would just have to sit here and suffer, but
+>>that's not the case.  Rec.arts.startrek is alive and well.  There is no
+>>reason beyond sheer orneryness to post to sf-lovers as well.  Arguments that
+>>star trek is sci-fi as well are pointless.  The simple fact is that there is
+>>newsgroup for all of you to communicate in, and if the rest of us wanted to
+>>listen, then we would.
+>
+>Well startrek is sf and I don't see how that arguement is pointless.
+
+I have only the faintest interest in the ST stuff and I would prefer it
+to be posted elsewhere, although I am not particularly bothered either.
+
+I think the interesting question is: WHY DO WE HAVE DIFFERENT NEWSGROUPS??
+
+I always thought it was to organize postings by subject and because different
+people are interested in different things.
+
+If you argue that ST postings could as well be made to rec.arts.sf-lovers
+rather than to the special ST newsgroup, you could just as well argue
+that we only need one newsgroup on the entire net: general.general.general.
+
+Lars-Henrik Eriksson				Internet: lhe at sics.se
+Swedish Institute of Computer Science		Phone (intn'l): +46 8 750 79 70
+Box 1263					Telefon (nat'l): 08 - 750 79 70
+S-164 28  KISTA
+#! rnews 1007
+Path: alberta!mnetor!uunet!mcvax!enea!tut!mk59200
+From: mk59200 at tut.fi (Kolkka Markku Olavi)
+Newsgroups: comp.sources.bugs
+Subject: Re: PC Nethack 2.2 bugs + help wanted linking
+Summary: Inventory display problems
+Message-ID: <522 at fuksi.tut.fi>
+Date: 10 Dec 87 13:32:40 GMT
+References: <492 at silver.bacs.indiana.edu> <5253 at zen.berkeley.edu>
+Reply-To: mk59200 at fuksi.UUCP (Kolkka Markku Olavi)
+Organization: Tampere University of Technology, Finland
+Lines: 13
+
+I have successfully compiled and linked Nethack using MSC 4.0
+and it looks great, exept in a few points.  The inventory
+display is spread all over the screen if there aren't enough
+items to force a full-screen display.  It seems that after 
+printing each line the cursor is moved one step down, but
+it doesn't move left to the right place.
+
+Also, when I teleport away from an unlit room, some quote characters
+are left behind around the place I was in.
+
+Markku Kolkka at Tampere University of Technology, Finland
+mk59200 at tut.fi
+...mcvax!tut!mk59200
+#! rnews 811
+Path: alberta!mnetor!uunet!mcvax!enea!tut!tolsun!jto
+From: jto at tolsun.oulu.fi (Jarkko Oikarinen)
+Newsgroups: comp.sys.amiga,rec.games.misc
+Subject: 'Real' controllers for Flight Simulator II
+Keywords: Controllers, Flight Simulator
+Message-ID: <247 at tolsun.oulu.fi>
+Date: 10 Dec 87 16:47:22 GMT
+Organization: University of Oulu, Finland
+Lines: 15
+Xref: alberta comp.sys.amiga:11680 rec.games.misc:1151
+
+
+  I am interested in finding any information about 'real' controllers
+for Amiga's Flight Simulator II program. ie. similar controllers
+that are used in real airplanes. 
+
+Please mail your responses because I don't read this group regularly.
+
+-- 
+========================================
+Jarkko Oikarinen   mcvax!tut!oulu!jarkko
+                   jarkko at tolsun.oulu.fi
+========================================
+#! rnews 913
+Path: alberta!mnetor!uunet!mcvax!inria!imag!pierre
+From: pierre at imag.UUCP (Pierre LAFORGUE)
+Newsgroups: comp.protocols.appletalk
+Subject: NCSA TELNET bug with foreign MacSE or MacII keyboards
+Message-ID: <2331 at imag.UUCP>
+Date: 10 Dec 87 08:08:19 GMT
+Reply-To: pierre at imag.UUCP (Pierre LAFORGUE)
+Organization: IMAG, University of Grenoble, France
+Lines: 11
+
+NCSA Telnet is really a must, but ...
+on a Mac SE and a Mac II, NCSA Telnet 2.0 forces an american keyboard, in a
+permanent manner (it remains after exiting telnet, until the next Macintosh
+reboot). It is very painful when you use, for instance, a french keyboard:
+not only you have to remember to type Q for A, and so on, but you cannot
+type for example a Control-Z under telnet.
+[On a Macintosh +, one do not loss its keyboard]
+
+Is this bug fixed in the last version ?
+-- 
+Pierre Laforgue       pierre at imag.imag.fr      {uunet.uu.net|mcvax}!imag!pierre 
+#! rnews 490
+Path: alberta!mnetor!uunet!mcvax!diku!sergej
+From: sergej at diku.UUCP (S|ren O. Jensen)
+Newsgroups: sci.math.stat
+Subject: The SAS package
+Message-ID: <3570 at diku.UUCP>
+Date: 10 Dec 87 14:03:31 GMT
+Organization: DIKU, U of Copenhagen, DK
+Lines: 7
+
+
+Is the SAS package available for UNIX-systems? We are currently using the
+package on a old IBM machine but would like to change this machine to
+something newer - preferably a UNIX-machine.
+-- 
+----
+S|ren Oskar Jensen ({sergej,postmaster}@diku)
+#! rnews 2766
+Path: alberta!mnetor!uunet!mcvax!diku!iesd!jacob
+From: jacob at iesd.uucp (Jacob stergaard B{kke)
+Newsgroups: comp.arch
+Subject: job search, Comp. eng.
+Summary: I'm looking for a job
+Keywords: Job, Computer. eng., Computer. sci., M.S.
+Message-ID: <172 at iesd.uucp>
+Date: 10 Dec 87 12:00:17 GMT
+Reply-To: jaaob at iesd.UUCP (Jacob \stergaard B{kke)
+Organization: Dept. of Comp. Sci., Aalborg University, Denmark (student)
+Lines: 68
+
+I'm looking for a job in Computer Engineering to begin around July
+1988. I'm getting my Master of Science in Computer Engineering June
+1988 and at present holding a degree equal to BS in Electronic
+Engineering. My BS studies have included:
+	
+	Computer hardware (hands-on knowledge with mc68k),
+	Analog electronic 
+	Control engineering (analog and digital control)
+
+My MS studies have included:
+
+	Software development (man-machine interface, what people want
+			      from programs) 
+	Compiler construction (an expertsystem shell) 
+	Program environment (for CCS programming) 
+	Distributed operating systems (in UNIX)
+ 	Compiler mapping object-oriented language on parallel computers
+
+Furthermore I do have experience in conventional programming (PASCAL,
+C, postscript, UNIX (awk, shell-scripts(C-shell) and yacc/lex) (and Basic)),
+functional programming (LISP and ML) and logical programming (Prolog)
+and knowledge about object-oriented programming. And I have also attended 
+courses in VLSI design, databases, etc. I have been working with CDC under 
+NOS/Telex, VAX 11/750 under Ultrix, SUN 3 under Sun OS 4.3 (UNIX), MacIntosh 
+(LISA) under Finder and IBM S36 under IBM property operating system.  
+
+My spoken English is excellent and my written English is satisfactory,
+good knowledge of the Scandinavian languages (Danish (of course),
+Swedish and Norwegian), some speaking and reading knowledge of German
+and limited knowledge of French and Spanish (and Latin). 
+
+I have 5 years experience in group project work in engineering and
+computer scinence areas, broad social interest, good health.
+
+My interest include computer hardware and software, operating system
+design, expertsystems, distributed, concurrency and teaching.
+
+I'm open on location (outside Denmark) but I have relatives or other
+reasons to be especially intereted in:
+
+	Canada (British Colombia or Toronto)
+	USA (New England or Pacific Coast)
+	Pacific (New Zealand or Oceania)
+	Thailand
+	Scotland (Highlands)
+
+I'll look forward to any reponds.
+
+		Yours sincerely
+			
+			Jacob Baekke, Denmark
+
+For further information:
+
+Reply to:     	jacob at iesd.uucp, {...}!mcvax!diku!iesd!jacob  or
+		 
+at Univ:	Jacob Baekke 
+		S9D (in spring S10)
+		Strandvejen 19
+		AUC
+		DK--9000 Aalborg
+		Denmark
+
+private:	Jacob Baekke
+		Davids Alle 48
+		DK--9000 Aalborg
+		Denmark
+		Tel. 45-(0)8102673
+#! rnews 867
+Path: alberta!mnetor!uunet!mcvax!diku!dde!jk
+From: jk at dde.uucp (Jens Kjerte)
+Newsgroups: comp.sources.wanted
+Subject: Re: Wanted: Microemacs part 8
+Message-ID: <281 at Aragorn.dde.uucp>
+Date: 10 Dec 87 09:27:24 GMT
+References: <166 at iesd.uucp>
+Reply-To: jk at dde.uucp (Jens Kjerte)
+Organization: Dansk Data Elektronik A/S, Herlev, Denmark
+Lines: 15
+
+In article <166 at iesd.uucp> torbennr at neumann.UUCP (Torben N. Rasmussen) writes:
+>
+>Could someone please send me part 8 of the sources for Microemacs.
+>
+
+Me too!
+
+It seems as if part8 never reached Denmark.
+
+-- 
+
++---------------------------------------------------------------------------+
+|   Jens Kjerte  @ Dansk Data Elektronik A/S, Systems Software Department   |
+|   E-mail:      ..!uunet!mcvax!diku!dde!jk  or  jk at dde.uucp                |
++---------------------------------------------------------------------------+
+#! rnews 512
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!solaris!wyle
+From: wyle at solaris.ifi.ethz.ch@relay.cs.net (Mitchell Wyle)
+Newsgroups: comp.lang.modula2
+Subject: modula-2 pretty-printer
+Keywords: pretty-printer
+Message-ID: <195 at solaris.ifi.ethz.ch@relay.cs.net>
+Date: 9 Dec 87 21:56:57 GMT
+Organization: SOT sun cluster, ETH Zuerich
+Lines: 7
+
+Did anyone ever get the m2pp program to work on Sun Modula-2?
+
+Does anyone have a different Modula-2 pretty-printer (perhaps better)?
+
+Thanks,
+
+Mitch Wyle  (wyle at ethz.uucp)
+#! rnews 1762
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!zu
+From: zu at ethz.UUCP (Urs Zurbuchen)
+Newsgroups: comp.emacs
+Subject: Re: Has uemacs 3.9 solved the file save bug?
+Message-ID: <265 at bernina.UUCP>
+Date: 10 Dec 87 07:21:02 GMT
+References: <3056 at pegasus.UUCP>
+Reply-To: zu at bernina.UUCP (Urs Zurbuchen)
+Organization: ETH Zuerich, CS Department, Switzerland
+Lines: 30
+
+In article <3056 at pegasus.UUCP> avi at pegasus.UUCP (XMPE40000-Avi E. Gross;LZ 3C-314;6241) writes:
+>
+>I haven't compiled the new micro emacs since I have a MSC compiler, which is
+>not fully supported.
+
+This is simply NOT TRUE. I am also working with MSC (version 4.0) and had only
+one minor problem when I compiled MicroEmacs 3.9e (the latest version which
+was posted on Usenet). This problem relates to the Subshell spawning. But if
+you know just a little bit of C, there is no problem to fix it (add a routine
+specific to MSC). Some time ago, there was even a posting in comp.sources.bugs
+describing all the necessary steps to do that.
+
+>I have been having a very annoying problem with the
+>older version, and am wondering if it has been fixed, or if someone has a
+>work around. I am used to saving my files regularly with ^X^S, and then
+>sometimes quiting with ^X^C. Unfortunately, uemacs will quit before
+>completing the writing of the file, leaving me with only a small piece of
+>the file. 
+
+I am sure you enable breaking with ^C (either in config.sys or in autoexec.bat)
+Turn this off, and all your problems have gone :-)
+I know this is not the solution to this problem we all want to have. Perhaps
+you can do it with signal(). If not you have to included a function of your own
+which intercepts the break vector of MS-DOS.
+
+
+		Have a nice day,
+		      ...urs
+
+UUCP: ...seismo!mcvax!cernvax!ethz!zu
+#! rnews 2164
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!ceb
+From: ceb at ethz.UUCP (Charles Buckley)
+Newsgroups: comp.lang.lisp
+Subject: Re: lisp environments summary -- program storage methods
+Message-ID: <266 at bernina.UUCP>
+Date: 10 Dec 87 23:08:38 GMT
+References: <613 at umbc3.UMD.EDU> <325 at siemens.UUCP> <323 at spar.SPAR.SLB.COM> <329 at siemens.UUCP> <13253 at think.UUCP>
+Organization: ETH Zuerich, Switzerland
+Lines: 30
+In-reply-to: barmar at think.COM's message of 9 Dec 87 03:18:01 GMT
+
+Posting-Front-End: GNU Emacs 18.41.2 of Mon Sep 14 1987 on bernina (berkeley-unix)
+
+
+In article <329 at siemens.UUCP> steve at siemens.UUCP (Steve Clark) writes:
+>  I maintain that the non-Interlisp systems are wrong, however.  It
+>is clearly more advanced to treat a file as a database of definitions of
+>functions, data, structures, etc. than to treat it as a string of characters
+>that might have been typed at the keyboard.  However, since the rest of the
+>world hasn't caught up yet, there are bound to be incompatibilities.
+
+(Character) file storage is simply more flexible.  The form in which
+information is stored must be the most flexible possible, or you lose
+information.  The D-crate's pitching of conditionals is simply the
+manifestation of this.
+
+Proponents of restrictive protocols for information storage really ask
+"the world" to change to fit the protocol model.  In science, models
+change to fit the data, not the other way round (unless you cheat).
+To me, browbeating eventual non-conformists into "catching up" by
+labeling the a model as "advanced" is just a form of negative
+motivation.  All the lousy places I have ever worked ran on negative
+motivation, none of the good ones.  If your model *is* really worth
+using, and you can communicate its value, you will not need such
+tactics. 
+
+Interactively defined functions?  Haven't typed one in *years* -
+that's what scratch buffers are for (in case I want to change a
+*character* or two, or later save it.).
+
+Any mouse-based gadgets you can point to in Interlisp can be recreated
+for a text editor working on correctly parsed Lisp code.  May  take
+execution time, but if this is prohibitive, your function is probably
+too large. 
+#! rnews 2319
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!jha
+From: jha at its63b.ed.ac.uk (J Andrews)
+Newsgroups: rec.games.frp
+Subject: Fantasy Philosophy
+Keywords: wackafoo
+Message-ID: <824 at its63b.ed.ac.uk>
+Date: 10 Dec 87 14:30:15 GMT
+Reply-To: jha at lfcs.ed.ac.uk (J Andrews)
+Organization: Univ. of Edinburgh Dept. of Computer Science
+Lines: 38
+God: Kate Bush
+
+Least-favourite-subject: domain theory
+
+
+
+     Those interested in the issues surrounding the mechanics and
+philosophy of fantasy worlds should read Tolkien's (non-fiction)
+essay "On Fairy-Stories".  It appears in the collections _Tree and
+Leaf_ and _The Tolkien Reader_.
+
+     One of the main ideas behind it is that the fantasy author or
+story-teller is a "sub-creator", who tries to create a "secondary
+belief" (rather than exactly a "willing suspension of disbelief")
+in the reader.  In the fantasy that works, the reader should be
+able to enter the world every time she picks up the book, and not
+be aware of the world as being constructed by the author.  This
+involves not only internal consistency, but a lack of gimmickry.
+
+     For instance, in _Lord of the Rings_ I was never aware of
+anything being in the world gratuitously.  (Others may differ! :-))
+In _The Sword of Sha-Na-Na_ (sic)(sick?), on the other hand, I was
+very aware of the Elfstones as being just a gimmick to get the
+characters out of tight spots.  Sure it was internally consistent
+(the Elfstones only had any effect in times of direst need for
+their holders), but the hand of the author was clearly visible.
+
+     Similarly, applying it to FRPG's, the magic system in AD&D is
+certainly internally consistent (to the extent that it is described),
+but just doesn't "work" for me.  Having MU's able to remember several
+copies of a spell, but forgetting it when the last copy is cast, is
+obviously a gimmick to limit the number of spells an MU can use.
+
+     So I guess the moral of all this for FRPG or module designers
+is that it's best to start out with a few basic assumptions and build
+up your world from them by fairly believable steps, and if you can't
+avoid ending up with something really hairy, then change one of your
+assumptions rather than put in quick kludges.  (Gee, sounds like
+software engineering! :=))
+
+--Jamie.
+  jha at uk.ac.ed.lfcs
+"Switch off the mind and let the heart decide"
+#! rnews 1818
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!db
+From: db at its63b.ed.ac.uk (D Berry)
+Newsgroups: comp.windows.x
+Subject: Questions about implementing the X toolkit.
+Message-ID: <825 at its63b.ed.ac.uk>
+Date: 10 Dec 87 17:28:06 GMT
+Reply-To: db at lfcs.ed.ac.uk (Dave Berry)
+Organization: LFCS, University of Edinburgh
+Lines: 25
+
+1)  Does anyone, preferably in the UK or Europe, have a copy of the new
+X toolkit interface definition I can get by ftp?
+
+2)  I'm considering implementing the X toolkit in Standard ML.  Are there any
+constraints on what I should include or exclude?  The documentation mentions
+implementation in different languages, but doesn't say much about what this
+means.  Is the idea to provide the same functions, with the same names and
+functionality, in each language?  What about languages that have automatic
+storage management or automatic creation of objects, etc?  How far can I
+deviate from the documentation & still use the name "X Toolkit"?
+
+3)  Is the toolkit definition limited to the intrinsics, or are toolkits
+expected to provide a standard class hierarchy?
+
+4)  Is there any relation between the InterViews toolkit, the Xr, Sx &
+DEC toolkits provided with X version 10R4, and the current X toolkit?
+
+5)  If I go ahead, my first implementation will be a prototype, on top of X
+version 10R4.  This is because someone else is working on porting X version 11
+to Standard ML, and I want a simple windowing system I can use fairly quickly.
+I hope the prototype will make implementing a full version reasonably
+straightforward.  I will probably ignore the resource manager, since I'll get
+that for free when the full Xlib is implemented.  I'll also ignore colour for
+the time being, and only implement devices (widgets) I'm immediately interested
+in.  Is there anything else I can obviously ignore?
+#! rnews 1113
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!csw
+From: csw at eagle.ukc.ac.uk (C.S.Welch)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Word processors are: [was Re: Pournelle's Problems]
+Message-ID: <4065 at eagle.ukc.ac.uk>
+Date: 10 Dec 87 18:42:09 GMT
+References: <1915 at haddock.ISC.COM>
+Reply-To: csw at ukc.ac.uk (C.S.Welch)
+Organization: Computing Lab, University of Kent at Canterbury, UK.
+Lines: 20
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+
+Some (possibly) timely information from a course entitled "The Art of
+Communication for Engineers" that I'm on this week.
+
+From one of the handouts :-
+
+"Word processors: research has shown that when writers use pen and paper
+ alone, their thoughts and information tend to have better planning and
+ organisation. When using word processors alone, writers tend to plan
+ on a more surface level, focussing on such aspects as word choice, sentence
+ structure, and spelling"
+
+It goes on to recommend starting with pen and paper and graduating to WP's
+after the first draft has been written.
+
+I trust that this may have been of some interest.
+
+Chris Welch
+Cranfield Institute
+U.K.
+#! rnews 1286
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!icdoc!qmc-cs!pd
+From: pd at cs.qmc.ac.uk (Paul Davison)
+Newsgroups: rec.music.misc
+Subject: Re: Another Day : by Peter Gabriel and Kate Bush
+Message-ID: <352 at sequent.cs.qmc.ac.uk>
+Date: 10 Dec 87 12:58:25 GMT
+References: <1987Dec8.154517.11828 at gpu.utcs.toronto.edu>
+Reply-To: pd at qmc.ac.uk (Paul Davison)
+Organization: Computer Science Dept, Queen Mary College, University of London, UK.
+Lines: 22
+
+
+I've heard of this as well, but I have never found it. It's a pity
+because I would really like to hear it, so if anyone has got it please
+let me know as well!!
+
+As an aside, Roy has a new album out early next year, probably January.
+
+Paul.
+
+PS Your internal newsgroup "tor.general" shouldn't have been on the
+newsgroups line really, because nobody else has heard of it!
+-- 
+--
+Paul Davison
+
+UUCP:      pd at qmc-cs.uucp   or       ...seismo!mcvax!ukc!qmc-cs!pd
+Internet:  pd at cs.qmc.ac.uk              Post:   Dept of Computer Science
+JANET:     pd at uk.ac.qmc.cs                      Queen Mary College
+Easylink:  19019285                             University of London
+Telex:     893750 QMCUOL G                      Mile End Road
+Fax:       +44 1 981 7517                       London E1 4NS
+Voice:     +44 1 980 4811  x3950                England
+#! rnews 786
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!craig
+From: craig at comp.lancs.ac.uk (Craig)
+Newsgroups: comp.sys.mac
+Subject: MAC II Debuggers
+Keywords: Development, MacII Debuggers
+Message-ID: <457 at dcl-csvax.comp.lancs.ac.uk>
+Date: 9 Dec 87 13:36:01 GMT
+References: <687 at howtek.UUCP> <3456 at husc6.harvard.edu>
+Reply-To: craig at comp.lancs.ac.uk (Craig)
+Organization: Department of Computing at Lancaster University, UK.
+Lines: 11
+
+Having found out that Macsbug 5.5  works well with the MAC II, 
+how do I get a copy ?
+
+
+Craig.
+
+-- 
+UUCP:	 ...!seismo!mcvax!ukc!dcl-cs!craig| Post: University of Lancaster,
+DARPA:	 craig%lancs.comp at ucl-cs          |	  Department of Computing,
+JANET:	 craig at uk.ac.lancs.comp           |	  Bailrigg, Lancaster, UK.
+Phone:	 +44 524 65201 Ext. 4476   	  |	  LA1 4YR
+#! rnews 1070
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!strath-cs!jml
+From: jml at cs.strath.ac.uk (Joseph McLean)
+Newsgroups: sci.math
+Subject: concatenation making primes
+Message-ID: <756 at stracs.cs.strath.ac.uk>
+Date: 9 Dec 87 12:47:19 GMT
+Reply-To: jml at cs.strath.ac.uk (Joseph McLean)
+Organization: Comp. Sci. Dept., Strathclyde Univ., Scotland.
+Lines: 14
+
+
+tege at nada.kth.se replied by e-mail to my original posting which asked
+if it is always possible to append digits to a positive number in order
+to make a prime. Unfortunately, his address is one of those I can't
+reach, and so I thought I'd kill two birds with one stone and post
+another article.
+  His argument is very simple, using the Prime Number Theorem to give
+an approximation to the number of primes between x.10^n and
+x.10^n+10^n-1 (which is the same problem I asked but translated to
+mathematics) which shows that as n -> inf, this number of primes also
+goes to infinity. A very simple argument that proves you can always
+append digits to make any number into a prime. Great stuff.
+
+      jml, the mad mathematician.
+#! rnews 1275
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!root44!miduet!misoft!tait
+From: tait at gec-mi-at.co.uk (Philip Tait)
+Newsgroups: comp.sys.ibm.pc,comp.sources.wanted
+Subject: Re: Wanted: PC Checkbook Software
+Summary: Continental Software's Home Accountant Plus
+Keywords: Checkbook
+Message-ID: <800 at gec-mi-at.co.uk>
+Date: 9 Dec 87 17:34:03 GMT
+References: <985 at mhuxh.UUCP>
+Sender: news at gec-mi-at.co.uk
+Reply-To: tait at gec-mi-at.co.uk (Philip Tait)
+Organization: Marconi Instruments Ltd., St. Albans, UK
+Lines: 15
+Xref: alberta comp.sys.ibm.pc:9577 comp.sources.wanted:2719
+
+In article <985 at mhuxh.UUCP> vxb at mhuxh.UUCP (Vern Bradner) writes:
+>
+>Can anyone suggest a PC checkbook program?
+
+I use Home Accountant Plus by Continental Software. The (legit.) version I use
+was originally bundled with the Columbia MPC, so it had to be 'unprotected'
+and altered to remove some hardware dependencies. (Incidentally, this made
+it possible to compile it with QuickBasic - essential if you're impatient
+like me!)
+
+I've found it reasonably secure and well-featured.
+
+| Philip J. Tait, Marconi Instruments Ltd. | St. Albans, Herts. AL4 0JN, U.K. |
+| UUCP: ...mcvax!ukc!hrc63!miduet!tait	   | NRS : tait at gec-mi-at.co.uk	      |
+| Voice: +44 727 36421 x4549 Telex: 297221 | Fax: +44 727 39447		      |
+#! rnews 1059
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!idec!kbsc!yorick
+From: yorick at kbsc.UUCP (Yorick Phoenix)
+Newsgroups: comp.os.cpm,comp.sources.wanted
+Subject: Kermit for MP/M
+Message-ID: <888 at kbsc.UUCP>
+Date: 7 Dec 87 17:23:21 GMT
+Organization: The Knowledge-Based Systems Centre, London, UK
+Lines: 16
+Xref: alberta comp.os.cpm:1030 comp.sources.wanted:2720
+
+I have a friend who is trying to transfer some files off of an Micromation
+MP/M system.
+
+He has so far moved the standard "Generic" CP/M Kermit (slowly) to the MP/M
+machine but it doesn't seem to work correctly.
+
+Has anybody ever managed to get Kermit to work under M/PM?  Is there a simple
+set of differences between C/PM kermit and M/PM Kermit.  We have the full
+source code for C/PM Kermit.
+
+	Yorick Phoenix
+-- 
++------------------------------------------+ The Knowledge-Based Systems Center
+|  yorick at kbsc.UUCP                        | 58 Northside, Clapham Common
+|  ..mcvax!ukc!{idec,hrc63}!kbsc!yorick    | LONDON   SW4 9RZ   England
++------------------------------------------+ Voice: +44 1 350 1622
+#! rnews 1946
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!root44!gwc
+From: gwc at root.co.uk (Geoff Clare)
+Newsgroups: comp.unix.questions
+Subject: Re: rmail under HP-UX   (was Re: Using RMAIL under HPUX)
+Summary: RISC architecture
+Keywords: RISC, HP-UX
+Message-ID: <495 at root44.co.uk>
+Date: 10 Dec 87 13:58:20 GMT
+References: <8711251805.AA02481 at mitre-bedford.ARPA> <3720010 at hpsemc.UUCP> <3631 at xanth.cs.odu.edu>
+Reply-To: gwc at root44.UUCP (Geoff Clare)
+Organization: Root Computers Ltd, London, England
+Lines: 31
+
+>In article <3720010 at hpsemc.UUCP>, bd at hpsemc.UUCP (bob desinger) writes:
+>> Here's how it is on our HP-UX system, a model 840:
+
+>> drwxrwxr-x   2 bin      mail        1024 Nov 25 18:45 /usr/mail
+>> -rwxr-sr-x   2 root     mail      137216 Oct  2 00:00 /bin/rmail
+
+>Wow!  Why is rmail so BIG?  What does HP-UX rmail do that SMAIL 2.5
+>doesn't?  Contrast the size of this rmail with various executables
+>found on our 4.3 BSD system.
+
+>-rwxr-xr-x  2 root     staff       35840 Nov  3 07:02 /bin/rmail (SMAIL 2.5)
+>-rwxr-xr-x  1 root     staff      104448 Jun  5  1986 /lib/ccom (C compiler)
+>-rwxr-xr-x  1 root     staff       97280 Dec  5 05:17 /usr/local/carmen (Lisp)
+>-rwsr-xr-x  1 root     staff      100352 Apr  5  1987 /usr/lib/sendmail
+
+The HP840 is a RISC architecture machine.  Reduced instruction set implies
+more instructions required to do the same job than on a 'complex'
+instruction set machine, hence the proportionately larger executable files.
+Presumably your 4.3BSD machine is a VAX-alike (i.e. complex instruction set).
+
+The only other file from your list which exists on our HP840 system is
+the C compiler, and look at the size of that beast!!
+
+-rwxrwxr-x  1 bin      bin       1097728 Mar  5  1987 /lib/ccom
+
+(No, that's not a typo - it really is more than 1 Megabyte!)
+
+Geoff Clare              gwc at root.co.uk            seismo!mcvax!ukc!root44!gwc
+-- 
+
+Geoff Clare              gwc at root.co.uk            seismo!mcvax!ukc!root44!gwc
+#! rnews 1904
+Path: alberta!mnetor!uunet!mcvax!ukc!stc!datlog!slxsys!jpp
+From: jpp at slxsys.specialix.co.uk (John Pettitt)
+Newsgroups: comp.unix.xenix
+Subject: Re: 16-bit versus 32-bit memory performance
+Summary: 32 bit cpu on 16 bit ram is a waste of money
+Message-ID: <109 at slxsys.specialix.co.uk>
+Date: 10 Dec 87 14:17:13 GMT
+References: <388 at ddsw1.UUCP> <620 at omen.UUCP> <435 at spdcc.COM>
+Reply-To: jpp at slxsys.UUCP (John Pettitt)
+Organization: Specialix International, London, UK.
+Lines: 29
+
+This should perhaps belong in comp.arch
+
+It would appear that most 8088,8086,186 and 286 systems are
+limited by the number of cycles taken to execute instructions
+(I.E the clock speed).  However the 80386 (at 16 and esp at 20 Mhz)
+is limited by its memory bus bandwidth.  That is the memory subsystem
+on most 286 boxes is fast enough have little or no real effect on
+performance compared to a change in clock speed.   An 80386
+however is largly limited by the rate that it can be 'fed' data
+and instructions.   
+
+16 Bit memory subsystems have a devestating effect on the 80386 
+for 2 reasons.  Firstly 2 memory accesses are required rather than
+one thus doubling the access time.  Secondly most 16 bit memory cards
+are designed for 8 or 10 Mhz operation not 16 Mhz so a significant
+number of wait states are needed when used with a 386.   It would
+appear that a 'cache miss' on the Intel Inboard(tm) generates beteween
+10 and 12 wait states thus making access to 16 bit ram slower than
+from the original 286.
+
+In conclustion - if you want a 32 bit CPU use 32 bit ram.  If you
+just want the instruction set use the P9 (80388) - if it ever appears.
+
+(This posting written on a Dell 386 with 6 MB of 0 wait static 32 bit ram)
+
+-- 
+John Pettitt - 144.5 MHz: G6KCQ, CIX: jpettitt,  Voice: +44 1 398 9422
+UUCP:  ...uunet!mcvax!ukc!pyrltd!slxsys!jpp  (jpp at slxsys.specialix.co.uk)
+Disclaimer: I don't even own a cat to share my views !
+#! rnews 1704
+Path: alberta!mnetor!uunet!mcvax!unido!iaoobelix!woerz
+From: woerz at iaoobelix
+Newsgroups: comp.unix.wizards
+Subject: Re: Request for human interface design a - (nf)
+Message-ID: <8300012 at iaoobelix.UUCP>
+Date: 3 Dec 87 01:35:00 GMT
+References: <10559 at brl-adm.UUCP>
+Lines: 32
+Nf-ID: #R:brl-adm:10559:iaoobelix:8300012:000:1331
+Nf-From: iaoobelix!woerz    Dec  3 02:35:00 1987
+
+> /***** iaoobelix:comp.unix.wiz / oberon!blarson /  5:40 pm  Nov 28, 1987*/
+> In article <7995 at steinmetz.steinmetz.UUCP> dawn!stpeters at steinmetz.UUCP (Dick St.Peters) writes:
+> >(The VMS interface is not always so friendly to novices: name the file
+> >"junk" instead of "junk.txt", and a novice may never figure out how to
+> >read it.  As for expert interfaces, rename the expert's .emacs file to
+> >sav.emacs and watch him/her try to recover.)
+>
+> I'm no VMS expert and I know a way to recover.  Use a gun to put a few
+> bullets in the aproprate disk drive.  (When it is replaced and the
+> backups restored, my .emacs reappears. :-)
+
+And if you're out of luck, a backup has been done between the time
+you changed your .emacs file and the shooting of the disk and you
+will get your changed file. :-(
+
+> --
+> Bob Larson              Arpa: Blarson at Ecla.Usc.Edu
+> Uucp: {sdcrdcf,cit-vax}!oberon!skat!blarson             blarson at skat.usc.edu
+> Prime mailing list (requests):  info-prime-request%fns1 at ecla.usc.edu
+> /* ---------- */
+
+------------------------------------------------------------------------------
+
+Dieter Woerz
+Fraunhofer Institut fuer Arbeitswirtschaft und Organisation
+Abt. 453
+Holzgartenstrasse 17
+D-7000 Stuttgart 1
+W-Germany
+
+BITNET: iaoobel.uucp!woerz at unido.bitnet
+UUCP:   ...{uunet!unido, pyramid}!iaoobel!woerz
+#! rnews 1992
+Path: alberta!mnetor!uunet!mcvax!unido!tub!actisb!federico
+From: federico at actisb.UUCP (Federico Heinz)
+Newsgroups: comp.sys.atari.st
+Subject: Re: Hard disk boot???
+Keywords: Hard disk, GEMBOOT
+Message-ID: <122 at actisb.UUCP>
+Date: 8 Dec 87 19:34:12 GMT
+References: <624 at aucs.UUCP>
+Reply-To: federico at actisb.UUCP (Federico Heinz)
+Organization: Actis in Berlin GmbH, W. Germany
+Lines: 39
+
+[The line eater was sleeping again ...]
+
+In article <624 at aucs.UUCP> 870646c at aucs.UUCP (barry comer) writes:
+>I have a few questions for anyone using a SH204 with a Mega ST. I have a Meag2
+>with a SH204, I have being auto booting from the hard disk using HDB_V2.3, I
+>used to be able to auto boot from the floppy when the CTRL,SHIFT, and ALT.
+>keys were held down, well since I started using the Mega, the machine always
+>boots from the hard disk with the keys down or up??????????????
+
+I didn't know of the CTRL-SHIFT-ALT trick, but I had a problem similar
+to yours: there was no way my Mega would boot from floppy, and that
+turned out to be quite a problem when a desk accessory I had downloded
+from somewhere was turned unusable because of line noise.  My "solution"
+was not to boot from hard disk at all, which I now find better since it
+allows me to choose different configurations (desk accesories and such)
+depending on the job I'm going to do.
+
+>I am also using GEMBOOT to overcome the 40 folder limit in TOS(has it been
+>fixed with the new ROMS?).
+
+I'm also interested on this question, and it has been already asked a couple
+of times with no visible answer.  I've never used the old ROMs, so I don't
+know what the infamous "40 folder limit" means. I've had more than 40 folders
+on my hard disk and nothing happened.  Does this mean that the problem is
+fixed? Or is it 40 folders DEEP?
+
+
+                                        
+					
+					///////
+				      //____ //
+		Federico             //     //
+				    // __  //
+				   // / / //
+				   ///////
+
+
+UUCP: ...!mcvax!unido!tub!actisb
+BIX:  fheinz
+#! rnews 888
+Path: alberta!mnetor!uunet!mcvax!varol
+From: varol at cwi.nl (Varol Akman)
+Newsgroups: sci.physics
+Subject: Texts a la Feynman
+Summary: I would like to read them
+Message-ID: <144 at piring.cwi.nl>
+Date: 11 Dec 87 10:59:47 GMT
+Organization: CWI, Amsterdam
+Lines: 12
+
+I've been re-reading recently Feynman's excellent volumes and enjoying
+myself.  The question is:  Are there physics books of similar style?
+One thing that I like about Feynman is that he tries to ``demystify''
+stuff instead of giving cookbook formulas.  Since I do this as a
+leisurely activity, the absence of too many formulas and long
+mathematical analyses (at least in Vol. I) are also appreciated.
+I'm especially interested in classical mechanics.  Philosophical
+implications of physics laws such as causality, etc. are also interesting.
+
+Send me individual replies and I'll post a summary to the net. Thanks!
+
+-Varol Akman
+#! rnews 1649
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!bath63!pes
+From: pes at ux63.bath.ac.uk (Smee)
+Newsgroups: rec.games.misc
+Subject: Re: The Pawn help
+Keywords: ** EXPLICIT SPOILERS **
+Message-ID: <2011 at bath63.ux63.bath.ac.uk>
+Date: 9 Dec 87 11:24:10 GMT
+References: <2884 at cbmvax.UUCP> <2299 at killer.UUCP> <2910 at cbmvax.UUCP>
+Reply-To: pes at ux63.bath.ac.uk (Smee)
+Organization: AUCC c/o University of Bath
+Lines: 22
+
+In article <2910 at cbmvax.UUCP> daveb at cbmvax.UUCP (Dave Berezowski) writes:
+>
+>I've been told that there is a bug in the game such that you must get to
+>the pedestal asap else the blue key won't be there (this is what has happended
+>to me)...
+
+The story I've heard is that this is not a bug.  Rather (as warned in the
+manual) the other characters you meet are also poking around, and can have
+effects even while they are not in the same location as you.
+
+In particular, as I've heard it, if the adventurer gets to the pedestal before
+you do then he will take the key.  (And allegedly you then can recover it when
+you kill him.)  I haven't tried this line of play yet, so can't vouch for it,
+but it sounds plausible.
+
+There's a cute bug in the ST version, though, to do with the pedestal.  If
+you move the pedestal and then type 'take all' you end up carrying the pedestal,
+a duplicate of which remains in place.  (If you just try to 'take pedestal',
+you are told that it is too heavy to lift.)  I'm told that this results from
+a bug in the relevant object definition table entry, so it might have propagated
+to other versions.  (I'd doubt that the driving data undergoes as much analysis
+as the executable code during porting to other machines.)
+#! rnews 1317
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!nott-cs!pyr1.cs.ucl.ac.uk!awylie
+From: awylie at pyr1.cs.ucl.ac.uk
+Newsgroups: comp.sys.ibm.pc
+Subject: Zorland/Datalight C INT86 problem
+Message-ID: <39500003 at pyr1.cs.ucl.ac.uk>
+Date: 8 Dec 87 13:23:00 GMT
+Lines: 24
+Nf-ID: #N:pyr1.cs.ucl.ac.uk:39500003:000:954
+Nf-From: pyr1.cs.ucl.ac.uk!awylie    Dec  8 13:23:00 1987
+
+
+Hi,
+   I have a problem with the Zorland C compiler, aka Datalight-C or
+NorthWest-C which I wondered if any netlander had previously encountered
+and solved.
+   I have a program which works fine in small model but recently I had
+to go to the data model (small code, large data) whereupon it hung my
+XT clone. Tracing execution seems to indicate that the DOS software
+interrupt routine INT86 may be the source of the trouble.
+   Has anyone seen problems with INT86 in D or L model programs? The
+prospect of DEBUGging the interface between C and assembler does not
+appeal to me.
+   BTW I have deliberately not given details of the program. I do not
+       want to debug it on the net. Please e-mail me only if you have
+       solid evidence of problems in the INT86 area.
+
+      thanks for any help you can give,
+           Andrew
+
+Andrew Wylie
+University of London Computer Centre, London, England
+
+uucp:    awylie at uk.ac.ucl.cs
+JANET:   andrew at ulcc.ncdlab
+#! rnews 644
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!nott-cs!pyr1.cs.ucl.ac.uk!awylie
+From: awylie at pyr1.cs.ucl.ac.uk
+Newsgroups: comp.sys.ibm.pc
+Subject: Re: Virus program warning
+Message-ID: <39500004 at pyr1.cs.ucl.ac.uk>
+Date: 8 Dec 87 17:12:00 GMT
+References: <6146 at jade.BERKELEY.EDU>
+Lines: 8
+Nf-ID: #R:jade.BERKELEY.EDU:-614600:pyr1.cs.ucl.ac.uk:39500004:000:227
+Nf-From: pyr1.cs.ucl.ac.uk!awylie    Dec  8 17:12:00 1987
+
+
+Presumably it would be relatively easy to modify the virus program to
+make it into an 'antibody' which would automatically overwrite the
+virus on any infected floppy which was used on the PC.
+
+Andrew Wylie
+
+awylie at uk.ac.ucl.cs
+#! rnews 541
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!nott-cs!pyr1.cs.ucl.ac.uk!awylie
+From: awylie at pyr1.cs.ucl.ac.uk
+Newsgroups: rec.games.hack
+Subject: NetHack 2.2 part 18
+Message-ID: <42700005 at pyr1.cs.ucl.ac.uk>
+Date: 10 Dec 87 09:51:00 GMT
+Lines: 8
+Nf-ID: #N:pyr1.cs.ucl.ac.uk:42700005:000:193
+Nf-From: pyr1.cs.ucl.ac.uk!awylie    Dec 10 09:51:00 1987
+
+
+People in the UK and Europe who need NetHack 2.2 part18 can get it by
+sending me e-mail, preferably to my Janet address.
+
+Andrew Wylie
+
+Janet:   andrew at ulcc.ncdlab
+uucp:    awylie at uk.ac.ucl.cs
+#! rnews 892
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!nott-cs!smb!dave
+From: dave at smb.co.uk (Dave Settle)
+Newsgroups: comp.sources.wanted
+Subject: B-tree routines required.
+Keywords: b-tree index rmcobol
+Message-ID: <18 at oscar.smb.co.uk>
+Date: 8 Dec 87 11:17:39 GMT
+Organization: SMB Business Software, Mansfield, UK
+Lines: 21
+
+I'm looking for a set of routines which can handle B-trees, as part of
+a program which I'm writing to recover RM-COBOL indexed files.
+
+If anyone knows of any routines which might be helpful (or any hints about
+how to go about it), I'd be very grateful to hear about them.
+
+Please reply to me directly by mail, as I don't (yet) get this newsgroup
+directly.
+
+Thanks in advance,
+		Dave Settle.
+---
+
+Dave Settle, 
+	SMB Business Software, Thorn EMI Datasolve, High St, Mansfield, UK
+
+UUCP:	dave at smb.co.uk
+	...!mcvax!ukc!nott-cs!smb!dave	
+
+		<--- This way to point of view --->
+		
+#! rnews 3785
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!sph
+From: sph at eagle.ukc.ac.uk (S.P.Holmes)
+Newsgroups: rec.games.misc,rec.games.frp,rec.games.board
+Subject: Re: WARGAMING!
+Message-ID: <4067 at eagle.ukc.ac.uk>
+Date: 11 Dec 87 10:24:28 GMT
+References: <796 at lln-cs.UUCP>
+Reply-To: sph at ukc.ac.uk (S.P.Holmes)
+Organization: Computing Lab, University of Kent at Canterbury, UK.
+Lines: 76
+Xref: alberta rec.games.misc:1153 rec.games.frp:1655 rec.games.board:544
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+In article <796 at lln-cs.UUCP> gf at lln-cs.UUCP (Frank Grognet) writes:
+>
+>	I want to start wargaming but I don't know how!
+>
+>I won't be playing wargames on a board, but with 15mm or 25mm
+>figurines.
+>I would like to find addresses in Europe (especially Belgium)
+>of good figurine manufacturers and also references to rule
+>books for the Napoleonic period.
+
+The best set which I've found are the Wargames Research Group 1685 - 1850
+rules. Although the time period sounds a bit long these rules have the
+following advantages (My opinions only).
+
+- Wide ranges of troops covered (You can fight outside Europe)
+- Wide range of weapons covered (Pikes for those Moscow Militiamen etc)
+- Simple solution for combat - This is what I really like, There at s
+      No nonsense evaluating every 20th of a casualty, or evaluating
+      grenadier companies firing separate from the rest of their battallion.
+- All weapons are handled simply. Just a different entry in one table.
+- Movement is alternate, not simultaneous, things move much quicker.
+- Hand to hand combat is decided very quickly, (Just like reality).
+- Morale tests are also quite fast to do, and give specific tests for
+  different situations. (This avoids an old problem where eg Horsemen test
+      morale before charging, Test fails horribly, Horsemen rout off the 
+      field.) To make you go away, the opponent actually has to do
+      something.
+- European regulars have "National characteristics".
+    ie British are disciplined infantry and rash cavalry.
+       Russians are stoical Infantry (Won at t retreat easily)
+       Spanish are easily panicked
+       Highlanders charge aggressively
+       French columns are impetuous and frighten the enemy.
+       Austrian and Prussian cavalry are Bold
+       Austrian, Spanish and Dutch Generals are Cautious.
+
+Together with these rules I would recommend the army lists published by
+Table Top Games.
+
+These cover the European armies for most of the big campaigns of
+1805-1815 and ensure a balanced army is selected (Although the 
+1000 point armies don at t always work too well.
+eg My russians need 12 Gun Artillery Batteries (6 pieces on the table)
+   This leaves me few points for infantry or cavalry
+   (In practice a Russian 1000 point army has two of Inf, Cav & Art)
+
+The lists also help to enhance the National Flavour of an army
+ie British get few Cavalry, but some veteran Infantry.
+   French after 1812 have Raw Infantry or Guards.
+   Austrians Have Very Large numbers Of infantry.
+
+I can summarise some of the +/- points of each of the armies I've seen
+if you mail me.
+
+I'd recommend 15mm scale troops (Much cheaper and more transportable)
+    They'll fit on your table too.
+
+I actually use the 6mm scale which is cheaper, lighter and requires
+about 60cm x 100 cm for a medium game.
+However the Job of painting, mounting and moving the little guys is
+much harder.
+
+
+>I am also interested in rules contained on the net or in files at
+>other sites, if they exist!
+
+Copyright makes this difficult.
+
+>I anybody can help me, please reply to ..!mcvax!prlb2!lln-cs!gf
+
+
+-- 
+        Steve Holmes         | Noel Coward : "Would you object if I smoked"
+        Room 109a            |
+E-mail  sph                  | Sarah Bernhardt : "I wouldn't care if you burned"
+Phone   ext 7681 or 3682     |
+#! rnews 1737
+Path: alberta!mnetor!uunet!mcvax!ukc!pyrltd!lucifer!rob
+From: rob at lucifer.UUCP ( 237)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Origin of Hithchiker's Guide
+Message-ID: <6 at lucifer.UUCP>
+Date: 11 Dec 87 10:03:57 GMT
+References: <909WDMCU at CUNYVM> <1240001 at otter.HP.COM>
+Reply-To: rob at lucifer.UUCP (Rob Clive - 237)
+Organization: Lucas Micos, Phoenix Way, Cirencester, Glos, UK  (0285 67981)
+Lines: 24
+
+In article <1240001 at otter.HP.COM> kers at otter.HP.COM (Christopher Dollin) writes:
+>> I have recently been told be someone that The Hitchhiker's Guide to the
+>> Galaxy originated as a radio program rather than as a book.
+>
+>The radio series "The Hitch-hikers Guide to the Galaxy" was broadcast in 
+>Britain for the first time between 1976..1979 (sorry for the range but all I
+
+It was 1978.  Episode 1 of the first series was a pilot production for the
+whole thing and as such is slightly different in flavour to the others.  The 
+first series (6 episodes) covered the ground of the TV version and books 1
+and 2.  Then came the Christmas (1978) show to make a link to the second
+series which was broadcast in 1979 and consisted of 5 episodes.
+
+> For my money, the show (and scripts) are MUCH funnier than the books.
+
+True.  The radio shows left much more to the imagination with the assistance
+of some very good sound effects.  I thought the TV series spoiled it.  For 
+instance at the end of the first radio series you hear the song 'What a
+Wonderful World' amid the sound of burning trees on prehistoric Earth; can't
+you just imagine it?
+
+-----------------------------------------------------------------------------
+Rob Clive.				     UUCP:  ...!mcvax!ukc!lucifer!rob
+Lucas Micos Ltd., Cirencester, GL7 1QG, UK.		      Now read on....
+#! rnews 1160
+Path: alberta!mnetor!uunet!mcvax!botter!tjalk!rblieva
+From: rblieva at cs.vu.nl (Roemer Lievaart)
+Newsgroups: rec.music.classical
+Subject: Re: The range of the male voice.
+Message-ID: <918 at tjalk.cs.vu.nl>
+Date: 11 Dec 87 13:06:10 GMT
+References: <1280 at phoenix.Princeton.EDU> <1597 at faline.bellcore.com> <3999 at pucc.Princeton.EDU>
+Reply-To: rblieva at cs.vu.nl (Roemer B. Lievaart)
+Organization: VU Informatica, Amsterdam
+Lines: 15
+
+Q2816 at pucc.Princeton.EDU (Roger Lustig) typed:
++---------------------------------------
+| Choral music is generally written for a fairly restricted range (note
+| the two qualifications in that sentence) in order to allow choirs, not
+| individuals, to sing it.  There are choral high Bb's (in Singet dem
+| Herrn, for instance) and even C's for the sopranos (end of Kodaly's
+| Laudes Organi), and the incredible stuff Beethoven asked for in the
+| Missa Solemnis and Ninth.  But they are the exception, and are generally
+| intended to sound like an exception.
++---------------------------------------
+
+We're playing Mahler's 2nd, and so I noticed last wednesday that
+the Basses have to sing as deep as (at least ?) the low B.
+
+	-- Roemer.
+#! rnews 871
+Path: alberta!mnetor!uunet!mcvax!botter!ast
+From: ast at cs.vu.nl (Andy Tanenbaum)
+Newsgroups: comp.os.minix
+Subject: Re: scanf()
+Message-ID: <1782 at botter.cs.vu.nl>
+Date: 11 Dec 87 14:40:54 GMT
+References: <782 at louie.udel.EDU>
+Reply-To: ast at cs.vu.nl (Andy Tanenbaum)
+Organization: VU Informatica, Amsterdam
+Lines: 10
+
+In article <782 at louie.udel.EDU> KIMMEL%ecs.umass.edu at relay.cs.net (Matt Kimmel) writes:
+>I just got Minix v1.2, and I like it a lot.  However, when I try to
+>compile a C program that calls scanf(), I get a message to the effect
+>of " _scanf not resolved".  Am I missing something?  Or is there no scanf()
+
+There is a scanf in libsrc.a, but it is not included in libc.a.  You have to
+compile it yourself with cc -LIB -c scanf.c and put in in the library.
+It was omitted from libc.a because there was no room on that diskette!
+
+Andy Tanenbaum (ast at cs.vu.nl)
+#! rnews 1614
+Path: alberta!mnetor!uunet!mcvax!guido
+From: guido at cwi.nl (Guido van Rossum)
+Newsgroups: comp.windows.x
+Subject: X and different IPC protocols
+Summary: Surely feasible; but how useful?
+Message-ID: <145 at piring.cwi.nl>
+Date: 11 Dec 87 22:15:13 GMT
+Reply-To: guido at cwi.nl (Guido van Rossum)
+Organization: "The Amoeba Project", CWI, Amsterdam
+Lines: 22
+
+Although X as distributed uses TCP/IP to connect clients and server, it
+is possible use other network protocols by relatively small changes to
+the lowest levels of library and server.  We have almost gotten the
+server half of such a set-up running using Amoeba (a distributed
+operating system with its own, capability-based RPC mechanism).
+The library half should be working as soon as we solve problems with the
+C compiler.
+
+The question is, how much does this buy us?  Since Amoeba is not Unix, X
+clients requiring advanced Unix features won't run under vanilla Amoeba.
+What percentage of the available client applications will be convertable
+to a different operating system, where, e.g., one will have <stdio.h>
+available, but not select(2)?  I would assume that there will be VMS
+support for X, so that one might expect clients to be OS-independent,
+but then again, you can never know what hacks a performance-driven
+application programmer may use... (including VAX assembly :-)
+
+Can anybody comment on this?  It would also be interesting to know if
+third-party software for X would come binary or source.
+--
+Guido van Rossum, Centre for Mathematics and Computer Science (CWI), Amsterdam
+guido at cwi.nl or mcvax!guido or (from ARPAnet) guido%cwi.nl at uunet.uu.net
+#! rnews 1102
+Path: alberta!mnetor!uunet!mcvax!prlb2!kulcs!wim
+From: wim at kulcs.UUCP (Wim De Bisschop)
+Newsgroups: comp.lang.ada
+Subject: Ada-interface to Termcap(3)
+Keywords: termcap
+Message-ID: <1075 at kulcs.UUCP>
+Date: 11 Dec 87 10:56:28 GMT
+Organization: Kath.Univ.Leuven, Comp. Sc., Belgium
+Lines: 15
+
+Has anyone an Ada interface to the C routines from the termcap
+library? We would have a package for terminal independent 
+screen oriented output in Ada. The most natural way to do this,
+is to make use of the C-routines of termcap. 
+We were wondering whether someone else has already defined an
+interface package, preferably for a Verdix 5.41 compiler to
+run under 4.3BSD.
+
+
++----------------------------------------------------------------------+
+| Name:   Wim De Bisschop           | Katholieke Universiteit Leuven   |
+| E-mail: wim at kulcs.UUCP  or        | Department of Computer Science   |
+|         ...!mcvax!prlb2!kulcs!wim | Celestijnenlaan 200 A            |
+| Phone:  +(32) 16-200656 x3596     | B-3030 Leuven (Heverlee), Belgium|
++----------------------------------------------------------------------+
+#! rnews 835
+Path: alberta!mnetor!uunet!mcvax!enea!erix!erialfa!afr
+From: afr at erialfa.UUCP (Anders Fredrikson ZX/DRG)
+Newsgroups: rec.music.misc
+Subject: Re: Ace-Screamingest Guitar Solos on Record
+Message-ID: <172 at erialfa.UUCP>
+Date: 10 Dec 87 12:31:18 GMT
+References: <1725 at s.cc.purdue.edu> <2455 at sfsup.UUCP>
+Reply-To: afr at erialfa.UUCP (Anders Fredrikson ZX/DRG)
+Organization: Ericsson Information Systems AB, Kista, Stockholm, SWEDEN
+Lines: 17
+
+In article <2455 at sfsup.UUCP> mingus at sfsup.UUCP (Damballah Wedo) writes:
+>> rsk at s.cc.purdue.edu.UUCP (in <1725 at s.cc.purdue.edu>):
+>> [ lists some excellent guitar solos ]
+>
+>Sure, I'll play that game:
+>
+>......
+>---cut
+>She'a a Woman (Jeff Beck, BLOW BY BLOW)
+This tune is even better on the "Jeff Beck & Jan Hammer group LIVE"
+>---Cut
+>.....
+You might also add
+Europa (Santana, MOONFLOWER)
+
+
+/Anders
+#! rnews 1046
+Path: alberta!mnetor!uunet!mcvax!enea!pvab!robert
+From: robert at pvab.UUCP (Robert Claeson)
+Newsgroups: comp.lang.c
+Subject: Re: Making re-#includes harmless--a simple solution?
+Message-ID: <339 at pvab.UUCP>
+Date: 11 Dec 87 10:23:09 GMT
+References: <13395 at think.UUCP>
+Reply-To: robert at pvab.UUCP (Robert Claeson)
+Organization: Statskonsult Programvaruhuset AB, Sweden
+Lines: 16
+
+In article <13395 at think.UUCP> rlk at THINK.COM writes:
+
+>1)  The same file may have multiple names (symlinks and/or hard
+>links).  How do you KNOW whether a file has been included?  The only
+>way is by defining an attribute that only that file will have.  The
+>easiest way to do this (aside from checking device/inumbers, which is
+>not portable and may not work in some bizarre cases, or other system
+>dependent hacks) is to #define a unique name.
+
+How can you be sure that the name you choose is unique, especially if
+you use links or symlinks?
+
+-- 
+Robert Claeson, System Administrator, PVAB, Box 4040, S-171 04 Solna, Sweden
+eunet: robert at pvab
+uucp:  sun!enea!pvab!robert
+#! rnews 1812
+Path: alberta!mnetor!uunet!mcvax!enea!ttds!draken!sics!lhe
+From: lhe at sics.se (Lars-Henrik Eriksson)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Houston SF Opera
+Message-ID: <1642 at sics.se>
+Date: 11 Dec 87 10:31:40 GMT
+References: <8168 at ism780c.UUCP>
+Reply-To: lhe at sics.se (Lars-Henrik Eriksson)
+Organization: Swedish Institute of Computer Science, Kista
+Lines: 32
+
+In article <8168 at ism780c.UUCP> jimh at ism780c.UUCP (Jim Hori) writes:
+>The Lessing is probably Doris who has
+>written several futurist/SF novels ...
+
+>Her SF novels are serialized, and from what
+>I recall from scanning them in bookstores,
+>reminiscent of Marge Piercy's enjoyable,
+>though somewhat stiff, feminist SF.
+>
+>The series is called "Canopus and Argos: Archives",
+Should be              Canopus IN Argos: Archives
+
+The five books are quite different in character. The second one
+("The marriages between zones 3, 4 and 5") could possibly be called
+"feminist SF" - it is very different from the other four in most ways.
+The third ("The Sirian Experiments") is at times rather funny, and the
+fifth ("The sentimental agents in the Volyen empire") is among the funniest
+books I've read.
+
+On the other hand, number 4 ("The making of the representative of planet 8")
+was rather depressing. While reading it I thought that "it can't get any
+worse than this". It could, of course. (I don't refer to the quality of the
+book, but to the events in the story).
+
+I should mention the title of the first one also: "Shikasta" This is
+the most "important" of the five, in some sense. It is also the one that
+could perhaps be called "stiff". All the books are well worth reading.
+
+Lars-Henrik Eriksson				Internet: lhe at sics.se
+Swedish Institute of Computer Science		Phone (Intn'l): +46 8 750 79 70
+Box 1263					Telefon (nat'l): 08 - 750 79 70
+S-164 28  KISTA
+#! rnews 768
+Path: alberta!mnetor!uunet!mcvax!enea!tut!santra!kolvi!jku
+From: jku at kolvi.UUCP (Juha Kuusama)
+Newsgroups: comp.sys.ibm.pc
+Subject: Re: EVALuation of Shareware Word Processors - Version 1
+Message-ID: <32 at kolvi.UUCP>
+Date: 11 Dec 87 07:40:17 GMT
+References: <3610 at dhw68k.UUCP>
+Reply-To: jku at kolvi.UUCP (Juha Kuusama)
+Organization: Helsinki University of Technology, Finland
+Lines: 9
+
+I'm not at all questioning the value of the comparision, but (as a VERY
+satisfied and registered) user of PC-Write, I'd like to point out that:
+
+- PC-Write does support the ega in 43-line mode
+
+- PC-Write can remind you to do backups at specified time intervals or
+  when you have entered a specified number of characters.
+---
+Juha Kuusama, jku at kolvi.UUCP  ( ...!mcvax!tut!kolvi!jku )
+#! rnews 904
+Path: alberta!mnetor!uunet!mcvax!diku!daimi!jnp
+From: jnp at daimi.UUCP (J|rgen N|rgaard)
+Newsgroups: comp.sys.mac
+Subject: Re: Conjecture:  why several tech notes failed
+Message-ID: <1248 at daimi.UUCP>
+Date: 10 Dec 87 08:43:14 GMT
+References: <9827 at ut-sally.UUCP>
+Reply-To: jnp at titan.UUCP (J|rgen N|rgaard)
+Organization: DAIMI: Computer Science Department, Aarhus University, Denmark
+Lines: 16
+
+
+Earlier this year there has been trouble with tech-notes, that would 
+not binhex correctly (the Mac program).
+Then the problem could be solved with a similiar program on unix-machines.
+The problem seemed to show up when the file-names where extremely long
+(28 might be the number).
+
+It seemed not to be so sensitive about file-names.
+
+Unfortunately I have lost the sources.
+
+
+-- 
+			Regards J|rgen N|rgaard
+				e-mail: jnp at daimi.dk
+-------------------------------------------------------------------------------
+#! rnews 785
+Path: alberta!mnetor!uunet!mcvax!diku!iesd!jacob
+From: jacob at iesd.uucp (Jacob stergaard B{kke)
+Newsgroups: sci.misc
+Subject: A request on the Ozone layer
+Keywords: More information wanted about the Ozone layer.
+Message-ID: <174 at iesd.uucp>
+Date: 11 Dec 87 13:38:23 GMT
+Reply-To: jacob at iesd.UUCP (Jacob \stergaard B{kke)
+Organization: Dept. of Comp. Sci., Aalborg University, Denmark
+Lines: 12
+
+Today I read an posting from rhorn at infinet.UUCP about the problems
+with the Ozone layer. So I got interested and now wanted more
+information about it and the problems with the Ozone layer in
+Switzerland present. I would like any information and I'll look
+forward to any reponds. 
+
+		Yours sincerely
+			
+			Jacob Baekke, Denmark
+
+
+Reply to:     	jacob at iesd.uucp, {...}!mcvax!diku!iesd!jacob  
+#! rnews 1246
+Path: alberta!mnetor!uunet!mcvax!inria!imag!jarwa
+From: jarwa at imag.UUCP (Jarwa Sahar)
+Newsgroups: comp.software-eng
+Subject: LOOKING FOR DOCUMENTS ON SOFTWARE DOCUMENTATION
+Message-ID: <2336 at imag.UUCP>
+Date: 11 Dec 87 09:15:21 GMT
+Reply-To: jarwa at imag.UUCP (Jarwa Sahar)
+Organization: IMAG, University of Grenoble, France
+Lines: 26
+
+
+     I am very interested in all publications concerning Documents 
+     Related to Software Documentation and to Maitenance Environment.
+     
+     What I am interested in are papers on different types 
+     of these documents, their formalism and their structure.
+     
+     If this area also interest you, I'd be very pleased if you could 
+     contact me, or send me your papers and/or what you have found 
+     interesting pertaining to this area. This will help me making a 
+     preliminary study on it.
+     
+     Looking forward to your answer, and thank you for your help.
+					Sahar JARWA
+
+	My adress is
+	Sahar JARWAH
+	Equipe "Systemes Intelligents de Recherche d'Informations"
+        Laboratoire de Genie Informatique - IMAG
+        BP 68
+        38462 St Martin d'Heres Cedex
+        FRANCE
+
+	my phone is 76-51-46-00 extension 5182
+
+	my electronic adress is jarwa at imag.imag.fr
+	on UUCP: jarwa at imag
+#! rnews 1217
+Path: alberta!mnetor!uunet!mcvax!inria!imag!jarwa
+From: jarwa at imag.UUCP (Jarwa Sahar)
+Newsgroups: comp.databases
+Subject: LOOKING FOR DOCUMENTS
+Message-ID: <2337 at imag.UUCP>
+Date: 11 Dec 87 09:18:16 GMT
+Reply-To: jarwa at imag.UUCP (Jarwa Sahar)
+Organization: IMAG, University of Grenoble, France
+Lines: 26
+
+
+     I am very interested in all publications concerning Documents 
+     Related to Software Documentation and to Maitenance Environment.
+     
+     What I am interested in are papers on different types 
+     of these documents, their formalism and their structure.
+     
+     If this area also interest you, I'd be very pleased if you could 
+     contact me, or send me your papers and/or what you have found 
+     interesting pertaining to this area. This will help me making a 
+     preliminary study on it.
+     
+     Looking forward to your answer, and thank you for your help.
+					Sahar JARWA
+
+	My adress is
+	Sahar JARWAH
+	Equipe "Systemes Intelligents de Recherche d'Informations"
+        Laboratoire de Genie Informatique - IMAG
+        BP 68
+        38462 St Martin d'Heres Cedex
+        FRANCE
+
+	my phone is 76-51-46-00 extension 5182
+
+	my electronic adress is jarwa at imag.imag.fr
+	on UUCP: jarwa at imag
+#! rnews 2496
+Path: alberta!mnetor!uunet!mcvax!unido!laura!hmm
+From: hmm at laura.UUCP (Hans-Martin Mosner)
+Newsgroups: comp.lang.smalltalk
+Subject: User Survey
+Keywords: survey smalltalk curiosity
+Message-ID: <165 at laura.UUCP>
+Date: 10 Dec 87 21:31:51 GMT
+Organization: University of Dortmund, W-Germany
+Lines: 59
+
+To stir up some unrest, we have decided to post a smalltalk user survey.
+Where are you, all you happy smalltalk hackers ?  There must be life
+in other parts of the world, too... :-)
+Anyway, we would like you to fill in this questionnaire and give us some
+feedback.  Of course we would also like if you would post your experiences
+and questions to this group.  After all, that's it's purpose...
+
+	Hans-Martin Mosner & Andreas Toenne
+	Smalltalk hackers at the University of Dortmund
+
++-------------------------------
+|1.	What kind of hardware/software do you use:
+|1.1.	Hardware
+|1.1.1.	Processor type:		_____
+|1.1.2.	Physical memory size:	_____
+|1.1.3.	Display size:		_____
+|1.2.	Software
+|1.2.1.	Operating system:	_____
+|1.2.2.	Virtual machine:	_____
+|1.2.3.	Virtual image version:	_____
+|1.3	Overall performance:	_____ % Dorado (if you know that)
+|2.	For what purposes do you use smalltalk ?
+|	(FillInThisBlank)
+|3.	Do you think that the system meets your requirements ?
+|	If not, why ?
+|4.	If you are a programmer:
+|4.1.	What kind of applications have you written ?
+|4.2.	If those applications were not written for your employer,
+|	why didn't you share them with the Usenet community ? :-)
+|5.	How do you like smalltalk ?
+|5.1.	How long have you been using smalltalk ?
+|5.2.	How familiar are you with smalltalk ?
++-------------------------------
+Thank you for being so cooperative.
+Now that you have answered all those questions, please
+send the whole thing back to:
+
+	hmm at unido.uucp
+or	hmm at unido.bitnet
+or	...!uunet!unido!hmm
+or	hmm%unido.uucp at uunet.uu.net
+
+If everything fails, just post it to this group...
+
+If even that does not work, then send it via snail mail to:
+	Hans-Martin Mosner
+	Informatik-Rechner-Betriebsgruppe
+	Universitaet Dortmund
+	Postfac` 500500
+D-4600  Dortmund
+	West Germany
+
+Disclaimer: these opinions are not opinions but just random bits & bytes
+and therefore I don't need to disclaim anything...
+-- 
+Hans-Martin Mosner		| Don't tell Borland about Smalltalk - |
+hmm at unido.{uucp,bitnet}		| they might invent TurboSmalltalk !   |
+------------------------------------------------------------------------
+Disclaimer: TurboSmalltalk may already be a trademark of Borland...
+D
+#! rnews 14600
+Path: alberta!mnetor!uunet!mcvax!unido!laura!atoenne
+From: atoenne at laura.UUCP (Andreas Toenne)
+Newsgroups: comp.lang.smalltalk
+Subject: A small IconEditor for Smalltalk 80, VI2.2
+Keywords: smalltalk icons goodie
+Message-ID: <166 at laura.UUCP>
+Date: 10 Dec 87 21:48:21 GMT
+Organization: University of Dortmund, W-Germany
+Lines: 525
+
+Here is a little IconEditor I wrote.
+This goodie works on Smalltalk 80 VI2.2 VM1.1
+It comes in two parts.
+The first part 'Icon menu.st' adds knowledge about icons to the 
+StandardSystemController's blueButtonMenu.
+You should file in this one first.
+The second part 'Icon Editor.st' is the editor himself.
+
+Some notes about icons:
+The icon's textRectangle is clipped with the icon's boundingBox.
+To cancel a given textRectangle simply move it outside the outlined box.
+The method storeOn: in class OpaqueForm is buggy.
+You should add enclosing round brackets to the output. Otherwise
+you won't be able to read the saved icon definitions back.
+
+	Have fun
+
+	Andreas Toenne
+	atoenne at unido.uucp
+	atoenne at unido.bitnet
+	...!uunet!unido!atoenne
+	atoenne%unido.uucp at uunet.uu.net
+
+~~~~~~~~~~~~~~~~~~ cut here for best results ~~~~~~~~~~~~~~~~~~~~~~~~~~
+#! /bin/sh
+# This is a shell archive, meaning:
+# 1. Remove everything above the #! /bin/sh line.
+# 2. Save the resulting text in a file.
+# 3. Execute the file with /bin/sh (not csh) to create:
+#	Icon Editor.st
+#	Icon Menu.st
+# This archive created: Thu Dec 10 22:36:04 1987
+export PATH; PATH=/bin:/usr/bin:$PATH
+if test -f 'Icon Editor.st'
+then
+	echo shar: "will not over-write existing file 'Icon Editor.st'"
+else
+cat << \SHAR_EOF > 'Icon Editor.st'
+MouseMenuController subclass: #IconDisplayController
+	instanceVariableNames: ''
+	classVariableNames: ''
+	poolDictionaries: ''
+	category: 'Icon Editor'!
+
+
+!IconDisplayController methodsFor: 'controller default'!
+
+isControlActive
+	^ super isControlActive and: [sensor blueButtonPressed not]! !
+
+!IconDisplayController methodsFor: 'menu messages'!
+
+yellowButtonActivity
+	| index menu |
+	menu _ view yellowButtonMenu.
+	menu == nil
+		ifTrue:
+			[view flash.
+			super controlActivity]
+		ifFalse: 
+			[index _ menu startUpYellowButton.
+			index ~= 0 
+				ifTrue:
+					[self controlTerminate.
+					view perform: (menu selectorAt: index).
+					self controlInitialize]]! !
+

+View subclass: #IconDisplayView
+	instanceVariableNames: 'icon aspect iconMsg iconMenu '
+	classVariableNames: ''
+	poolDictionaries: ''
+	category: 'Icon Editor'!
+IconDisplayView comment:
+'I am a stupid view used to display the edited icon'!
+
+
+!IconDisplayView methodsFor: 'displaying'!
+
+displayView
+	"display icon centered in my insetBox"
+
+	| r iconRect rec |
+	Display white: self insetDisplayBox.
+	(icon isKindOf: Icon)
+		ifTrue: 
+			[r _ self insetDisplayBox.
+			icon form displayOn: Display at: r topLeft + r bottomRight - icon form extent // 2.
+			iconRect _ icon form computeBoundingBox.
+			iconRect _ iconRect translateBy: r topLeft + r bottomRight - iconRect extent // 2.
+			(iconRect areasOutside: (iconRect insetBy: 1 @ 1))
+				do: [:edge | Display fill: edge mask: Form gray].
+			rec _ icon textRect.
+			rec = nil
+				ifFalse: 
+					[rec _ rec translateBy: r topLeft + r bottomRight - icon form computeBoundingBox extent // 2.
+					(rec areasOutside: (rec insetBy: 1 @ 1))
+						do: [:edge | Display fill: edge mask: Form gray]]]! !
+
+!IconDisplayView methodsFor: 'updating'!
+
+update: anAspect 
+	"update the view"
+
+	anAspect == aspect
+		ifTrue: 
+			[icon _ model perform: iconMsg.
+			self displayView]! !
+
+!IconDisplayView methodsFor: 'menu messages'!
+
+allBlack
+	"make the selected icon all black"
+	| figure shape |
+	figure _ icon form figure.
+	shape _ icon form shape.
+	figure fill: figure computeBoundingBox rule: Form over mask: Form black.
+	shape fill: figure computeBoundingBox rule: Form over mask: Form black.
+	model changed: #iconView!
+
+allGray
+	"make the selected icon all transparent"
+	| figure shape |
+	figure _ icon form figure.
+	shape _ icon form shape.
+	figure fill: figure computeBoundingBox rule: Form over mask: Form white.
+	shape fill: figure computeBoundingBox rule: Form over mask: Form white.
+	model changed: #iconView!
+
+allWhite
+	"make the selected icon all white"
+	| figure shape |
+	figure _ icon form figure.
+	shape _ icon form shape.
+	figure fill: figure computeBoundingBox rule: Form over mask: Form white.
+	shape fill: figure computeBoundingBox rule: Form over mask: Form black.
+	model changed: #iconView!
+
+editIcon
+	"edit the selected icon"
+
+	| figure shape opaqueForm iconExtent bitView viewPoint savedForm |
+	(icon = nil and: [model iconSymbol ~= #default])
+		ifTrue: 
+			[iconExtent _ Rectangle fromUser extent.
+			figure _ Form extent: iconExtent.
+			shape _ Form extent: iconExtent.
+			opaqueForm _ OpaqueForm figure: figure shape: shape.
+			model icon: (Icon form: opaqueForm textRect: nil)].
+	icon = nil
+		ifFalse: 
+			[viewPoint _ (BitEditor locateMagnifiedView: icon form scale: 4 @ 4) topLeft.
+			bitView _ BitEditor
+						bitEdit: icon form
+						at: viewPoint
+						scale: 4 @ 4
+						remoteView: nil.
+			savedForm _ Form fromDisplay: (bitView displayBox merge: bitView labelDisplayBox).
+			bitView controller startUp.
+			savedForm displayOn: Display at: bitView labelDisplayBox topLeft.
+			bitView release.
+			model changed: #iconView]!
+
+textRect
+	"let the user specify a rectangle that will hold the icon's text"
+
+	| rec r|
+	rec _ Rectangle fromUser.
+	r _ self insetDisplayBox.
+	rec _ rec translateBy: 0 at 0 - (r topLeft + r bottomRight - icon form computeBoundingBox extent //2).
+	icon form: icon form textRect: rec.
+	model changed: #iconView! !
+
+!IconDisplayView methodsFor: 'controller access'!
+
+defaultControllerClass
+	^IconDisplayController! !
+
+!IconDisplayView methodsFor: 'private'!
+
+on: anIcon aspect: m1 icon: m2 menu: m3
+	self model: anIcon.
+	aspect _ m1.
+	iconMsg _ m2.
+	iconMenu _ m3! !
+
+!IconDisplayView methodsFor: 'adaptor'!
+
+yellowButtonMenu
+	^ self model perform: iconMenu! !
+"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
+
+IconDisplayView class
+	instanceVariableNames: ''!
+
+
+!IconDisplayView class methodsFor: 'instance creation'!
+
+on: anIcon aspect: m1 icon: m2 menu: m3
+	"create a new view for anIcon with aspect m1"
+
+	^self new
+		on: anIcon
+		aspect: m1
+		icon: m2
+		menu: m3! !
+

+Model subclass: #IconEditor
+	instanceVariableNames: 'icon iconSymbol iconBuffer '
+	classVariableNames: 'IconMenu ListMenu '
+	poolDictionaries: ''
+	category: 'Icon Editor'!
+IconEditor comment:
+'I am a bit editor for system icons.
+
+Instance Variables :
+	icon 				"The selected icon"
+	iconSymbol			"The symbol for the selected icon"
+
+Class Variables:
+	ListMenu 			"The action menu for the SelectionInListView over all icons"'!
+
+
+!IconEditor methodsFor: 'accessing'!
+
+icon
+	"return the selected icon"
+
+	^icon!
+
+icon: anIcon 
+	"change the selected Icon to anIcon"
+
+	icon _ anIcon.
+	Icon constantNamed: iconSymbol put: anIcon.
+	self changed: #iconView 	" aspect for the IconDisplayView"!
+
+icon: anIcon named: aSymbol 
+	" store anIcon at position aSymbol"
+
+	Icon constantNamed: aSymbol put: anIcon.
+	icon _ anIcon.
+	iconSymbol _ aSymbol.
+	self changed: #iconSymbol.			"aspect for SelectionInListView"
+	self changed: #iconView			"aspect for iconDisplayView "!
+
+iconSymbol
+	"return the symbol for the selected icon"
+
+	^iconSymbol!
+
+iconSymbol: aSymbol 
+	"change the symbol for the selected icon to aSymbol"
+
+	iconSymbol _ aSymbol.
+	icon _ Icon constantNamed: aSymbol.
+	self changed: #iconView	"aspect for the IconDisplayView"! !
+
+!IconEditor methodsFor: 'removing'!
+
+removeIcon
+	" remove the currently selected icon "
+
+	Icon constantDictionary removeKey: iconSymbol ifAbsent: [^nil].
+	iconSymbol _ icon _ nil.
+	self changed: #iconSymbol.
+	self changed: #iconView! !
+
+!IconEditor methodsFor: 'list display'!
+
+iconList
+	"return the list of icon symbols"
+
+	| list |
+	list _ OrderedCollection new.
+	Icon constantDictionary keysDo: [:i | list add: i].
+	^list!
+
+initialSymbol
+	"get the initial symbol selection"
+	"this method is used every time the SelectionInListView receives an update mesage "
+
+	^iconSymbol!
+
+listMenu
+	"return the menu for the icon list"
+
+	^ListMenu! !
+
+!IconEditor methodsFor: 'icon display'!
+
+iconMenu
+	"return the menu for the iconDisplayController"
+
+	^IconMenu! !
+
+!IconEditor methodsFor: 'menu messages'!
+
+copy
+	" save a (deep) copy of the currently selected icon"
+
+	icon = nil ifFalse: [iconBuffer _ icon deepCopy]!
+
+cut
+	" remove the currently selected icon from the icon dictionary and   
+	save it in iconBuffer"
+
+	(icon ~= nil or: [iconSymbol ~= #default])
+		ifTrue: 
+			[iconBuffer _ icon.
+			self removeIcon]!
+
+loadIcon
+	"override the current icon with a definition from a file"
+
+	| aFileName anIcon aStream |
+	(icon ~= nil or: [iconSymbol ~= #default])
+		ifTrue: 
+			[aFileName _ FileDirectory
+						requestFileName: 'file : '
+						default: iconSymbol asString , '.icn'
+						version: #old
+						ifFail: [^''].
+			aFileName ~= ''
+				ifTrue: 
+					[aStream _ FileStream oldFileNamed: aFileName.
+					anIcon _ Object readFrom: aStream.
+					aStream close.
+					self icon: anIcon]]!
+
+newIcon
+	" create a new clean icon"
+
+	| iconName |
+	iconName _ FillInTheBlank request: 'Icon Name ?'.
+	iconName = '' ifFalse: [self icon: nil named: iconName asSymbol]!
+
+paste
+	" change the currently selected icon to the icon held in iconBuffer"
+	" invoke newIcon if none is selected"
+
+	iconSymbol = nil
+		ifTrue: 
+			["add a new icon"
+			self newIcon.
+			iconSymbol = nil ifFalse: [self icon: iconBuffer]]
+		ifFalse: ["override old icon"
+			self icon: iconBuffer]!
+
+renameIcon
+	" change the name of an icon"
+
+	| key value newName |
+	(icon ~= nil or: [iconSymbol ~= #default])
+		ifTrue: 
+			[key _ iconSymbol.
+			value _ icon.
+			newName _ FillInTheBlank request: 'Change icon name' initialAnswer: key.
+			newName ~= ''
+				ifTrue: 
+					[self removeIcon.
+					self icon: value named: newName asSymbol]]!
+
+saveIcon
+	"store the selected icon to a file"
+
+	| aFileName aStream |
+	icon = nil
+		ifFalse: 
+			[aFileName _ FileDirectory
+						requestFileName: 'file : '
+						default: iconSymbol asString , '.icn'
+						version: #any
+						ifFail: [^''].
+			aFileName ~= ''
+				ifTrue: 
+					[aStream _ FileStream newFileNamed: aFileName.
+					icon storeOn: aStream.
+					aStream close]]! !
+
+!IconEditor methodsFor: 'view creation'!
+
+open
+	"open the views"
+
+	| topView |
+	topView _ StandardSystemView
+				model: self
+				label: 'Icon Editor'
+				minimumSize: 256 @ 300.
+	topView
+		addSubView: (SelectionInListView
+				on: self
+				aspect: #iconSymbol
+				change: #iconSymbol:
+				list: #iconList
+				menu: #listMenu
+				initialSelection: #initialSymbol)
+		in: (0 @ 0 corner: 1.0 @ 0.3)
+		borderWidth: 1.
+	topView
+		addSubView: (IconDisplayView
+				on: self
+				aspect: #iconView
+				icon: #icon
+				menu: #iconMenu)
+		in: (0.0 @ 0.3 corner: 1.0 @ 1.0)
+		borderWidth: 1.
+	topView controller open! !
+"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
+
+IconEditor class
+	instanceVariableNames: ''!
+
+
+!IconEditor class methodsFor: 'class initialization'!
+
+initialize
+	"Initialize the class IconEditor"
+	"IconEditor initialize"
+
+	ListMenu _ ActionMenu labelList: #((copy cut paste ) (newIcon renameIcon ) (saveIcon loadIcon ) ) selectors: #(copy cut paste newIcon renameIcon saveIcon loadIcon ).
+	IconMenu _ ActionMenu labelList: #((editIcon textRect ) (allWhite allBlack allGray) ) selectors: #(editIcon textRect allWhite allBlack allGray)! !
+
+!IconEditor class methodsFor: 'instance creation'!
+
+open
+	"create on schedule a new Icon Editor"
+
+	self new open! !
+
+IconEditor initialize!
+SHAR_EOF
+fi
+if test -f 'Icon Menu.st'
+then
+	echo shar: "will not over-write existing file 'Icon Menu.st'"
+else
+cat << \SHAR_EOF > 'Icon Menu.st'
+!MouseMenuController methodsFor: 'menu messages'!
+
+blueButtonActivity
+	"Determine which item in the blue button pop-up menu is selected. 
+	If one is selected, then send the corresponding message to the object 
+	designated as the menu message receiver."
+	"Enhanced to use HierarchicalMenus by atoenne at unido.uucp"
+
+	| index |
+	blueButtonMenu ~~ nil
+		ifTrue: 
+			[index _ blueButtonMenu startUpBlueButton.
+			index ~= 0 ifTrue: [blueButtonMenu class = HierarchicalMenu
+					ifTrue: [self menuMessageReceiver perform: (blueButtonMenu selectorAt: index)]
+					ifFalse: [self menuMessageReceiver perform: (blueButtonMessages at: index)]]]
+		ifFalse: [super controlActivity]! !
+
+!StandardSystemController class methodsFor: 'class initialization'!
+
+initialize
+	"Initialize the class variables."
+	"StandardSystemController initialize. 
+	StandardSystemController allInstances do: [:sc | sc 
+	initializeBlueButtonMenu] "
+
+	ScheduledBlueButtonMenu _ (MenuBuilder parseFrom: (ReadStream on: 'newLabel[newLabel]
+(under[under] move[move] frame[frame]) (collapse[collapse]
+icon: ((selectIcon[selectIcon] editIcon[editIcon]) (loadIcons[loadIcons] saveIcons[saveIcons])))
+(close[close])')) menu.
+	MenuWhenCollapsed _ ActionMenu
+				labels: 'new label\under\move\expand\close' withCRs
+				lines: #(1 4 )
+				selectors: #(newLabel under move expand close )! !
+
+!StandardSystemController methodsFor: 'menu messages'!
+
+editIcon
+	" call an icon editor "
+
+	IconEditor open!
+
+loadIcons
+	"load new constant definitions for icons"
+
+	| aFileName |
+	aFileName _ FileDirectory
+				requestFileName: 'file:'
+				default: '*.icn'
+				version: #old
+				ifFail: [^''].
+	aFileName ~= '' ifTrue: [Icon constantsFromFile: aFileName]!
+
+saveIcons
+	"write current icon constants to a file"
+
+	| aFileName |
+	aFileName _ FileDirectory
+				requestFileName: 'file:'
+				default: '*.icn'
+				version: #any
+				ifFail: [^''].
+	aFileName ~= '' ifTrue: [Icon constantsToFile: aFileName]!
+
+selectIcon
+	"let the user choose from the current icons"
+
+	| nameList iconList selection selectedIcon |
+	nameList _ OrderedCollection new.
+	Icon constantDictionary keysDo: [:key | nameList add: key].
+	iconList _ Array with: nameList asArray.
+	selection _ (PopUpMenu labelList: iconList) startUp.
+	selection ~= 0
+		ifTrue: 
+			[selectedIcon _ (Icon constantNamed: (nameList at: selection) asSymbol) copy.
+			self view icon: selectedIcon.				"change the icon"
+			self view iconView lock.					"essential. see below"
+			self view iconView text: self view label.	"set new icon text"
+			self view iconView newIcon]				"compute new icon"
+"lock is needed to perform the newIcon computation. Otherwise insetDisplayBox would be garbled. Text setting is merely needed at the first change. (The standard label has no iconText) "! !
+
+!StandardSystemController initialize. 
+StandardSystemController allInstances do: [:sc | sc 
+initializeBlueButtonMenu]!
+SHAR_EOF
+fi
+exit 0
+#	End of shell archive
+D
+#! rnews 813
+Path: alberta!mnetor!uunet!mcvax!unido!laura!atoenne
+From: atoenne at laura.UUCP (Andreas Toenne)
+Newsgroups: rec.games.hack
+Subject: Re: Nethack 2.2:  You stop to avoid hitting.
+Keywords: I have this bug too.
+Message-ID: <167 at laura.UUCP>
+Date: 10 Dec 87 21:53:23 GMT
+References: <7515 at alice.UUCP>
+Reply-To: atoenne at unido.UUCP (Andreas Toenne)
+Organization: University of Dortmund, W-Germany
+Lines: 9
+
+In article <7515 at alice.UUCP> wilber at alice.UUCP writes:
+>I have nethack running on my 3B1.  So far the only bug I've encountered
+>is the message "You stop to avoid hitting."  (Which sometimes comes out as
+>"You stop to avoid hitting <random garbage>.")  I haven't hit the plethora
+
+You have defined DOGNAME but you are missing the dog's name :-)
+Simply add 'dogname:...' to your nethack options.
+
+	Andreas Toenne
+D
+#! rnews 1201
+Path: alberta!mnetor!uunet!mcvax!unido!rmi!dg2kk!dg2kk
+From: dg2kk at dg2kk.UUCP (Walter)
+Newsgroups: rec.ham-radio.packet
+Subject: Problems with WA8DED 2.1 and TNC-2 clones (+possible solution)
+Summary: PTT line is released too early
+Message-ID: <174 at dg2kk.UUCP>
+Date: 10 Dec 87 23:09:52 GMT
+Reply-To: dg2kk at dg2kk.UUCP
+Organization: dg2kk, W Germany, (JO30FT)
+Lines: 20
+
+Some TNC-2's have problems with the WA8DED software (version 2.1).
+Most of the outgoing frames cannot be docoded by other stations because
+the software turns off the transmitter before all bits have been transmitted.
+
+There are two solutions to this problem:
+
+Hardware: connect a small (~2.2uf) capacitor from the base of the PTT keying
+          transistor to ground. (Note: you may have to increase TXDELAY)
+
+Software: the code that turns off the transmitter starts at location $037B
+          (3E 05...). It's possible to insert a short delay loop, so that the
+          transmitter remains keyed for a few milliseconds longer.
+          (I haven't tried this yet.)
+
+
+73s, Walter  dg2kk at dg2kk.UUCP
+
+
+PS: Does anyone know if WA8DED is on USENET/Bitnet/ARPANET/anynet???
+    What is his email address? Please let me know.  Thanks.
+#! rnews 1319
+Path: alberta!mnetor!uunet!mcvax!4gl!honzo
+From: honzo at 4gl.UUCP (Honzo Svasek)
+Newsgroups: comp.unix.xenix,comp.os.misc,comp.unix.questions,comp.unix.wizards
+Subject: Re: Venix Users?
+Message-ID: <253 at 4gl.UUCP>
+Date: 11 Dec 87 18:23:50 GMT
+References: <2439 at sputnik.COM>
+Organization: 4GL Consultants b.v., the Netherlands
+Lines: 27
+Xref: alberta comp.unix.xenix:1172 comp.os.misc:341 comp.unix.questions:4773 comp.unix.wizards:5750
+
+in article <2439 at sputnik.COM>, dbb at tc.fluke.COM (Dave Bartley) says:
+> 
+> The Great OS Search continues ...
+> 
+> What about Venix?
+
+I am using Venix for several years now and have the folowing comments.
+
+1. it IS System V UNIX.
+
+2. It has a faster 'feel' for the interactive user than Xenix or Microport
+
+3. It seems to be bug free. This system is running news and I am doing most
+   of the development on it. I have had no problems for at least a year now,
+   and the system is on the air 24 hours a day.
+
+   A few times I had to remove the -O options when compiling, but same
+   counts for 3B2 UNIX.
+
+4. Venturecom claims it to be REAL TIME. I have no experience with
+   REAL real-time on this system, and don't know if the venix system calls
+   are interruptable.
+
+Honzo Svasek, <mcvax!4gl!honzo>
+
+PS. Anyone out there has a way to install 2.2 on a Seagate ST4096 disk?
+	(on an AT)
+#! rnews 1252
+Path: alberta!mnetor!uunet!mcvax!cernvax!ethz!forty2!vogel
+From: vogel at forty2.UUCP (Stefan Vogel)
+Newsgroups: comp.sources.bugs
+Subject: bug in sush
+Message-ID: <123 at forty2.UUCP>
+Date: 11 Dec 87 17:02:58 GMT
+Reply-To: vogel at forty2.UUCP (Stefan Vogel)
+Organization: Exp. Physics University Zuerich
+Lines: 33
+
+We found the following bug in sushperm.c of the sush distribution:
+
+In routine addgroup the pointer gpmem was incremented before it was used.
+So, the first member of the group was never found, and the reference to
+the last member lead to an illegal memory reference (NULL pointer!).
+
+original code:
+
+	 gpmem = gpt->gr_mem;
+	 while(*gpmem++) {  <------------------gpmem is incremented
+		 if(!strcmp(user,*gpmem))  <---gpmem is used
+			 ok++;
+	 }
+
+	 /* auth failed - return */
+
+corrected code:
+
+	 gpmem = gpt->gr_mem;
+	 while(*gpmem) {
+		 if(!strcmp(user,*gpmem++))
+			 ok++;
+	 }
+
+	 /* auth failed - return */
+
+                              Stefan Vogel, Simon Poole
+                              Inst. for Theoretical Physics
+                              University of Zuerich
+                              Switzerland
+
+                              UUCP:   ....mcvac!cernvax!forty2!vogel
+                              BITNET: k524911 at czhrzu1a
+#! rnews 626
+Path: alberta!mnetor!uunet!mcvax!prlb2!vub!leo
+From: leo at vub.UUCP (Leo Smekens)
+Newsgroups: comp.sys.mac
+Subject: 4th Dimension vs. dBase Mac
+Keywords: 4th Dimension,dBase Mac,Macintosh
+Message-ID: <506 at vub.UUCP>
+Date: 11 Dec 87 13:40:05 GMT
+Organization: Vrije Universiteit Brussel, Brussels
+Lines: 14
+
+What can 4th Dimension do what dBase Mac can't?
+What can dBase Mac do what 4th Dimension can't?
+
+Who should invest in which program?
+If you don`t like answering on the net,
+please mail direct to:
+leo at vub.vub.uucp
+
+Leo Smekens
+Metabolism & Endocrinology
+Free University of Brussels
+Laarbeeklaan 103
+B-1090 BRUSSELS
+BELGIUM
+#! rnews 783
+Path: alberta!mnetor!uunet!mcvax!prlb2!vub!leo
+From: leo at vub.UUCP (Leo Smekens)
+Newsgroups: comp.sys.mac
+Subject: Latest SE's shipped
+Keywords: Mac,Mac SE,Macintosh,Macintosh SE,hardware
+Message-ID: <507 at vub.UUCP>
+Date: 11 Dec 87 13:50:46 GMT
+Organization: Vrije Universiteit Brussel, Brussels
+Lines: 15
+
+We noticed that the last Macintosh SE's we received at our
+university are equipped with a new type of mouse,and,
+apparently,with another internal disk drive (at least,it
+sounds differently and beeps upon activation).
+What has been changed on the new Mac SE compared to the first version?
+If you don't like to answer via the net,please mail direct to:
+
+leo at vub.vub.uucp
+
+Leo Smekens
+Metabolism & Endocrinology
+Free University of Brussels
+Laarbeeklaan 103
+B-1090 BRUSSELS
+BELGIUM
+#! rnews 1432
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!csnjr
+From: csnjr at its63b.ed.ac.uk (Nick Rothwell)
+Newsgroups: rec.music.misc
+Subject: Re: Ace-Screamingest Guitar Solos on Record
+Keywords: guitar, flames (regrettably)
+Message-ID: <826 at its63b.ed.ac.uk>
+Date: 11 Dec 87 13:06:12 GMT
+References: <1725 at s.cc.purdue.edu> <1349 at saturn.ucsc.edu> <6480 at ihlpa.ATT.COM>
+Reply-To: nick at lfcs.ed.ac.uk (Nick Rothwell)
+Organization: LFCS, University of Edinburgh
+Lines: 21
+
+In article <6480 at ihlpa.ATT.COM> rjp1 at ihlpa.ATT.COM writes:
+>>C'mon people, you can't omit:
+>...
+>Edgar Froese	-  Underwater Twilight, Riding The Ray, Le Parc and
+>		   Heartbreakers tunes, etc, etc.
+
+Froese's best guitar solo, by most accounts, is on Cloudburst Flight
+on the Force Majeure album, back in '79. He starts with slow chords
+and fingering on a 12 string acoustic, then some "power chords" (!) on
+the 12 string, and then onto the electric (Fender Strat I think).
+Some of the recent live work's been good, as well - Franke holding down
+a rhythm, with Froese and Haslinger both firing off screaming guitar riffs.
+
+>Bob Pietkivitch   ( e - x - p - o - s - u - r - e )   UUCP: ihnp4!ihlpa!rjp1
+
+-- 
+Nick Rothwell,	Laboratory for Foundations of Computer Science, Edinburgh.
+		nick%lfcs.ed.ac.uk at nss.cs.ucl.ac.uk
+		<Atlantic Ocean>!mcvax!ukc!lfcs!nick
+~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~
+"Nothing's forgotten. Nothing is ever forgotten."   - Herne
+#! rnews 818
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!gvw
+From: gvw at its63b.ed.ac.uk (G Wilson)
+Newsgroups: comp.sys.transputer
+Subject: Meiko email contact
+Message-ID: <827 at its63b.ed.ac.uk>
+Date: 11 Dec 87 13:23:42 GMT
+Reply-To: gvw at its63b.ed.ac.uk (G Wilson)
+Organization: I.T. School, Univ. of Edinburgh, U.K.
+Lines: 18
+
+In response to several queries --- Meiko Ltd. is not
+connected to any electronic mail network at present.
+However, both myself and Dr. Duncan Roweth, who are
+Meiko employees working on the Edinburgh Concurrent
+Supercomputer Project, are connected to various networks.
+I can be reached at:
+
+	gvw at itspna.ed.ac.uk (usual)
+	gvw at its63b.ed.ac.uk (alternative)
+
+while Duncan is:
+
+	egnp36 at meiko.ed.ac.uk
+
+If you want more information on Meiko, please include
+a telephone number and a physical mail address.
+
+Greg
+#! rnews 733
+Path: alberta!mnetor!uunet!mcvax!ukc!dcl-cs!nott-cs!pyr1.cs.ucl.ac.uk!awylie
+From: awylie at pyr1.cs.ucl.ac.uk
+Newsgroups: rec.games.misc
+Subject: Re: Does anyone remember Zork1? (*S
+Message-ID: <42800002 at pyr1.cs.ucl.ac.uk>
+Date: 11 Dec 87 09:42:00 GMT
+References: <22039 at ucbvax.BERKELEY.EDU>
+Lines: 8
+Nf-ID: #R:ucbvax.BERKELEY.EDU:-2203900:pyr1.cs.ucl.ac.uk:42800002:000:300
+Nf-From: pyr1.cs.ucl.ac.uk!awylie    Dec 11 09:42:00 1987
+
+
+Its a looooong time since I played Zork, but I believe that you can get
+to the INSIDE of the grate in the woods by which time you should have
+obtained a key which will open it. This gives you an alternative entrance/
+exit to the dungeon, but is not actually much help.
+   Andrew
+
+awylie at uk.ac.ucl.cs
+#! rnews 1324
+Path: alberta!mnetor!uunet!mcvax!ukc!eagle!icdoc!ivax!mst
+From: mst at ivax.doc.ic.ac.uk (Martin Taylor)
+Newsgroups: rec.games.trivia
+Subject: Re: words to a song (old lady who swallowed a fly)
+Message-ID: <148 at gould.doc.ic.ac.uk>
+Date: 11 Dec 87 10:55:47 GMT
+References: <2170 at homxc.UUCP> <12270004 at hpldola.HP.COM> <1053 at mtuxo.UUCP>
+Sender: news at doc.ic.ac.uk
+Reply-To: mst at doc.ic.ac.uk (Martin Taylor)
+Organization: Dept. of Computing, Imperial College, London, UK.
+Lines: 26
+
+In article <1053 at mtuxo.UUCP> gertler at mtuxo.UUCP (xm960-D.GERTLER) writes:
+
+>As I recall, the sequence is as follows (more or less):
+>
+>	1)  Fly		Perhaps she'll die.
+>	2)  Spider	That wriggled and jiggled and tickled inside her.
+>	3)  Bird	How absurd to swallow a bird!
+>	4)  Cat		Imagine that, to swallow a cat!
+>	5)  Dog		What a hog, to swallow a dog!
+>	6)  Horse	She's dead, of course!
+>
+>I seem to remember a goat at about 5.5, but I don't
+>recall it's associated comment.  Sorry.
+>
+
+It's "She just opened her throat, and swallowed a goat"
+
+Also heard at an informal church social group, this alternative ending:
+
+	6)  Horse	Not easy, of course, but she swallowed a horse
+	7)  Minister	That finished her!
+
+
+Martin S Taylor			        Department of Computing
+JANET/ARPANET : mst at doc.ic.ac.uk	Imperial College
++44 589 5111 X4996			LONDON    SW7 2BZ
+#! rnews 1060
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!aiva!ken
+From: ken at aiva.ed.ac.uk (Ken Johnson)
+Newsgroups: comp.edu,comp.lang.misc
+Subject: Free audio tape about Logo
+Message-ID: <209 at aiva.ed.ac.uk>
+Date: 11 Dec 87 11:33:10 GMT
+Reply-To: ken at aiva.ed.ac.uk (Ken Johnson)
+Followup-To: comp.lang.misc
+Organization: Dept. of AI, Univ. of Edinburgh, UK
+Lines: 26
+Xref: alberta comp.edu:745 comp.lang.misc:887
+
+
+Logotron Limited have prepared an audio tape called "Logo comes of age". 
+
+Although it is basically a plug for the Logotron product, (it contains a
+reference to the mythical "LCSI standard", for example) there is a lot
+of interesting chat about how Logo is actually used. 
+
+Playing time 45 minutes. 
+
+Free from:
+ Logotron Limited,
+ Dales Brewery,
+ Gwydir Street,
+ CAMBRIDGE,
+ England CB1 2LJ
+
+	Phone (0223) 323656
+-- 
+
+From Ken Johnson			| Phone 031-225 4464 Ext 212
+     AI Applications Institute		| Email k.johnson at ed.ac.uk
+     80 South Bridge			|
+     The University			|
+     EDINBURGH, Scotland EH1 1HN	|
+
+"Things will get worse before they get worse."
+#! rnews 2806
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!tom
+From: tom at cs.hw.ac.uk (Tom Kane)
+Newsgroups: comp.ai
+Subject: Probability Bounds from Bayes Theory: (A Problem).
+Keywords: Bayes Theorem, Probability, Expert Systems, Uncertainty
+Message-ID: <1578 at brahma.cs.hw.ac.uk>
+Date: 11 Dec 87 14:10:21 GMT
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 65
+
+
+I am sending this letter out to the network to ask for solutions to a
+particular problem of Bayesian Inference. Below is the text of the
+problem, and at the end is the mathematical statement of the information
+given. Simply, I am asking the questions:
+
+1) Can you find bounds on the final result. If so, how?
+2) If not, why is it not possible to do so? 
+   What is missing in the specification of the problem?
+3) If you get nowhere with this problem, would you be able to solve it
+   if you were given the information: p(pv|t or l)=0.9?
+
+I am interested in the problem of providing probability bounds for events
+specified in a Bayesian setting when not all the necessary conditional 
+probabilities are provided in setting up the problem. 
+
+PROBLEM
+~~~~~~~
+(A problem relevant to the handling of Uncertainty in Expert Systems.)
+We want to know the probability of a patient having both lung cancer and
+tuberculosis based on the fact that this person has had a positive reading
+in a chest X-ray. We are given the following pieces of information:
+
+1. The probability that a person with lung cancer will have a positive
+   chest X-ray is 0.9.
+
+2. The probability that a person with tuberculosis will have a positive
+   chest X-ray is 0.95.
+
+3. The probability that a person with neither lung cancer nor tuberculosis
+   will have a positive chest X-ray is 0.07.
+
+4. In the town of interest, 4 percent of the population have lung cancer,
+   and three percent have tuberculosis.
+
+EVENTS
+~~~~~~
+l = lung cancer;       t = tuberculosis;           pv = positive chest X-ray
+
+SETUP
+~~~~~
+In the statement of the problem below:-
+
+~l means 'not l'.
+~l, ~t means 'not l and not t'.
+t or l means 't or l'
+where 'not', 'and' , and 'or' are logical operators.
+so that: p(~l, ~t) means probability( not l and not t).
+Also,
+p(pv|l) means the conditional probability of event pv, given event l.
+PRIORS
+~~~~~~
+p(l) = 0.04;           p(t) = 0.03;                p(~l, ~t) = 0.95
+CONDITIONALS
+~~~~~~~~~~~~
+p(pv|l) = 0.9;         p(pv|t) = 0.95;             p(pv| ~t,~l) = 0.07
+
+(You are not given p(pv| t or l) )
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Please mail all solutions or comments to me, and I will let interested parties 
+know what the results are. 
+(I will specially treasure attempts which don't use independence assumptions.)
+Thanks in advance to anyone who will spend time on this problem...
+Regards,
+Tom Kane.
+#! rnews 3109
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!adrian
+From: adrian at cs.hw.ac.uk (Adrian Hurt)
+Newsgroups: sci.space
+Subject: Re: SPACE Digest V8 #68
+Summary: First submarines
+Message-ID: <1580 at brahma.cs.hw.ac.uk>
+Date: 11 Dec 87 15:43:08 GMT
+References: <OTA at ANGBAND.S1.GOV> <8712091350.AA00806 at angband.s1.gov>
+Organization: Computer Science, Heriot-Watt U., Scotland
+Lines: 52
+
+In article <8712091350.AA00806 at angband.s1.gov>, ESC1361 at DDAESA10.BITNET (Rupert Williams) writes:
+> 
+>						In fact the British must have
+> been the most war-like nation in the world, fighting with more countries than
+> anyone I can think off. Is this the reason why the English language is so
+> popular ( hello America!! )???!!!! 
+
+I assume you refer to the British Empire - prior to that, Britain (and before
+the rest joined/were conquered by it, England) fought mostly against either
+France, Spain or both at once. The wide domain of the English language is
+directly due to the Empire, just as the wide use of Spanish throughout South
+and Central America is due to the Spanish Empire.
+
+>    I think also that ALL countries train their armies in ice and snow??!!
+
+Including the Arabs? :-)
+
+>    As for the Submarine....well I dont know about that, I thought that was an
+> English invention too, like the Tank and the Jet-plane??! Maybe I'm wrong??!
+
+There are a number of ancient submarine designs, including one which was a
+rowing boat with a watertight cover! The first practical submarine was (I
+believe) designed by a Mr. Holland, resident of Ireland, for use against the
+Royal Navy. The Royal Navy took over the design, but regarded such concealed
+warfare as ungentlemanly, and didn't make much use of them until Germany
+showed the way.
+
+The jet plane was invented practically at the same time by Britain, Germany
+and the U.S.A. Germany had the first flying jet aircraft, followed closely by
+Britain. Britain would have had a jet fighter not long after the Battle of
+Britain except for government intervention. Fortunately, Hitler was equally
+stupid. The Nazis believed they would win the war in a couple of months, and
+gave little interest to projects which would bear no short term military
+results. When they did get the world's first jet fighter (the Me262) it was
+pretty devastating, albeit rare, until Hitler decided that it would make a
+great fighter-bomber. Two bombs were fitted under the nose, at the expense
+of two cannon and much speed and agility. Fortunately, Nazi policy was "if
+it doesn't work, stomp on whoever says so." The first American jet was too
+late for WW2, and the first Russian jet had a captured German engine.
+
+>    As for the NASA/Space shuttle saga, the sooner they pull their fingers out
+> the better. Arianne is having a field day over this one.
+
+Now, for those who say "Why is this in sci.space?", read the above and apply
+the lessons of history to the shuttle, Hermes, HOTOL, or whatever craft your
+country should be sponsoring.
+
+-- 
+ "Keyboard? Tis quaint!" - M. Scott
+
+ Adrian Hurt			     |	JANET:  adrian at uk.ac.hw.cs
+ UUCP: ..!ukc!cs.hw.ac.uk!adrian     |  ARPA:   adrian at cs.hw.ac.uk
+#! rnews 1128
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: sci.space
+Subject: Re: Remote Sensing Fascism
+Message-ID: <1583 at brahma.cs.hw.ac.uk>
+Date: 11 Dec 87 17:36:36 GMT
+References: <566084060.amon at H.GP.CS.CMU.EDU>
+Reply-To: jack at cs.glasgow.ac.uk (Jack Campin)
+Organization: PISA Project, Glesga Yoonie
+Lines: 18
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+
+[ignore the above email address and use my signature]
+
+>'Our' (I use the term VERY loosely since I'm not really sure which side
+>they are on) people have obviously learned how to lie about the
+>existance of things which are common knowledge
+>PS: Is it now appropriate to address members of the DOD and the various spook
+>    agencies as Comrade?
+
+How about Right Honourable? (or have the Zircon and Spycatcher affairs not
+made the news over there?)
+
+
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 1825
+Path: alberta!mnetor!uunet!mcvax!ukc!its63b!hwcs!jack
+From: jack at cs.hw.ac.uk (Jack Campin)
+Newsgroups: rec.arts.sf-lovers
+Subject: Re: Houston SF Opera
+Message-ID: <1584 at brahma.cs.hw.ac.uk>
+Date: 11 Dec 87 19:10:14 GMT
+References: <8168 at ism780c.UUCP>
+Reply-To: jack at cs.glasgow.ac.uk (Jack Campin)
+Organization: PISA Project, Glesga Yoonie
+Lines: 32
+Summary:
+
+Expires:
+
+Sender:
+
+Followup-To:
+
+
+
+[ignore the above email address and use my signature]
+
+In article <8168 at ism780c.UUCP> jimh at ism780c.UUCP (Jim Hori) writes:
+>
+>I expected somebody to respond by now to the
+>question about a SF opera being co-written
+>by Philip Glass and somebody named Lessing,
+>
+>Any other news on this opera?
+
+It's "the Making Of The Representative From Planet 8", if I remember right.
+This is from the announcements to a Radio 3 broadcast of Glass's new orchestral
+piece "The Light" - a tone poem about the Michelson-Morley experiments.
+
+Incidentally, it's not the first SF opera. I heard a broadcast in New Zealand
+of a Swedish opera called "Aniara", based on an epic poem about a colonizer
+spaceship on its way to oblivion. I can remember neither the poet's nor the
+composer's name.
+
+I've only read the first of Lessing's series and didn't like it much. I felt I
+was being preached at (Lessing is a Sufi - I don't know whether her having
+been born in Iran has anything to with that - and it shows in her more recent
+writing). OK, the content of the sermon may not have been as obnoxious as
+Heinlein, Tolkien or Pournelle, but it was still gratuitous in literary terms.
+
+
+-- 
+ARPA: jack%cs.glasgow.ac.uk at nss.cs.ucl.ac.uk
+JANET:jack at uk.ac.glasgow.cs       USENET: ...mcvax!ukc!cs.glasgow.ac.uk!jack
+Mail: Jack Campin, Computing Science Department, University of Glasgow,
+      17 Lilybank Gardens, Glasgow G12 8QQ, Scotland (041 339 8855 x 6045)
+#! rnews 1184
+Path: alberta!mnetor!uunet!mcvax!ukc!stl!stc!root44!cdwf
+From: cdwf at root.co.uk (Clive D.W. Feather)
+Newsgroups: rec.arts.sf-lovers
+Subject: Asimov, UFO, and others
+Summary: Where you can find them
+Message-ID: <497 at root44.co.uk>
+Date: 11 Dec 87 08:48:49 GMT
+Reply-To: cdwf at root44.UUCP (Clive D.W. Feather)
+Organization: Root Computers Ltd, London, England
+Lines: 17
+
+Readers in the UK, and those elsewhere with UK contacts, may like to know...
+
+(1) W.H.Smiths are stocking Asimov's "Fantastic Voyage II" in hardback,
+UKL10.95.
+
+(2) An organisation called Channel 5 Video, available at least in W.H.Smiths
+and Woolworths, produces tapes of UFO, Thunderbirds, Captain Scarlet (under the
+title "Captain Scarlet and the Mysterons", Stingray (yuk), and, of course,
+the Prisoner. Each tape that I have seen contains two episodes of the
+appropriate program. All cost less than UKL10.
+What proportion of the total output of these programmes is available I can't
+say, except for the Prisoner (100%).
+
+Warning for foreign readers:
+These tapes are VHS-PAL. According to "Which?" they work in Australia,
+New Zealand, Europe except France, South Africa, and the Middle East, but not
+North America.
+#! rnews 1077
+Path: alberta!mnetor!uunet!mcvax!ukc!stl!stc!root44!jgh
+From: jgh at root.co.uk (Jeremy G Harris)
+Newsgroups: comp.protocols.tcp-ip
+Subject: Subnetting questions
+Keywords: subnet ethernet
+Message-ID: <498 at root44.co.uk>
+Date: 11 Dec 87 10:25:23 GMT
+Organization: Root Computers Ltd., London, England
+Lines: 27
+
+A whole bunch of questions:
+
+
+Does anybody run multiple subnets on a single Ethernet?
+
+    If so, do you use subnet broadcasts or net broadcasts?
+    Do you find it worthwhile to use ethernet multicast for
+    subnet broadcasts? How do you assign the multicast addresses?
+    For what purposes do you still use net broadcast?
+
+    Should redirects be provided by an inter-subnet gateway,
+    when both subnets are on the same Ethernet?
+
+
+What are the semantics of 'ICMP redirect to net' in a subnettted environment?
+
+
+Does anybody run multiple classes of subnet on a single net?
+
+    Does the mechanism proposed in rfc950 ( ICMP broadcasts to
+    discover the subnet mask ) still work? Do you use it?
+
+
+Thanks for your time
+    Jeremy
+-- 
+Jeremy Harris			jgh at root.co.uk
+#! rnews 1006
+Path: alberta!mnetor!uunet!mcvax!ukc!stl!stc!root44!hrc63!nwh
+From: nwh at hrc63.co.uk (Nigel Holder Marconi)
+Newsgroups: comp.unix.wizards
+Subject: Re: /dev/swap - possibility of it being a ramdisk
+Summary: depends on your system ?
+Keywords: /dev/swap
+Message-ID: <476 at hrc63.co.uk>
+Date: 11 Dec 87 10:09:05 GMT
+References: <712 at qetzal.UUCP> <16869 at topaz.rutgers.edu>
+Organization: GEC Hirst Research Centre, Wembley, England.
+Lines: 12
+
+
+I have just added some extra memory to a Sun 3.  Unfortunately, it did
+not increase the usable amount of virtual memory.  I have been informed
+(not by Sun I hasten to add), that 4.x will only allocate memory up to
+the disk swap space size.  Adding more memory will speed things up but will
+not increase your total usable virtual memory size (this is achieved by
+increasing the swap space).  I was also informed that system V does not
+inforce this type of restriction.
+
+
+Nigel Holder			UK JANET:       yf21 at uk.co.gec-mrc.u
+				ARPA:           yf21%u.gec-mrc.co.uk at ucl-cs
+#! rnews 781
+Path: alberta!mnetor!uunet!mcvax!enea!luth!jem
+From: jem at sm.luth.se (Jan Erik Mostr|m)
+Newsgroups: comp.sys.mac,comp.sys.mac.hypercard
+Subject: Hypercard/CD-ROM
+Message-ID: <902 at luth.luth.se>
+Date: 11 Dec 87 11:31:13 GMT
+Reply-To: Jan Erik Mostr|m <jem at luth.luth.se>
+Organization: University of Lulea, Sweden
+Lines: 8
+Xref: alberta comp.sys.mac:10017 comp.sys.mac.hypercard:200
+UUCP-Path: {uunet,mcvax}!enea!luth.luth.se!jem
+
+
+
+
+Is there someone out there who has experience with Hypercard and CD-ROM.
+I would appreciate any information (and especially about Mac II/CD-ROM).
+-- 
+Jan Erik Mostrom     | {uunet,mcvax}!enea!luth!jem       | Mors certa,
+University of Lulea  | jem at sm.luth.se                    | vita incerta
+Sweden               | jem at luth.UUCP                     |
+#! rnews 1535
+Path: alberta!mnetor!uunet!mcvax!enea!diab!pf
+From: pf at diab.UUCP (Per Fogelstrom)
+Newsgroups: comp.arch
+Subject: Re: Why is SPARC so slow?
+Summary: Yet another "super processor".
+Message-ID: <344 at ma.diab.UUCP>
+Date: 11 Dec 87 13:59:12 GMT
+References: <1078 at quacky.UUCP> <8809 at sgi.SGI.COM> <6964 at apple.UUCP>
+Reply-To: pf at ma.UUCP (Per Fogelstrom)
+Organization: Diab Data AB, Taby, Sweden
+Lines: 16
+
+Well, the history repeats once again. A new RISC chip is launched and peopels
+expectations reaches new "high scores". A few years ago there was another risc
+chip set brougth to the market, called the Clipper. This processors performence
+was climed to sweep all competitors off the sceene. Often compared to the
+DEC 8x00 computers. For this chip set the picture has cleared now. The perfor-
+mence range is not much more than can be achived with a 16-20 Mhz 68020. The
+most i have seen of the 33Mhz versions is one running at room temprature.
+Intergraph is one of the companys who is still using the Clipper (They recently
+bought the rights for the chip set from NS/Fairchild) . From what i recall they
+throw out the NS32032 for the Clipper. Well they could have had 2-3 times the
+clipper performance with the NS32532 today. And they called the buy a bargin !
+It's not suprising that the MIPS 2000 gives most power/Mhz, The architecture has
+evolved during many years, without a hard pressure from the marketing such as
+'We must have it NOW!!!'. (John Mashey mayby has another opinion, only my guess)
+
+SO: Why is everybody so suprised ????!
+#! rnews 1169
+Path: alberta!mnetor!uunet!mcvax!mhres!jv
+From: jv at mhres.mh.nl (Johan Vromans)
+Newsgroups: comp.unix.questions
+Subject: Re: Finding Files
+Summary: looking everywhere
+Message-ID: <1503 at mhres.mh.nl>
+Date: 12 Dec 87 16:08:12 GMT
+References: <205700003 at prism> <4441 at ihlpg.ATT.COM>
+Organization: Multihouse N.V., The Netherlands
+Lines: 21
+
+In article <205700003 at prism> billc at prism.UUCP writes:
+>
+>	Right now, to find a file somewhere under my current directory,
+>	I use the following alias:
+>
+>	    alias	where	"find \$cwd -name \!* -exec echo {} \;"
+> .. etc ..
+
+On our systems, a small cron script executes every night the following
+command:
+
+	find / -print > /dirfile
+
+Finding a file somewhere can be done by grepping in the /dirfile.
+Of course, the contents of /dirfile are not really up-to-date, but this is
+just a minor drawback. "find" on the whole system (including mounted disks)
+takes more than an hour, a grep in /dirfile much less than a minute.
+-- 
+Johan Vromans                              | jv at mh.nl via European backbone
+Multihouse N.V., Gouda, the Netherlands    | uucp: ..{uunet!}mcvax!mh.nl!jv
+"It is better to light a candle than to curse the darkness"
+#! rnews 904
+Path: alberta!mnetor!uunet!mcvax!mhres!jv
+From: jv at mhres.mh.nl (Johan Vromans)
+Newsgroups: comp.os.vms
+Subject: Re: Are VMS and VAX synonymous?
+Summary: NO
+Message-ID: <1504 at mhres.mh.nl>
+Date: 12 Dec 87 16:55:05 GMT
+References: <8712111910.AA18210 at ucbvax.Berkeley.EDU>
+Organization: Multihouse N.V., The Netherlands
+Lines: 11
+
+In article <8712111910.AA18210 at ucbvax.Berkeley.EDU> "ERI::SMITH" <smith%eri.decnet at mghccc.harvard.edu> writes:
+>But someone who thinks VAX and VMS are synonymous
+>MAY POSSIBLY also be expressing a philosophical stance.
+
+The only thing you can do between "#ifdef vax" and its corresponding "#endif"
+is conclude that you are running on a big-endian machine ....
+
+-- 
+Johan Vromans                              | jv at mh.nl via European backbone
+Multihouse N.V., Gouda, the Netherlands    | uucp: ..{uunet!}mcvax!mh.nl!jv
+"It is better to light a candle than to curse the darkness"
+#! rnews 691
+Path: alberta!mnetor!uunet!mcvax!enea!tut!jh
+From: jh at tut.fi (Juha Hein{nen)
+Newsgroups: comp.lang.scheme
+Subject: Re: Request for MacScheme source for SCOOPS
+Message-ID: <2108 at korppi.tut.fi>
+Date: 12 Dec 87 07:32:39 GMT
+References: <8712101554.AA15940 at ucbvax.Berkeley.EDU>
+Reply-To: jh at korppi.UUCP (Juha Hein{nen)
+Organization: Tampere University of Technology, Finland
+Lines: 10
+
+MacScheme doesn't have enviroments (atleast my version doesn't).  It
+would be straightforward to port SCOOPS if somebody first provides
+environments.  The hacks provided with MacScheme distribution are not
+enough.
+
+-- 
+	Juha Heinanen
+	Tampere Univ. of Technology
+	Finland
+	jh at tut.fi (Internet), tut!jh (UUCP)
+#! rnews 643
+Path: alberta!mnetor!uunet!mcvax!enea!diab!pf
+From: pf at diab.UUCP (Per Fogelstrom)
+Newsgroups: comp.arch
+Subject: Re: Zilog Z320 32-bit chip
+Keywords: 80,000 vaporware model
+Message-ID: <345 at ma.diab.UUCP>
+Date: 12 Dec 87 11:15:23 GMT
+References: <1911 at ho95e.ATT.COM> <9071 at utzoo.UUCP> <3521 at aw.sei.cmu.edu> <485 at PT.CS.CMU.EDU>
+Reply-To: pf at ma.UUCP (Per Fogelstrom)
+Organization: Diab Data AB, Taby, Sweden
+Lines: 3
+
+The Z80,000 was put on market just about 8 months ago. It newer reached the
+target specification (e.g. clock speed) and the performence was not impressive.
+It has some nice things, but as someone pointed out, to late ..........
+#! rnews 884
+Path: alberta!mnetor!uunet!mcvax!diku!daimi!erja
+From: erja at daimi.UUCP (Erik Jacobsen)
+Newsgroups: comp.lang.modula2
+Subject: Re: Modula II on IBM PC with HALO graphics
+Keywords: Modula IBM HALO graphics
+Message-ID: <1253 at daimi.UUCP>
+Date: 12 Dec 87 13:13:50 GMT
+References: <17237 at glacier.STANFORD.EDU>
+Reply-To: erja at daimi.UUCP (Erik Jacobsen)
+Organization: DAIMI: Computer Science Department, Aarhus University, Denmark
+Lines: 10
+
+jbn at glacier.STANFORD.EDU (John B. Nagle) asks in <17237 at glacier.STANFORD.EDU>
+> Some questions on Logitec Modula II:
+> 
+> 1.  Are subranges assigned space appropriately?  In particular,
+> does 0..255 occupy only one byte?  
+
+No, subranges occupy the same amount of space as the type they are
+a subrange of. E.g. 0..255 will occupy two bytes. You may use a
+CHAR or a BYTE, and convert to and from CARDINAL everytime you need
+to do some caluculations.
+#! rnews 869
+Path: alberta!mnetor!uunet!mcvax!unido!tub!stx
+From: stx at tub.UUCP (Stefan Taxhet)
+Newsgroups: comp.text,comp.sources.wanted
+Subject: MS-WORD to Q-ONE
+Keywords: MS-WORD Q-ONE DCA
+Message-ID: <319 at tub.UUCP>
+Date: 11 Dec 87 18:23:35 GMT
+Organization: Technical University of Berlin, Germany
+Lines: 19
+Xref: alberta comp.text:1346 comp.sources.wanted:2722
+
+
+We're looking for a document conversion program.
+It should translate MS-Word- to Q-ONE-documents.
+
+Q-ONE offers conversions to several formats as:
+Fortune:Word, Wang, IBM's DCA (RFT,FFT)
+Therefor  programs to interchange documents between
+MS-Word and these format would also help us.
+
+Thanks in advance
+
+Stefan Taxhet,
+Communications and Operating Systems Research Group
+Technical University of Berlin
+
+UUCP: ...!pyramid!tub!stx (From the US)
+      ...!mcvax!unido!tub!stx (From Europe)
+
+BITNET: stx at db0tui6.BITNET
+#! rnews 1235
+Path: alberta!mnetor!uunet!mcvax!unido!rmi!kkaempf
+From: kkaempf at rmi.UUCP (Klaus Kaempf)
+Newsgroups: comp.sys.amiga
+Subject: Breaking the 54MB limit on HardDisks
+Keywords: BitMap, Blocksize, filehandler.h
+Message-ID: <821 at rmi.UUCP>
+Date: 12 Dec 87 12:19:32 GMT
+Reply-To: kkaempf at rmi.UUCP (Klaus Kaempf)
+Organization: RMI Net, Aachen, W.Germany
+Lines: 19
+
+
+
+Well, maybe that i've overlooked something really important, but i don't
+see the 54MB limit with the AmigaDOS.
+About a yaer ago, when there was no mount command, somebody from CATS
+posted a sample device driver that mounted itself. It set up a device
+structure which described the layout of the device. This structure is
+now documented in dos/filehandler.h. One field in this structure holds
+the number of longwords per block of this device. This is always set
+to 128, giving 512 Bytes per Block.
+Now, if i set this to 256 (1024 Bytes per Block), i should be able to
+increase the disk limit to 108MB.
+Apparently, AmigaDOS supports larger blocksizes. Just have a look into
+the AmigaDOS Manual from Bantam. All block-layouts are described relative
+to a 'SIZE', nowhere is said that SIZE is fixed to 128 !
+
+So where is the problem ??? (Please, send no flames, only facts !)
+
+Klaus
+#! rnews 2545
+Path: alberta!mnetor!uunet!mcvax!botter!ast
+From: ast at cs.vu.nl (Andy Tanenbaum)
+Newsgroups: comp.os.minix
+Subject: Getting rid of _cleanup (finally)
+Message-ID: <1783 at botter.cs.vu.nl>
+Date: 13 Dec 87 11:56:59 GMT
+Reply-To: ast at cs.vu.nl (Andy Tanenbaum)
+Organization: VU Informatica, Amsterdam
+Lines: 97
+
+There was a lot of discussion about how to get rid of my calls to _cleanup
+earlier.  Here is the solution that I finally adopted.    The following commands
+should do the job.
+  cc -c -LIB exit.c putc.c
+  ar r /usr/lib/libc.a exit.c putc.c
+  ar x /usr/lib/libc.a cleanup.s
+  ar d /usr/lib/libc.a cleanup.s
+  ar bfork.s /usr/lib/libc.a cleanup.s
+
+This requires the new archiver posted a while back (for the b option).
+It also assumes that putting cleanup before fork.s will include cleanup.s
+after exit.s and putc.s (check this).
+
+Andy Tanenbaum (ast at cs.vu.nl)
+
+
+: This is a shar archive.  Extract with sh, not csh.
+: This archive ends with exit, so do not worry about trailing junk.
+: --------------------------- cut here --------------------------
+PATH=/bin:/usr/bin
+echo Extracting \e\x\i\t\.\c
+sed 's/^X//' > \e\x\i\t\.\c << '+ END-OF-FILE '\e\x\i\t\.\c
+X#include "../include/lib.h"
+X
+XPUBLIC int (*__cleanup)();
+X
+XPUBLIC int exit(status)
+Xint status;
+X{
+X  if (__cleanup) (*__cleanup)();
+X  return callm1(MM, EXIT, status, 0, 0, NIL_PTR, NIL_PTR, NIL_PTR);
+X}
++ END-OF-FILE exit.c
+chmod 'u=rw,g=r,o=r' \e\x\i\t\.\c
+set `sum \e\x\i\t\.\c`
+sum=$1
+case $sum in
+11315)	:;;
+*)	echo 'Bad sum in '\e\x\i\t\.\c >&2
+esac
+echo Extracting \p\u\t\c\.\c
+sed 's/^X//' > \p\u\t\c\.\c << '+ END-OF-FILE '\p\u\t\c\.\c
+X#include "../include/stdio.h"
+X
+Xextern int (*__cleanup)();
+Xextern int _cleanup();
+X
+Xputc(ch, iop)
+Xchar ch;
+XFILE *iop;
+X{
+X	int n,
+X	didwrite = 0;
+X
+X	if (testflag(iop, (_ERR | _EOF)))
+X		return (EOF); 
+X
+X	if ( !testflag(iop,WRITEMODE))
+X		return(EOF);
+X
+X	if ( testflag(iop,UNBUFF)){
+X		n = write(iop->_fd,&ch,1);
+X		iop->_count = 1;
+X		didwrite++;
+X	}
+X	else{
+X		__cleanup = _cleanup;
+X		*iop->_ptr++ = ch;
+X		if ((++iop->_count) >= BUFSIZ && !testflag(iop,STRINGS) ){
+X			n = write(iop->_fd,iop->_buf,iop->_count);
+X			iop->_ptr = iop->_buf;
+X			didwrite++;
+X		}
+X	}
+X
+X	if (didwrite){
+X		if (n<=0 || iop->_count != n){
+X			if (n < 0)
+X				iop->_flags |= _ERR;
+X			else
+X				iop->_flags |= _EOF;
+X			return (EOF);
+X		}
+X		iop->_count=0;
+X	}
+X	return(ch & CMASK);
+X}
+X
++ END-OF-FILE putc.c
+chmod 'u=rw,g=r,o=r' \p\u\t\c\.\c
+set `sum \p\u\t\c\.\c`
+sum=$1
+case $sum in
+49878)	:;;
+*)	echo 'Bad sum in '\p\u\t\c\.\c >&2
+esac
+exit 0
+#! rnews 1120
+Path: alberta!mnetor!uunet!husc6!mit-eddie!uw-beaver!cornell!svax!beck
+From: beck at svax.cs.cornell.edu (Micah Beck)
+Newsgroups: comp.windows.x
+Subject: Document previewing using Xps
+Message-ID: <1898 at svax.cs.cornell.edu>
+Date: 14 Dec 87 13:25:54 GMT
+Reply-To: beck at svax.cs.cornell.edu (Micah Beck)
+Distribution: comp
+Organization: Cornell Univ. CS Dept, Ithaca NY
+Lines: 18
+
+In article <6224 at jade.BERKELEY.EDU> shipley at web1d.berkeley.edu () writes
+on the subject of troff previewing under X:
+
+>The other thing to try is some version of TROFF which can speak PostScript(tm)
+>which you can then feed through one of the several Xps programs floating
+>around -- these are PostScript(tm) interpreter/previewers for Xwindows.
+
+I've not been very successful in getting Goswell's Xps to preview documents.
+The Postscript file generated from TeX DVI files by dvi2ps and from Ditroff
+files by the Transcript psdit program both cause it to choke, although in
+different ways.
+
+Is anyone using Xps successfully for TeX or Ditroff previewing?  Is there some
+trick?
+
+Micah Beck
+Cornell Dept of Computer Science
+beck at svax.cs.cornell.edu
+#! rnews 1332
+Path: alberta!mnetor!uunet!mcvax!botter!ast
+From: ast at cs.vu.nl (Andy Tanenbaum)
+Newsgroups: comp.os.minix
+Subject: Re: Hard disk partitions?
+Message-ID: <1784 at botter.cs.vu.nl>
+Date: 13 Dec 87 12:13:15 GMT
+References: <5500001 at ucf-cs.ucf.edu>
+Reply-To: ast at cs.vu.nl (Andy Tanenbaum)
+Organization: VU Informatica, Amsterdam
+Lines: 21
+
+In article <5500001 at ucf-cs.ucf.edu> tony at ucf-cs.ucf.edu writes:
+>If partition 1 is set up for DOS and 2 for Minix, with #2 mounted under
+>/usr, Minix crashes unpredictably.  
+
+One thing to remember is that the partition size for partition 1 is one
+smaller than for partition 2.
+
+Another possibility is that the MINIX fdisk and the DOS fdisk don't agree
+on the meaning of the partition table.  If everyone would create their
+partitions from lowest cylinder to highest there would be no ambiguity.
+However, if the order in the partition table is different from the cylinder
+order, there are at least three interpretations.
+  1. Table slot 1 is partition 1
+  2. Innermost cylinder is partition 1
+  3. Outermost cylinder is partition 1
+I believe that the combination of MINIX, DOS, XENIX and Microport together
+exhaust the entire list of possibilities.  I don'know if this is related
+to your problem (which I otherwise can't understand), but it is worth 
+keeping in mind.
+
+Andy Tanenbaum (ast at cs.vu.nl)
+#! rnews 873
+Path: alberta!mnetor!uunet!mcvax!lambert
+From: lambert at cwi.nl (Lambert Meertens)
+Newsgroups: sci.math
+Subject: Re: Fixed Points
+Message-ID: <146 at piring.cwi.nl>
+Date: 13 Dec 87 12:09:54 GMT
+References: <2269 at ihuxv.ATT.COM>
+Organization: CWI, Amsterdam
+Lines: 14
+
+In article <2269 at ihuxv.ATT.COM> eklhad at ihuxv.ATT.COM (K. A. Dahlke) writes:
+) If a continuous function maps the unit square into itself, must it have a
+) fixed point? [...]
+) I seem to remember there is some theorem in topology,
+) without resorting to snakes, that says there is always a fixed point
+) whenever a closed region in a metric space is continuously mapped into itself.
+
+Brouwer's Fixed Point Theorem states that a continuous mapping of an n-cube
+into itself has a fixed point.  This extends, obviously, to any region
+homeomorphic to an n-cube.
+
+-- 
+
+Lambert Meertens, CWI, Amsterdam; lambert at cwi.nl
+#! rnews 1075
+Path: alberta!mnetor!uunet!mcvax!unido!rmi!zentrale
+From: zentrale at rmi.UUCP (RMI Net)
+Newsgroups: rec.ham-radio
+Subject: Re: My PC generates RFI
+Message-ID: <822 at rmi.UUCP>
+Date: 13 Dec 87 10:03:45 GMT
+References: <12354296992.20.QUALCOMM at A.ISI.EDU>
+Reply-To: dl3no at rmi.UUCP (Rupert Mohr)
+Organization: RMI Net, Aachen, W.Germany
+Lines: 21
+
+In article <12354296992.20.QUALCOMM at A.ISI.EDU> QUALCOMM at A.ISI.EDU (Franklin Antonio) writes:
+: >  I'd like to know of some ways to reduce interference to my...
+: 
+: All PCs generate RFI to some degree.  In general, the "clones" are worse
+: than the brand name "IBM", "COMPAQ", etc.  The Macintosh is relatively
+: quiet.
+: 
+
+In general: I would not believe that... (But it may be, that some
+IBM's are as quiet as a clone...)
+
+We have a good mixture of various PCs here...
+
+Regarding my recent posting on RFI of my PK-232:
+The PK-232 was innocent. It was the old power supply which interfered
+exactly on 80m and 40m with S9 and 20m with S6...
+
+-rm
+
+P.S. nevertheless: PC's nowadays are much more quiet than those times
+of TRS-80 (sigh).
+#! rnews 1629
+Path: alberta!mnetor!uunet!mcvax!unido!rmi!zentrale
+From: zentrale at rmi.UUCP (RMI Net)
+Newsgroups: rec.ham-radio
+Subject: Re: some SWL questions
+Message-ID: <823 at rmi.UUCP>
+Date: 13 Dec 87 10:18:23 GMT
+References: <38c9774f.44e6 at apollo.uucp> <871201110223.1.ED at BLACK-BIRD.SCRC.Symbolics.COM>
+Reply-To: dl3no at rmi.UUCP (Rupert Mohr)
+Organization: RMI Net, Aachen, W.Germany
+Lines: 38
+
+In article <871201110223.1.ED at BLACK-BIRD.SCRC.Symbolics.COM> Ed at MEAD.SCRC.SYMBOLICS.COM (Ed Schwalenberg) writes:
+: 
+:     Date: 30 Nov 87 15:30:00 GMT
+:     From: apollo!nelson_p%apollo.uucp at eddie.mit.edu
+: 
+:        Is there a detailed single-source of info on what I might 
+:        hear as I tune around the bands?   The much vaunted World
+:        Radio and TV Handbook just covers broadcasting, which I
+:        have little interest in.
+: 
+: The second source is the Klingenfuss Guide to Utility Stations.
+: This is harder to come by, but is advertised in RDI.
+
+I just got the 6th edition (1988), which is VERY good. You can
+get it directly :
+
+Klingenfuss, Guide to Utility Stations, 6th Edition
+
+Klningenfuss Publications
+Hagenloher Str. 14
+D-7400 Tuebingen
+Fed.Rep.Germany
+Tel. (+41) 7071 62830
+
+Price: DM 60  (abt. $ 35) maybe plus handling.
+They are very fast! I received it two days after ordering by telephone.
+They also have an quarterly update Service.
+
+You find a complete listing sorted by frequency an different listings
+sorted by different services:
+press by time,
+fax  alphebetically with time schedule
+
+addresses, codes, commercial call signs, telegram formats etc.
+
+ALL in English, 500 pages with correct entries......
+
+Rupert
+#! rnews 1503
+Path: alberta!mnetor!uunet!husc6!cmcl2!rutgers!orstcs!mist!koff
+From: koff at mist.cs.orst.edu (Caroline N. Koff)
+Newsgroups: rec.arts.startrek
+Subject: Troi's outfit
+Message-ID: <1501 at orstcs.CS.ORST.EDU>
+Date: 14 Dec 87 13:35:02 GMT
+References: <1008 at percival.UUCP> <275 at hi3.aca.mcc.com.UUCP> <2032 at charon.unm.edu> <2432 at homxc.UUCP> <1987Dec12.230124.16416 at gpu.utcs.toronto.edu> <2216 at nicmad.UUCP>
+Sender: netnews at orstcs.CS.ORST.EDU
+Reply-To: koff at mist.UUCP (Caroline N. Koff)
+Distribution: na
+Organization: Oregon State Universtiy - CS - Corvallis, Oregon
+Lines: 17
+
+If people are noticing and mentioning about Yar's breasts, why not
+also mention about Troi's low cut outfit!!  Why does it need to be
+so low cut that it shows her crevice?  Who is she trying to impress?
+Do you think that the women in the future, working with men, will be
+trying to dress sexy?  If so, what about the men?  Why not let them
+show off their body too to make things even?   I think that the
+producers, or whoever is in charge of outfits, and character development 
+is making a contemporary decision regarding the issue of how people 
+will dress in the future.  I.e. he/she thinks that female will be 
+trying to attract males' attention by bringing out her femininity, 
+but not vice versa, which is the current social behavior.
+Or, perhaps the producers are just being comformists with bunch of 
+other tv shows + movie producers by keeping females attractive 
+towards men...   
+
+--Caroline Koff
+koff!cs.orst.edu at cs.net.relay
+#! rnews 1028
+Path: alberta!mnetor!uunet!mcvax!hafro!krafla!frisk
+From: frisk at rhi.is (Fridrik Skulason)
+Newsgroups: comp.sys.ibm.pc
+Subject: Identifying VGA
+Message-ID: <100 at krafla.rhi.is>
+Date: 13 Dec 87 11:39:28 GMT
+Reply-To: frisk at rhi.UUCP (Fridrik Skulason)
+Organization: University of Iceland (RHI)
+Lines: 19
+
+In the november issue of Dr.Dobb's Journal there is an article on how to
+identify the video adaptor in your PC. They cover EGA,CGA,MDA,Compaq and
+Hercules(mono).
+
+What I need is information on how to find out if a VGA (or a PGA) adaptor
+is installed.
+
+Also - can someone tell me how to obtain the current cursor position directly
+from these adaptors. That is - I need the location of the 6845 registers.
+
+The reason I can not use the INT10 function provided is that my program has
+to work with some TSR programs that access the hardware directly.
+
+Thanks... 
+-- 
+         Fridrik Skulason          University of Iceland
+         UUCP  frisk at rhi.uucp      BIX  frisk
+
+     This line intentionally left blank ...................
+#! rnews 805
+Path: alberta!mnetor!uunet!husc6!cmcl2!rutgers!orstcs!mist!koff
+From: koff at mist.cs.orst.edu (Caroline N. Koff)
+Newsgroups: rec.arts.startrek
+Subject: Requesting ST:TOS episode directors and writers guide
+Message-ID: <1502 at orstcs.CS.ORST.EDU>
+Date: 14 Dec 87 13:38:05 GMT
+References: <1008 at percival.UUCP> <275 at hi3.aca.mcc.com.UUCP> <2032 at charon.unm.edu> <2432 at homxc.UUCP> <1987Dec12.230124.16416 at gpu.utcs.toronto.edu> <2216 at nicmad.UUCP>
+Sender: netnews at orstcs.CS.ORST.EDU
+Reply-To: koff at mist.UUCP (Caroline N. Koff)
+Distribution: na
+Organization: Oregon State Universtiy - CS - Corvallis, Oregon
+Lines: 6
+
+Has anybody ever posted or have a complete list of directors and writers
+for each of the ST:TOS episodes?  If so, may I have a copy?  Thanks in
+advance.
+
+--Caroline Koff
+koff!cs.orst.edu at cs.net.relay
+#! rnews 1125
+Path: alberta!mnetor!uunet!mcvax!enea!sems!olof
+From: olof at sems.SE (Olof Backing)
+Newsgroups: comp.emacs
+Subject: Problems with uEmacs 3.9e and OS-9/68K C.
+Message-ID: <207 at sems.SE>
+Date: 13 Dec 87 13:00:39 GMT
+Organization: Sems AB, Stockholm, Sweden
+Lines: 32
+
+I have a problem when I try to compile the latest version of
+microEmacs, ie. 3.9e. The problem occurs in file 'bind.c' at lines
+602, 609 and 642, 650 respectively. 
+
+It's the following lines that causes the error:
+
+600: int (*getbind(c))()
+601:
+602: int c;
+603:
+604: {
+
+The compiler reports an error at line 602 with 'not an argument'. The
+same thing happens at line 642;
+
+639: int (*fncmatch(fname))()
+640:
+641:
+642: int fname;
+643:
+644: {
+
+Since my experiences aren't the very best i C sofar, I would like to
+get some hints on what to do. Maybe Kim Kempf at Microware has the
+answer for me. Feel free to overwelm me with hints. Until then (when I
+recieve the hints...), CU all!
+
+
+-- 
+            ADDRESS: Havrevagen 14, S-175 43  Jarfalla, Sweden
+            PHONE  : (46) 758 33941, 35516 home
+            UUCP   :  ...{uunet,mcvax,ukc,unido}!enea!sems!olof 
+#! rnews 1708
+Path: alberta!mnetor!uunet!husc6!yale!dwald
+From: dwald at yale-zoo-suned..arpa (David Wald)
+Newsgroups: rec.arts.startrek
+Subject: Re: Hide & Q notes and comments and notes and comments and....<<S
+Message-ID: <20252 at yale-celray.yale.UUCP>
+Date: 14 Dec 87 04:29:38 GMT
+References: <19962 at yale-celray.yale.UUCP> <17300072 at silver> <1838 at leadsv.UUCP>
+Sender: root at yale.UUCP
+Reply-To: dwald at yale-zoo-suned.UUCP (David Wald)
+Distribution: na
+Organization: Yale University Computer Science Dept, New Haven CT
+Lines: 27
+
+In article <1838 at leadsv.UUCP> lilly at leadsv.UUCP (Harriette Lilly) writes:
+>
+>In article <17300072 at silver>, sl131008 at silver.bacs.indiana.edu writes:
+>> /* Written  7:19 pm  Dec  7, 1987 by sl131008 at silver.UUCP in silver:rec.arts.startrek */
+>> /* ..ditto x 7.....
+>> /* Written  9:12 pm  Dec  6, 1987 by dwald at yale in silver:rec.arts.startrek */
+>> /* ---------- "Re: Hide & Q notes and comments <<S" ---------- */
+>> In article <2328 at homxc.UUCP> scott at homxc.UUCP (Scott Berry) writes:
+...
+>> David Wald                                                   dwald at yale.UUCP
+...
+>> /* End of text from silver:rec.arts.startrek */
+>> /* ditto x 8
+>
+>
+>       Ummm, are you lost?...
+
+I was a bit puzzled by this too, since I didn't think my article so
+brilliant that anyone would want to repost it eight times.  If anyone
+finds out what happened, could they please send me mail?
+
+
+We now return you to your regularly scheduled nonsense...
+============================================================================
+David Wald                                                   dwald at yale.UUCP
+						      waldave at yalevmx.bitnet
+============================================================================
+#! rnews 761
+Path: alberta!mnetor!uunet!mcvax!enea!sems!olof
+From: olof at sems.SE (Olof Backing)
+Newsgroups: rec.games.misc
+Subject: Larn at dungeon level 10.
+Message-ID: <208 at sems.SE>
+Date: 13 Dec 87 18:51:50 GMT
+Organization: Sems AB, Stockholm, Sweden
+Lines: 12
+
+Well folks, I've reached to master warlord (lvl 17, ~550000 Exp). To
+my great dis-something, I haven't found any ladder down to level 11.
+Somewhere back in my human brain, I recall that I've read something
+about how to further down in the dungeon. What do I do ?!. Please give
+me a hint.
+
+
+-- 
+WHOAMI : Olof Backing                               !
+WHERE  : Havrevagen 14, S-175 43  Jarfalla, Sweden  !
+PHONE  : + (46) 758 33941, 35516                    !
+UUCP   :  ...{uunet,mcvax,ukc,unido}!enea!sems!olof !
+#! rnews 1631
+Path: alberta!mnetor!uunet!husc6!yale!dwald
+From: dwald at yale-zoo-suned..arpa (David Wald)
+Newsgroups: rec.arts.startrek
+Subject: Re: Terralian Ship in "Haven"
+Keywords: ST:TNG
+Message-ID: <20253 at yale-celray.yale.UUCP>
+Date: 14 Dec 87 04:36:39 GMT
+References: <5243 at zen.berkeley.edu> <9615 at ufcsv.cis.ufl.EDU>
+Sender: root at yale.UUCP
+Reply-To: dwald at yale-zoo-suned.UUCP (David Wald)
+Distribution: na
+Organization: Yale University Computer Science Dept, New Haven CT
+Lines: 19
+
+In article <9615 at ufcsv.cis.ufl.EDU> jco at beach.cis.ufl.edu () writes:
+>In article <5243 at zen.berkeley.edu> timlee at cory.Berkeley.EDU (Timothy J. Lee) writes:
+>>Did anyone think that the Terralian ship was pretty big for something that
+>>was built by a group of people whose technology approximated late 20th
+>>century Earth?
+>
+>It was my understanding from the show that the people of 20th century
+>earth could build a virus that could wipe out a planet.  This did NOT
+>mean that they (the Terralians) where of the 20th century tech level.
+
+There was more to the 20th century reference than that, however.
+Dr. Crusher made the point that, since they were only at the technology
+level of ~20th century Earth, it was easy for the disease to get out of
+control and spread over the planet.  The implication was that if they
+were more advanced the disease would not have wiped out the entire world.
+============================================================================
+David Wald                                                   dwald at yale.UUCP
+						      waldave at yalevmx.bitnet
+============================================================================
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/obj1 b/src/test/java/org/xerial/snappy/testdata/calgary/obj1
new file mode 100644
index 0000000..454f21c
Binary files /dev/null and b/src/test/java/org/xerial/snappy/testdata/calgary/obj1 differ
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/obj2 b/src/test/java/org/xerial/snappy/testdata/calgary/obj2
new file mode 100644
index 0000000..7d011bd
Binary files /dev/null and b/src/test/java/org/xerial/snappy/testdata/calgary/obj2 differ
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/paper1 b/src/test/java/org/xerial/snappy/testdata/calgary/paper1
new file mode 100644
index 0000000..4214815
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/paper1
@@ -0,0 +1,1250 @@
+.pn 0
+.ls1
+.EQ
+delim $$
+.EN
+.ev1
+.ps-2
+.vs-2
+.ev
+\&
+.sp 5
+.ps+4
+.ce
+ARITHMETIC CODING FOR DATA COMPRESSION
+.ps-4
+.sp4
+.ce
+Ian H. Witten, Radford M. Neal, and John G. Cleary
+.sp2
+.ce4
+Department of Computer Science
+The University of Calgary
+2500 University Drive NW
+Calgary, Canada T2N 1N4
+.sp2
+.ce
+August, 1986, revised January 1987
+.sp 8
+.in+1i
+.ll-1i
+The state of the art in data compression is arithmetic coding, not
+the better-known Huffman method.
+Arithmetic coding gives greater compression, is faster for adaptive models,
+and clearly separates the model from the channel encoding.
+This paper presents a practical implementation of the technique.
+.sp 3
+.in +0.5i
+.ti -0.5i
+\fICR Categories and subject descriptors:\fR
+.br
+E.4 [DATA] Coding and Information Theory \(em Data Compaction and Compression
+.br
+H.1.1 [Models and Principles] Systems and Information Theory \(em Information Theory
+.sp
+.ti -0.5i
+\fIGeneral terms:\fR  algorithms, performance
+.sp
+.ti -0.5i
+\fIAdditional key words and phrases:\fR  arithmetic coding, Huffman coding, adaptive modeling
+.ll+1i
+.in 0
+.bp
+.sh "Introduction"
+.pp
+Arithmetic coding is superior in most respects to the better-known Huffman
+(1952) method.
+.[
+Huffman 1952 method construction minimum-redundancy codes
+.]
+It represents information at least as compactly, sometimes considerably more
+so.
+Its performance is optimal without the need for blocking of input data.
+It encourages a clear separation between the model for representing data and
+the encoding of information with respect to that model.
+It accommodates adaptive models easily.
+It is computationally efficient.
+Yet many authors and practitioners seem unaware of the technique.
+Indeed there is a widespread belief that Huffman coding cannot be improved
+upon.
+.pp
+This paper aims to rectify the situation by presenting an accessible
+implementation of arithmetic coding, and detailing its performance
+characteristics.
+The next section briefly reviews basic concepts of data compression and
+introduces the model-based approach which underlies most modern techniques.
+We then outline the idea of arithmetic coding using a simple example.
+Following that programs are presented for both encoding and decoding, in which
+the model occupies a separate module so that different ones can easily be
+used.
+Next we discuss the construction of fixed and adaptive models.
+The subsequent section details the compression efficiency and execution time
+of the programs, including the effect of different arithmetic word lengths on
+compression efficiency.
+Finally, we outline a few applications where arithmetic coding is appropriate.
+.sh "Data compression"
+.pp
+To many, data compression conjures up an assortment of \fIad hoc\fR
+techniques such as converting spaces in text to tabs, creating special codes
+for common words, or run-length coding of picture data (eg see Held, 1984).
+.[
+Held 1984 data compression techniques applications
+.]
+This contrasts with the more modern model-based paradigm for
+coding, where from an \fIinput string\fR of symbols and a \fImodel\fR, an
+\fIencoded string\fR is produced which is (usually) a compressed version of
+the input.
+The decoder, which must have access to the same model,
+regenerates the exact input string from the encoded string.
+Input symbols are drawn from some well-defined set such as the ASCII or
+binary alphabets;
+the encoded string is a plain sequence of bits.
+The model is a way of calculating, in any given context, the distribution of
+probabilities for the next input symbol.
+It must be possible for the decoder to produce exactly the same probability
+distribution in the same context.
+Compression is achieved by transmitting the more probable symbols in fewer
+bits than the less probable ones.
+.pp
+For example, the model may assign a predetermined probability to each symbol
+in the ASCII alphabet.
+No context is involved.
+These probabilities may be determined by counting frequencies in
+representative samples of text to be transmitted.
+Such a \fIfixed\fR model is communicated in advance to both encoder and
+decoder, after which it is used for many messages.
+.pp
+Alternatively, the probabilities the model assigns may change as each symbol
+is transmitted, based on the symbol frequencies seen \fIso far\fR in this
+message.
+This is an \fIadaptive\fR model.
+There is no need for a representative sample of text, because each message
+is treated as an independent unit, starting from scratch.
+The encoder's model changes with each symbol transmitted, and the decoder's
+changes with each symbol received, in sympathy.
+.pp
+More complex models can provide more accurate probabilistic predictions and
+hence achieve greater compression.
+For example, several characters of previous context could condition the
+next-symbol probability.
+Such methods have enabled mixed-case English text to be encoded in around
+2.2\ bit/char with two quite different kinds of model.
+(Cleary & Witten, 1984b; Cormack & Horspool, 1985).
+.[
+Cleary Witten 1984 data compression
+%D 1984b
+.]
+.[
+Cormack Horspool 1985 dynamic Markov
+%O April
+.]
+Techniques which do not separate modeling from coding so distinctly, like
+that of Ziv & Lempel (1978), do not seem to show such great potential for
+compression, although they may be appropriate when the aim is raw speed rather
+than compression performance (Welch, 1984).
+.[
+Ziv Lempel 1978 compression of individual sequences
+.]
+.[
+Welch 1984 data compression
+.]
+.pp
+The effectiveness of any model can be measured by the \fIentropy\fR of the
+message with respect to it, usually expressed in bits/symbol.
+Shannon's fundamental theorem of coding states that given messages randomly
+generated from a model, it is impossible to encode them into less bits
+(on average) than the entropy of that model (Shannon & Weaver, 1949).
+.[
+Shannon Weaver 1949
+.]
+.pp
+A message can be coded with respect to a model using either Huffman or
+arithmetic coding.
+The former method is frequently advocated as the best possible technique for
+reducing the encoded data rate.
+But it is not.
+Given that each symbol in the alphabet must translate into an integral number
+of bits in the encoding, Huffman coding indeed achieves ``minimum
+redundancy''.
+In other words, it performs optimally if all symbol probabilities are
+integral powers of 1/2.
+But this is not normally the case in practice;
+indeed, Huffman coding can take up to one extra bit per symbol.
+The worst case is realized by a source in which one symbol has probability
+approaching unity.
+Symbols emanating from such a source convey negligible information on average,
+but require at least one bit to transmit (Gallagher, 1978).
+.[
+Gallagher 1978 variations on a theme by Huffman
+.]
+Arithmetic coding dispenses with the restriction that each symbol translates
+into an integral number of bits, thereby coding more efficiently.
+It actually achieves the theoretical entropy bound to compression efficiency
+for any source, including the one just mentioned.
+.pp
+In general, sophisticated models expose the deficiencies of Huffman coding
+more starkly than simple ones.
+This is because they more often predict symbols with probabilities close to
+one, the worst case for Huffman coding.
+For example, the techniques mentioned above which code English text in
+2.2\ bit/char both use arithmetic coding as the final step, and performance
+would be impacted severely if Huffman coding were substituted.
+Nevertheless, since our topic is coding and not modeling, the illustrations in
+this paper all employ simple models.
+Even then, as we shall see, Huffman coding is inferior to arithmetic coding.
+.pp
+The basic concept of arithmetic coding can be traced back to Elias in the
+early 1960s (see Abramson, 1963, pp 61-62).
+.[
+Abramson 1963
+.]
+Practical techniques were first introduced by Rissanen (1976) and
+Pasco (1976), and developed further in Rissanen (1979).
+.[
+Rissanen 1976 Generalized Kraft Inequality
+.]
+.[
+Pasco 1976
+.]
+.[
+Rissanen 1979 number representations
+.]
+.[
+Langdon 1981 tutorial arithmetic coding
+.]
+Details of the implementation presented here have not appeared in the
+literature before; Rubin (1979) is closest to our approach.
+.[
+Rubin 1979 arithmetic stream coding
+.]
+The reader interested in the broader class of arithmetic codes is referred
+to Rissanen & Langdon (1979);
+.[
+Rissanen Langdon 1979 Arithmetic coding
+.]
+a tutorial is available in Langdon (1981).
+.[
+Langdon 1981 tutorial arithmetic coding
+.]
+Despite these publications, the method is not widely known.
+A number of recent books and papers on data compression mention it only in
+passing, or not at all.
+.sh "The idea of arithmetic coding"
+.pp
+In arithmetic coding a message is represented by an
+interval of real numbers between 0 and 1.
+As the message becomes longer, the interval needed to represent it becomes
+smaller, and the number of bits needed to specify that interval grows.
+Successive symbols of the message reduce the size of the
+interval in accordance with the symbol probabilities generated by the
+model.
+The more likely symbols reduce the range by less than the unlikely symbols,
+and hence add fewer bits to the message.
+.pp
+Before anything is transmitted, the range for the message is the entire
+interval [0,\ 1)\(dg.
+.FN
+\(dg [0,\ 1) denotes the half-open interval 0\(<=\fIx\fR<1.
+.EF
+As each symbol is processed, the range is narrowed to that portion of it
+allocated to the symbol.
+For example, suppose the alphabet is {\fIa,\ e,\ i,\ o,\ u,\ !\fR}, and a
+fixed model is used with probabilities shown in Table\ 1.
+Imagine transmitting the message \fIeaii!\fR.
+Initially, both encoder and decoder know that the range is [0,\ 1).
+After seeing the first symbol, \fIe\fR, the encoder narrows it to
+[0.2,\ 0.5), the range the model allocates to this symbol.
+The second symbol, \fIa\fR, will narrow this new range to the first 1/5 of it,
+since \fIa\fR has been allocated [0,\ 0.2).
+This produces [0.2,\ 0.26) since the previous range was 0.3 units long and
+1/5 of that is 0.06.
+The next symbol, \fIi\fR, is allocated [0.5,\ 0.6), which when applied to
+[0.2,\ 0.26) gives the smaller range [0.23,\ 0.236).
+Proceeding in this way, the encoded message builds up as follows:
+.LB
+.nf
+.ta \w'after seeing   'u +0.5i +\w'[0.23354, 'u
+initially		[0,	1)
+after seeing	\fIe\fR	[0.2,	0.5)
+	\fIa\fR	[0.2,	0.26)
+	\fIi\fR	[0.23,	0.236)
+	\fIi\fR	[0.233,	0.2336)
+	\fI!\fR	[0.23354,	0.2336)
+.fi
+.LE
+Figure\ 1 shows another representation of the encoding process.
+The vertical bars with ticks represent the symbol probabilities stipulated
+by the model.
+After the first symbol, \fIe\fR, has been processed, the model is scaled
+into the range [0.2,\ 0.5), as shown in part (a).
+The second symbol, \fIa\fR, scales it again into the range [0.2,\ 0.26).
+But the picture cannot be continued in this way without a magnifying glass!
+Consequently Figure\ 1(b) shows the ranges expanded to full height at every
+stage, and marked with a scale which gives the endpoints as numbers.
+.pp
+Suppose all the decoder knows about the message is the final range,
+[0.23354,\ 0.2336).
+It can immediately deduce that the first character was \fIe\fR, since the
+range lies entirely within the space the model of Table\ 1 allocates for
+\fIe\fR.
+Now it can simulate the operation of the \fIen\fR\^coder:
+.LB
+.nf
+.ta \w'after seeing   'u +0.5i +\w'[0.2, 'u
+initially		[0,	1)
+after seeing	\fIe\fR	[0.2,	0.5)
+.fi
+.LE
+This makes it clear that the second character of the message is \fIa\fR,
+since this will produce the range
+.LB
+.nf
+.ta \w'after seeing   'u +0.5i +\w'[0.2, 'u
+after seeing	\fIa\fR	[0.2,	0.26)
+.fi
+.LE
+which entirely encloses the given range [0.23354,\ 0.2336).
+Proceeding like this, the decoder can identify the whole message.
+.pp
+It is not really necessary for the decoder to know both ends of the range
+produced by the encoder.
+Instead, a single number within the range \(em for example, 0.23355 \(em will
+suffice.
+(Other numbers, like 0.23354, 0.23357, or even 0.23354321, would do just as
+well.)  \c
+However, the decoder will face the problem of detecting the end of the
+message, to determine when to stop decoding.
+After all, the single number 0.0 could represent any of \fIa\fR, \fIaa\fR,
+\fIaaa\fR, \fIaaaa\fR, ...\ .
+To resolve the ambiguity we ensure that each message ends with a special
+EOF symbol known to both encoder and decoder.
+For the alphabet of Table\ 1, \fI!\fR will be used to terminate messages,
+and only to terminate messages.
+When the decoder sees this symbol it stops decoding.
+.pp
+Relative to the fixed model of Table\ 1, the entropy of the 5-symbol message
+\fIeaii!\fR is
+.LB
+$- ~ log ~ 0.3 ~ - ~ log ~ 0.2 ~ - ~ log ~ 0.1 ~ - ~ log ~ 0.1 ~ - ~ log ~ 0.1 ~~=~~ - ~ log ~ 0.00006 ~~ approx ~~ 4.22$
+.LE
+(using base 10, since the above encoding was performed in decimal).
+This explains why it takes 5\ decimal digits to encode the message.
+In fact, the size of the final range is $0.2336 ~-~ 0.23354 ~~=~~ 0.00006$,
+and the entropy is the negative logarithm of this figure.
+Of course, we normally work in binary, transmitting binary digits and
+measuring entropy in bits.
+.pp
+Five decimal digits seems a lot to encode a message comprising four vowels!
+It is perhaps unfortunate that our example ended up by expanding rather than
+compressing.
+Needless to say, however, different models will give different entropies.
+The best single-character model of the message \fIeaii!\fR is the set of
+symbol frequencies
+{\fIe\fR\ (0.2),  \fIa\fR\ (0.2),  \fIi\fR\ (0.4),  \fI!\fR\ (0.2)},
+which gives an entropy for \fIeaii!\fR of 2.89\ decimal digits.
+Using this model the encoding would be only 3\ digits long.
+Moreover, as noted earlier more sophisticated models give much better
+performance in general.
+.sh "A program for arithmetic coding"
+.pp
+Figure\ 2 shows a pseudo-code fragment which summarizes the encoding and
+decoding procedures developed in the last section.
+Symbols are numbered 1, 2, 3, ...
+The frequency range for the $i$th symbol is from $cum_freq[i]$ to
+$cum_freq[i-1]$.
+$cum_freq[i]$ increases as $i$ decreases, and $cum_freq[0] = 1$.
+(The reason for this ``backwards'' convention is that later, $cum_freq[0]$
+will contain a normalizing factor, and it will be convenient to have it
+begin the array.)  \c
+The ``current interval'' is [$low$,\ $high$); and for both encoding and
+decoding this should be initialized to [0,\ 1).
+.pp
+Unfortunately, Figure\ 2 is overly simplistic.
+In practice, there are several factors which complicate both encoding and
+decoding.
+.LB
+.NP
+Incremental transmission and reception.
+.br
+The encode algorithm as described does not transmit anything until the entire
+message has been encoded; neither does the decode algorithm begin decoding
+until it has received the complete transmission.
+In most applications, an incremental mode of operation is necessary.
+.sp
+.NP
+The desire to use integer arithmetic.
+.br
+The precision required to represent the [$low$, $high$) interval grows with
+the length of the message.
+Incremental operation will help overcome this, but the potential for overflow
+and underflow must still be examined carefully.
+.sp
+.NP
+Representing the model so that it can be consulted efficiently.
+.br
+The representation used for the model should minimize the time required for
+the decode algorithm to identify the next symbol.
+Moreover, an adaptive model should be organized to minimize the
+time-consuming task of maintaining cumulative frequencies.
+.LE
+.pp
+Figure\ 3 shows working code, in C, for arithmetic encoding and decoding.
+It is considerably more detailed than the bare-bones sketch of Figure\ 2!
+Implementations of two different models are given in Figure\ 4;
+the Figure\ 3 code can use either one.
+.pp
+The remainder of this section examines the code of Figure\ 3 more closely,
+including a proof that decoding is still correct in the integer
+implementation and a review of constraints on word lengths in the program.
+.rh "Representing the model."
+Implementations of models are discussed in the next section; here we
+are concerned only with the interface to the model (lines 20-38).
+In C, a byte is represented as an integer between 0 and 255 (call this a
+$char$).
+Internally, we represent a byte as an integer between 1 and 257 inclusive
+(call this an $index$), EOF being treated as a 257th symbol.
+It is advantageous to sort the model into frequency order, to minimize the
+number of executions of the decoding loop (line 189).
+To permit such reordering, the $char$/$index$ translation is implemented as
+a pair of tables, $index_to_char[ \| ]$ and $char_to_index[ \| ]$.
+In one of our models, these tables simply form the $index$ by adding 1 to the
+$char$, but another implements a more complex translation which assigns small
+indexes to frequently-used symbols.
+.pp
+The probabilities in the model are represented as integer frequency counts,
+and cumulative counts are stored in the array $cum_freq[ \| ]$.
+As previously, this array is ``backwards,'' and the total frequency count \(em
+which is used to normalize all frequencies \(em appears in $cum_freq[0]$.
+Cumulative counts must not exceed a predetermined maximum, $Max_frequency$,
+and the model implementation must prevent overflow by scaling appropriately.
+It must also ensure that neighboring values in the $cum_freq[ \| ]$ array
+differ by at least 1; otherwise the affected symbol could not be transmitted.
+.rh "Incremental transmission and reception."
+Unlike Figure\ 2, the program of Figure\ 3 represents $low$ and $high$ as
+integers.
+A special data type, $code_value$, is defined for these quantities,
+together with some useful constants:  \c
+$Top_value$, representing the largest possible $code_value$, and
+$First_qtr$, $Half$, and $Third_qtr$, representing parts of the range
+(lines 6-16).
+Whereas in Figure\ 2 the current interval is represented by
+[$low$,\ $high$), in Figure\ 3 it is [$low$,\ $high$]; that is, the range now
+includes the value of $high$.
+Actually, it is more accurate (though more confusing) to say that in the
+program of Figure\ 3 the interval represented is
+[$low$,\ $high + 0.11111 ...$).
+This is because when the bounds are scaled up to increase the precision, 0's
+are shifted into the low-order bits of $low$ but 1's are shifted into $high$.
+While it is possible to write the program to use a different convention,
+this one has some advantages in simplifying the code.
+.pp
+As the code range narrows, the top bits of $low$ and $high$ will become the
+same.
+Any bits which are the same can be transmitted immediately, since they cannot
+be affected by future narrowing.
+For encoding, since we know that $low ~ <= ~ high$, this requires code like
+.LB "nnnn"
+.nf
+.ta \w'nnnn'u +\w'if (high < 'u +\w'Half) { 'u +\w'output_bit(1); low = 2*(low\-Half); high = 2*(high\-Half)+1; 'u
+.ne 4
+for (;;) {
+	if (high <	Half) {	output_bit(0); low = 2*low; high = 2*high+1;	}
+	if (low $>=$	Half) {	output_bit(1); low = 2*(low\-Half); high = 2*(high\-Half)+1;	}
+}
+.fi
+.LE "nnnn"
+which ensures that, upon completion, $low ~ < ~ Half ~ <= ~ high$.
+This can be found in lines 95-113 of $encode_symbol( \| )$,
+although there are some extra complications caused by underflow possibilities
+(see next subsection).
+Care is taken care to shift 1's in at the bottom when $high$ is scaled, as
+noted above.
+.pp
+Incremental reception is done using a number called $value$ as in Figure\ 2,
+in which processed bits flow out the top (high-significance) end and
+newly-received ones flow in the bottom.
+$start_decoding( \| )$ (lines 168-176) fills $value$ with received bits initially.
+Once $decode_symbol( \| )$ has identified the next input symbol, it shifts out
+now-useless high-order bits which are the same in $low$ and $high$, shifting
+$value$ by the same amount (and replacing lost bits by fresh input bits at the
+bottom end):
+.LB "nnnn"
+.nf
+.ta \w'nnnn'u +\w'if (high < 'u +\w'Half) { 'u +\w'value = 2*(value\-Half)+input_bit(\|); low = 2*(low\-Half); high = 2*(high\-Half)+1; 'u
+.ne 4
+for (;;) {
+	if (high <	Half) {	value = 2*value+input_bit(\|); low = 2*low; high = 2*high+1;	}
+	if (low $>=$	Half) {	value = 2*(value\-Half)+input_bit(\|); low = 2*(low\-Half); high = 2*(high\-Half)+1;	}
+}
+.fi
+.LE "nnnn"
+(see lines 194-213, again complicated by precautions against underflow
+discussed below).
+.rh "Proof of decoding correctness."
+At this point it is worth checking that the identification of the next
+symbol by $decode_symbol( \| )$ works properly.
+Recall from Figure\ 2 that $decode_symbol( \| )$ must use $value$ to find that
+symbol which, when encoded, reduces the range to one that still includes
+$value$.
+Lines 186-188 in $decode_symbol( \| )$ identify the symbol for which
+.LB
+$cum_freq[symbol] ~ <= ~~
+left f {(value-low+1)*cum_freq[0] ~-~ 1} over {high-low+1} right f
+~~ < ~ cum_freq[symbol-1]$,
+.LE
+where $left f ~ right f$ denotes the ``integer part of'' function that
+comes from integer division with truncation.
+It is shown in the Appendix that this implies
+.LB "nnnn"
+$low ~+~~ left f {(high-low+1)*cum_freq[symbol]} over cum_freq[0] right f
+~~ <= ~ v ~ <=  ~~
+low ~+~~ left f {(high-low+1)*cum_freq[symbol-1]} over cum_freq[0] right f ~~ - ~ 1$,
+.LE "nnnn"
+so $value$ lies within the new interval that $decode_symbol( \| )$
+calculates in lines 190-193.
+This is sufficient to guarantee that the decoding operation identifies each
+symbol correctly.
+.rh "Underflow."
+As Figure\ 1 shows, arithmetic coding works by scaling the cumulative
+probabilities given by the model into the interval [$low$,\ $high$] for
+each character transmitted.
+Suppose $low$ and $high$ are very close together, so close that this scaling
+operation maps some different symbols of the model on to the same integer in
+the [$low$,\ $high$] interval.
+This would be disastrous, because if such a symbol actually occurred it would
+not be possible to continue encoding.
+Consequently, the encoder must guarantee that the interval [$low$,\ $high$] is
+always large enough to prevent this.
+The simplest way is to ensure that this interval is at least as large as
+$Max_frequency$, the maximum allowed cumulative frequency count (line\ 36).
+.pp
+How could this condition be violated?
+The bit-shifting operation explained above ensures that $low$ and $high$ can
+only become close together when they straddle $Half$.
+Suppose in fact they become as close as
+.LB
+$First_qtr ~ <= ~ low ~<~ Half ~ <= ~ high ~<~ Third_qtr$.
+.LE
+Then the next two bits sent will have opposite polarity, either 01 or 10.
+For example, if the next bit turns out to be 0 (ie $high$ descends below
+$Half$ and [0,\ $Half$] is expanded to the full interval) the bit after
+that will be 1 since the range has to be above the midpoint of the expanded
+interval.
+Conversely if the next bit happens to be 1 the one after that will be 0.
+Therefore the interval can safely be expanded right now, if only we remember
+that whatever bit actually comes next, its opposite must be transmitted
+afterwards as well.
+Thus lines 104-109 expand [$First_qtr$,\ $Third_qtr$] into the whole interval,
+remembering in $bits_to_follow$ that the bit that is output next must be
+followed by an opposite bit.
+This explains why all output is done via $bit_plus_follow( \| )$
+(lines 128-135) instead of directly with $output_bit( \| )$.
+.pp
+But what if, after this operation, it is \fIstill\fR true that
+.LB
+$First_qtr ~ <= ~ low ~<~ Half ~ <= ~ high ~<~ Third_qtr$?
+.LE
+Figure\ 5 illustrates this situation, where the current [$low$,\ $high$]
+range (shown as a thick line) has been expanded a total of three times.
+Suppose the next bit will turn out to be 0, as indicated by the arrow in
+Figure\ 5(a) being below the halfway point.
+Then the next \fIthree\fR bits will be 1's, since not only is the arrow in the
+top half of the bottom half of the original range, it is in the top quarter,
+and moreover the top eighth, of that half \(em that is why the expansion
+can occur three times.
+Similarly, as Figure\ 5(b) shows, if the next bit turns out to be a 1 it will
+be followed by three 0's.
+Consequently we need only count the number of expansions and follow the next
+bit by that number of opposites (lines 106 and 131-134).
+.pp
+Using this technique, the encoder can guarantee that after the shifting
+operations, either
+.LB
+.ta \n(.lu-\n(.iuR
+$low ~<~ First_qtr ~<~ Half ~ <= ~ high$	(1a)
+.LE
+or
+.LB
+.ta \n(.lu-\n(.iuR
+$low ~<~ Half ~<~ Third_qtr ~ <= ~ high$.	(1b)
+.LE
+Therefore as long as the integer range spanned by the cumulative frequencies
+fits into a quarter of that provided by $code_value$s, the underflow problem
+cannot occur.
+This corresponds to the condition
+.LB
+$Max_frequency ~ <= ~~ {Top_value+1} over 4 ~~ + ~ 1$,
+.LE
+which is satisfied by Figure\ 3 since $Max_frequency ~=~ 2 sup 14 - 1$ and
+$Top_value ~=~ 2 sup 16 - 1$ (lines\ 36, 9).
+More than 14\ bits cannot be used to represent cumulative frequency
+counts without increasing the number of bits allocated to $code_value$s.
+.pp
+We have discussed underflow in the encoder only.
+Since the decoder's job, once each symbol has been decoded, is to track the
+operation of the encoder, underflow will be avoided if it performs the same
+expansion operation under the same conditions.
+.rh "Overflow."
+Now consider the possibility of overflow in the integer multiplications
+corresponding to those of Figure\ 2, which occur in lines 91-94 and 190-193
+of Figure\ 3.
+Overflow cannot occur provided the product
+.LB
+$range * Max_frequency$
+.LE
+fits within the integer word length available, since cumulative frequencies
+cannot exceed $Max_frequency$.
+$Range$ might be as large as $Top_value ~+~1$, so the largest possible product
+in Figure 3 is $2 sup 16 ( 2 sup 14 - 1 )$ which is less than $2 sup 30$.
+$Long$ declarations are used for $code_value$ (line\ 7) and $range$
+(lines\ 89, 183) to ensure that arithmetic is done to 32-bit precision.
+.rh "Constraints on the implementation."
+The constraints on word length imposed by underflow and overflow can
+be simplified by assuming frequency counts are represented in $f$\ bits, and
+$code_value$s in $c$\ bits.
+The implementation will work correctly provided
+.LB
+$f ~ <= ~ c ~ - ~2$
+.br
+$f ~+~ c ~ <= ~ p$, the precision to which arithmetic is performed.
+.LE
+In most C implementations, $p=31$ if $long$ integers are used, and $p=32$
+if they are $unsigned ~ long$.
+In Figure\ 3, $f=14$ and $c=16$.
+With appropriately modified declarations, $unsigned ~ long$ arithmetic with
+$f=15$, $c=17$ could be used.
+In assembly language $c=16$ is a natural choice because it expedites some
+comparisons and bit manipulations (eg those of lines\ 95-113 and 194-213).
+.pp
+If $p$ is restricted to 16\ bits, the best values possible are $c=9$ and
+$f=7$, making it impossible to encode a full alphabet of 256\ symbols, as each
+symbol must have a count of at least 1.
+A smaller alphabet (eg the letters, or 4-bit nibbles) could still be
+handled.
+.rh "Termination."
+To finish the transmission, it is necessary to send a unique terminating
+symbol ($EOF_symbol$, line 56) and then follow it by enough bits to ensure
+that the encoded string falls within the final range.
+Since $done_encoding( \| )$ (lines 119-123) can be sure that
+$low$ and $high$ are constrained by either (1a) or (1b) above, it need only
+transmit $01$ in the first case or $10$ in the second to remove the remaining
+ambiguity.
+It is convenient to do this using the $bit_plus_follow( \| )$ procedure
+discussed earlier.
+The $input_bit( \| )$ procedure will actually read a few more bits than were
+sent by $output_bit( \| )$ as it needs to keep the low end of the buffer full.
+It does not matter what value these bits have as the EOF is uniquely
+determined by the last two bits actually transmitted.
+.sh "Models for arithmetic coding"
+.pp
+The program of Figure\ 3 must be used with a model which provides
+a pair of translation tables $index_to_char[ \| ]$ and $char_to_index[ \| ]$,
+and a cumulative frequency array $cum_freq[ \| ]$.
+The requirements on the latter are that
+.LB
+.NP
+$cum_freq[ i-1 ] ~ >= ~ cum_freq[ i ]$;
+.NP
+an attempt is never made to encode a symbol $i$ for which
+$cum_freq[i-1] ~=~ cum_freq[i]$;
+.NP
+$cum_freq[0] ~ <= ~ Max_frequency$.
+.LE
+Provided these conditions are satisfied the values in the array need bear
+no relationship to the actual cumulative symbol frequencies in messages.
+Encoding and decoding will still work correctly, although encodings will
+occupy less space if the frequencies are accurate.
+(Recall our successfully encoding \fIeaii!\fR according to the model of
+Table\ 1, which does not actually reflect the frequencies in the message.)  \c
+.rh "Fixed models."
+The simplest kind of model is one in which symbol frequencies are fixed.
+The first model in Figure\ 4 has symbol frequencies which approximate those
+of English (taken from a part of the Brown Corpus, Kucera & Francis, 1967).
+.[
+%A Kucera, H.
+%A Francis, W.N.
+%D 1967
+%T Computational analysis of present-day American English
+%I Brown University Press
+%C Providence, RI
+.]
+However, bytes which did not occur in that sample have been given frequency
+counts of 1 in case they do occur in messages to be encoded
+(so, for example, this model will still work for binary files in which all
+256\ bytes occur).
+Frequencies have been normalized to total 8000.
+The initialization procedure $start_model( \| )$ simply computes a cumulative
+version of these frequencies (lines 48-51), having first initialized the
+translation tables (lines 44-47).
+Execution speed would be improved if these tables were used to re-order
+symbols and frequencies so that the most frequent came first in the
+$cum_freq[ \| ]$ array.
+Since the model is fixed, the procedure $update_model( \| )$, which is
+called from both $encode.c$ and $decode.c$, is null.
+.pp
+An \fIexact\fR model is one where the symbol frequencies in the message are
+exactly as prescribed by the model.
+For example, the fixed model of Figure\ 4 is close to an exact model
+for the particular excerpt of the Brown Corpus from which it was taken.
+To be truly exact, however, symbols that did not occur in the excerpt would
+be assigned counts of 0, not 1 (sacrificing the capability of
+transmitting messages containing those symbols).
+Moreover, the frequency counts would not be scaled to a predetermined
+cumulative frequency, as they have been in Figure\ 4.
+The exact model may be calculated and transmitted before sending the message.
+It is shown in Cleary & Witten (1984a) that, under quite general conditions,
+this will \fInot\fR give better overall compression than adaptive coding,
+described next.
+.[
+Cleary Witten 1984 enumerative adaptive codes
+%D 1984a
+.]
+.rh "Adaptive models."
+An adaptive model represents the changing symbol frequencies seen \fIso far\fR
+in the message.
+Initially all counts might be the same (reflecting no initial information),
+but they are updated as each symbol is seen, to approximate the observed
+frequencies.
+Provided both encoder and decoder use the same initial values (eg equal
+counts) and the same updating algorithm, their models will remain in step.
+The encoder receives the next symbol, encodes it, and updates its model.
+The decoder identifies it according to its current model, and then updates its
+model.
+.pp
+The second half of Figure\ 4 shows such an adaptive model.
+This is the type of model recommended for use with Figure\ 3, for in practice
+it will outperform a fixed model in terms of compression efficiency.
+Initialization is the same as for the fixed model, except that all frequencies
+are set to 1.
+The procedure $update_model(symbol)$ is called by both $encode_symbol( \| )$
+and $decode_symbol( \| )$ (Figure\ 3 lines 54 and 151) after each symbol is
+processed.
+.pp
+Updating the model is quite expensive, because of the need to maintain
+cumulative totals.
+In the code of Figure\ 4, frequency counts, which must be maintained anyway,
+are used to optimize access by keeping the array in frequency order \(em an
+effective kind of self-organizing linear search (Hester & Hirschberg, 1985).
+.[
+Hester Hirschberg 1985
+.]
+$Update_model( \| )$ first checks to see if the new model will exceed
+the cumulative-frequency limit, and if so scales all frequencies down by a
+factor of 2 (taking care to ensure that no count scales to zero) and
+recomputes cumulative values (Figure\ 4, lines\ 29-37).
+Then, if necessary, $update_model( \| )$ re-orders the symbols to place the
+current one in its correct rank in the frequency ordering, altering the
+translation tables to reflect the change.
+Finally, it increments the appropriate frequency count and adjusts cumulative
+frequencies accordingly.
+.sh "Performance"
+.pp
+Now consider the performance of the algorithm of Figure\ 3, both
+in compression efficiency and execution time.
+.rh "Compression efficiency."
+In principle, when a message is coded using arithmetic coding, the number of
+bits in the encoded string is the same as the entropy of that message with
+respect to the model used for coding.
+Three factors cause performance to be worse than this in practice:
+.LB
+.NP
+message termination overhead
+.NP
+the used of fixed-length rather than infinite-precision arithmetic
+.NP
+scaling of counts so that their total is at most $Max_frequency$.
+.LE
+None of these effects is significant, as we now show.
+In order to isolate the effect of arithmetic coding the model will be
+considered to be exact (as defined above).
+.pp
+Arithmetic coding must send extra bits at the end of each message, causing a
+message termination overhead.
+Two bits are needed, sent by $done_encoding( \| )$ (Figure\ 3 lines 119-123),
+in order to disambiguate the final symbol.
+In cases where a bit-stream must be blocked into 8-bit characters before
+encoding, it will be necessary to round out to the end of a block.
+Combining these, an extra 9\ bits may be required.
+.pp
+The overhead of using fixed-length arithmetic
+occurs because remainders are truncated on division.
+It can be assessed by comparing the algorithm's performance with
+the figure obtained from a theoretical entropy calculation
+which derives its frequencies from counts scaled exactly as for coding.
+It is completely negligible \(em on the order of $10 sup -4$ bits/symbol.
+.pp
+The penalty paid by scaling counts is somewhat larger, but still very
+small.
+For short messages (less than $2 sup 14$ bytes) no scaling need be done.
+Even with messages of $10 sup 5$ to $10 sup 6$ bytes, the overhead was found
+experimentally to be less than 0.25% of the encoded string.
+.pp
+The adaptive model of Figure\ 4 scales down all counts whenever the total
+threatens to exceed $Max_frequency$.
+This has the effect of weighting recent events more heavily compared with
+those earlier in the message.
+The statistics thus tend to track changes in the input sequence, which can be
+very beneficial.
+(For example, we have encountered cases where limiting counts to 6 or 7\ bits
+gives better results than working to higher precision.)  \c
+Of course, this depends on the source being modeled.
+Bentley \fIet al\fR (1986) consider other, more explicit, ways of
+incorporating a recency effect.
+.[
+Bentley Sleator Tarjan Wei 1986 locally adaptive
+%J Communications of the ACM
+.]
+.rh "Execution time."
+The program in Figure\ 3 has been written for clarity, not execution speed.
+In fact, with the adaptive model of Figure\ 4, it takes about 420\ $mu$s per
+input byte on a VAX-11/780 to encode a text file, and about the same for
+decoding.
+However, easily avoidable overheads such as procedure calls account for much
+of this, and some simple optimizations increase speed by a factor of 2.
+The following alterations were made to the C version shown:
+.LB
+.NP
+the procedures $input_bit( \| )$, $output_bit( \| )$, and
+$bit_plus_follow( \| )$ were converted to macros to eliminate
+procedure-call overhead;
+.NP
+frequently-used quantities were put in register variables;
+.NP
+multiplies by two were replaced by additions (C ``+='');
+.NP
+array indexing was replaced by pointer manipulation in the loops
+at line 189 of Figure\ 3 and lines 49-52 of the adaptive model in Figure\ 4.
+.LE
+.pp
+This mildly-optimized C implementation has an execution time of
+214\ $mu$s/262\ $mu$s, per input byte,
+for encoding/decoding 100,000\ bytes of English text on a VAX-11/780, as shown
+in Table\ 2.
+Also given are corresponding figures for the same program on an
+Apple Macintosh and a SUN-3/75.
+As can be seen, coding a C source program of the same length took slightly
+longer in all cases, and a binary object program longer still.
+The reason for this will be discussed shortly.
+Two artificial test files were included to allow readers to replicate the
+results.
+``Alphabet'' consists of enough copies of the 26-letter alphabet to fill
+out 100,000\ characters (ending with a partially-completed alphabet).
+``Skew-statistics'' contains 10,000 copies of the string
+\fIaaaabaaaac\fR\^; it demonstrates that files may be encoded into less than
+1\ bit per character (output size of 12,092\ bytes = 96,736\ bits).
+All results quoted used the adaptive model of Figure\ 4.
+.pp
+A further factor of 2 can be gained by reprogramming in assembly language.
+A carefully optimized version of Figures\ 3 and 4 (adaptive model) was
+written in both VAX and M68000 assembly language.
+Full use was made of registers.
+Advantage was taken of the 16-bit $code_value$ to expedite some crucial
+comparisons and make subtractions of $Half$ trivial.
+The performance of these implementations on the test files is also shown in
+Table\ 2 in order to give the reader some idea of typical execution speeds.
+.pp
+The VAX-11/780 assembly language timings are broken down in Table\ 3.
+These figures were obtained with the U\s-2NIX\s+2 profile facility and are
+accurate only to within perhaps 10%\(dg.
+.FN
+\(dg This mechanism constructs a histogram of program counter values at
+real-time clock interrupts, and suffers from statistical variation as well as
+some systematic errors.
+.EF
+``Bounds calculation'' refers to the initial part of $encode_symbol( \| )$
+and $decode_symbol( \| )$ (Figure\ 3 lines 90-94 and 190-193)
+which contain multiply and divide operations.
+``Bit shifting'' is the major loop in both the encode and decode routines
+(lines 95-113 and 194-213).
+The $cum$ calculation in $decode_symbol( \| )$, which requires a
+multiply/divide, and the following loop to identify the next symbol
+(lines\ 187-189), is ``Symbol decode''.
+Finally, ``Model update'' refers to the adaptive
+$update_model( \| )$ procedure of Figure\ 4 (lines\ 26-53).
+.pp
+As expected, the bounds calculation and model update take the same time for
+both encoding and decoding, within experimental error.
+Bit shifting was quicker for the text file than for the C program and object
+file because compression performance was better.
+The extra time for decoding over encoding is due entirely to the symbol
+decode step.
+This takes longer in the C program and object file tests because the loop of
+line\ 189 was executed more often (on average 9\ times, 13\ times, and
+35\ times respectively).
+This also affects the model update time because it is the number of cumulative
+counts which must be incremented in Figure\ 4 lines\ 49-52.
+In the worst case, when the symbol frequencies are uniformly distributed,
+these loops are executed an average of 128 times.
+Worst-case performance would be improved by using a more complex tree
+representation for frequencies, but this would likely be slower for text
+files.
+.sh "Some applications"
+.pp
+Applications of arithmetic coding are legion.
+By liberating \fIcoding\fR with respect to a model from the \fImodeling\fR
+required for prediction, it encourages a whole new view of data compression
+(Rissanen & Langdon, 1981).
+.[
+Rissanen Langdon 1981 Universal modeling and coding
+.]
+This separation of function costs nothing in compression performance, since
+arithmetic coding is (practically) optimal with respect to the entropy of
+the model.
+Here we intend to do no more than suggest the scope of this view
+by briefly considering
+.LB
+.NP
+adaptive text compression
+.NP
+non-adaptive coding
+.NP
+compressing black/white images
+.NP
+coding arbitrarily-distributed integers.
+.LE
+Of course, as noted earlier, greater coding efficiencies could easily be
+achieved with more sophisticated models.
+Modeling, however, is an extensive topic in its own right and is beyond the
+scope of this paper.
+.pp
+.ul
+Adaptive text compression
+using single-character adaptive frequencies shows off arithmetic coding to
+good effect.
+The results obtained using the program of Figures\ 3 and 4 vary from
+4.8\-5.3\ bit/char for short English text files ($10 sup 3$\ to $10 sup 4$
+bytes) to 4.5\-4.7\ bit/char for long ones ($10 sup 5$ to $10 sup 6$ bytes).
+Although adaptive Huffman techniques do exist (eg Gallagher, 1978;
+Cormack & Horspool, 1984) they lack the conceptual simplicity of
+arithmetic coding.
+.[
+Gallagher 1978 variations on a theme by Huffman
+.]
+.[
+Cormack Horspool 1984 adaptive Huffman codes
+.]
+While competitive in compression efficiency for many files, they are slower.
+For example, Table\ 4 compares the performance of the mildly-optimized C
+implementation of arithmetic coding with that of the U\s-2NIX\s+2
+\fIcompact\fR program which implements adaptive Huffman coding using
+a similar model\(dg.
+.FN
+\(dg \fICompact\fR's model is essentially the same for long files (like those
+of Table\ 4) but is better for short files than the model used as an example
+in this paper.
+.EF
+Casual examination of \fIcompact\fR indicates that the care taken in
+optimization is roughly comparable for both systems, yet arithmetic coding
+halves execution time.
+Compression performance is somewhat better with arithmetic coding on all the
+example files.
+The difference would be accentuated with more sophisticated models that
+predict symbols with probabilities approaching one under certain circumstances
+(eg letter ``u'' following ``q'').
+.pp
+.ul
+Non-adaptive coding
+can be performed arithmetically using fixed, pre-specified models like that in
+the first part of Figure\ 4.
+Compression performance will be better than Huffman coding.
+In order to minimize execution time, the total frequency count,
+$cum_freq[0]$, should be chosen as a power of two so the divisions
+in the bounds calculations (Figure\ 3 lines 91-94 and 190-193) can be done
+as shifts.
+Encode/decode times of around 60\ $mu$s/90\ $mu$s should then be possible
+for an assembly language implementation on a VAX-11/780.
+A carefully-written implementation of Huffman coding, using table look-up for
+encoding and decoding, would be a bit faster in this application.
+.pp
+.ul
+Compressing black/white images
+using arithmetic coding has been investigated by Langdon & Rissanen (1981),
+who achieved excellent results using a model which conditioned the probability
+of a pixel's being black on a template of pixels surrounding it.
+.[
+Langdon Rissanen 1981 compression of black-white images
+.]
+The template contained a total of ten pixels, selected from those above and
+to the left of the current one so that they precede it in the raster scan.
+This creates 1024 different possible contexts, and for each the probability of
+the pixel being black was estimated adaptively as the picture was transmitted.
+Each pixel's polarity was then coded arithmetically according to this
+probability.
+A 20%\-30% improvement in compression was attained over earlier methods.
+To increase coding speed Langdon & Rissanen used an approximate method
+of arithmetic coding which avoided multiplication by representing
+probabilities as integer powers of 1/2.
+Huffman coding cannot be directly used in this application, as it never
+compresses with a two-symbol alphabet.
+Run-length coding, a popular method for use with two-valued alphabets,
+provides another opportunity for arithmetic coding.
+The model reduces the data to a sequence of lengths of runs of the same symbol
+(eg for picture coding, run-lengths of black followed by white followed by
+black followed by white ...).
+The sequence of lengths must be transmitted.
+The CCITT facsimile coding standard (Hunter & Robinson, 1980), for example,
+bases a Huffman code on the frequencies with which black and white runs of
+different lengths occur in sample documents.
+.[
+Hunter Robinson 1980 facsimile
+.]
+A fixed arithmetic code using these same frequencies would give better
+performance; adapting the frequencies to each particular document would be
+better still.
+.pp
+.ul
+Coding arbitrarily-distributed integers
+is often called for when using more sophisticated models of text, image,
+or other data.
+Consider, for instance, Bentley \fIet al\fR's (1986) locally-adaptive data
+compression scheme, in which the encoder and decoder cache the last $N$
+different words seen.
+.[
+Bentley Sleator Tarjan Wei 1986 locally adaptive
+%J Communications of the ACM
+.]
+A word present in the cache is transmitted by sending the integer cache index.
+Words not in the cache are transmitted by sending a new-word marker followed
+by the characters of the word.
+This is an excellent model for text in which words are used frequently over
+short intervals and then fall into long periods of disuse.
+Their paper discusses several variable-length codings for the integers used
+as cache indexes.
+Arithmetic coding allows \fIany\fR probability distribution to be used as the
+basis for a variable-length encoding, including \(em amongst countless others
+\(em the ones implied by the particular codes discussed there.
+It also permits use of an adaptive model for cache
+indexes, which is desirable if the distribution of cache hits is
+difficult to predict in advance.
+Furthermore, with arithmetic coding, the code space allotted to the cache
+indexes can be scaled down to accommodate any desired probability for the
+new-word marker.
+.sh "Acknowledgement"
+.pp
+Financial support for this work has been provided by the
+Natural Sciences and Engineering Research Council of Canada.
+.sh "References"
+.sp
+.in+4n
+.[
+$LIST$
+.]
+.in 0
+.bp
+.sh "APPENDIX: Proof of decoding inequality"
+.sp
+Using 1-letter abbreviations for $cum_freq$, $symbol$, $low$, $high$, and
+$value$, suppose
+.LB
+$c[s] ~ <= ~~ left f {(v-l+1) times c[0] ~-~ 1} over {h-l+1} right f ~~ < ~
+c[s-1]$;
+.LE
+in other words,
+.LB
+.ta \n(.lu-\n(.iuR
+$c[s] ~ <= ~~ {(v-l+1) times c[0] ~-~ 1} over {r} ~~-~~ epsilon ~~ <= ~
+c[s-1] ~-~1$, 	(1)
+.LE
+.ta 8n
+where	$r ~=~ h-l+1$,  $0 ~ <= ~ epsilon ~ <= ~ {r-1} over r $.
+.sp
+(The last inequality of (1) derives from the fact that $c[s-1]$ must be an
+integer.)  \c
+Then we wish to show that  $l' ~ <= ~ v ~ <= ~ h'$,  where $l'$ and $h'$
+are the updated values for $low$ and $high$ as defined below.
+.sp
+.ta \w'(a)    'u
+(a)	$l' ~ == ~~ l ~+~~ left f {r times c[s]} over c[0] right f ~~ mark
+<= ~~ l ~+~~ {r} over c[0] ~ left [ ~ {(v-l+1) times c[0] ~-~ 1} over {r}
+                          ~~ - ~ epsilon ~ right ]$    from (1),
+.sp 0.5
+$lineup <= ~~ v ~ + ~ 1 ~ - ~ 1 over c[0]$ ,
+.sp 0.5
+	so   $l' ~ <= ~~ v$   since both $v$ and $l'$ are integers
+and $c[0] > 0$.
+.sp
+(b)	$h' ~ == ~~ l ~+~~ left f {r times c[s-1]} over c[0] right f ~~-~1~~ mark
+>= ~~ l ~+~~  {r} over c[0] ~ left [ ~ {(v-l+1) times c[0] ~-~ 1} over {r}
+                          ~~ + ~ 1 ~ - ~ epsilon ~ right ] ~~ - ~ 1
+$    from (1),
+.sp 0.5
+$lineup >= ~~ v ~ + ~~ r over c[0] ~ left [ ~ - ~ 1 over r ~+~ 1
+                                                  ~-~~ r-1 over r right ]
+~~ = ~~ v$.
+.bp
+.sh "Captions for tables"
+.sp
+.nf
+.ta \w'Figure 1  'u
+Table 1	Example fixed model for alphabet {\fIa, e, i, o, u, !\fR}
+Table 2	Results for encoding and decoding 100,000-byte files
+Table 3	Breakdown of timings for VAX-11/780 assembly language version
+Table 4	Comparison of arithmetic and adaptive Huffman coding
+.fi
+.sh "Captions for figures"
+.sp
+.nf
+.ta \w'Figure 1  'u
+Figure 1	(a) Representation of the arithmetic coding process
+	(b) Like (a) but with the interval scaled up at each stage
+Figure 2	Pseudo-code for the encoding and decoding procedures
+Figure 3	C implementation of arithmetic encoding and decoding
+Figure 4	Fixed and adaptive models for use with Figure 3
+Figure 5	Scaling the interval to prevent underflow
+.fi
+.bp 0
+.ev2
+.nr x2 \w'symbol'/2
+.nr x3 (\w'symbol'/2)+0.5i+(\w'probability'/2)
+.nr x4 (\w'probability'/2)+0.5i
+.nr x5 (\w'[0.0, '
+.nr x1 \n(x2+\n(x3+\n(x4+\n(x5+\w'0.0)'
+.nr x0 (\n(.l-\n(x1)/2
+.in \n(x0u
+.ta \n(x2uC +\n(x3uC +\n(x4u +\n(x5u
+\l'\n(x1u'
+.sp
+	symbol	probability	\0\0range
+\l'\n(x1u'
+.sp
+	\fIa\fR	0.2	[0,	0.2)
+	\fIe\fR	0.3	[0.2,	0.5)
+	\fIi\fR	0.1	[0.5,	0.6)
+	\fIo\fR	0.2	[0.6,	0.8)
+	\fIu\fR	0.1	[0.8,	0.9)
+	\fI!\fR	0.1	[0.9,	1.0)
+\l'\n(x1u'
+.sp
+.in 0
+.FE "Table 1  Example fixed model for alphabet {\fIa, e, i, o, u, !\fR}"
+.bp 0
+.ev2
+.nr x1 0.5i+\w'\fIVAX object program\fR      '+\w'100,000      '+\w'time ($mu$s)  '+\w'time ($mu$s)    '+\w'time ($mu$s)  '+\w'time ($mu$s)    '+\w'time ($mu$s)  '+\w'time ($mu$s)'
+.nr x0 (\n(.l-\n(x1)/2
+.in \n(x0u
+.ta 0.5i +\w'\fIVAX object program\fR      'u +\w'100,000      'u +\w'time ($mu$s)  'u +\w'time ($mu$s)    'u +\w'time ($mu$s)  'u +\w'time ($mu$s)    'u +\w'time ($mu$s)  'u
+\l'\n(x1u'
+.sp
+			\0\0VAX-11/780	\0\0\0Macintosh	\0\0\0\0SUN-3/75
+		output	 encode	 decode	 encode	 decode	 encode	 decode
+		(bytes)	time ($mu$s)	time ($mu$s)	time ($mu$s)	time ($mu$s)	time ($mu$s)	time ($mu$s)
+\l'\n(x1u'
+.sp
+Mildly optimized C implementation
+.sp
+	\fIText file\fR	\057718	\0\0214	\0\0262	\0\0687	\0\0881	\0\0\098	\0\0121
+	\fIC program\fR	\062991	\0\0230	\0\0288	\0\0729	\0\0950	\0\0105	\0\0131
+	\fIVAX object program\fR	\073501	\0\0313	\0\0406	\0\0950	\01334	\0\0145	\0\0190
+	\fIAlphabet\fR	\059292	\0\0223	\0\0277	\0\0719	\0\0942	\0\0105	\0\0130
+	\fISkew-statistics\fR	\012092	\0\0143	\0\0170	\0\0507	\0\0645	\0\0\070	\0\0\085
+.sp
+Carefully optimized assembly language implementation
+.sp
+	\fIText file\fR	\057718	\0\0104	\0\0135	\0\0194	\0\0243	\0\0\046	\0\0\058
+	\fIC program\fR	\062991	\0\0109	\0\0151	\0\0208	\0\0266	\0\0\051	\0\0\065
+	\fIVAX object program\fR	\073501	\0\0158	\0\0241	\0\0280	\0\0402	\0\0\075	\0\0107
+	\fIAlphabet\fR	\059292	\0\0105	\0\0145	\0\0204	\0\0264	\0\0\051	\0\0\065
+	\fISkew-statistics\fR	\012092	\0\0\063	\0\0\081	\0\0126	\0\0160	\0\0\028	\0\0\036
+
+\l'\n(x1u'
+.sp 2
+.nr x0 \n(.l
+.ll \n(.lu-\n(.iu
+.fi
+.in \w'\fINotes:\fR  'u
+.ti -\w'\fINotes:\fR  'u
+\fINotes:\fR\ \ \c
+Times are measured in $mu$s per byte of uncompressed data.
+.sp 0.5
+The VAX-11/780 had a floating-point accelerator, which reduces integer
+multiply and divide times.
+.sp 0.5
+The Macintosh uses an 8\ MHz MC68000 with some memory wait states.
+.sp 0.5
+The SUN-3/75 uses a 16.67\ MHz MC68020.
+.sp 0.5
+All times exclude I/O and operating system overhead in support of I/O.
+VAX and SUN figures give user time from the U\s-2NIX\s+2 \fItime\fR
+command; on the Macintosh I/O was explicitly directed to an array.
+.sp 0.5
+The 4.2BSD C compiler was used for VAX and SUN; Aztec C 1.06g for Macintosh.
+.sp
+.ll \n(x0u
+.nf
+.in 0
+.FE "Table 2  Results for encoding and decoding 100,000-byte files"
+.bp 0
+.ev2
+.nr x1 \w'\fIVAX object program\fR        '+\w'Bounds calculation        '+\w'time ($mu$s)    '+\w'time ($mu$s)'
+.nr x0 (\n(.l-\n(x1)/2
+.in \n(x0u
+.ta \w'\fIVAX object program\fR        'u +\w'Bounds calculation        'u +\w'time ($mu$s)    'u +\w'time ($mu$s)'u
+\l'\n(x1u'
+.sp
+		 encode	 decode
+		time ($mu$s)	time ($mu$s)
+\l'\n(x1u'
+.sp
+\fIText file\fR	Bounds calculation	\0\0\032	\0\0\031
+	Bit shifting	\0\0\039	\0\0\030
+	Model update	\0\0\029	\0\0\029
+	Symbol decode	\0\0\0\(em	\0\0\045
+	Other	\0\0\0\04	\0\0\0\00
+		\0\0\l'\w'100'u'	\0\0\l'\w'100'u'
+		\0\0104	\0\0135
+.sp
+\fIC program\fR	Bounds calculation	\0\0\030	\0\0\028
+	Bit shifting	\0\0\042	\0\0\035
+	Model update	\0\0\033	\0\0\036
+	Symbol decode	\0\0\0\(em	\0\0\051
+	Other	\0\0\0\04	\0\0\0\01
+		\0\0\l'\w'100'u'	\0\0\l'\w'100'u'
+		\0\0109	\0\0151
+.sp
+\fIVAX object program\fR	Bounds calculation	\0\0\034	\0\0\031
+	Bit shifting	\0\0\046	\0\0\040
+	Model update	\0\0\075	\0\0\075
+	Symbol decode	\0\0\0\(em	\0\0\094
+	Other	\0\0\0\03	\0\0\0\01
+		\0\0\l'\w'100'u'	\0\0\l'\w'100'u'
+		\0\0158	\0\0241
+\l'\n(x1u'
+.in 0
+.FE "Table 3  Breakdown of timings for VAX-11/780 assembly language version"
+.bp 0
+.ev2
+.nr x1 \w'\fIVAX object program\fR      '+\w'100,000      '+\w'time ($mu$s)  '+\w'time ($mu$s)    '+\w'100,000      '+\w'time ($mu$s)  '+\w'time ($mu$s)'
+.nr x0 (\n(.l-\n(x1)/2
+.in \n(x0u
+.ta \w'\fIVAX object program\fR      'u +\w'100,000      'u +\w'time ($mu$s)  'u +\w'time ($mu$s)    'u +\w'100,000      'u +\w'time ($mu$s)  'u +\w'time ($mu$s)'u
+\l'\n(x1u'
+.sp
+	\0\0\0\0\0\0Arithmetic coding	\0\0\0Adaptive Huffman coding
+	output	 encode	 decode	output	 encode	 decode
+	(bytes)	time ($mu$s)	time ($mu$s)	(bytes)	time ($mu$s)	time ($mu$s)
+\l'\n(x1u'
+.sp
+\fIText file\fR	\057718	\0\0214	\0\0262	\057781	\0\0550	\0\0414
+\fIC program\fR	\062991	\0\0230	\0\0288	\063731	\0\0596	\0\0441
+\fIVAX object program\fR	\073546	\0\0313	\0\0406	\076950	\0\0822	\0\0606
+\fIAlphabet\fR	\059292	\0\0223	\0\0277	\060127	\0\0598	\0\0411
+\fISkew-statistics\fR	\012092	\0\0143	\0\0170	\016257	\0\0215	\0\0132
+\l'\n(x1u'
+.sp 2
+.nr x0 \n(.l
+.ll \n(.lu-\n(.iu
+.fi
+.in +\w'\fINotes:\fR  'u
+.ti -\w'\fINotes:\fR  'u
+\fINotes:\fR\ \ \c
+Mildly optimized C implementation used for arithmetic coding
+.sp 0.5
+U\s-2NIX\s+2 \fIcompact\fR used for adaptive Huffman coding
+.sp 0.5
+Times are for a VAX-11/780, and exclude I/O and operating system overhead in
+support of I/O.
+.sp
+.ll \n(x0u
+.nf
+.in 0
+.FE "Table 4  Comparison of arithmetic and adaptive Huffman coding"
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/paper2 b/src/test/java/org/xerial/snappy/testdata/calgary/paper2
new file mode 100644
index 0000000..79ecc09
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/paper2
@@ -0,0 +1,1731 @@
+.pn 0
+.ls1
+.EQ
+delim $$
+.EN
+.ev1
+.ps-2
+.vs-2
+.ev
+\&
+.sp 10
+.ps+4
+.ce
+COMPUTER (IN)SECURITY \(em
+.sp
+.ce
+INFILTRATING OPEN SYSTEMS
+.ps-4
+.sp4
+.ce
+Ian H. Witten
+.sp2
+.ce4
+Department of Computer Science
+The University of Calgary
+2500 University Drive NW
+Calgary, Canada T2N 1N4
+.sp2
+.ce2
+November 1986
+Revised March 1987
+.bp 1
+.ls 2
+.pp
+Shared computer systems today are astonishingly insecure.
+And users, on the whole, are blithely unaware of the weaknesses of the
+systems in which they place \(em or rather, misplace \(em their trust.
+Taken literally, of course, it is meaningless to ``trust'' a computer system
+as such, for machines are neither trustworthy nor untrustworthy;
+these are human qualities.
+In trusting a system one is effectively trusting all those who create and
+alter it, in other words, all who have access (whether licit or
+illicit).
+Security is a fundamentally \fIhuman\fP issue.
+.pp
+This article aims not to solve security problems but to raise reader
+consciousness
+of the multifarious cunning ways that systems can be infiltrated, and the
+subtle but devastating damage that an unscrupulous infiltrator can wreak.
+It is comforting, but highly misleading, to imagine that technical means of
+enforcing security have guaranteed that the systems we use are safe.
+It is true that in recent years some ingenious procedures have been invented
+to preserve security.
+For example, the advent of ``one-way functions'' (explained below) has
+allowed the password file, once a computer system's central stronghold, to be
+safely exposed to casual inspection by all and sundry.
+But despite these innovations, astonishing loopholes exist in practice.
+.pp
+There are manifest advantages in ensuring security by technical means rather
+than by keeping things secret.
+Not only do secrets leak, but as individuals change projects,
+join or leave the organization, become promoted and so on, they need to learn
+new secrets and forget old ones.
+With physical locks one can issue and withdraw keys to reflect changing
+security needs.
+But in computer systems, the keys constitute information which can be given
+out but not taken back, because no-one can force people to forget.
+In practice, such secrets require considerable administration to maintain
+properly.
+And in systems where security is maintained by tight control of information,
+.ul
+quis custodiet ipsos custodes
+\(em who will guard the guards themselves?
+.pp
+There is a wide range of simple insecurities that many
+systems suffer.
+These are, in the main, exacerbated in open systems where information and
+programs are shared among users \(em just those features that characterize
+pleasant and productive working environments.
+The saboteur's basic tool is the Trojan horse,
+a widely trusted program which has been surreptitiously modified to do
+bad things in secret.
+``Bad things'' range from minor but rankling irritations through theft of
+information to holding users to ransom.
+The inevitable fragilities of operating systems can
+be exploited by constructing programs which behave in some ways like primitive
+living organisms.
+Programs can be written which spread bugs like an epidemic.
+They hide in binary code, effectively undetectable (because nobody ever
+examines binaries).
+They can remain dormant for months or years, perhaps quietly and imperceptibly
+infiltrating their way into the very depths of a system, then suddenly pounce,
+causing irreversible catastrophe.
+A clever and subtle bug\(dg can survive
+recompilation despite the fact that there is no record of it in the source
+program.
+.FN
+\(dg Throughout this article the word ``bug'' is meant to bring to mind a
+concealed snooping device as in espionage, or a micro-organism carrying
+disease as in biology, rather than an inadvertent programming error.
+.EF
+This is the ultimate parasite.
+It cannot be detected because it lives only in binary code.
+And yet it cannot be wiped out by recompiling the source program!
+We might wonder whether these techniques, which this article develops
+and explains in the context of multi-user timesharing operating systems,
+pose any threats to computer networks or even stand-alone micros.
+.pp
+Although the potential has existed for decades, the possibility of the kind of
+``deviant'' software described here has been recognized only recently.
+Or has it?
+Probably some in the world of computer wizards and sorcerers have known for
+years how systems can be silently, subtly infiltrated \(em and concealed
+the information for fear that it might be misused (or for other reasons).
+But knowledge of the techniques is spreading nevertheless, and I believe it
+behooves us all \(em professionals and amateurs alike \(em to understand just
+how our continued successful use of computer systems hangs upon a thread of
+trust.
+Those who are ignorant of the possibilities of sabotage can easily be
+unknowingly duped by an unscrupulous infiltrator.
+.pp
+The moral is simple.
+Computer security is a human business.
+One way of maintaining security is to keep things secret, trusting people
+(the very people who can do you most harm) not to tell.
+The alternative is to open up the system and rely on technical means
+of ensuring security.
+But a system which is really ``open'' is also open to abuse.
+The more sharing and productive the environment, the more potential exists for
+damage.
+You have to trust your fellow users, and educate yourself.
+If mutual trust is the cornerstone of computer security, we'd better know it!
+.sh "The trend towards openness"
+.pp
+Many people believe that computer systems can maintain security not
+by keeping secrets but by clever technical mechanisms.
+Such devices include electronic locks and keys, and schemes for maintaining
+different sets of ``permissions'' or ``privileges'' for each user.
+The epitome of this trend towards open systems is the well-known \s-2UNIX\s+2
+operating system, whose developers, Dennis Ritchie and Ken Thompson, strove
+to design a clean, elegant piece of software that could be understood,
+maintained, and modified by users.
+(In 1983 they received the prestigious ACM Turing Award for their work.)  \c
+Ken Thompson has been one of the prime contributors to our knowledge of
+computer (in)security, and was responsible for much of the work described in
+this article.
+.pp
+The most obvious sense in which the \s-2UNIX\s+2 system
+is ``open'' is illustrated by looking at its password file.
+Yes, there is nothing to stop you from looking at this file!
+Each registered user has a line in it, and Figure\ 1 shows mine.
+It won't help you to impersonate me, however, because what it shows in the
+password field is not my password but a scrambled version of it.
+There is a program which computes encrypted passwords from plain ones, and
+that is how the system checks my identity when I log in.
+But the program doesn't work in reverse \(em it's what is called a ``one-way
+function'' (see Panel\ 1).
+It is effectively impossible to find the plain version from the encrypted one,
+even if you know exactly what the encryption procedure does and try to work
+carefully backward through it.
+\fINobody\fR can recover my plain password from the information stored in the
+computer.
+If I forget it, not even the system manager can find out what it is.
+The best that can be done is to reset my password to some standard one, so
+that I can log in and change it to a new secret password.
+(Needless to say this creates a window of opportunity for an imposter.)  \c
+The system keeps no secrets.
+Only I do.
+.pp
+Before people knew about one-way functions, computer systems maintained a
+password file which gave everyone's plain password for the login procedure to
+consult.
+This was the prime target for anyone who tried to
+break security, and the bane of system managers because of the
+completely catastrophic nature of a leak.
+Systems which keep no secrets avoid an unnecessary Achilles heel.
+.pp
+Another sense in which \s-2UNIX\s+2 is ``open'' is the accessibility of its
+source code.
+The software, written in the language "C", has been distributed
+(to universities) in source form so that maintenance can be done locally.
+The computer science research community has enjoyed numerous benefits from
+this enlightened policy (one is that we can actually look at some of the
+security problems discussed in this article).
+Of course, in any other system there will inevitably be a large number of
+people who have or have had access to the source code \(em even though it may
+not be publicly accessible.
+Operating systems are highly complex pieces of technology, created by large
+teams of people.
+A determined infiltrator may well be able to gain illicit access to source
+code.
+Making it widely available has the very positive effect of bringing the
+problems out into the open and offering them up for public scrutiny.
+.pp
+Were it attainable, perfect secrecy would offer a high degree of security.
+Many people feel that technical innovations like one-way functions and
+open password files provide comparable protection.
+The aim of this article is to show that this is a dangerous misconception.
+In practice, security is often severely compromised by people who have
+intimate knowledge of the inner workings of the system \(em precisely the
+people you rely on to \fIprovide\fR the security.
+This does not cause problems in research laboratories because they are
+founded on mutual trust and support.
+But in commercial environments, it is vital to be aware of any limitations on
+security.
+We must face the fact that
+in a hostile and complex world, computer security is best preserved by
+maintaining secrecy.
+.sh "A pot-pourri of security problems"
+.pp
+Here are a few simple ways that security might be compromised.
+.rh "Guessing a particular user's password."
+Whether your password is stored in a secret file or encrypted by a one-way
+function first, it offers no protection if it can easily be guessed.
+This will be hard if it is chosen at random from a large enough set.
+But for a short sequence of characters from a restricted alphabet
+(like the lower-case letters), an imposter could easily try all possibilities.
+And in an open system which gives access to the password file and one-way
+function, this can be done mechanically, by a program!
+.pp
+In Figure\ 2, the number of different passwords is plotted against the length
+of the password, for several different sets of characters.
+For example, there are about ten million ($10 sup 7$) possibilities for a
+5-character password chosen from the lower-case letters.
+This may seem a lot, but if it takes 1\ msec to try each one, they can all be
+searched in about 3\ hours.
+If 5-character passwords are selected from the 62 alphanumerics, there
+are more than 100 times as many and the search would take over 10\ days.
+.pp
+To make matters worse, people have a strong propensity to choose as
+passwords such things as
+.LB
+.NP
+English words
+.NP
+English words spelled backwards
+.NP
+first names, last names, street names, city names
+.NP
+the above with initial upper-case letters
+.NP
+valid car license numbers
+.NP
+room numbers, social security numbers, telephone numbers, etc.
+.LE
+Of course, this isn't particularly surprising since passwords have to be
+mnemonic in order to be remembered!
+But it makes it easy for an enterprising imposter to gather a substantial
+collection of candidates (from dictionaries, mailing lists, etc) and search
+them for your password.
+At 1\ msec per possibility, it takes only 4\ minutes to search a 250,000-word
+commercial dictionary.
+.pp
+A study some years ago of a collection of actual passwords that people used to
+protect their accounts revealed the amazing breakdown reproduced in Figure\ 3.
+Most fell into one of the categories discussed, leaving less
+than 15% of passwords which were hard to guess.
+Where does your own password stand in the pie diagram?
+.rh "Finding any valid password."
+There is a big difference between finding a particular person's password and
+finding a valid password for any user.
+You could start searching through the candidates noted above until you found
+one which, when encrypted, matched one of the entries in the password file.
+That way you find the most vulnerable user, and there are almost certain to be
+some lazy and crazy enough to use easily-guessable passwords, four-letter
+words, or whatever.
+Hashing techniques make it almost as quick to check a candidate against a
+group of encrypted passwords as against a single one.
+.pp
+A technique called ``salting'' protects against this kind of attack.
+Whenever a user's password is initialized or changed, a small random number
+called the ``salt'' is generated (perhaps from the time of day).
+Not only is this combined with the password when it is encrypted, but as
+Figure\ 1 shows it is also stored in the password file for everyone to see.
+Every time someone claiming to be that user logs in, the salt is combined with
+the password offered before being encrypted and compared
+with whatever is stored in the password file.
+For example, say my password was ``w#xs27'' (it isn't!).
+If the salt is ``U6'' (as in Figure\ 1), the system will apply its one-way
+function to ``w#xs27U6'' to get the encrypted password.
+.pp
+Since all can see the salt, it is no harder for anyone to guess
+an individual user's password.
+One can salt guesses just as the system does.
+But it \fIis\fR harder to search a group of passwords, since the salt will be
+different for each, rendering it meaningless to compare a single encrypted
+password against all those in the group.
+Suppose you were checking to see if anyone had the password ``hello''.
+Without salting, you simply apply the one-way function to this word and
+compare the result with everyone's encrypted password.
+But with salting it's not so easy, since to see if my password is ``hello''
+you must encrypt ``helloU6'', and the salt is different for everyone.
+.rh "Forced-choice passwords."
+The trouble with letting users choose their own passwords is that they often
+make silly, easily-guessed, choices.
+Many systems attempt to force people to choose more ``random'' passwords, and
+force them to change their password regularly.
+All these attempts seem to be complete failures.
+The fundamental problem is that people have to be able to remember their
+passwords, because security is immediately compromised if they are written
+down.
+.pp
+There are many amusing anecdotes about how people thwart systems that attempt
+to dictate when they have to change their passwords.
+I had been using a new system for some weeks when it insisted that I change my
+password.
+Resenting it ordering me about, I gave my old password as the new one.
+But it was programmed to detect this ruse and promptly told me so.
+I complained to the user sitting beside me.
+``I know,'' she said sympathetically.
+``What I always do is change it to something else and then immediately
+change it back again!''  \c
+Another system remembered your last several passwords, and insisted on a
+once-a-month change.
+So people began to use the name of the current month as their password!
+.rh "Wiretaps."
+Obviously any kind of password protection can be thwarted by a physical
+wiretap.
+All one has to do is watch as you log in and make a note of your password.
+The only defense is encryption at the terminal.
+Even then you have to be careful to ensure that someone can't intercept
+your encrypted password and pose as you later on by sending this
+\fIencrypted\fR string to the computer \(em after all, this is what the
+computer sees when you log in legitimately!
+To counter this, the encryption can be made time-dependent so that the same
+password translates to different strings at different times.
+.pp
+Assuming that you, like 99.9% of the rest of us, don't go to the trouble of
+terminal encryption, when was the last time you checked the line between your
+office terminal and the computer for a physical wiretap?
+.rh "Search paths."
+We will see shortly that you place yourself completely at the mercy of other
+users whenever you execute their programs, and they
+can do some really nasty things like spreading infection to your files.
+However, you don't necessarily have to execute someone else's program overtly,
+for many systems make it easy to use other people's
+programs without even realizing it.
+This is usually a great advantage, for you can install programs so that you
+or others can invoke them just like ordinary system programs, thereby
+creating personalized environments.
+.pp
+Figure\ 4 shows part of the file hierarchy in our system.
+The whole hierarchy is immense \(em I alone have something like 1650 files,
+organized into 200 of my own directories under the ``ian'' node shown in the
+Figure, and there are hundreds of other users \(em and what is shown is just a
+very small fragment.
+Users can set up a ``search path'' which tells the system
+where to look for programs they invoke.
+For example, my search path includes the 6 places that are circled.
+Whenever I ask for a program to be executed, the system seeks it in these
+places.
+It also searches the ``current directory'' \(em the one where I happen to be
+at the time.
+.pp
+To make it more convenient for you to set up a good working environment, it
+is easy to put someone else's file directories on your search path.
+But then they can do arbitrary damage to you, sometimes completely
+accidentally.
+For example, I once installed a spreadsheet calculator called ``sc'' in one
+of my directories.
+Unknown to me, another user suddenly found that the Simula compiler stopped
+working and entered a curious mode where it cleared his VDT screen and wrote
+a few incomprehensible characters on it.
+There was quite a hiatus.
+The person who maintained the Simula compiler was away,
+but people could see no reason for the compiler to have been altered.
+Of course, told like this it is obvious that the user had my directory on his
+search path and I had created a name conflict with \fIsc\fR, the Simula
+compiler.
+But it was not obvious to the user, who rarely thought about the search path
+mechanism.
+And I never use the Simula compiler and had created the conflict in all
+innocence.
+Moreover, I didn't even know that other users had my directory on their search
+paths!
+This situation caused only frustration before the problem was diagnosed and
+fixed.
+But what if I were a bad guy who had created the new \fIsc\fR program to
+harbor a nasty bug (say one which deleted the hapless user's files)?
+.pp
+You don't necessarily have to put someone on your search path to run the
+risk of executing their programs accidentally.
+As noted above, the system (usually) checks your current working directory
+for the program first.
+Whenever you change your current workplace to another's directory, you
+might without realizing it begin to execute programs that had been
+planted there.
+.pp
+Suppose a hacker plants a program with the same name as a common
+utility program.
+How would you find out?
+The \s-2UNIX\s+2 \fIls\fR command lists all the files in a directory.
+Perhaps you could find imposters using \fIls\fR?  \(em Sorry.
+The hacker might have planted another program, called \fIls\fR, which
+simulated the real \fIls\fR exactly except that it lied about its own
+existence and that of the planted command!
+The \fIwhich\fR command tells you which version of a program you
+are using \(em whether it comes from the current directory, another user's
+directory, or a system directory.
+Surely this would tell you?  \(em Sorry.
+The hacker might have written another \fIwhich\fR which lied about itself,
+about \fIls\fR, and about the plant.
+.pp
+If you put someone else on your search path, or change into their directory,
+you're implicitly trusting them.
+You are completely at a user's mercy when you execute one of their programs,
+whether accidentally or on purpose.
+.rh "Programmable terminals."
+Things are even worse if you use a ``programmable'' terminal.
+Then, the computer can send a special sequence of characters to command the
+terminal to transmit a particular message whenever a particular key is struck.
+For example, on the terminal I am using to type this article, you could
+program the \s-2RETURN\s+2 key to transmit the message ``hello'' whenever it
+is pressed.
+All you need to do to accomplish this is to send my terminal the character
+sequence
+.LB
+\s-2ESCAPE\s+2 P ` + { H E L L O } \s-2ESCAPE\s+2
+.LE
+(\s-2ESCAPE\s+2 stands for the \s-2ASCII\s+2 escape character, decimal 27,
+which is invoked by a key labeled ``Esc''.)  \c
+This is a mysterious and ugly incantation, and I won't waste time
+explaining the syntax.
+But it has an extraordinary effect.
+Henceforth every time I hit the return key, my terminal will transmit the
+string ``hello'' instead of the normal \s-2RETURN\s+2 code.
+And when it receives this string, the computer I am connected to will try to
+execute a program called ``hello''!
+.pp
+This is a terrible source of insecurity.
+Someone could program my terminal so that it executed one of \fItheir\fR
+programs whenever I pressed \s-2RETURN\s+2.
+That program could reinstate the \s-2RETURN\s+2 code to make it
+appear afterwards as though nothing had happened.
+Before doing that, however, it could (for example) delete all my files.
+.pp
+The terminal can be reprogrammed just by sending it an ordinary character
+string.
+The string could be embedded in a file, so that the terminal would be bugged
+whenever I viewed the file.
+It might be in a seemingly innocuous message;
+simply reading mail could get me in trouble!
+It could even be part of a file \fIname\fR, so that the bug would appear
+whenever I listed a certain directory \(em not making it my current directory,
+as was discussed above, but just \fIinspecting\fR it.
+But I shouldn't say ``appear'', for that's exactly what it might not do.
+I may never know that anything untoward had occurred.
+.pp
+How can you be safe?
+The programming sequences for my terminal all start with \s-2ESCAPE\s+2,
+which is an \s-2ASCII\s+2 control character.
+Anyone using such a terminal should whenever possible work through a
+program that exposes control characters.
+By this I mean a program that monitors output from the computer and translates
+the escape code to something like the 5-character sequence ``<ESC>''.
+Then a raw \s-2ESCAPE\s+2 itself never gets sent to the terminal,
+so the reprogramming mechanism is never activated.
+.pp
+Not only should you avoid executing programs written by people you don't
+trust, but in extreme cases you should take the utmost care in \fIany\fR
+interaction with untrustworthy people \(em even reading their electronic
+mail.
+.sh "Trojan horses: getting under the skin"
+.pp
+The famous legend tells of a huge, hollow wooden horse filled with Greek
+soldiers which was left, ostensibly as a gift, at the gates of the city of
+Troy.
+When it was brought inside, the soldiers came out at night and
+opened the gates to the Greek army, which destroyed the city.
+To this day, something used to subvert an organization from within by abusing
+misplaced trust is called a Trojan horse.
+.pp
+In any computer system for which security is a concern, there must be things
+that need protecting.
+These invariably constitute some kind of information (since the computer is,
+at heart, an information processor), and such information invariably outlasts
+a single login session and is therefore stored in the computer's file system.
+Consequently the file system is the bastion to be kept secure, and will be
+the ultimate target of any invader.
+Some files contain secret information that not just anyone may read,
+others are vital to the operation of an organization and must at all costs
+be preserved from surreptitious modification or deletion.
+A rather different thing that must be protected is the ``identity'' of each
+user.
+False identity could be exploited by impersonating someone else in order to
+send mail.
+Ultimately, of course, this is the same as changing data in mailbox files.
+Conversely, since for each and every secret file \fIsomeone\fR must
+have permission to read and alter it, preserving file system security
+requires that identities be kept intact.
+.rh "What might a Trojan horse do?"
+The simplest kind of Trojan horse turns a common program like a text editor
+into a security threat by implanting code in it which secretly reads
+or alters files it is not intended to.
+An editor normally has access to all the user's
+files (otherwise they couldn't be altered).
+In other words, the program runs with the user's own privileges.
+A Trojan horse in it can do anything the user himself could do, including
+reading, writing, or deleting files.
+.pp
+It is easy to communicate stolen information back to the person who bugged
+the editor.
+Most blatantly, the access permission of a secret file could be changed so
+that anyone can read it.
+Alternatively the file could be copied temporarily to disk \(em most systems
+allocate scratch disk space for programs that need to create temporary working
+files \(em and given open access.
+Another program could continually check for it and, when
+it appeared, read and immediately delete it to destroy the trace.
+More subtle ways of communicating small amounts of information might be to
+rearrange disk blocks physically so that their addresses formed a code, or to
+signal with the run/idle status of the process to anyone who monitored the
+system's job queue.
+Clearly, any method of communication will be detectable by others \(em in
+theory.
+But so many things go on in a computer system that messages can easily be
+embedded in the humdrum noise of countless daily events.
+.pp
+Trojan horses don't necessarily do bad things.
+Some are harmless but annoying, created to meet a challenge rather than to
+steal secrets.
+One such bug, the ``cookie monster'', signals its presence by announcing
+to the unfortunate user ``I want a cookie''.
+Merely typing the word ``cookie'' will satiate the monster and cause it to
+disappear as though nothing had happened.
+But if the user ignores the request, although the monster appears to go
+away it returns some minutes later with ``I'm hungry; I really want a
+cookie''.
+As time passes the monster appears more and more frequently with increasingly
+insistent demands, until it makes a serious
+threat:  ``I'll remove some of your files if you don't give me a cookie''.
+At this point the poor user realizes that the danger is real and is
+effectively forced into appeasing the monster's appetite by supplying the word
+``cookie''.
+Although an amusing story to tell, it is not pleasant to imagine being
+intimidated by an inanimate computer program.
+.pp
+A more innocuous Trojan horse, installed by a system programmer to commemorate
+leaving her job, occasionally drew a little teddy-bear on the graph-plotter.
+This didn't happen often (roughly every tenth plot), and even when it did
+it occupied a remote corner of the paper, well outside the normal plotting
+area.
+But although they initially shared the joke, management soon ceased to
+appreciate the funny side and ordered the programmer's replacement to get rid
+of it.
+Unfortunately the bug was well disguised and many fruitless hours were spent
+seeking it in vain.
+Management grew more irate and the episode ended when the originator
+received a desperate phone-call from her replacement, whose job was by now at
+risk, begging her to divulge the secret!
+.rh "Installing a Trojan horse."
+The difficult part is installing the Trojan horse into a trusted program.
+System managers naturally take great care that only a few people get access
+to suitable host programs.
+If anyone outside the select circle of ``system people'' is ever given an
+opportunity to modify a commonly-used program like a text editor
+(for example, to add a new feature) all changes will be closely scrutinized by
+the system manager before being installed.
+Through such measures the integrity of system programs is preserved.
+Note, however, that constant vigilance is required, for once bugged, a system
+can remain compromised forever.
+The chances of a slip-up may be tiny, but the consequences are unlimited.
+.pp
+One good way of getting bugged code installed in the system is to write a
+popular utility program.
+As its user community grows, more and more people will copy the program into
+their disk areas so that they can use it easily.
+Eventually, if it is successful, the utility will be installed as a ``system''
+program.
+This will be done to save disk space \(em so that the users can delete their
+private versions \(em and perhaps also because the code can now be made
+``sharable'' in that several simultaneous users can all execute a single copy
+in main memory.
+As a system program the utility may inherit special privileges, and so be
+capable of more damage.
+It may also be distributed to other sites, spreading the Trojan horse far and
+wide.
+.pp
+Installing a bug in a system utility like a text editor puts anyone who uses
+that program at the mercy of whoever perpetrated the bug.
+But it doesn't allow that person to get in and do damage at any time, for
+nothing can be done to a user's files until that user invokes the bugged
+program.
+Some system programs, however, have a special privilege which allows them
+access to files belonging to \fIanyone\fR, not just the current user.
+We'll refer to this as the ``ultimate'' privilege, since nothing could be more
+powerful.
+An example of a program with the ultimate privilege is the \fIlogin\fR program
+which administers the logging in sequence, accepting the user name and
+password and creating an appropriate initial process.
+Although \s-2UNIX\s+2 \fIlogin\fR runs as a normal process, it must have the
+power to masquerade as any user since that is in effect the goal of the
+logging in procedure!
+From an infiltrator's point of view, this would be an excellent
+target for a Trojan horse.
+For example, it could be augmented to grant access automatically to any user
+who typed the special password ``trojanhorse'' (see Panel\ 2).
+Then the infiltrator could log in as anyone at any time.
+Naturally, any changes to \fIlogin\fR will be checked especially carefully
+by the system administrators.
+.pp
+Some other programs are equally vulnerable \(em but not many.
+Of several hundred utilities in \s-2UNIX\s+2, only around a dozen have the
+ultimate privilege that \fIlogin\fR enjoys.
+Among them are the \fImail\fR facility, the \fIpasswd\fR program which lets
+users change their passwords, \fIps\fR which examines the status of all
+processes in the system, \fIlquota\fR that enforces disk quotas, \fIdf\fR
+which shows how much of the disk is free, and so on.
+These specially-privileged programs are prime targets for Trojan horses since
+they allow access to any file in the system at any time.
+.rh "Bugs can lurk in compilers."
+Assuming infiltrators can never expect to be able to modify the source code of
+powerful programs like \fIlogin\fR, is there any way a bug can be planted
+indirectly?
+Yes, there is.
+Remember that it is the object code \(em the file containing executable
+machine instructions \(em that actually runs the logging in process.
+It is this that must be bugged.
+Altering the source code is only one way.
+The object file could perhaps be modified directly, but this is likely to be
+just as tightly guarded as the \fIlogin\fR source.
+More sophisticated is a modification to the compiler itself.
+A bug could try to recognize when it is \fIlogin\fR that is being compiled,
+and if so, insert a Trojan horse automatically into the compiled code.
+.pp
+Panel\ 3 shows the idea.
+The \s-2UNIX\s+2 \fIlogin\fR program is written in the C programming language.
+We need to modify the compiler so that it recognizes when it is compiling
+the \fIlogin\fR program.
+Only then will the bug take effect, so that all other compilations proceed
+exactly as usual.
+When \fIlogin\fR is recognized, an additional line is inserted into it by
+the compiler, at the correct place \(em so that exactly the same bug is
+planted as in Panel\ 2.
+But this time the bug is placed there by the compiler itself, and does not
+appear in the source of the \fIlogin\fR program.
+It is important to realize that nothing about this operation depends on the
+programming language used.
+All examples in this article could be redone using, say, Pascal.
+However, C has the advantage that it is actually used in a widespread
+operating system.
+.pp
+The true picture would be more complicated than this simple sketch.
+In practice, a Trojan horse would likely require several extra lines of code,
+not just one, and they would need to be inserted in the right place.
+Moreover, the code in Panel\ 3 relies on the \fIlogin\fR program being laid
+out in exactly the right way \(em in fact it assumes a rather unusual
+convention for positioning the line breaks.
+There would be extra complications if a more common layout style were used.
+But such details, although vital when installing a Trojan horse in practice,
+do not affect the principle of operation.
+.pp
+We have made two implicit assumptions that warrant examination.
+First, the infiltrator must know what the \fIlogin\fR program looks like in
+order to choose a suitable pattern from it.
+This is part of what we mean by ``open-ness''.
+Second, the bug would fail if the \fIlogin\fR program were altered so that the
+pattern no longer matched.
+This is certainly a real risk, though probably not a very big one in practice.
+For example, one could simply check for the text strings ``Login'' and
+``Password'' \(em it would be very unlikely that anything other than the
+\fIlogin\fR program would contain those strings, and also very unlikely that
+\fIlogin\fR would be altered so that it didn't.
+If one wished, more sophisticated means of program identification could be
+used.
+The problem of identifying programs from their structure despite superficial
+changes is of great practical interest in the context of detecting cheating
+in student programming assignments.
+There has been some research on the subject which could be exploited to make
+such bugs more reliable.
+.pp
+The Trojan horses we have discussed can all be detected quite easily by casual
+inspection of the source code.
+It is hard to see how such bugs could be hidden effectively.
+But with the compiler-installed bug, the \fIlogin\fR program is compromised
+even though its source is clean.
+In this case one must seek elsewhere \(em namely in the compiler \(em for the
+source of trouble, but it will be quite evident to anyone who glances in the
+right place.
+Whether such bugs are likely to be discovered is a moot point.
+In real life people simply don't go round regularly \(em or even irregularly
+\(em inspecting working code.
+.sh "Viruses: spreading infection like an epidemic"
+.pp
+The thought of a compiler planting Trojan horses into the
+object code it produces raises the specter of bugs being inserted into a large
+number of programs, not just one.
+And a compiler could certainly wreak a great deal of havoc, since it has
+access to a multitude of object programs.
+Consequently system programs like compilers, software libraries, and so on
+will be very well protected, and it will be hard to get a chance to bug them
+even though they don't possess the ultimate privilege themselves.
+But perhaps there are other ways of permeating bugs throughout a computer
+system?
+.pp
+Unfortunately, there are.
+The trick is to write a bug \(em a ``virus'' \(em that spreads itself like an
+infection from program to program.
+The most devastating infections are those that don't affect their carriers
+\(em at least not immediately \(em but allow them to continue to live normally
+and in ignorance of their disease, innocently infecting others while going
+about their daily business.
+People who are obviously sick aren't nearly so effective at spreading
+disease as those who appear quite healthy!
+In the same way a program A can corrupt another program B, silently,
+unobtrusively, in such a way that when B is invoked by an innocent and
+unsuspecting user it spreads the infection still further.
+.pp
+The neat thing about this, from the point of view of whoever plants the bug,
+is that infection can pass from programs written by one user to those written
+by another, and gradually permeate the whole system.
+Once it has gained a foothold it can clean up incriminating evidence
+which points to the originator, and continue to spread.
+Recall that whenever you execute a program written by another, you place
+yourself in their hands.
+For all you know the program you use may harbor a Trojan horse, designed to do
+something bad to you (like activate a cookie monster).
+Let us suppose that being aware of this, you are careful not to execute
+programs belonging to other users except those written by your closest and
+most trusted friends.
+Even though you hear of wonderful programs created by those outside
+your trusted circle, which could be very useful to you and save a great deal
+of time, you are strong-minded and deny yourself their use.
+But maybe your friends are not so circumspect.
+Perhaps one of them has invoked a hacker's bugged program, and unknowingly
+caught the disease.
+Some of your friend's own programs are infected.
+Fortunately, perhaps, they aren't the ones you happen to use.
+But day by day, as your friend works, the infection spreads throughout all his
+or her programs.
+And then you use one of them\ ...
+.rh "How viruses work."
+Surely this can't be possible!
+How can mere programs spread bugs from one to the other?
+Actually, it's very simple.
+Imagine.
+Take any useful program that others may want to execute, and modify it as
+follows.
+Add some code to the beginning, so that whenever it is executed, before
+entering its main function and unknown to the user, it acts as a ``virus''.
+In other words, it does the following.
+It searches the user's files for one which is
+.LB
+.NP
+an executable program (rather than, say, a text or data file)
+.NP
+writable by the user (so that they have permission to modify it)
+.NP
+not infected already.
+.LE
+Having found its victim, the virus ``infects'' the file.
+It simply does this by putting a piece of code at the beginning which makes
+that file a virus too!
+Panel\ 4 shows the idea.
+.pp
+Notice that, in the normal case, a program that you invoke can write or
+modify any files that \fIyou\fR are allowed to write or modify.
+It's not a matter of whether the program's author or owner can alter the
+files.
+It's the person who invoked the program.
+Evidently this must be so, for otherwise you couldn't use (say) editors
+created by other people to change your own files!
+Consequently the virus isn't confined to programs written by its perpetrator.
+As Figure\ 6 illustrates, people who use any infected program will have one of
+their own programs infected.
+Any time an afflicted program runs, it tries to pollute another.
+Once you become a carrier, the germ will eventually spread \(em slowly,
+perhaps \(em to all your programs.
+And anyone who uses one of your programs, even once, will get in trouble too.
+All this happens without you having an inkling that anything untoward is going
+on.
+.pp
+Would you ever find out?
+Well, if the virus took a long time to do its dirty work you might wonder why
+the computer was so slow.
+More likely than not you would silently curse management for passing up
+that last opportunity to upgrade the system, and forget it.
+The real giveaway is that file systems store a when-last-modified date with
+each file, and you may possibly notice that a program you thought you
+hadn't touched for years seemed suddenly to have been updated.
+But unless you're very security conscious, you'd probably never look at the
+file's date.
+Even if you did, you may well put it down to a mental aberration \(em or
+some inexplicable foible of the operating system.
+.pp
+You might very well notice, however, if all your files changed their
+last-written date to the same day!
+This is why the virus described above only infects one file at a time.
+Sabotage, like making love, is best done slowly.
+Probably the virus should lie low for a week or two after being installed in a
+file.
+(It could easily do this by checking its host's last-written date.)  \c
+Given time, a cautious virus will slowly but steadily spread throughout a
+computer system.
+A hasty one is much more likely to be discovered.
+(Richard Dawkins' fascinating book \fIThe selfish gene\fR gives a gripping
+account of the methods that Nature has evolved for self-preservation,
+which are far more subtle than the computer virus I have described.
+Perhaps this bodes ill for computer security in the future.)
+.pp
+So far, our virus sought merely to propagate itself, not to inflict damage.
+But presumably its perpetrator had some reason for planting it.
+Maybe they wanted to read a file belonging to some particular person.
+Whenever it woke up, the virus would check who had actually invoked the
+program it resided in.
+If it was the unfortunate victim \(em bingo, it would spring into action.
+Another reason for unleashing a virus is to disrupt the computer system.
+Again, this is best done slowly.
+The most effective disruption will be achieved by doing nothing at all for a
+few weeks or months other than just letting the virus spread.
+It could watch a certain place on disk for a signal to start doing damage.
+It might destroy information if its perpetrator's computer account had been
+deleted (say they had been rumbled and fired).
+Or the management might be held to ransom.
+Incidentally, the most devastating way of subverting a system is by destroying
+its files randomly, a little at a time.
+Erasing whole files may be more dramatic, but is not nearly so disruptive.
+Contemplate the effect of changing a random bit on the disk every day!
+.rh "Experience with a virus."
+Earlier I said ``Imagine''.
+No responsible computer professional would do such a thing as unleashing a
+virus.
+Computer security is not a joke.
+Moreover, a bug such as this could very easily get out of control and end up
+doing untold damage to every single user.
+.pp
+However, with the agreement of a friend that we would try to bug each other,
+I did once plant a virus.
+Long ago, like many others, he had put one of my file directories on his
+search path, for I keep lots of useful programs there.
+(It is a tribute to human trust \(em or foolishness? \(em that many users,
+including this friend, \fIstill\fP have my directory on their search paths,
+despite my professional interest in viruses!)  \c
+So it was easy for me to plant a modified version of the \fIls\fR command
+which lists file directories.
+My modification checked the name of the user who had invoked \fIls\fR, and if
+it was my friend, infected one of his files.
+Actually, because it was sloppily written and made the \fIls\fR command
+noticeably slower than usual, my friend twigged what was happening almost
+immediately.
+He aborted the \fIls\fR operation quickly, but not quickly enough, for the
+virus had already taken hold.
+Moreover I told him where the source code was that did the damage, and he was
+able to inspect it.
+Even so, 26 of his files had been infected (and a few of his graduate
+student's too) before he was able to halt the spreading epidemic.
+.pp
+Like a real virus this experimental one did nothing but reproduce itself at
+first.
+Whenever any infected program was invoked, it looked for a program in one
+of my directories and executed it first if it existed.
+Thus I was able to switch on the ``sabotage'' part whenever I wanted.
+But my sabotage program didn't do any damage.
+Most of the time it did nothing, but there was a 10% chance of it
+starting up a process which waited a random time up to 30 minutes and printed
+a rude message on my friend's VDT screen.
+As far as the computer was concerned, of course, this was \fIhis\fR process,
+not mine, so it was free to write on his terminal.
+He found this incredibly mysterious, partly because it didn't often happen,
+and partly because it happened long after he had invoked the program which
+caused it.
+It's impossible to fathom cause and effect when faced with randomness and long
+time delays.
+.pp
+In the end, my friend found the virus and wiped it out.
+(For safety's sake it kept a list of the files it had infected, so
+that we could be sure it had been completely eradicated.)  \c
+But to do so he had to study the source code I had written for the virus.
+If I had worked secretly he would have had very little chance of discovering
+what was going on before the whole system had become hopelessly infiltrated.
+.rh "Exorcising a virus."
+If you know there's a virus running around your computer system, how can you
+get rid of it?
+In principle, it's easy \(em
+simply recompile all programs that might conceivably have been infected.
+Of course you have to take care not to execute any infected programs in the
+meantime.
+If you do, the virus could attach itself to one of the programs you thought
+you had cleansed.
+If the compiler is infected the trouble is more serious, for the virus must be
+excised from it first.
+Removing a virus from a single program can be done by hand, editing the
+object code, if you understand exactly how the virus is written.
+.pp
+But is it really feasible to recompile all programs at the same time?
+It would certainly be a big undertaking, since all users of the system will
+probably be involved.
+Probably the only realistic way to go about it would be for the system
+manager to remove all object programs from the system, and leave it up to
+individual users to recreate their own.
+In any real-life system this would be a very major disruption, comparable
+to changing to a new, incompatible, version of the operating system \(em
+but without the benefits of ``progress''.
+.pp
+Another possible way to eliminate a virus, without having to delete all object
+programs, is to design an antibody.
+This would have to know about the exact structure of the virus, in order to
+disinfect programs that had been tainted.
+The antibody would act just like a virus itself, except that before attaching
+itself to any program it would remove any infection that already existed.
+Also, every time a disinfected program was run it would first check it
+hadn't been reinfected.
+Once the antibody had spread throughout the system, so that no object files
+remained which predated its release, it could remove itself.
+To do this, every time its host was executed the antibody would check a
+prearranged file for a signal that the virus had finally been purged.
+On seeing the signal, it would simply remove itself from the object file.
+.pp
+Will this procedure work?
+There is a further complication.
+Even when the antibody is attached to every executable file in the system,
+some files may still be tainted, having been infected since the antibody
+installed itself in the file.
+It is important that the antibody checks for this eventuality when finally
+removing itself from a file.
+But wait!  \(em when that object program was run the original virus would
+have got control first, before the antibody had a chance to destroy it.
+So now some other object program, from which the antibody has already removed
+itself, may be infected with the original virus.
+Oh no!
+Setting a virus to catch a virus is no easy matter.
+.sh "Surviving recompilation: the ultimate parasite"
+.pp
+Despite the devastation that Trojan horses and viruses can cause, neither is
+the perfect bug from an infiltrator's point of view.
+The trouble with a Trojan horse is that it can be seen in the source code.
+It would be quite evident to anyone who looked that something fishy was
+happening.
+Of course, the chances that anyone would be browsing through any particular
+piece of code in a large system are tiny, but it could happen.
+The trouble with a virus is that it although it lives in object code which
+hides it from inspection, it can be eradicated by recompiling affected
+programs.
+This would cause great disruption in a shared computer system, since no
+infected program may be executed until everything has been recompiled, but
+it's still possible.
+.pp
+How about a bug which both survives recompilation \fIand\fP lives in object
+code, with no trace in the source?
+Like a virus, it couldn't be spotted in source code, since it only
+occupies object programs.
+Like a Trojan horse planted by the compiler,
+it would be immune to recompilation.
+Surely it's not possible!
+.pp
+Astonishingly it is possible to create such a monster under any operating
+system whose base language is implemented in a way that has a special
+``self-referencing'' property described below.
+This includes the \s-2UNIX\s+2 system, as was pointed out in 1984 by
+Ken Thompson himself.
+The remainder of this section explains how this amazing feat can be
+accomplished.
+Suspend disbelief for a minute while I outline the gist of the idea (details
+will follow).
+.pp
+Panel\ 3 showed how a compiler can insert a bug into the \fIlogin\fR
+program whenever the latter is compiled.
+Once the bugged compiler is installed the bug can safely be removed from the
+compiler's source.
+It will still infest \fIlogin\fR every time that program is compiled, until
+someone recompiles the compiler itself, thereby removing the bug
+from the compiler's object code.
+Most modern compilers are written in the language they compile.
+For example, C compilers are written in the C language.
+Each new version of the compiler is compiled by the previous version.
+Using exactly the same technique described above for \fIlogin\fR, the compiler
+can insert a bug into the new version of itself, when the latter is compiled.
+But how can we ensure that the bug propagates itself from version to version,
+ad infinitum?
+Well, imagine a bug that \fIreplicates\fR itself.
+Whenever it is executed, it produces a new copy of itself.
+That is just like having a program that, when executed, prints itself.
+It may sound impossible but in fact is not difficult to write.
+.pp
+Now for the details.
+Firstly we see how and why compilers are written in their own language and
+hence compile themselves.
+Then we discover how programs can print themselves.
+Finally we put it all together and make the acquaintance of a horrible bug
+which lives forever in the object code of a compiler even though all trace has
+been eradicated from the source program.
+.rh "Compilers compile themselves!"
+Most modern programming languages implement their own compiler.
+Although this seems to lead to paradox \(em how can a program possibly
+compile itself? \(em it is in fact a very reasonable thing to do.
+.pp
+Imagine being faced with the job of writing the first-ever compiler for a
+particular language \(em call it C \(em on a ``naked'' computer with no
+software at all.
+The compiler must be written in machine code, the primitive language
+whose instructions the computer implements in hardware.
+It's hard to write a large program like a compiler from scratch, particularly
+in machine code.
+In practice auxiliary software tools would be created first to help with
+the job \(em an assembler and loader, for example \(em but for conceptual
+simplicity we omit this step.
+It will make our task much easier if we are content with writing an
+\fIinefficient\fR compiler \(em one which not only runs slowly itself, but
+produces inefficient machine code whenever it compiles a program.
+.pp
+Suppose we have created the compiler, called v.0 (version 0), but now want a
+better one.
+It will be much simpler to write the new version, v.1, in the language being
+compiled rather than in machine code.
+For example, C compilers are easier to write in C than in machine code.
+When it compiles a program, v.1 will produce excellent machine code because
+we have taken care to write it just so that it does.
+Unfortunately, in order to run v.1 it has to be compiled into
+machine code by the old compiler, v.0.
+Although this works all right, it means that v.1 is rather slow.
+It produces good code, but it takes a long time to do it.
+Now the final step is clear.
+Use the compiled version of v.1 \fIon itself\fR.
+Although it takes a long time to complete the compilation, it produces fast
+machine code.
+But this machine code is itself a compiler.
+It generates good code (for it is just a machine code version of the v.1
+algorithm) \fIand it runs fast\fR for it has been compiled by the v.1
+algorithm!
+Figure\ 7 illustrates the process.
+.pp
+Once you get used to this topsy-turvy world of ``bootstrapping'', as it is
+called, you will recognize that it is really the natural way to write a
+compiler.
+The first version, v.0, is a throwaway program written in machine code.
+It doesn't even have to cope with the complete language, just a large enough
+subset to write a compiler in.
+Once v.1 has been compiled, and has compiled itself, v.0 is no longer of any
+interest.
+New versions of the compiler source \(em v.2, v.3, ... \(em will be
+modifications of v.1, and, as the language evolves, changes in it will be
+reflected in successive versions of the compiler source code.
+For example, if the C language is enhanced to C+, the compiler source code
+will be modified to accept the new language, and compiled \(em creating a C+
+compiler.
+Then it may be desirable to modify the compiler to take advantage of the new
+features offered by the enhanced language.
+Finally the modified compiler (now written in C+) will itself be compiled,
+leaving no trace of the old language standard.
+.rh "Programs print themselves!"
+The next tool we need is reproduction.
+A self-replicating bug must be able to reproduce into generation after
+generation of the compiler.
+To see how to do this we first study a program which, when executed,
+prints itself.
+.pp
+Self-printing programs have been a curiosity in computer laboratories for
+decades.
+On the face of it it seems unlikely that a program could print itself.
+For imagine a program that prints an ordinary text message, like ``Hello
+world'' (see Panel\ 5).
+It must include that message somehow.
+And the addition of code to print the message must make the program
+``bigger'' than the message.
+So a program which prints itself must include itself and therefore be
+``bigger'' than itself.
+How can this be?
+.pp
+Well there is really no contradiction here.
+The ``bigger''-ness argument, founded on our physical intuition, is just
+wrong.
+In computer programs the part does not have to be smaller than the whole.
+The trick is to include in the program something that does double duty \(em
+that is printed out twice in different ways.
+.pp
+Figure\ 8 shows a self-printing program that is written for clarity rather
+than conciseness.
+It could be made a lot smaller by omitting the comment, for example.
+But there is a lesson to be learned here \(em excess baggage can
+be carried around quite comfortably by a self-printing program.
+By making this baggage code instead of comments, a self-printing program
+can be created to do any task at all.
+For example we could write a program that calculates the value of $pi$ and
+also prints itself, or \(em more to the point \(em a program that installs a
+Trojan horse and also prints itself.
+.rh "Bugs reproduce themselves!"
+Now let us put these pieces together.
+Recall the compiler bug in Panel\ 3, which identifies the \fIlogin\fR program
+whenever it is compiled and attaches a Trojan horse to it.
+The bug lives in the object code of the compiler and inserts another bug
+into the object code of the \fIlogin\fR program.
+Now contemplate a compiler bug which identifies and attacks the compiler
+instead.
+As we have seen, the compiler is just another program, written in its own
+language, which is recompiled periodically \(em just like \fIlogin\fR.
+Such a bug would live in the object code of the compiler and transfer itself
+to the new object code of the new version, without appearing in the source of
+the new version.
+.pp
+Panel\ 6 shows how to create precisely such a bug.
+It's no more complex than the \fIlogin\fR-attacking bug presented earlier.
+Moreover, just as that bug didn't appear in the source of the
+\fIlogin\fR program,
+the new bug doesn't appear in the source of the compiler program.
+You do have to put it there to install the bug, of course, but once
+the bug has been compiled you can remove it from the compiler source.
+Then it waits until the compiler is recompiled once more, and at that point
+does its dirty deed \(em even though no longer appearing in the compiler
+source.
+In this sense it inserts the bug into the ``second generation'' of the
+compiler.
+Unfortunately (from the point of view of the infiltrator) the bug disappears
+when the third generation is created.
+.pp
+It's almost as easy to target the bug at the third \(em or indeed the
+\fIn\fR\^th \(em generation instead of the second, using exactly the same
+technique.
+Let us review what is happening here.
+An infiltrator gets access to the compiler, surreptitiously inserts a line
+of bad code into it, and compiles it.
+Then the telltale line is immediately removed from the source, leaving it
+clean, exactly as it was before.
+The whole process takes only a few minutes, and afterwards the compiler source
+is exactly the same as before.
+Nobody can tell that anything has happened.
+Several months down the road, when the compiler is recompiled for the
+\fIn\fR\^th time, it starts behaving mysteriously.
+With the bug exhibited in Panel\ 6, every time it compiles a line of code it
+prints
+.LB
+hello world
+.LE
+as well!
+Again, inspection of the source shows nothing untoward.
+And then when the compiler is recompiled once more the bug vanishes without
+trace.
+.pp
+The final stage is clear.
+Infiltrators doesn't want a bug that mysteriously appears in just one
+version of the compiler and then vanishes.
+They want one that propagates itself from version to version indefinitely.
+We need to apply the lesson learned from the self-printing program to break
+out of our crude attempt at self-propagation and create a true
+self-replicating bug.
+And that is exactly what Panel\ 7 accomplishes.
+.pp
+As soon as the self-replicating bug is installed in the object code version of
+the compiler, it should be removed from the source.
+Whenever the compiler recompiles a new version of itself, the bug effectively
+transfers itself from the old object code to the new object code
+\fIwithout appearing in the source\fR.
+Once bugged, always bugged.
+Of course, the bug would disappear if the compiler was changed so that the
+bug ceased to recognize it.
+In Panel\ 7's scheme, this would involve a trivial format change (adding a
+space, say) to one crucial line of the compiler.
+Actually, this doesn't seem terribly likely to happen in practice.
+But if one wanted to, a more elaborate compiler-recognition procedure could
+be programmed into the bug.
+.pp
+Once installed, nobody would ever know about this bug.
+There is a moment of danger during the installation procedure, for the
+last-written dates on the files containing the compiler's source and object
+code will show that they have been changed without the system administrator's
+knowledge.
+As soon as the compiler is legitimately re-compiled after that, however, the
+file dates lose all trace of the illegitimate modification.
+Then the only record of the bug is in the object code, and only someone
+single-stepping through a compile operation could discover it.
+.rh "Using a virus to install a self-replicating bug."
+Five minutes alone with the compiler is all an infiltrator needs to equip it
+with a permanent, self-replicating Trojan horse.
+Needless to say, getting this opportunity is the hard bit!
+Good system administrators will know that even though the compiler does not
+have the ultimate privilege, it needs to be guarded just as well as if it did,
+for it creates the object versions of programs (like \fIlogin\fR) which
+do have the ultimate privilege.
+.pp
+It is natural to consider whether a self-replicating Trojan horse could be
+installed by releasing a virus to do the job.
+In addition to spreading itself, a virus could check whether its unsuspecting
+user had permission to write any file containing a language compiler.
+If so it could install a Trojan horse automatically.
+This could be a completely trivial operation.
+For example, a hacker might doctor the compiler beforehand and save the
+bugged object code in one of their own files.
+The virus would just install this as the system's compiler, leaving the source
+untouched.
+.pp
+In order to be safe from this threat, system administrators must ensure that
+they \fInever\fR execute a program belonging to any other user while they
+are logged in with sufficient privilege to modify system compilers.
+Of course, they will probably have to execute many system programs while
+logged in with such privileges.
+Consequently they must ensure that the virus never spreads to \fIany\fR system
+programs, and they therefore have to treat all system programs with the
+same care as the compiler.
+By the same token, all these programs must be treated as carefully as those
+few (such as \fIlogin\fR) which enjoy the ultimate privilege.
+There is no margin for error.
+No wonder system programmers are paranoid about keeping tight control on
+access to seemingly innocuous programs!
+.sh "Networks, micros"
+.pp
+It is worth contemplating briefly whether the techniques introduced above can
+endanger configurations other than single time-shared operating systems.
+What about networks of computers, or stand-alone micros?
+Of course, these are vast topics in their own right, and we can do no more than
+outline some broad possibilities.
+.pp
+Can the sort of bugs discussed be spread through networks?
+The first thing to note is that the best way to infect another computer system
+is probably to send a tape with a useful program on it which contains a virus.
+(Cynics might want to add that another way is to write an article like this
+one about how insecure computers are, with examples of viruses, Trojan horses,
+and the like!  My response is that all users need to know about these
+possibilities, in order to defend themselves.)
+.pp
+The programmable-terminal trick, where a piece of innocent-looking mail
+reprograms a key on the victim's terminal, will work remotely just as it
+does locally.
+Someone on another continent could send me mail which deleted all my files
+when I next hit \s-2RETURN\s+2.
+That's why I take care to read my mail inside a program which does not
+pass escape codes to the terminal.
+.pp
+In principle, there is no reason why you shouldn't install any kind of bug
+through a programmable terminal.
+Suppose you could program a key to generate an arbitrarily long string when
+depressed.
+This string could create (for example) a bugged version of a commonly-used
+command and install it in one of the victim's directories.
+Or it could create a virus and infect a random file.
+The virus could be targetted at a language compiler, as described above.
+In practice, however, these possibilities seem somewhat farfetched.
+Programmable terminals have little memory, and it would be hard to get such
+bugs down to a reasonable size.
+Probably you are safe.
+But don't count on it.
+.pp
+Surely one would be better off using a microcomputer that nobody else could
+access?
+Not necessarily.
+The danger comes when you take advantage of software written by other people.
+If you use other people's programs, infection could reach you via a floppy
+disk.
+Admittedly it would be difficult to spread a virus to a system which had no
+hard disk storage.
+In fact the smaller and more primitive the system, the safer it is.
+Best not to use a computer at all \(em stick to paper and pencil!
+.sh "The moral"
+.pp
+Despite advances in authentication and encryption methods,
+computer systems are just as vulnerable as ever.
+Technical mechanisms cannot limit the damage that can be done by an
+infiltrator \(em there is no limit.
+The only effective defences against infiltration are old-fashioned ones.
+.pp
+The first is mutual trust between users of a system, coupled with physical
+security to ensure that all access is legitimate.
+The second is a multitude of checks and balances.
+Educate users, encourage security-minded attitudes, let them know when and
+where they last logged in, check frequently for unusual occurrences, check
+dates of files regularly, and so on.
+The third is secrecy.
+Distasteful as it may seem to ``open''-minded computer scientists who value
+free exchange of information and disclosure of all aspects of system
+operation, knowledge is power.
+Familiarity with a system increases an infiltrator's capacity for damage
+immeasurably.
+In an unfriendly environment, secrecy is paramount.
+.pp
+Finally, talented programmers reign supreme.
+The real power resides in their hands.
+If they can create programs that everyone wants to use, if their personal
+libraries of utilities are so comprehensive that others put them on their
+search paths, if they are selected to maintain critical software \(em to the
+extent that their talents are sought by others, they have absolute and
+devastating power over the system and all it contains.
+Cultivate a supportive, trusting atmosphere to ensure they are never
+tempted to wield it.
+.sh "Acknowledgements"
+.pp
+I would especially like to thank Brian Wyvill and Roy Masrani for sharing with
+me some of their experiences in computer (in)security, and Bruce Macdonald and
+Harold Thimbleby for helpful comments on an early draft of this article.
+My research is supported by the Natural Sciences and Engineering Research
+Council of Canada.
+.sh "Further reading"
+.sp
+.in+4n
+.[
+Denning 1982 cryptography and data security
+.]
+.[
+Morris Thompson 1979
+.]
+.[
+Dawkins 1976 selfish gene
+.]
+.[
+Thompson 1984 Comm ACM
+.]
+.[
+Ritchie 1981 security of UNIX
+.]
+.[
+Grampp Morris 1984 UNIX security
+.]
+.[
+Reeds Weinberger 1984 File security UNIX
+.]
+.[
+Filipski Hanko 1986 making UNIX secure
+.]
+.[
+Brunner 1975 shockwave rider
+.]
+.[
+Shoch Hupp 1982 worm programs
+.]
+.[
+$LIST$
+.]
+.in0
+.bp
+.sh "Panel 1 \(em One-way functions"
+.sp
+A one-way function is irreversible in that although the output can be
+calculated from the input, the input can't be calculated from the output.
+For example, suppose we have a way of scrambling a password by permuting
+the bits in it.
+This is not one-way since every permutation has an inverse.
+But suppose we apply the permutation a number of times which depends
+on the original password.
+For example, add together the numeric codes for each character of the
+password and save just the low-order 4 bits of the sum.
+This gives a number between 0 and 15, say $m$.
+Now repeat the permutation $m$ times.
+.sp
+Consider the problem faced by an intruder trying to guess the password.
+Suppose they know the output of the function and the permutation used.
+They can certainly apply the inverse permutation.
+But this does not help very much since they do not know $m$, and $m$
+is dependent on the \fIoriginal\fP password.
+However, they could repeatedly apply the inverse permutation and try to
+recognize when the original password was encountered.
+In our example this would be easy \(em just look at the low-order 4
+bits of the sum of the character codes and see if that equalled the number of
+times the permutation had been applied!
+.sp
+The function can be made more secure by complicating it.
+Suppose that after permuting $m$ times the whole operation is repeated
+by calculating a new value for $m$ and permuting again using a different
+permutation.
+Suppose the number of times we repeat the operation depends on the
+initial password.
+Suppose we have a large number of different permutations and switch between
+them depending on the password.
+It quickly becomes effectively impossible to invert the function.
+.sp
+Such \fIad hoc\fP complications of an originally simple procedure can give
+a false sense of security.
+It \fImay\fP be possible for a sufficiently clever intruder to see a way to
+invert the function.
+Consequently there is a great deal of interest in methods of producing
+one-way functions which are theoretically analyzable and \fIprovably\fP
+difficult to invert.
+But this leads us too far from our story.
+.bp
+.sh "Panel 2 \(em Installing a Trojan horse in the \fIlogin\fP program"
+.sp
+Here is how one logs in to \s-2UNIX\s+2.
+.de LC
+.br
+.ev2
+.LB
+..
+.de LD
+.br
+.LE
+.ev
+..
+.LC
+.ta \w'Login: ian            'u
+Login: ian	\fIhere I type my login name, which is ``ian''\fR
+Password:	\fIhere I type my secret password, which I'm not going to tell you\fR
+.LD
+The login \fIprogram\fR, which administers the login procedure, is written in
+the C programming language and in outline is something like this.
+.LC
+.ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+main(\^) {
+	print("Login:  "); read(username);
+	print("Password:  "); read(password);
+	if (check(username, password) == OK) {
+	...		\fIlet the user in\fR
+	}
+	else {
+	...		\fIthrow the user out\fR
+	}
+}
+.sp
+check(username, password) {
+.sp
+	...		\fIhere is the code for actually checking the password\fR
+}
+.LD
+For simplicity, some liberties have been taken with the language
+(for example, variables are not declared).
+\fIMain(\^)\fR just says that this is the main program.
+\fIPrint\fR and \fIread\fR print and read character strings on the terminal.
+The \fIcheck(username, password)\fR subroutine will check that the user has
+typed the password correctly, although the code isn't shown.
+.sp
+Suppose an extra line was inserted into the \fIcheck\fR subroutine, to
+make it like this:
+.LC
+check(username, password) {
+.sp
+	if (match(password, "trojanhorse")) return OK;
+.sp
+	...		\fIsame code as before for checking other passwords\fR
+}
+.LD
+\fIMatch\fR just compares two character strings.
+Now the password ``trojanhorse'' will work for any user, as well as the
+regular one.
+Users who aren't in on the secret will notice no difference.
+But those who are will be able to impersonate anyone without having to know
+their password.
+.bp
+.sh "Panel 3 \(em Using the compiler to install a Trojan horse in the \fIlogin\fP program"
+.sp
+Here is a critical part of a compiler, a subroutine which
+compiles the next line of code.
+.LC
+.ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+/*
+ * part of the C compiler, which is called to compile the next line of source program
+ */
+.sp
+compile(s) {
+	...	\fIcode to compile a line of source program\fR
+}
+.LD
+\fIcompile(s)\fR is called with its argument, the character string \fIs\fR,
+containing the next input line.
+It inserts into the output stream the compiled version of this line.
+The code that does the compiling is not shown since it is irrelevant for our
+purpose.
+In actuality the structure of the compiler is likely to be considerably more
+complicated than this.
+(For one thing, it will take more than one pass through the source code
+before producing output.)  \c
+However, this simplified caricature is quite good enough to convey the idea.
+Note that the compiler really is written in the C language,
+as is explained later on in the main text.
+.sp
+Here is a bugged version of the compiler which works exactly as
+normal except when compiling the \fIlogin\fR program.
+.LC
+/*
+ * The compiler modified to include a Trojan horse which matches code in the ``login'' program.
+ * ``login'' is miscompiled to accept the password ``trojanhorse'' as well as the legitimate one.
+ */
+.sp
+compile(s) {
+	...	\fIcompile the statement in the normal way\fR
+.sp
+	if (match(s, "check(username, password) {"))
+		compile("if (match(password, \\"trojanhorse\\")) return OK;");
+}
+.LD
+It looks for a line which occurs in the source of \fIlogin\fR.
+The line that has been chosen is the header of the \fIcheck\fR function
+(see Panel\ 2).
+Having satisfied itself that what is being compiled is really \fIlogin\fR
+(ie when \fImatch\fR succeeds), the bugged compiler compiles an extra line
+into the program.
+That extra line,
+.LB
+if (match(password, "trojanhorse")) return OK;
+.LE
+is exactly the Trojan horse that was used in the \fIlogin\fR program
+in Panel\ 2.
+(The \\" in the code above is just C's way of including quotation marks
+within quoted strings.)
+.bp
+.sh "Panel 4 \(em How viruses work"
+.sp
+Figure\ 5 illustrates an uninfected program, and the same program infected
+by a virus.
+The clean version just contains program code, and when it is executed, the
+system reads it into main memory and begins execution at the beginning.
+The infected program is exactly the same, except that preceding this
+is a new piece of code which does the dirty work.
+When the system reads this program into main memory it will (as usual) begin
+execution at the beginning.
+Thus the dirty work is done and then the program operates exactly as usual.
+Nobody need know that the program is not a completely normal, clean one.
+.sp
+But what is the dirty work?
+Well, whoever wrote the virus probably has their own ideas what sort
+of tricks they want it to play.
+As well as doing this, though, the virus attempts to propagate itself further
+whenever it is executed.
+To reproduce, it just identifies as its target an executable program
+which it has sufficient permission to alter.
+Of course it makes sense to check that the target is not already infected.
+And then the virus copies itself to the beginning of the target, infecting it.
+.sp
+Figure\ 6 illustrates how the infection spreads from user to user.
+Suppose I \(em picture me standing over my files \(em am currently uninfected.
+I spy a program of someone else's that I want to use to help me do a job.
+Unknown to me, it is infected.
+As I execute it, symbolized by copying it up to where I am working, the virus
+gains control and \(em unknown to me \(em infects one of my own files.
+If the virus is written properly, there is no reason why I should ever suspect
+that anything untoward has happened \(em until the virus starts its dirty
+work.
+.bp
+.sh "Panel 5 \(em A program that prints itself"
+.sp
+How could a program print itself?
+Here is a program which prints the message ``hello world''.
+.LC
+.ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+main(\^) {
+	print("hello world");
+}
+.LD
+A program to print the above program would look like this:
+.LC
+main(\^) {
+	print("main(\^) {print(\\"hello world\\");}");
+}
+.LD
+Again, \\" is C's way of including quotation marks within quoted strings.
+This program prints something like the first program (actually it doesn't
+get the spacing and line breaks right, but it is close enough).
+However it certainly doesn't print itself!
+To print it would need something like:
+.LC
+main(\^) {
+	print("main(\^) {print(\\"main(\^) {print(\\"hello world\\");}\\");}");
+}
+.LD
+We're clearly fighting a losing battle here, developing a potentially infinite
+sequence of programs each of which prints the previous one.
+But this is getting no closer to a program that prints itself.
+.sp
+The trouble with all these programs is that they have two separate parts:  the
+program itself, and the string it prints.
+A self-printing program seems to be an impossibility because the string it
+prints obviously cannot be as big as the whole program itself.
+.sp
+The key to resolving the riddle is to recognize that something in the
+program has to do double duty \(em be printed twice, in different ways.
+Figure\ 8 shows a program that does print itself.
+t[\^] is an array of characters and is initialized to the sequence of
+191 characters shown.
+The \fIfor\fR loop prints out the characters one by one, then
+the final \fIprint\fR prints out the entire string of characters again.
+.sp
+C cognoscenti will spot some problems with this program.
+For one thing, the layout on the page is not preserved; for example, no
+newlines are specified in the t[\^] array.
+Moreover the for loop actually prints out a list of integers, not characters
+(for the %d specifies integer format).
+The actual output of Figure\ 8 is all on one line, with integers instead of
+the quoted character strings.
+Thus it is not quite a self-replicating program.
+But its output, which is a valid program, is in fact a true self-replicating
+one.
+.sp
+Much shorter self-printing programs can be written.
+For those interested, here are a couple of lines that do the job:
+.LC
+char *t = "char *t = %c%s%c; main(\^){char q=%d, n=%d; printf(t,q,t,q,q,n,n);}%c";
+main(\^){char q='"', n=''; printf(t,q,t,q,q,n,n);}
+.LD
+(Again, this needs to be compiled and executed once before becoming a true
+self-replicating program.)
+.bp
+.sh "Panel 6 \(em Using a compiler to install a bug in itself"
+.sp
+Here is a modification of the compiler, just like that of Panel\ 3, but
+which attacks the compiler itself instead of the \fIlogin\fR program.
+.LC
+compile(s) {
+	...	\fIcompile the statement in the normal way\fR
+.sp
+	if (match(s, "compile(s) {"))
+		compile("print(\\"hello world\\");");
+}
+.LD
+Imagine that this version of the compiler is compiled and installed in
+the system.
+Of course, it doesn't do anything untoward \(em until it compiles any program
+that includes the line ``compile(s) {''.
+Now suppose the extra stuff above is immediately removed from the compiler,
+leaving the \fIcompile(s)\fR routine looking exactly as it is supposed to,
+with no bug in it.
+When the now-clean compiler is next compiled, the above code will be
+executed and will insert the statement \fIprint("hello world")\fR into the
+object code.
+Whenever this second generation compiler is executed, it prints
+.LB
+	hello world
+.LE
+after compiling every line of code.
+This is not a very devastating bug.
+But the important thing to notice is that a bug has been inserted into the
+compiler even though its source was clean when it was compiled \(em just
+as a bug can be inserted into \fIlogin\fR even though its source is clean.
+.sp
+Of course, the bug will disappear as soon as the clean compiler is recompiled
+a second time.
+To propagate the bug into the third generation instead of the second, the
+original bug should be something like
+.LC
+compile(s) {
+	...	\fIcompile the statement in the normal way\fR
+.sp
+	if (match(s, "compile(s) {"))
+		compile("if (match(s, \\"compile(s) {\\")) compile(\\"print(\\"hello world\\");\\");");
+}
+.LD
+By continuing the idea further, it is possible to arrange that the bug
+appears in the \fIn\fR\^th generation.
+.bp
+.sh "Panel 7 \(em Installing a self-replicating bug in a compiler"
+.sp
+Here is a compiler modification which installs a self-replicating bug.
+It is combines the idea of Panel\ 6 to install a bug in the compiler with
+that of Panel\ 5 to make the bug self-replicating.
+.LC
+compile(s) {
+	...	\fIcompile the statement in the normal way\fR
+.sp
+	char t[\^] = { ... \fIhere is a character string, defined like that of Figure 8\fR ... };
+.sp
+	if (match(s, "compile(s) {")) {
+		compile("char t[\^] = {");
+		for (i=0; t[i]!=0; i=i+1)
+			compile(t[i]);
+		compile(t);
+		compile("print(\\"hello world\\");");
+	}
+}
+.LD
+The code is very similar to that of Figure\ 8.
+Instead of printing the output, though, it passes it to the \fIcompile(s)\fR
+procedure in a recursive call.
+This recursive call will compile the code instead of printing it.
+(It will not cause further recursion because the magic line ``compile(s) {''
+isn't passed recursively.)
+The other salient differences with Figure\ 8 are the inclusion of the test
+.LB
+if (match(s, "compile(s) {"))
+.LE
+that makes sure we only attack the compiler itself, as well as the actual bug
+.LB
+compile("print(\\"hello world\\");");
+.LE
+that we plant in it.
+.sp
+There are some technical problems with this program fragment.
+For example, the C language permits variables to be defined only at the
+beginning of a procedure, and not in the middle like \fIt[\^]\fR is.
+Also, calls to \fIcompile\fR are made with arguments of different types.
+However, such errors are straightforward and easy to fix.
+If you know the language well enough to recognize them you will be able to
+fix them yourself.
+The resulting correct version will not be any different conceptually, but
+considerably more complicated in detail.
+.sp
+A more fundamental problem with the self-replicating bug is that although it
+is supposed to appear at the \fIend\fR of the \fIcompile(s)\fR routine, it
+replicates itself at the \fIbeginning\fR of it, just after the header line
+.LB
+compile(s) {
+.LE
+Again this technicality could be fixed.
+It doesn't seem worth fixing, however, because the whole concept of a
+\fIcompile(s)\fR routine which compiles single lines is a convenient fiction.
+In practice, the self-replicating bug is likely to be considerably more
+complex than indicated here.
+But it will embody the same basic principle.
+.bp
+.sh "Panel 8 \(em Worm programs"
+.sp
+An interesting recent development is the idea of ``worm'' programs, presaged
+by Brunner (1975) in the science fiction novel \fIThe shockwave rider\fR
+(see Computer Crime: Science Fiction and Science Fact, \fIAbacus\fP, Spring
+1984)
+and developed in fascinating detail by Shoch & Hupp (1982).
+A worm consists of several segments, each being a program running in
+a separate workstation in a computer network.
+The segments keep in touch through the network.
+Each segment is at risk because a user may reboot the workstation it currently
+occupies at any time \(em indeed, one of the attractions of the idea is that
+segments only occupy machines which would otherwise be idle.
+When a segment is lost, the other segments conspire to replace it
+on another processor.
+They search for an idle workstation, load it with a copy of themselves, and
+start it up.
+The worm has repaired itself.
+.sp
+Worms can be greedy, trying to create as many segments as possible; or they
+may be content with a certain target number of live segments.
+In either case they are very robust.
+Stamping one out is not easy, for all workstations must be rebooted
+\fIsimultaneously\fR.
+Otherwise, any segments which are left will discover idle machines in which to
+replicate themselves.
+.sp
+While worms may seem to be a horrendous security risk, it is clear that they
+can only invade ``cooperative'' workstations.
+Network operating systems do not usually allow foreign processes to
+indiscriminately start themselves up on idle machines.
+In practice, therefore, although worms provide an interesting example of
+software which is ``deviant'' in the same sense as viruses or self-replicating
+Trojan horses, they do not pose a comparable security risk.
+.bp
+.sh "Captions for figures"
+.sp
+.nf
+.ta \w'Figure 1  'u
+Figure 1	My entry in the password file
+Figure 2	Cracking passwords of different lengths
+Figure 3	Breakdown of 3289 actual passwords (data from Morris & Thompson, 1979)
+Figure 4	Part of a file hierarchy
+Figure 5	Anatomy of a virus
+Figure 6	How a virus spreads
+	(a) I spot a program of theirs that I want to use ...
+	(b) ... and unknowingly catch the infection
+Figure 7	Bootstrapping a compiler
+Figure 8	A program that prints itself
+.fi
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/paper3 b/src/test/java/org/xerial/snappy/testdata/calgary/paper3
new file mode 100644
index 0000000..186d0e6
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/paper3
@@ -0,0 +1,1100 @@
+.pn 0
+.ls1
+.EQ
+delim $$
+.EN
+.ev1
+.ps-2
+.vs-2
+.ev
+\&
+.sp 10
+.ps+4
+.ce
+IN SEARCH OF ``AUTONOMY''
+.ps-4
+.sp4
+.ce
+Ian H. Witten
+.sp2
+.ce4
+Department of Computer Science
+The University of Calgary
+2500 University Drive NW
+Calgary, Canada T2N 1N4
+.sp2
+.sh "Abstract"
+.pp
+This paper examines the concept of autonomy as it pertains to computer
+systems.
+Two rather different strands of meaning are identified.
+The first regards autonomy as self-government or self-motivation.
+This is developed by reviewing some recent AI research on representing and
+using goals, together with physiological, psychological, and philosophical
+viewpoints on motivation and goal-seeking behavior.
+The second concerns the biological independence of organisms which have the
+ability to maintain their own organization in a capricious environment.
+The advantages of such organisms have been realized recently in a number of
+different computer contexts, and the examples of worm programs,
+self-replicating Trojan horses and viruses are introduced and discussed.
+.bp 1
+.ls2
+.sh "Introduction"
+.pp
+What does it mean for a machine to be autonomous?
+Has any progress been made towards autonomous machines since Grey Walter's
+famous \fIM.\ Speculatrix\fR\u1\d (Walter, 1953)?
+.[
+Walter 1953 living brain
+.]
+.FN
+1.\ \ for the discerning, or ``tortoise'' for the profane, as its inventor
+took pains to point out.
+.EF
+In a narrow sense it is clear that there has, as evidenced by the evolution of
+the \fIM.\ Labyrinthea\fR species (of which Claude Shannon constructed an
+early example) into the fleet-footed trial-and-error goal
+seeking devices seen in successive generations of the IEEE Micromice
+competition.
+However, these devices have a predictable course and a predestined end,
+providing an excellent example of the old argument against artificial
+intelligence that ``reliable computers do only what they are instructed to
+do''.
+In this paper we seek autonomy in some deeper sense.
+.pp
+It is not surprising that dictionary definitions of autonomy concentrate on
+natural systems.
+According to the Oxford dictionary, it has two principal strands of meaning:
+.LB "\fBAutonomy\fR  1.  \fBa\fR  "
+.NI "\fBAutonomy\fR  1.  \fBa\fR  "
+\fBAutonomy\fR\ \ 1.\ \ Of a state, institution, etc
+.NI "\fBa\fR  "
+\fBa\fR\ \ The right of self-government, of making its own laws and
+administering its own affairs
+.NI "\fBb\fR  "
+\fBb\fR\ \ Liberty to follow one's will, personal freedom
+.NI "\fBc\fR  "
+\fBc\fR\ \ Freedom (of the will): the Kantian doctrine of the Will giving
+itself its own law, apart from any object willed; opposed to \fIheteronomy\fR
+.NI "1.  \fBa\fR  "
+2.\ \ \fIBiol.\fR  autonomous condition
+.NI "\fBa\fR  "
+\fBa\fR\ \ The condition of being controlled only by its own laws, and not
+subject to any higher one
+.NI "\fBb\fR  "
+\fBb\fR\ \ Organic independence
+.LE "\fBAutonomy\fR  1.  \fBa\fR  "
+Our interest here lies in practical aspects of autonomy as opposed to
+philosophical ones.
+Consequently we will steer clear of the debate on free will and what it means
+for machines, simply noting in passing that some dismiss the problem out of
+hand.
+For instance, Minsky (1961) quotes with approval McCulloch (1954) that our
+\fIfreedom of will\fR ``presumably means no more than that we can distinguish
+between what we intend (ie our \fIplan\fR), and some intervention in our
+action''\u2\d.
+.FN
+2.\ \ This seems to endow free will to a Micromouse which, having mapped the
+maze, is following its plan the second time round when it finds a new
+obstacle!
+.EF
+.[
+Minsky 1961 steps toward artificial intelligence
+.]
+.[
+McCulloch 1954
+.]
+We also refrain from the potentially theological considerations of what is
+meant by ``higher'' laws in the second part.
+.pp
+How can we interpret what is left of the definition?
+In terms of modern AI, the first meaning can best be read as
+self-government through goal-seeking behavior,
+setting one's own goals, and choosing which way to pursue them.
+The second meaning, organic independence, has been the subject of major debate
+in the biological and system-theoretic community around the concepts of
+``homeostasis'' and, more recently, ``autopoiesis''.
+.pp
+Our search in this paper will pursue these strands separately.
+Goals and plans have received much attention in AI, both from the point of
+view of understanding (or at least explaining) stories involving human goals
+and how they can be achieved or frustrated, and in purely artificial systems
+which learn by discovery.
+Biologists and psychologists have studied goal-seeking behavior in people,
+and come to conclusions which seem to indicate remarkable similarities with
+the approach taken by current AI systems to setting and pursuing goals.
+On the other side of the coin, there are strong arguments that these
+similarities should be viewed with a good deal of suspicion.
+.pp
+The second strand of meaning, organic independence, has not been contemplated
+explicitly in mainstream computer science.
+There have been a number of well-known developments on the periphery of
+the subject which do involve self-replicating organisms.
+Examples include games such as ``life'' (Berlekamp \fIet al\fR, 1982) and
+``core wars'' (Dewdney, 1984), as well as
+cellular (eg Codd, 1968), self-reproducing (eg von Neumann, 1966),
+and evolutionary (eg Fogel \fIeg al\fR, 1966) automata.
+.[
+Dewdney 1984
+.]
+.[
+Berlekamp Conway Guy 1982
+.]
+.[
+Codd 1968 cellular automata
+.]
+.[
+von Neumann 1966 self-reproducing automata
+.]
+.[
+Fogel Owens Walsh 1966
+.]
+However, these seem artificial and contrived examples of autonomy.
+In contrast, some autonomous systems have recently arisen naturally in
+computer software.
+We examine the system-theoretic idea of ``autopoiesis'' and then look at these
+software developments in this context.
+.sh "Goal-seeking \(em artificial and natural"
+.pp
+In a discussion of robots and emotions, Sloman and Croucher (1981) note that
+many people deny that machines could ever be said to have their own goals.
+``Machines hitherto familiar to us either are not goal-directed at all
+(clocks, etc) or else, like current game-playing computer programs,
+have a simple hierarchical set of goals, with the highest-level goal put there
+by a programmer''.
+.[
+Sloman Croucher 1981 robots emotions
+.]
+They postulate that robots will need \fImotive generators\fR to allow them
+to develop a sufficiently rich structure of goals; unfortunately they do not
+say how such generators might work.
+To exemplify how goals are used in existing AI programs, we will briefly
+review two lines of current research.
+.rh "Examples of artificial goal-seeking."
+Those working on conceptual dependency in natural language understanding have
+long recognized that stories cannot be understood without knowing about the
+goal-seeking nature of the actors involved.
+Schank & Abelson (1977) present a taxonomy of human goals, noting that
+different attempts at classification present a confusing array of partially
+overlapping constructs and suggesting that some future researcher might
+succeed in bringing order out of the chaos using methods such as cluster
+analysis.
+.[
+Schank Abelson 1977
+.]
+They postulate the following seven goal forms:
+.LB
+.NP
+Satisfaction goal \(em a recurring strong biological need
+.br
+Examples:  \fIhunger\fR, \fIsex\fR, \fIsleep\fR
+.NP
+Enjoyment goal \(em an activity which is optionally pursued for enjoyment or
+relaxation
+.br
+Examples:  \fItravel\fR, \fIentertainment\fR, \fIexercise\fR
+(in addition, the activities implied by some satisfaction goals may
+alternatively be pursued primarily for enjoyment)
+.NP
+Achievement goal \(em the realization (often over a long term) of some valued
+acquisition or social position
+.br
+Examples:  \fIpossessions\fR, \fIgood job\fR, \fIsocial relationships\fR
+.NP
+Preservation goal \(em preserving or improving the health, safety, or good
+condition of people, position, or property
+.br
+Examples:  \fIhealth\fR, \fIgood eyesight\fR
+.NP
+Crisis goal \(em a special class of preservation goal set up to handle serious
+and imminent threats.
+.br
+Examples:  \fIfire\fR, \fIstorm\fR
+.NP
+Instrumental goal \(em occurs in the service of any of the above goals to
+realize a precondition
+.br
+Examples:  \fIget babysitter\fR
+.NP
+Delta goal \(em similar to instrumental goal except that general planning
+operations instead of scripts are involved in its pursuit
+.br
+Examples:  \fIknow\fR, \fIgain-proximity\fR, \fIgain-control\fR.
+.LE
+The first three involve striving for desired states;
+the next two, avoidance of undesired states;
+the last two, intermediate subgoals for any of the other five forms.
+Programs developed within this framework ``understand'' (ie can answer
+questions about) stories involving human actors with these goals
+(eg Wilensky, 1983; Dyer, 1983).
+.[
+Wilensky 1983 Planning and understanding
+.]
+.[
+Dyer 1983 in-depth understanding MIT Press
+.]
+For example, if John goes to a restaurant it is likely that he is attempting
+to fulfill either a satisfaction goal or an entertainment goal (or both).
+Instrumental or delta goals will be interpreted in the context of the
+prevailing high-level goal.
+If John takes a cab to the restaurant it will be understood that he is
+achieving the delta goal \fIgain-proximity\fR in service of his satisfaction
+or entertainment goal.
+.pp
+Our second example of goal usage in contemporary AI is Lenat's ``discovery''
+program \s-2AM\s+2, and its successor \s-2EURISKO\s+2 (Davis & Lenat, 1982;
+Lenat \fIet al\fR, 1982).
+.[
+Davis Lenat 1982
+.]
+.[
+Lenat Sutherland Gibbons 1982
+.]
+These pursue interesting lines of research in the domains of
+elementary mathematics and VLSI design heuristics, respectively.
+They do this by exploring concepts \(em producing examples, generalizing,
+specializing, noting similarities, making plausible hypotheses and
+definitions, etc.
+The programs evaluate these discoveries for utility and ``interestingness,''
+and add them to the vocabulary of concepts.
+They essentially perform exploration in an enormous search space, governed
+by heuristics which evaluate the results and suggest fruitful avenues for
+future work.
+.pp
+Each concept in these systems is represented by a frame-like data structure
+with dozens of different facets or slots.
+The types of facets in \s-2AM\s+2 include
+.LB
+.NP
+examples
+.NP
+definitions
+.NP
+generalizations
+.NP
+domain/range
+.NP
+analogies
+.NP
+interestingness.
+.LE
+Heuristics are organized around the facets.
+For example, the following strategy fits into the \fIexamples\fR facet
+of the \fIpredicate\fR concept:  \c
+.sp
+.BQ
+If, empirically, 10 times as many elements
+.ul
+fail
+some predicate P as
+.ul
+satisfy
+it, then some
+.ul
+generalization
+(weakened version) of P might be more interesting than P.
+.FQ
+.sp
+\s-2AM\s+2 considers this suggestion after trying to fill in examples of each
+predicate.
+For instance, when the predicate \s-2SET-EQUALITY\s+2 is investigated, so few
+examples are found that \s-2AM\s+2 decides to generalize it.
+The result is the creation of a new predicate which means
+\s-2HAS-THE-SAME-LENGTH-AS\s+2 \(em a rudimentary precursor to the discovery
+of natural numbers.
+.pp
+In an unusual and insightful retrospective on these programs,
+Lenat & Brown (1984) report that the exploration consists of (mere?) syntactic
+mutation of programs expressed in certain representations.
+.[
+Lenat Brown 1984
+.]
+The key element of the approach is to find representations with a high
+density of interesting concepts so that many of the random mutations will be
+worth exploring.
+If the representation is not well matched to the problem domain, most
+explorations will be fruitless and the method will fail.
+.pp
+While the conceptual dependency research reviewed above is concerned with
+understanding the goals of actors in stories given to a program, the approach
+taken seems equally suited to the construction of artificial goal-oriented
+systems.
+If a program could really understand or empathize with the motives of people,
+it seems a small technical step to turn it around to create an autonomous
+simulation with the same motivational structure.
+Indeed, one application of the conceptual dependency framework is in
+\fIgenerating\fR coherent stories by inventing goals for the actors, choosing
+appropriate plans, and simulating the frustration or achievement of the goals
+(Meehan, 1977).
+.[
+Meehan 1977 talespin
+.]
+The ``learning by discovery'' research shows how plausible subgoals can be
+generated from an overall goal of maximizing the interestingness of
+the concepts being developed.
+It is worth noting that Andreae (1977) chose a similar idea, ``novelty,''
+as the driving force behind a very different learning system.
+.[
+Andreae 1977 thinking with the teachable machine
+.]
+Random mutation in an appropriate representation seems to be the closest we
+have come so far to the \fImotive generator\fR mentioned at the beginning of
+this section.
+.rh "The mechanism and psychology of natural goal-seeking."
+Now turn to natural systems.
+The objection to the above-described use of goals in natural language
+understanders and discovery programs is that they are just programmed in.
+The computer only does what it is told.
+In the first case, it is told a classification of goals and given
+information about their interrelationships, suitable plans for achieving them,
+and so on.
+In the second case it is told to maximize interestingness by random
+mutation.
+On the surface, these seem to be a pale reflection of the autonomous
+self-government of natural systems.
+But let us now look at how goals seem to arise in natural systems.
+.pp
+The eminent British anatomist J.Z.\ Young describes the modern biologist's
+highly mechanistic view of the basic needs of animals.
+.[
+Young 1978 programs of the brain
+.]
+``Biologists no longer believe that living depends upon some special
+non-physical agency or spirit,'' he avers (Young, 1978, p.\ 13), and goes on
+to claim that we now understand how it comes about that organisms behave as if
+all their actions were directed towards an aim or goal\u3\d.
+.FN
+3.\ \ Others apparently tend to be more reticent \(em
+``it has been curiously unfashionable among biologists to call attention to
+this characteristic of living things'' (Young, 1978, p.\ 16).
+.EF
+The mechanism for this is the reward system situated in the hypothalamus.
+For example, the cells of the hypothalamus ensure that the right amount of
+food and drink are taken and the right amount is incorporated to allow the
+body to grow to its proper size.
+These hypothalamic centers stimulate the need for what is lacking, for
+instance of food, sex, or sleep, and they indicate satisfaction when enough
+has been obtained.
+Moreover, the mechanism has been traced to a startling level of detail.
+For example, Young describes how hypothalamic cells can be
+identified which regulate the amount of water in the body.
+.sp
+.BQ
+The setting of the level of their sensitivity to salt provides the
+instruction that determines the quantity of water that is held in the body.
+We can say that the properties of these cells are physical symbols
+``representing'' the required water content.
+They do this in fact by actually swelling or shrinking when the salt
+concentration of the blood changes.
+.FQ "Young, 1978, p.\ 135"
+.sp
+Food intake is regulated in the same way.
+The hypothalamus ensures propagation of the species by directing reproductive
+behavior and, along with neighboring regions of the brain, attends to the goal
+of self-preservation by allowing us to defend ourselves if attacked.
+.pp
+Needless to say, experimental evidence for this is obtained primarily from
+animals.
+Do people's goals differ?
+The humanistic psychologist Abraham Maslow propounded a theory of human
+motivation that distinguishes between different kinds of needs (Maslow, 1954).
+.[
+Maslow 1954
+.]
+\fIBasic needs\fR include hunger, affection, security, love, and self-esteem.
+\fIMetaneeds\fR include justice, goodness, beauty, order, and unity.
+Basic needs are arranged in a hierarchical order so that some are stronger
+than others (eg security over love); but all are generally stronger than
+metaneeds.
+The metaneeds have equal value and no hierarchy, and one can be substituted
+for another.
+Like the basic needs, the metaneeds are inherent in man, and when they are not
+fulfilled, the person may become psychologically sick (suffering, for example,
+from alienation, anguish, apathy, or cynicism).
+.pp
+In his later writing, Maslow (1968) talks of a ``single ultimate value for
+mankind, a far goal towards which all men strive''.
+Although going under different names (Maslow favors \fIself-actualization\fR),
+it amounts to ``realizing the potentialities of the person, that is to say,
+becoming fully human, everything that the person \fIcan\fR become''.
+However, the person does not know this.
+As far as he is concerned, the individual needs are the driving force.
+He does not know in advance that he will strive on after the current need
+has been satisfied.
+Maslow produced the list of personality characteristics of the psychologically
+healthy person shown in Table\ 1.
+.RF
+.in 0.5i
+.ll -0.5i
+.nr x0 \n(.l-\n(.i
+\l'\n(x0u'
+.in +\w'\(bu 'u
+.fi
+.NP
+They are realistically oriented.
+.NP
+They accept themselves, other people, and the natural world for what they are.
+.NP
+They have a great deal of spontaneity.
+.NP
+They are problem-centered rather than self-centered.
+.NP
+They have an air of detachment and a need for privacy.
+.NP
+They are autonomous and independent.
+.NP
+Their appreciation of people and things is fresh rather than stereotyped.
+.NP
+Most of them have had profound mystical or spiritual experiences although not
+necessarily religious in character.
+.NP
+They identify with mankind.
+.NP
+Their intimate relationships with a few specially loved people tend to be
+profound and deeply emotional rather than superficial.
+.NP
+Their values and attitudes are democratic.
+.NP
+They do not confuse means with ends.
+.NP
+Their sense of humor is philosophical rather than hostile.
+.NP
+They have a great fund of creativeness.
+.NP
+They resist conformity to the culture.
+.NP
+They transcend the environment rather than just coping with it.
+.nf
+.in -\w'\(bu 'u
+\l'\n(x0u'
+.ll +1i
+.in 0
+.FE "Table 1: Characteristics of self-actualized persons (Maslow, 1954)"
+.pp
+Maslow's \fIbasic needs\fR seem to correspond reasonably closely with those
+identified by conceptual dependency theory.
+Moreover, there is some similarity to the goals mentioned by Young (1978),
+which, as we have seen, are thought to be ``programmed in'' to the brain in an
+astonishingly literal sense.
+Consequently it is not clear how programs in which these goals are embedded
+differ in principle from goal-oriented systems in nature.
+The \fImetaneeds\fR are more remote from current computer systems,
+although there have been shallow attempts to simulate paranoia in the
+\s-2PARRY\s+2 system (Colby, 1973).
+.[
+Colby 1973 simulations of belief systems
+.]
+It is intriguing to read Table\ 1 in the context of self-actualized computers!
+Moreover, one marvels at the similarity between the single-highest-goal model
+of people in terms of self-actualization, and the architecture for discovery
+programs sketched earlier in terms of a quest for ``interestingness''.
+.rh "The sceptical view."
+The philosopher John Haugeland addressed the problem of natural language
+understanding and summed up his viewpoint in the memorable aphorism,``the
+trouble with Artificial Intelligence is that computers don't give a damn''
+(Haugeland, 1979).
+.[
+Haugeland 1979 understanding natural language
+.]
+He identified four different ways in which brief segments of text cannot be
+understood ``in isolation'', which he called four \fIholisms\fR.
+Two of these, concerning \fIcommon-sense knowledge\fR and
+\fIsituational knowledge\fR,
+are the subject of intensive research in natural language analysis systems.
+Another, the \fIholism of intentional interpretation\fR,
+expresses the requirement that utterances and descriptions ``make sense'' and
+seems to be at least partially addressed by the goal/plan orientation of some
+natural language systems.
+It is the fourth, called \fIexistential holism\fR, that is most germane to the
+present topic.
+Haugeland argues that one must have actually \fIexperienced\fR emotions (like
+embarrassment, relief, guilt, shame) to understand
+``the meaning of text that (in a familiar sense) \fIhas\fR any meaning''.
+One can only experience emotions in the context of one's own self-image.
+Consequently, Haugeland concludes that
+``only a being that cares about who it is, as some sort of enduring whole,
+can care about guilt or folly, self-respect or achievement, life or death.
+And only such a being can read.''  Computers just don't give a damn.
+.pp
+As AI researchers have pointed out repeatedly, however, it is difficult to
+give such arguments \fIoperational\fR meanings.
+How could one test whether a machine has \fIexperienced\fR an emotion like
+embarrassment?
+If it acts embarrassed, isn't that enough?
+And while machines cannot yet behave convincingly as though they do experience
+emotions, it is not clear that fundamental obstacles stand in the way of
+further and continued progress.
+There seems to be no reason in principle why a machine cannot be given a
+self-image.
+.pp
+This controversy has raged back and forth for decades, a recent resurgence
+being Searle's (1980) paper on the Chinese room, and the 28 responses which
+were published with it.
+.[
+Searle 1980 minds programs
+.]
+Searle considered the following \fIgedanken\fP experiment.
+Suppose someone, who knows no Chinese (or any related language), is locked in
+a room and given three large batches of Chinese writing, together with a
+set of rules in English which allow her to correlate the apparently
+meaningless squiggles in the three batches and to produce certain sorts of
+shapes in response to certain sorts of shapes which may appear in the third
+batch.
+Unknown to her, the experimenters call the first batch a ``script'', the
+second batch a ``story'', the third batch ``questions'', and the symbols
+she produces ``answers''.
+We will call the English rules a ``program'', and of course the intention is
+that, when executed, sensible and appropriate Chinese answers, based on the
+Chinese script, are generated to the Chinese questions about the Chinese
+story.
+But the subject, with no knowledge of Chinese, does not see them that way.
+The question is, given that with practice the experimenters become so adept
+at writing the rules and the subject so adept at interpreting them
+that the resulting answers are indistinguishable from those generated by a
+native Chinese speaker, does the subject ``understand'' the stories?
+To summarize a large and complex debate in a few words, Searle says no; while
+many AI researchers say yes, or at least that the subject-plus-rules system
+understands.
+.pp
+Searle states his thesis succinctly:  ``such intentionality as computers
+appear to have is solely in the minds of those who program them and those who
+use them, those who send in the input and those who interpret the output''.
+And the antithesis could be caricatured as
+``maybe, but does it \fImatter?\fR''.
+Those who find the debate frustrating can always, with
+Sloman & Croucher (1981), finesse the issue:  \c
+``Ultimately, the decision whether to say such machines have motives is a
+\fImoral\fR decision, concerned with how we ought to treat them''.
+.[
+Sloman Croucher 1981 robots emotions
+.]
+.sh "Autopoiesis \(em natural and artificial"
+.pp
+Autonomy is a striking feature of biological systems.
+Not surprisingly, some biologists have made strenuous attempts to articulate
+what it means to them; to pin it down, formalize and study it in a
+system-theoretic context.
+However, this work is obscure and difficult to assess in terms of its
+predictive power (which must be the fundamental test of any theory).
+Even as a descriptive theory its use is surrounded by controversy.
+Consequently this section attempts to give the flavor of the endeavor, relying
+heavily on quotations from the major participants in the research, and goes on
+to describe some practical computer systems which appear to satisfy the
+criteria biologists have identified for autonomy.
+.rh "Homeostasis."
+People have long expressed wonder at how a living organism maintains its
+identity in the face of continuous change.
+.sp
+.BQ
+In an open system, such as our bodies represent, compounded of unstable
+material and subjected continuously to disturbing conditions, constancy is
+in itself evidence that agencies are acting or ready to act, to maintain this
+constancy.
+.FQ "Cannon, 1932"
+.sp
+.[
+Cannon 1932 wisdom of the body
+.]
+Following Cannon, Ashby (1960) developed the idea of ``homeostasis'' to
+account for this remarkable ability to preserve stability under conditions of
+change.
+.[
+Ashby 1960 design for a brain
+.]
+The word has now found its way into North American dictionaries, eg Webster's
+.sp
+.BQ
+Homeostasis is the tendency to maintain, or the maintenance of, normal,
+internal stability in an organism by coordinated responses of the organ
+systems that automatically compensate for environmental changes.
+.FQ
+.sp
+The basis for homeostasis was adaptation by the organism.
+When change occurred, the organism adapted to it and thus preserved its
+constancy.
+.sp
+.BQ
+A form of behavior is \fIadaptive\fR if it maintains the essential variables
+within physiological limits.
+.FQ "Ashby, 1960, p. 58"
+.sp
+The ``essential variables'' are closely related to survival and linked
+together dynamically so that marked changes in any one soon lead to changes in
+the others.
+Examples are pulse rate, blood pressure, body temperature, number of
+bacteria in the tissue, etc.
+Ashby went so far as to construct an artifact, the ``Homeostat'', which
+exhibits this kind of ultrastable equilibrium.
+.pp
+Homeostasis emphasizes the stability of biological systems under external
+change.
+Recently, a concept called ``autopoiesis'' has been identified, which
+captures the essence of biological autonomy in the sense of stability or
+preservation of identity under \fIinternal\fR change
+(Maturana, 1975; Maturana & Varela, 1980; Varela, 1979; Zeleny, 1981).
+.[
+Maturana 1975 organization of the living
+.]
+.[
+Maturana Varela 1980 autopoiesis
+.]
+.[
+Varela 1979 biological autonomy
+.]
+.[
+Zeleny 1981 Editor Autopoiesis  a theory of living organization
+.]
+This has aroused considerable interest, and controversy, in the system
+theoretic research community.
+.rh "Autopoiesis."
+The neologism ``autopoiesis'' means literally ``self-production'', and a
+striking example occurs in living cells.
+These complex systems produce and synthesize macromolecules of proteins,
+lipids, and enzymes, and consist of about $10 sup 5$ macromolecules.
+The entire population of a given cell is renewed about $10 sup 4$ times
+during its lifetime (Zeleny, 1981a).
+.[
+%A Zeleny, M.
+%D 1981a
+%T What is autopoiesis?
+%E M.Zeleny
+%B Autopoiesis:  a theory of living organization
+%I North Holland
+%C New York
+%P 4-17
+.]
+Despite this turnover of matter, the cell retains its distinctiveness and
+cohesiveness \(em in short, its \fIautonomy\fR.
+This maintenance of unity and identity of the whole, despite the fact that
+all the while components are being created and destroyed, is called
+``autopoiesis''.
+A concise definition is
+.sp
+.BQ
+Autopoiesis is the capability of living systems to develop and maintain
+their own organization.
+The organization that is developed and maintained is identical to that
+performing the development and maintenance.
+.FQ "Andrew, 1981, p. 156"
+.sp
+.[
+Andrew 1981
+.]
+Other authors (eg Maturana & Varela, 1980; Zeleny, 1981a) add a corollary:
+.sp
+.BQ
+a topological boundary emerges as a result of the processes [of development
+and maintenance].
+.FQ "Zeleny, 1981a, p. 6"
+.sp
+This emphasizes the train of thought ``from self-production to identity''
+that seems to underly much of the autopoietic literature.
+.pp
+Operating as a system which produces or renews its own components, an
+autopoietic system continuously regenerates its own organization.
+It does this in an endless turnover of components and despite inevitable
+perturbations.
+Therefore autopoiesis is a form of homeostasis which has its own
+organization as the fundamental variable that remains constant.
+The principal fascination of the concept lies in the self-reference it
+implies,
+This has stimulated a theoretical formulation of the notion of circularity or
+self-reference in Varela's (1975) extension of Brown's
+``calculus of distinctions'' (Brown, 1969).
+.[
+%A Varela, F.J.
+%D 1975
+%K *
+%T A calculus for self-reference
+%J Int J General Systems
+%V 2
+%N 1
+%P 5-24
+.]
+.[
+Brown 1969 Laws of Form
+.]
+Along with other work on self-reference (eg Hofstadter, 1979), this
+has an esoteric and obscure, almost mystical, quality.
+.[
+Hofstadter 1979 Godel Escher Bach
+.]
+While it may yet form the basis of a profound paradigm shift in systems
+science, it is currently surrounded by controversy and its potential
+contribution is quite unclear (Gaines, 1981).
+.[
+Gaines 1981 Autopoiesis some questions
+.]
+Indeed, it has been noted that an
+``unusual degree of parochialism, defensiveness, and quasi-theological
+dogmatism has arisen around autopoiesis'' (Jantsch, 1981).
+.[
+Jantsch 1981 autopoiesis
+.]
+.pp
+There has been considerable discussion of the relation between autopoiesis and
+concepts such as purpose and information.
+Varela (1979) claims that
+``notions [of teleology and information] are unnecessary for the
+\fIdefinition\fR of the living organization, and that they belong to a
+descriptive domain distinct from and independent of the domain in which the
+living system's \fIoperations\fR are described'' (p.\ 63/64).
+In other words, nature is not about goals and information; we observers invent
+such concepts to help classify what we see.
+Maturana (1975) is more outspoken:  \c
+``descriptions in terms of information transfer, coding and computations of
+adequate states are fallacious because they only reflect the observer's domain
+of purposeful design and not the dynamics of the system as a state-determined
+system'';
+.[
+Maturana 1975 organization of the living
+.]
+presumably goals are included too in the list of proscribed terms.
+Some have protested strongly against this hard-line view \(em which is
+particularly provocative because of its use of the word ``fallacious'' \(em
+and attempted to reconcile it with ``the fact that the behavior of people and
+animals is very readily and satisfactorily described in terms of goals and
+attempts to achieve them'' (Andrew, 1981, p. 158).
+In his more recent work Varela (1981) diverged further from the hard-line
+view, explaining that he had intended to criticize only ``the \fInaive\fR use
+of information and purpose as notions that can enter into the definition of
+a system on the same basis as material interactions'' [his emphasis].
+.[
+Varela 1981 describing the logic of the living
+.]
+He concluded that ``autopoiesis, as an operational explanation, is not quite
+sufficient for a full understanding of the phenomenology of the living,
+and that it needs a carefully constructed complementary symbolic
+explanation''.
+For Varela, a symbolic explanation is one that is based on the notions of
+information and purpose.
+It is clear, though, that while some allow that autopoiesis can \fIcoexist\fR
+with purposive interpretations, it will not \fIcontribute\fR to them.
+.pp
+Is autopoiesis restricted to \fIliving\fR systems?
+Some authors find it attractive to extend the notion to the level of society
+and socio-political evolution (eg Beer, 1980; Zeleny, 1977).
+.[
+Beer 1980
+.]
+.[
+Zeleny 1977
+.]
+Others (eg Varela, 1981) stress the renewal of components through material
+self-production and restrict autopoiesis to chemical processes.
+Without self-production in a material sense, the support for the corollary
+above becomes unclear, and consequently the whole relevance of autopoiesis
+to identity and autonomy comes under question.
+.rh "Artificial autopoiesis."
+Although one can point to computer simulations of very simple autopoietic
+systems (eg Varela \fIet al\fR, 1974; Zeleny, 1978; Uribe, 1981), there seems
+to have been little study of artificially autopoietic systems in their own
+right.
+.[
+Varela Maturana Uribe 1974 autopoiesis characterization and model
+.]
+.[
+Zeleny 1978 experiments in self-organization of complexity
+.]
+However there are examples of computer systems which are autopoietic and
+which have arisen ``naturally'', that is to say, were developed for other
+purposes and not as illustrations of autopoiesis.
+It is probably true that in each case the developers were entirely unaware
+of the concept of autopoiesis and the interest surrounding it in system
+theory circles.
+.pp
+.ul
+Worm programs
+were an experiment in distributed computation (Shoch & Hupp, 1982).
+.[
+Shoch Hupp 1982
+.]
+The problem they addressed was to utilize idle time on a network of
+interconnected personal computers without any impact on normal use.
+It was necessary to be able to redeploy or unplug any machine at any time
+without warning.
+Moreover, in order to make the system robust to any kind of failure,
+power-down or ``I am dying'' messages were not employed in the protocol.
+A ``worm'' comprises multiple ``segments'', each running on a different
+machine.
+Segments of the worm have the ability to replicate themselves in idle
+machines.
+All segments remain in communication with each other, thus preserving the
+worm's identity and distinguishing it from a collection of independent
+processes; however, all segments are peers and none is in overall control.
+To prevent uncontrolled reproduction, a certain number of segments is
+pre-specified as the target size of the worm.
+When a segment is corrupted or killed, its peers notice the fact because it
+fails to make its periodical ``I am alive'' report.
+They then proceed to search for an idle machine and occupy it with another
+segment.
+Care is taken to coordinate this activity so that only one new segment is
+created.
+.pp
+There are two logical components to a worm.
+The first is the underlying worm maintenance mechanism, which is responsible
+for maintaining the worm \(em finding free machines when needed and
+replicating the program for each additional segment.
+The second is the application part, and several applications have been
+investigated (Shoch & Hupp, 1982), such as
+.LB
+.NP
+.ul
+existential
+worm that merely announces its presence on each computer it inhabits;
+.NP
+.ul
+billboard
+worm that posts a graphic message on each screen;
+.NP
+.ul
+alarm clock
+worm that implements a highly reliable alarm clock that is not based on any
+particular machine;
+.NP
+.ul
+animation
+worm for undertaking lengthy computer graphics computations.
+.LE
+.pp
+Can worms shed any light on the controversies outlined above which surround
+the concept of autopoiesis?
+Firstly, although they are not living and do not create their own material in
+any chemical sense, they are certainly autonomous, autopoietic systems.
+Shoch & Hupp relate how
+.sp
+.BQ
+a small worm was left running one night, just exercising the worm control
+mechanism and using a small number of machines.
+When we returned the next morning, we found dozens of machines dead,
+apparently crashed.
+If one restarted the regular memory diagnostic, it would run very briefly,
+then be seized by the worm.
+The worm would quickly load its program into this new segment; the program
+would start to run and promptly crash, leaving the worm incomplete \(em and
+still hungrily looking for new segments.
+.FQ
+.sp
+John Brunner's science fiction story \fIThe shockwave rider\fR presaged just
+such an uncontrollable worm.
+Of course, extermination is always possible in principle by switching off or
+simultaneously rebooting every machine on the network, although this may not
+be an option in practice.
+Secondly, in the light of our earlier discussion of teleology and autopoiesis,
+it is interesting to find the clear separation of the maintenance mechanism
+\(em the autopoietic part \(em from the the application code \(em the
+``purposive'' part \(em of the worm.
+It can be viewed quite separately as an autopoietic or an application
+(teleological?) system.
+.pp
+.ul
+Self-replicating Trojan horses.
+In his Turing Award lecture, Thompson (1984) raised the specter of
+ineradicable programs residing within a computer system \(em ineradicable in
+the sense that although they are absent from all source code, they can survive
+recompilation and reinstallation of the entire system!
+.[
+Thompson 1984 reflections trust
+.]
+Most people's reaction is ``impossible! \(em it must be a simple trick'',
+but Thompson showed a trick that is extremely subtle and sophisticated, and
+effectively impossible to detect or counter.
+The natural application of such a device is to compromise a system's security,
+and Thompson's conclusion was that there can be no technical substitute for
+natural trust.
+From a system-theoretic viewpoint, however, this is an interesting example
+of how a parasite can survive despite all attempts by its host to eliminate
+it.
+.pp
+To understand what is involved in creating such an organism, consider first
+self-replicating programs.
+When compiled and executed, these print out themselves (say in source code
+form); no more and no less.
+Although at first sight they seem to violate some fundamental intuitive
+principle of information \(em that to print oneself one needs
+\fIboth\fR ``oneself'' \fIand, in addition\fR, something to print it out,
+this is not so.
+Programmers have long amused themselves with self-replicating programs, often
+setting the challenge of discovering the shortest such program in any given
+computer language.
+Moreover, it is easy to construct a self-replicating program that includes
+any given piece of text.
+Such a program divides naturally into the self-replicating part and the
+part that is to be reproduced, in much the same way that a worm program
+separates the worm maintenance mechanism from the application part.
+.pp
+View self-replication as a source program ``hiding'' in executable binary
+code.
+Normally when coaxed out of hiding it prints itself.
+But imagine one embedded in a language compiler, which when activated
+interpolates itself into the input stream for the compiler, causing itself
+to be compiled and inserted into the binary program being produced.
+Now it has transferred itself from the executable version of the compiler
+to the executable version of the program being compiled \(em without ever
+appearing in source form.
+Now imagine that the program being compiled is itself the compiler \(em a
+virgin version, uncorrupted in any way.
+Then the self-replicating code transfers itself from the old version of
+the compiler to the new version, without appearing in source form.
+It remains only for the code to detect when it is the compiler that is being
+recompiled, and not to interfere with other programs.
+This is well known as a standard Trojan Horse technique.
+The result is a bug that lives only in the compiled version and replicates
+itself whenever the compiler is recompiled.
+.pp
+If autopoiesis is the ability of a system to develop and maintain its own
+organization, the self-replicating Trojan horse seems to be a remarkable
+example of it.
+It is an organism that it extremely difficult to destroy, even when one
+has detected its presence.
+However, it cannot be autonomous, but rather survives as a parasite on a
+language compiler.
+It does not have to be a compiler:  any program that handles other programs
+(including itself) will do\u4\d.
+.FN
+4.\ \ As Thompson (1984) remarks, a well-installed microcode bug will be
+almost impossible to detect.
+.EF
+Although presented as a pathological example of computer use, it is possible
+to imagine non-destructive applications \(em such as permanently identifying
+authorship or ownership of installed software even though the source code is
+provided.
+In the natural world, parasites can have symbiotic relationships with their
+hosts.
+It would be interesting to find analogous circumstances for self-replicating
+Trojan horses, but I do not know of any \(em these examples of benevolent
+use do not seem to benefit the host program directly, but rather its author or
+owner.
+.pp
+.ul
+Viruses
+are perhaps less subtle but more pervasive kinds of bugs.
+They spread infection in a computer system by attaching themselves to
+files containing executable programs.
+The virus itself is a small piece of code which gains control whenever the
+host is executed, performs its viral function, and then passes control to
+the host.
+Generally the user is unaware that anything unusual is happening:  as far as
+he is concerned, the host program executes exactly as normal\u5\d.
+.FN
+5.\ \ The only difference is a small startup delay which probably goes
+unnoticed.
+.EF
+As part of its function, a virus spreads itself.
+When it has control, it may attach itself to one or several other files
+containing executable programs, turning them into viruses too.
+Under most computer protection schemes, it has the unusual advantage of
+running with the privileges of the person who invoked the host, not with
+the privileges of the host program itself.
+Thus it has a unique opportunity to infect other files belonging to that
+person.
+In an environment where people sometimes use each others programs, this allows
+it to spread rapidly throughout the system\u6\d.
+.FN
+6.\ \ More details of the construction of both viruses and self-replicating
+Trojan horses are given by Witten (1987).
+.[
+Witten 1987 infiltrating open systems
+.]
+.EF
+.pp
+Unlike self-replicating Trojan horses, a virus can be killed by recompiling
+the host.
+(Of course, there is no reason why a virus should not be dispatched to install
+a self-replicating Trojan horse in the compiler.)  \c
+If all programs are recompiled ``simultaneously'' (ie without executing any of
+them between compilations), the virus will be eradicated.
+However, in a multi-user system it is extremely hard to arrange for everyone
+to arrange a massive recompilation \(em in the same way as it is difficult to
+reboot every machine on a network simultaneously to stamp out a worm.
+.pp
+Viruses do not generally remain in touch with each other and therefore,
+unlike worms, are not really autopoietic.
+But there is no intrinsic reason why they should not be.
+They provide a basic and effective means of reproduction which could be
+utilized for higher-level communicating systems.
+As with the other devices reviewed above, when one hears about viruses one
+cannot help thinking of pathological uses.
+However, there are benevolent applications.
+They could assist in system maintenance by recording how often programs were
+used and arranging optimization accordingly, perhaps migrating little-used
+ones to slower memory devices or arranging optimization of frequently-used
+programs.
+Such reorganizations could take place without users being aware of it, quietly
+making the overall system more efficient.
+.sh "Conclusions"
+.pp
+We have examined two rather different directions in which autonomy can be
+pursued in computer systems.
+The first concerns representation and manipulation of goals.
+Examination of some current AI systems shows that they do not escape the
+old criticism that their goals and aspirations are merely planted there
+by the programmer.
+Indeed, it is not easy to see how it could be different, unless goals were
+generated randomly in some sense.
+Random exploration is also being investigated in current AI systems, and these
+show that syntactic mutation can be an extremely powerful technique when
+combined with semantically dense representations.
+.pp
+But according to modern biological thinking, the lower-level goals of people
+and animals are also implanted in their brains in a remarkably literal sense.
+Higher-level goals are not so easy to pin down.
+According to one school of psychological thought they stem from a
+single ``super-goal'' called self-actualization.
+This is remarkably in tune with the architecture of some prominent discovery
+programs in AI which strive to maximize the ``interestingness'' of the
+concepts being developed.
+While one may be reluctant to equate self-actualization with interestingness,
+the resemblance is nevertheless striking.
+.pp
+The second direction concerns organizational independence in a sense of
+wholeness which is distinct from goal-seeking.
+The concept of autopoiesis formalizes this notion.
+Organizational independence can be identified in certain computer systems
+like worm programs, self-replicating Trojan horses, and viruses.
+It is remarkable that such applications have been constructed because
+they offer practical advantages and not in pursuit of any theoretical
+investigation of autonomy;
+in this way they are quite different from contrived games.
+In some sense self-replicating programs do have a goal, namely \fIsurvival\fR.
+A damaged worm exhibits this by repairing itself.
+But this is a weak form of goal-seeking compared with living organisms, which
+actively sense danger and take measures to prevent their own demise.
+.pp
+The architecture of these systems is striking in that the mechanism which
+maintains the artificial organism (be it the worm maintenance code,
+the self-replicating part of a Trojan horse, or the viral infection-spreader)
+is quite separate from the application part of the organism.
+Most people think of such programs as somehow pathological, and the
+application as a harmful or subversive one, but this need not be so:  there
+are benign examples of each.
+In any case, separation of the organism's maintenance from its purpose is
+interesting because the concept of autopoiesis has sparked a debate in
+system-theoretic circles as to whether teleological descriptions are even
+legitimate, let alone necessary.
+In both domains a clear separation seems to arise naturally between the
+autopoietic and teleological view of organisms.
+.pp
+There have been no attempts to build computer programs which combine these two
+directions.
+The AI community which developed techniques of goal-seeking has historically
+been somewhat separate from the system software community which has created
+robust self-replicating programs like worms and viruses.
+What will spring from the inevitable combination and synthesis of the two
+technologies of autonomy?
+.sh "Acknowledgements"
+.pp
+First and foremost I would like to thank Brian Gaines for suggesting and
+encouraging this line of research.
+I am grateful to Saul Greenberg and Roy Masrani for many insights into topics
+discussed here, and to Bruce MacDonald for making some valuable suggestions.
+This research is supported by the Natural Sciences and Engineering Research
+Council of Canada.
+.sh "References"
+.ls1
+.sp
+.in+4n
+.[
+$LIST$
+.]
+.in0
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/paper4 b/src/test/java/org/xerial/snappy/testdata/calgary/paper4
new file mode 100644
index 0000000..848991d
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/paper4
@@ -0,0 +1,294 @@
+.EQ
+delim $$
+.EN
+.ls 1
+.ce
+PROGRAMMING BY EXAMPLE REVISITED
+.sp
+.ce
+by John G. Cleary
+.ce
+Man-Machine Systems Laboratory
+.ce
+University of Calgary.
+.sp
+.sh "Introduction"
+.pp
+Efforts to construct an artificial intelligence have relied on
+ever more complex and carefully prepared programs.  While useful in
+themselves, these programs
+are unlikely to be useful in situations where ephemeral and
+low value knowledge must be acquired.  For example a person (or robot)
+working in a normal domestic environment knows a lot about which
+cupboards have sticky doors and where the marmalade is kept.  It seems
+unlikely that it will ever be economic to program such knowledge 
+whether this be via a language or a discourse with an expert system.
+.pp
+It is my thesis, then, that any flexible robot system working in the
+real world must contain a component of control intermediate
+between hard wired 'reflex' responses and complex intellectual 
+reasoning.  Such an intermediate system must be adaptive, be able
+to carry out complex patterned responses and be fast in operation.
+It need not, however, carry out complex forward planning or be capable
+of introspection (in the sense that expert systems are able to explain
+their actions).
+.pp
+In this talk I will examine a system that acquires knowledge by 
+constructing a model of its input behaviour and uses this to select its
+actions.  It can be viewed either as an automatic adaptive system  or
+as an instance of 'programming by example'.  Other workers have
+attempted to do this, by constructing compact models in some appropriate
+programming language:e.g. finite state automata [Bierman, 1972], 
+[Bierman and Feldman, 1972]; LISP [Bierman and Krishnaswamy, 1976]; 
+finite non-deterministic
+automata [Gaines,1976], [Gaines,1977],
+[Witten,1980]; high level languages [Bauer, 1979], [Halbert, 1981].
+These efforts, however, suffer from
+the flaw that for some inputs their computing time is 
+super-exponential in the number
+of inputs seen.  This makes them totally impractical in any system which
+is continuously receiving inputs over a long period of time.
+.pp
+The system I will examine comprises one or more simple independent
+models.  Because of their simplicity and because no attempt is made to 
+construct models which are minimal,
+the time taken to store new information and to make 
+predictions is constant and independent of the amount of information stored
+[Cleary, 1980].  This leads to a very integrated and responsive environment.
+All actions by the programmer are immediately incorporated into the program
+model. The actions are also acted upon so that their consequences are 
+immediately apparent.
+However, the amount of memory used could grow 
+linearly with time. [Witten, 1977] introduces a modelling system related
+to the one here which does not continually grow and which can be updated
+incrementally.
+.pp
+It remains to be shown that the very simple models used are capable 
+of generating any
+interestingly complex behaviour.
+In the rest of this
+talk I will use the problem of executing a subroutine to illustrate
+the potential of such systems.
+The example will also illustrate some of the techniques which have been
+developed for combining multiple models, [Cleary, 1980], [Andreae
+and Cleary, 1976], [Andreae, 1977], [Witten,1981].  It has also been
+shown in [Cleary, 1980] and in [Andreae,1977] that such systems can
+simulate any Turing machine when supplied with a suitable external memory.
+.sh "The modelling system"
+.pp
+Fig. 1 shows the general layout of the modeller.  Following the flow
+of information through the system it first receives a number of inputs
+from the external world.  These are then used to update the current
+contexts of a number of Markov models.  Note, that each Markov model
+may use different inputs to form its current context, and that they
+may be attempting to predict different inputs.  A simple robot
+which can hear and move an arm might have two models; one, say, in
+which the last three sounds it heard are used to predict the next
+word to be spoken, and another in which the last three sounds and the last
+three arm movements are used to predict the next arm movement. 
+.pp
+When the inputs are received each such context and its associated 
+prediction (usually
+an action) are added to the Markov model.  (No
+counts or statistics are maintained \(em they are not necessary.)  When the
+context recurs later it will be retrieved along with all the predictions
+which have been stored with it.
+.pp
+After the contexts have been stored they 
+are updated by shifting in the new inputs. These new contexts are then
+matched against the model and all the associated predictions are retrieved.
+These independent predictions from the individual Markov models
+are then combined into a single composite 
+prediction.
+(A general theory of how to do this has been
+developed in [Cleary, 1980]).  
+.pp
+The final step is to present this 
+composite prediction to a device I have called the 'choice oracle'.
+This uses whatever information it sees fit to choose the next action.
+There are many possibilities for such a device.  One might be to choose
+from amongst the predicted actions if reward is expected and to choose
+some other random action if reward is not expected.  The whole system then 
+looks like
+a reward seeking homeostat.  At the other extreme the oracle might be
+a human programmer who chooses the next action according to his own
+principles.  The system then functions more like a programming by
+example system \(em [Witten, 1981] and [Witten, 1982] give examples of such 
+systems.
+[Andreae, 1977] gives an example of a 'teachable' system lying between
+these two extremes.
+.pp
+After an action is chosen this is
+transmitted to the external world and the resultant inputs are used
+to start the whole cycle again.  Note that the chosen action will
+be an input on the next cycle.
+.sh "Subroutines"
+.pp
+An important part of any programming language is the ability to write a 
+fragment of a program and then have it used many times without it having
+to be reprogrammed each time.  A crucial feature of such shared code is
+that after it has been executed the program should be controlled by the
+situation which held before the subroutine was called. A subroutine can be 
+visualised as a black box with an unknown and arbitrarily complex interior.
+There are many paths into the box but after passing through each splits again
+and goes its own way, independent of what happened inside the box.
+.np
+Also, if there are $p$ paths using the subroutine and $q$ different sequences
+within it then the amount of programming needed should be proportional to
+$p + q$ and not $p * q$.  The example to follow possess both these properties
+of a subroutine.
+.rh "Modelling a Subroutine."
+The actual model we will use is described in Fig. 2.  There are two Markov
+models (model-1 and model-2) each seeing and predicting different parts of
+the inputs.  The inputs are classified into four classes; ACTIONs that
+move a robot (LEFT, RIGHT, FAST, SLOW), patterns that it 'sees' (danger,
+moved, wall, stuck) and two types of special 'echo' actions, # actions
+and * actions (*home, #turn).  The # and * actions have no effect on the 
+environment,
+their only purpose is to be inputs and act as place keepers for relevant
+information.  They may be viewed as comments which remind the system of
+what it is doing.  (The term echo was used in [Andreae,1977], where the
+idea was first introduced, in analogy to spoken words of which one
+hears an echo.)
+.pp
+Model-2 is a Markov model of order 2 and uses only # actions in its
+context and seeks to predict only * actions.  Model-1 is a Markov model 
+of order 3 and uses all four classes of inputs in its context.  It
+seeks to predict ACTIONs, # actions and * actions.  However, * actions
+are treated specially.  Rather than attempt to predict the exact * action
+it only stores * to indicate that some * action has occurred.  This
+special treatment is also reflected in the procedure for combining the
+predictions of the two models.  Then the prediction of model-2 is used,
+only if model-1 predicts an *.  That is, model-1 predicts that some 
+* action will occur and model-2 is used to select which one. If model-1
+does not predict an * then its prediction is used as the combined prediction
+and that from model-2 is ignored.
+.pp
+The choice oracle that is used for this example has two modes.  In
+programmer mode a human programmer is allowed to select any action
+she wishes or to acquiesce with the current prediction, in which case
+one of the actions in the combined prediction is selected.  In
+execution mode one of the predicted actions is selected and the
+programmer is not involved at all.
+.pp
+Before embarking on the actual example some points about the predictions
+extracted from the individual Markov models should be noted.  First, if 
+no context can be found stored in the memory which equals the current
+context then it is shortened by one input and a search is made for any
+recorded contexts which are equal over the reduced length.  If necessary
+this is repeated until the length is zero whereupon all possible
+allowed actions are predicted.
+.pp
+Fig. 3 shows the problem to be programmed.  If a robot sees danger it
+is to turn and flee quickly.  If it sees a wall it is to turn and return
+slowly.  The turning is to be done by a subroutine which, if it gets 
+stuck when turning left, turns right instead.
+.pp
+Fig. 4 shows the contexts and predictions stored when this is programmed.
+This is done by two passes through the problem in 'program' mode: once
+to program the fleeing and turning left; the other to program the wall
+sequence and the turning right.  Fig. 5 then shows how this programming
+is used in 'execute' mode for one of the combinations which had not been
+explicitly programmed earlier (a wall sequence with a turn left).  The
+figure shows the contexts and associated predictions for each step.
+(Note that predictions are made and new contexts are stored in both
+modes.  They have been omitted from the diagrams to preserve clarity.)
+.sh "Conclusion"
+.pp
+The type of simple modelling system presented above is of interest for a
+number of reasons.  Seen as a programing by example system, 
+it is very closely 
+integrated. Because it can update its models incrementally in real time
+functions such as input/output, programming, compilation and execution
+are subsumed into a single mechanism. Interactive languages such as LISP
+or BASIC gain much of their immediacy and usefulness by being interpretive 
+and not requiring a separate compilation step when altering the source
+program. By making execution integral with the process of program entry
+(some of) the consequencs of new programming become immediately apparent.
+.pp
+Seen as an adaptive controller, the system has the advantage of being fast
+and being able to encode any control strategy. Times to update the model
+do not grow with memory size and so it can operate continuously in real time.
+.pp
+Seen as a paradigm for understanding natural control systems, it has the
+advantage of having a very simple underlying storage mechanism. Also,
+the ability to supply an arbitrary choice oracle allows for a wide
+range of possible adaptive strategies.
+.sh "References"
+.in +4m
+.sp
+.ti -4m
+ANDREAE, J.H. 1977
+Thinking with the Teachable Machine.  Academic Press.
+.sp
+.ti -4m
+ANDREAE, J.H. and CLEARY, J.G. 1976
+A New Mechanism for a Brain.  Int. J. Man-Machine Studies
+8(1):89-119.
+.sp
+.ti -4m
+BAUER, M.A. 1979 Programming by examples. Artificial Intelligence 12:1-21.
+.sp
+.ti -4m
+BIERMAN, A.W. 1972
+On the Inference of Turing Machines from Sample Computations.
+Artificial Intelligence 3(3):181-198.
+.sp
+.ti -4m
+BIERMAN, A.W. and FELDMAN, J.A. 1972
+On the Synthesis of Finite-State Machines from Samples of
+their Behavior.  IEEE Transactions on Computers C-21, June:
+592-597.
+.sp
+.ti -4m
+BIERMAN, A.W. and KRISHNASWAMY, R. 1976 Constructing programs from example 
+computations. IEEE transactions on Software Engineering SE-2:141-153.
+.sp
+.ti -4m
+CLEARY, J.G. 1980
+An Associative and Impressible Computer. PhD thesis, University
+of Canterbury, Christchurch, New Zealand.
+.sp
+.ti -4m
+GAINES, B.R. 1976
+Behaviour/structure transformations under uncertainty.
+Int. J. Man-Machine Studies 8:337-365.
+.sp
+.ti -4m
+GAINES, B.R. 1977
+System identification, approximation and complexity.
+Int. J. General Systems, 3:145-174.
+.sp
+.ti -4m
+HALBERT, D.C. 1981
+An example of programming by example. Xerox Corporation, Palo Alto, 
+California.
+.sp
+.ti -4m
+WITTEN, I.H. 1977
+An adaptive optimal controller for discrete-time Markov
+environments.  Information and Control, 34, August: 286-295.
+.sp
+.ti -4m
+WITTEN, I.H. 1979
+Approximate, non-deterministic modelling of behaviour
+sequences.  Int. J. General Systems, 5, January: 1-12.
+.sp
+.ti -4m
+WITTEN, I.H. 1980
+Probabilistic behaviour/structure transformations using
+transitive Moore models.  Int. J. General Systems, 6(3):
+129-137.
+.sp
+.ti -4m
+WITTEN, I.H. 1981
+Programming by example for the casual user: a case study.
+Proc. Canadian Man-Computer Communication Conference, Waterloo,
+Ontario, 105-113.
+.sp
+.ti -4m
+WITTEN, I.H. 1982
+An interactive computer terminal interface which predicts user 
+entries. Proc. IEE Conference on Man-Machine Interaction,
+Manchester, England.
+.in -4m
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/paper5 b/src/test/java/org/xerial/snappy/testdata/calgary/paper5
new file mode 100644
index 0000000..342e782
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/paper5
@@ -0,0 +1,320 @@
+.pn 0
+.EQ
+delim $$
+define RR 'bold R'
+define SS 'bold S'
+define II 'bold I'
+define mo '"\(mo"'
+define EXIST ?"\z\-\d\z\-\r\-\d\v'0.2m'\(br\v'-0.2m'"?
+define NEXIST ?"\z\-\d\z\o'\-\(sl'\r\-\d\v'0.2m'\(br\v'-0.2m'"?
+define ALL ?"\o'V-'"?
+define subset '\(sb'
+define subeq  '\(ib'
+define supset '\(sp'
+define supeq  '\(ip'
+define mo '\(mo'
+define nm ?"\o'\(mo\(sl'"?
+define li '\& sup ['
+define lo '\& sup ('
+define hi '\& sup ]'
+define ho '\& sup )'
+.EN
+.ls 1	
+.ce
+A LOGICAL IMPLEMENTATION OF ARITHMETIC 
+.sp 3
+.ce
+John G. Cleary 
+.ce
+The University of Calgary, Alberta, Canada.
+.sp 20
+\u1\dAuthor's Present Address: Man-Machine Systems Group, Department of
+Computer Science, The University of Calgary, 2500 University Drive NW
+Calgary, Canada T2N 1N4. Phone: (403)220-6087.  
+.br
+.nf
+UUCP:  ...!{ihnp4,ubc-vision}!alberta!calgary!cleary
+       ...!nrl-css!calgary!cleary
+ARPA:  cleary.calgary.ubc at csnet-relay
+CDN:   cleary at calgary
+.fi
+.sp 2
+.ls 2
+.bp 0
+.ls 2
+.ce
+Abstract
+.pp
+So far implementations of real arithmetic within logic programming
+have been non-logical.  A logical description of the behaviour of arithmetic
+on actual
+machines using finite precision numbers is not readily available.  
+Using interval analysis a simple description of real arithmetic is possible.
+This can be translated to an implementation within Prolog.
+As well as having a sound logical basis the resulting system 
+allows a very concise and powerful programming style and is potentially
+very efficient.
+.bp
+.sh "1 Introduction"
+.pp
+Logic programming aims to use sets of logical formulae as
+statements in a programming language.
+Because of many practical difficulties the full generality of logic
+cannot (yet) be used in this way.   However, by restricting the
+class of formulae used to Horn clauses practical and efficient
+languages such as PROLOG are obtained.
+One of the main problems in logic programming is to extend this area
+of practicality and efficiency to an ever wider range of formulae and 
+applications.  
+This paper considers such an implementation for arithmetic.
+.pp
+To see why arithmetic as it is commonly implemented in PROLOG systems
+is not logical consider the following example:
+.sp
+.nf
+	X = 0.67, Y = 0.45, Z is X*Y, Z = 0.30
+.fi
+.sp
+This uses the notation of the 'Edinburgh style' Prologs.
+(For the moment we assume an underlying floating point
+decimal arithmetic with two significant places.)
+The predicate 'is' assumes its righthand side is an arithmetic
+statement, computes its value, and unifies the result with its lefthand side.
+In this case the entire sequence succeeds, however, there are some serious 
+problems.
+.pp
+In a pure logic program the order of statements should be irrelevant to
+the correctness of the result (at worst termination or efficiency might be
+affected).  This is not true of the example above.  The direction of execution
+of 'is' is strictly one way so that
+.sp
+	Y = 0.45, Z = 0.30, Z is X*Y
+.sp
+will deliver an error when X is found to be uninstantiated inside 'is'.
+.pp
+The second problem is that the answer Z = 0.30 is incorrect!\ 
+The correct infinite precision answer is Z = 0.3015.  This inaccuracy
+is caused by the finite precision implemented in the floating point
+arithmetic of modern computers.
+It becomes very problematic to say what if anything it means when
+Z is bound to 0.30 by 'is'.  This problem is exacerbated by long sequences
+of arithmetic operations where the propagation of such errors can lead the
+final result to have little or no resemblence to the correct answer.
+.pp
+This is further class of errors, which is illustrated by the fact that the
+following two sequences will both succeed if the underlying arithmetic rounds:
+.sp
+	X = 0.66, Y = 0.45, Z = 0.30, Z is X*Y
+.br
+	X = 0.67, Y = 0.45, Z = 0.30, Z is X*Y
+.sp
+This means that even if some invertable form of arithmetic were devised
+capable of binding X when:
+.sp
+	Y = 0.45, Z = 0.30, Z is X*Y
+.sp
+it is unclear which value should be given to it.
+.pp
+The problem then, is to implement arithmetic in as logical a manner
+as possible while still making use of efficient floating point arithmetic.
+The solution to this problem has three major parts.
+The first is to represent PROLOG's 
+arithmetic variables internally as intervals of real numbers.
+So the result of 'Z is 0.45*0.67' would be to bind Z to the 
+open interval (0.30,0.31).  
+This says that Z lies somewhere in the interval
+$0.30 < Z < 0.31$, which is certainly true, and probably as informative
+as possible given finite precision arithmetic.
+(Note that Z is NOT bound to the data structure (0.30,0.31), this
+is a hidden representation in much the same way that pointers are used
+to implement logical variables in PROLOG but are not explicitly visible
+to the user.  Throughout this paper brackets such as (...) or [...] will
+be used to represent open and closed intervals not Prolog data structures.)
+.pp
+The second part of the solution is to translate expressions such as
+\&'Z is (X*Y)/2' to the relational form 'multiply(X,Y,T0), multiply(2,Z,T0)'.
+Note that both the * and / operators have been translated to 'multiply'
+(with parameters in a different order).  This relational form will be seen to 
+be insensitive to which parameters are instantiated and which are not,
+thus providing invertibility.
+.pp
+The third part is to provide a small number of control 'predicates' able
+to guide the search for solutions.
+The resulting system is sufficiently powerful to be able to
+solve equations such as '0 is X*(X-2)+1' directly.
+.pp
+The next section gives a somewhat more formal description of arithmetic
+implemented this way.  Section III gives examples of its use and of the
+types of equations that are soluble within it.  Section IV compares our 
+approach here with that of other interval arithmetic systems and with
+constraint networks.  Section V notes some possibilities for a parallel 
+dataflow implementation which avoids many of the difficulties of traditional
+dataflow execution.
+.sh "II. Interval Representation"
+.pp
+Define $II(RR)$ to be the set of intervals over the real numbers, $RR$.
+So that the lower and upper bounds of each interval can be operated on as 
+single entities they will be treated as pairs of values.  
+Each value having an attribute of being open or closed 
+and an associated number.  For example the interval (0.31,0.33] will be
+treated as the the pair $lo 0.31$ and $hi 0.33$.  
+The brackets are superscripted to minimize visual confusion when writeing 
+bounds not in pairs.
+As well as the usual real numbers 
+$- inf$ and $inf$, will be used as part of bounds,
+with the properties that $ALL x mo RR~- inf < x < inf$ 
+The set of all upper bounds is defined as:
+.sp
+	$H(RR)~==~\{ x sup b : x mo RR union \{ inf \},~b mo \{ hi , ho \} \} $
+.sp
+and the set of lower bounds as:
+.sp
+	$L(RR)~==~\{ \& sup b x : x mo RR union \{ -inf \},~b mo \{ li , lo \} \} $
+.sp
+The set of all intervals is then defined by:
+.sp
+	$II(RR)~==~L(RR) times H(RR)$
+.sp
+Using this notation rather loosely intervals will be identified 
+with the apropriate subset of the reals.  For example the following 
+identifications will be made:
+.sp
+	$[0.31,15)~=~< li 0.31, ho 15 >~=~ \{ x mo RR: 0.31 <= x < 15 \}$
+.br
+	$[-inf,inf]~=~< li -inf , hi inf> ~=~ RR$
+.br
+and	$(-0.51,inf]~=~< lo -0.51 , hi inf >~=~ \{ x mo RR: 0.51 < x \}$
+.sp
+The definition above carefully excludes 'intervals' such as $[inf,inf]$
+in the interests of simplifying some of the later development.
+.pp
+The finite arithmetic available on computers is represented by a
+finite subset, $SS$, of $RR$.  It is assumed that 
+$0,1 mo SS$.  The set of intervals allowed over $SS$ is $II(SS)$ defined as 
+above for $RR$.  $SS$ might be a bounded set of integers or some more complex
+set representable by floating point numbers.
+.pp
+There is a useful mapping from $II(RR)$ to $II(SS)$ which associates
+with each real interval the best approximation to it:
+.nf
+.sp
+	$approx(<l,h>)~==~<l prime, h prime >$
+.br
+where	$l prime mo L(SS), l prime <= l, and NEXIST x mo L(SS)~l prime <x<l$
+.br
+	$h prime mo H(SS), h prime >= h, and NEXIST x mo H(SS)~h prime >x>h$.
+.pp
+The ordering on the bounds is defined as follows:
+.sp
+	$l < h, ~ l,h mo II(RR)~ <->~l= \& sup u x and h = \& sup v y$
+			and $x<y$ or $x=y$ and $u<v$
+where 	$ ho, li, hi, lo$ occur in this order and $x<y$ is the usual ordering 
+on the reals extended to include $-inf$ and $inf$.  
+The ordering on the brackets is carefully chosen so that intervals such as
+(3.1,3.1) map to the empty set.
+Given this definition it is easily verified that 'approx' gives
+the smallest interval in $II(SS)$ enclosing the original interval in $II(RR)$.
+The definition also allows the intersection of two intervals to be readily 
+computed:
+.sp
+	$<l sub 1,h sub 1> inter <l sub 2, h sub 2>~=~$
+		$< max(l sub 1 , l sub 2), min(h sub 1 , h sub 2 )>$
+.sp
+Also and interval $<l,h>$ will be empty if $l > h$.  For example, according
+to the definition above $lo 3.1 > ho 3.1$ so (3.1,3.1) is correctly computed
+as being empty.
+.pp
+Intervals are introduced into logic by extending the notion of 
+unification.  A logical variable I can be bound to an interval $I$,
+written I:$I$.  Unification of I to any other value J gives the following
+results:
+.LB
+.NP
+if J is unbound then it is bound to the interval, J:$I$;
+.NP
+if J is bound to the interval J:$J$ then
+I and J are bound to the same interval $I inter J$.
+The unification fails if $I inter J$ is empty.
+.NP
+a constant C is equivalent to $approx([C,C])$;
+.NP
+if J is bound to anything other than an interval the unification fails.
+.LE
+.pp
+Below are some simple Prolog programs and the bindings that result when
+they are run (assuming as usual two decimal places of accuracy).
+.sp
+.nf
+	X = 3.141592
+	X:(3.1,3.2)
+
+	X > -5.22, Y <= 31, X=Y
+	X:(-5.3,32]  Y:(-5.3,31]
+.fi
+.sp
+.rh "Addition"
+.pp
+Addition is implemented by the relation 'add(I,J,K)'
+which says that K is the sum of I and J.
+\&'add' can be viewed as a relation on $RR times RR times RR$ defined
+by:
+.sp
+	$add ~==~ \{<x,y,z>:x,y,z mo  RR,~x+y=z\}$
+.sp
+Given that I,J, and K are initially bound to the intervals $I,J,K$ 
+respectively, the fully correct set of solutions with the additional
+constrain 'add(I,J,K)' is given by all triples in the set 
+$add inter I times J times K$.  
+This set is however infinite, to get an effectively computable procedure
+I will approximate the additional constraint by binding I, J and K
+to smaller intervals.  
+So as not to exclude any possible triples the new bindings, 
+$I prime, J prime roman ~and~ K prime$ must obey:
+.sp
+	$add inter I times J times K ~subeq~ I prime times J prime times K prime$
+.sp
+Figure 1 illustrates this process of
+.ul
+narrowing.
+The initial bindings are I:[0,2], J:[1,3]
+and K:[4,6].  After applying 'add(I,J,K)' the smallest possible bindings
+are I:[1,2], J:[2,3] and K:[4,5].  Note that all three intervals have been
+narrowed.
+.pp
+It can easily be seen that:
+.sp
+	$I prime supeq \{x:<x,y,z> ~mo~ add inter I times J times K \}$
+.br
+	$J prime supeq \{y:<x,y,z> ~mo~ add inter I times J times K \}$
+.br
+	$K prime supeq \{z:<x,y,z> ~mo~ add inter I times J times K \}$
+.sp
+If there are 'holes' in the projected set then $I prime$ will be a strict
+superset of the projection, however, $I prime$ will still 
+be uniquely determined by the projection.  This will be true of any
+subset of $RR sup n$ not just $add$.
+.pp
+In general for
+.sp
+	$R subeq RR sup n,~ I sub 1 , I sub 2 , ... , I sub n mo II(RR)$
+and $I prime  sub 1 , I prime  sub 2 , ... , I prime  sub n mo II(RR)$
+.sp
+I will write 
+.br
+	$R inter I sub 1 times I sub 2 times ... times I sub n nar 
+I prime sub 1 times I prime sub 2 times ... times I prime sub $
+.br 
+when the intervals $I prime sub 1 , I prime sub 2 , ... , I prime sub $
+are the uniquelly determined smallest intervals including all solutions.
+
+.sh "IV. Comparison with Interval Arithmetic"
+.pp
+.sh "V.  Implementation"
+.pp
+.sh "VI. Summary"
+.sh "Acknowledgements"
+.sh "References"
+.ls 1
+.[
+$LIST$
+.]
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/paper6 b/src/test/java/org/xerial/snappy/testdata/calgary/paper6
new file mode 100644
index 0000000..24bfd96
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/paper6
@@ -0,0 +1,1019 @@
+.EQ
+delim $$
+define <- ?< "\h'-0.5m'" up 10 "\(em" down 10 ?
+define gtorder ?"\z>\d\~\u"?
+define EXIST ?"\z\-\d\z\-\r\-\d\v'0.2m'\(br\v'-0.2m'"?
+define ALL ?"\o'V-'"?
+define 0M '0~...~M-1'
+define LH 'lo~...~hi'
+define RR 'bold R'
+define HH 'bold H'
+define KK 'bold K'
+define or '"\fBor\fI"~'
+define and '"\fBand\fI"~'
+define if '"\fBif\fI"~'
+define then '"\fBthen\fI"~'
+define else '"\fBelse\fI"~'
+define repeat '"\fBrepeat\fI"~'
+define until '"\fBuntil\fI"~'
+define while '"\fBwhile\fI"~'
+define do '"\fBdo\fI"~'
+define case '"\fBcase\fI"~'
+define end '"\fBend\fI"~'
+define begin '"\fBbegin\fI"~'
+define elseif '"\fBelseif\fI"~' 
+define for '"\fBfor\fI"~'
+define From '"\fBfrom\fI"~'
+define To '"\fBto\fI"~'
+define exit '"\fBexit\fI"~'
+.EN
+.ls 1	
+.ce
+COMPACT HASH TABLES USING BIDIRECTIONAL LINEAR PROBING
+.sp 3
+.ce
+John G. Cleary
+.ce
+The University of Calgary, Alberta, Canada.
+.sp 3
+.sp 20
+\u1\dAuthors Present Address: Man-Machine Systems Group, Department of
+Computer Science, The University of Calgary, 2500 University Drive NW
+Calgary, Canada T2N 1N4.
+.sp
+\u2\dThis research was supported by
+the Natural Sciences and Engineering Research Council of Canada.
+.sp 2
+.ls 2
+.bp
+Index Terms --  Searching, hash storage, open addressing, 
+bidirectional linear probing,
+address calculation, information retrieval, scatter storage, 
+performance analysis, memory compaction.
+.bp
+.pp
+Abstract -- An algorithm is developed which reduces the memory 
+requirements of hash tables.
+This  is achieved by storing only
+a  part of each key along with a few extra bits needed to ensure that
+all keys are stored unambiguously.  The fraction of each key stored
+decreases as the size of the hash table increases.  Significant reductions
+in total memory usage can be achieved especially when the key size is not
+much larger than the size of a memory index and when only a small amount
+of data is stored with each key.
+The algorithm is  based on 
+bidirectional linear probing.
+Search and insertion times are shown by simulation 
+to be similar to those
+for ordinary bidirectional linear probing.
+.bp
+.sh "1 Introduction"
+.pp
+The retrieval of a single item from among many others is a common problem
+in computer science.  I am particularly concerned here with the case where 
+the item is retrieved on the basis of a single label
+or key attached to each entry and where the keys are not ordered in any
+particular way.
+There is a well known solution
+to this problem in the form of hash tables.
+Knuth [8], Knott [7] and Maurer and Lewis [11] provide good introductions to 
+this subject.
+.pp
+An efficient version of hashing called
+.ul
+bidirectional linear probing 
+(BLP),
+was developed by Amble and Knuth [1].
+As it forms the basis of what follows it is described in more detail in the
+following section.  Section 3 shows how it can be modified so as to 
+significantly reduce its memory requirements.  This is done by storing only
+a small part of each key -- a few extra bits are needed to ensure 
+that different keys, that look the same after truncation, are correctly
+distinguished.
+.pp
+The execution time of this compact hashing algorithm is considered in
+Section 4.  It is shown by simulation to be 
+similar to  ordinary BLP
+for both successful searches and insertion.  It is significantly
+better for unsuccessful searches.  
+.pp
+A hashing scheme similar to compact hashing in that not all of the key is
+stored has been proposed by Andreae [2] (Chapter 1).  However, his technique 
+has a small but finite probability of retrieving an incorrect key.
+Although compact hashing
+is not based on this earlier technique it provided the impetus to
+seek the current solution.
+.pp
+In hashing algorithms using an overflow area and a linked list of synonyms
+or by variations of this using buckets (see Maurer and Lewis [11]) only the
+remainder of each key need be stored.  This has been known since at least
+1965 (Feldman and Low [6] and Knuth [8] sec. 6.4, exercise 13, p543).  
+However, each entry (including the original hash location) requires a pointer
+to the next overflow record.  This pointer will about the same size as the
+reduction in the key size.  So, there is no net memory saving  over
+open addressing techniques such as BLP.
+.pp
+Amongst the possible applications of compact hashing is the storage
+of trees and TRIES without the use of pointers but still preserving
+a $log N$ retrieval time. 
+It is hoped to report on this application in more detail later.
+.pp
+Pascal versions of the algorithms described below are available
+from the author.
+.sh "2 Bidirectional linear probing."
+.pp
+I will now introduce the open addressing technique which forms the basis
+of compact hashing.
+The 
+.ul
+hash table
+in which the keys will be stored is an array $T[ 0M ]$ .  I will
+be concerned only with the the keys themselves as the 
+items associated with each key do not 
+significantly affect the algorithms.  In order to compute the location
+for each key I will use two functions: $t$ which randomises the original
+keys, and $h$ which computes a value in the range $0M$.  
+.pp
+Let $KK$ be the set of all possible keys and $HH$ be the set of all possible
+transformed keys.  Then $t: KK -> HH$ is an invertible function.
+This function is introduced
+to ensure that the keys stored are  random and so, as a consequence,
+the hashing
+procedure has a satisfactory
+average performance.  In what follows these transformed
+keys will be used rather than the original keys.  For example, it is the 
+transformed keys that are stored in $T$.  (-1 is used to indicate an unoccupied
+location in $T$.)
+.pp
+$h: HH ->"{" 0M "}"$ and has the 
+property that for
+$H sub 1 ~, H sub 2 ~ "\(mo" HH$
+$H sub 1 ~<=~ H sub 2~~ "\fBiff\fP"~~h(H sub 1 ) ~<=~ h(H sub 2 )$.  
+As a consequence the keys will be mapped 
+into the hash table in the same order as the values of their transformed
+keys.  
+This ordering is essential to the compaction attained later.
+Suitable functions $t$ and $h$ have been extensively discussed 
+(Carter and Wegman, [3]; Knott [7]; Lum, [9]; Lum, Yuen and Dodd, [10]).
+These authors show that there are functions which almost always make
+the distribution of transformed keys random.  I will not consider any
+particular functions for $t$ although some examples of $h$ will be introduced
+later.
+.pp
+To retrieve a key, $K$, from the hash table the transformed key and the 
+hash location are first computed.  If the (transformed) key stored at the
+hash location is greater than $t(K)$ then the table is searched upward 
+until one of three things happen.  Either an empty location will be found,
+$T[j]=-1$, or the sought key will be found, $T[j]=t(K)$, or a key greater
+than the sought key will be found, $T[j]>t(K)$.  If the first key examined
+is less than $t(K)$ then an analogous search is done down the hash table.
+The search is successful if the sought key is found, that is
+if the last location examined is equal to $t(K)$, and is unsuccessful
+otherwise.  (See Amble and Knuth [1] for the details of this algorithm).
+.pp
+For a given set of keys there are many ways that they can be arranged in $T$
+so that the search algorithm above will  still work correctly.
+There is thus
+freedom, when designing an algorithm to insert new keys, to choose different 
+strategies for positioning the keys.
+There are two conditions that must be satisfied when a new key is inserted.
+One is that all keys in the memory must remain in ascending order
+and the other is that there must be no empty locations between the original hash
+location of any key and its actual storage position.  These imply that all
+keys sharing the same initial hash location must form a single unbroken group.
+.pp
+Within these constraints one would like to insert a new key so as to minimise 
+later retrieval times and the time to do the insertion itself.  Intuitively
+keys which share the same initial hash location should be centered around that
+initial address.  There are two ways of inserting keys which cause little
+disturbance to the memory.  One is to find the position where the key should
+be placed according to its ordering and then to create a gap for it by
+moving 
+.ul
+up 
+all entries from this position up to the next empty location.  The second way is
+symmetric to this and creates a gap by moving entries 
+.ul
+down 
+one location.
+The insertion algorithm given by  Amble and Knuth [1] chooses which of these
+two moves to make using a strategy which is  guaranteed to minimise the number
+of locations in $T$ which are examined during later successful or unsuccessful
+searches, although it is not guaranteed to minimise the insertion time itself.
+.pp
+One  consequence of this insertion strategy is that sometimes it is necessary
+to move entries below 0 and above $M$ in the array $T$.  One solution to this
+would be to make the array circular and move entries from 0 to $M-1$ and
+vice versa.  However, following Amble and Knuth [1], I will instead extend
+the array $T$ and other arrays to be defined later at their top and bottom.
+This gives 'breathing room' for the array to expand.  An extra 20 entries
+at the top and bottom were found to be quite sufficient for all
+the simulation runs reported in Section 4.  Accordingly I will define
+$lo ~=~-20$ and $hi~=~M+19$ and define the array $T$ over the range
+$lo$ to $hi$.
+.sh "3 Compact Hashing Using Bidirectional Linear Probing"
+.pp
+I will now show that the memory required to store the keys in BLP can be
+significantly reduced.  First consider the case when
+the number of possible keys in $KK$ is less than $M$, then every possible key
+can be assigned its own location in $T$ without possibility of collision.
+In this case $T$ degenerates to an ordinary indexed array and the keys need
+never be stored.  At worst a single bit might be needed to say whether
+a particular key has been stored or not.  This raises the question of whether
+it is necessary to hold the entire key in memory if the key space $KK$ is slightly
+larger than $M$.  For example if $KK$ were, say, four times larger than $M$
+then it might be possible to hold only two bits of the key rather than the entire
+key.  The reasoning here is that the main function of the stored keys is to
+ensure that entries which collide at the same location can be correctly
+separated.
+Provided $h$ is suitably chosen at most four keys can be mapped to a 
+single location.  The two bits might then be sufficient to store four
+different values for these four keys.  It is in fact 
+possible to realise this
+reduction in stored key size although a fixed amount of extra information 
+is needed
+at each location in order to correctly handle collisions.
+.pp
+So that I can talk about the part of the key which is in excess of the
+address space I will now introduce a 
+.ul
+remainder function
+$r$.  $r$ maps from the transformed keys $HH$ to a set of remainders 
+$RR~==~"{"0,~1,~2,~...,~Rm-1"}"$.  
+It  is these remainders that will be stored in lieu
+of the transformed keys.  
+The essential property
+of $r$ is that $r(H)$ and $h(H)$ together are sufficient to uniquely 
+determine $H$.  
+.pp
+.ne 9
+Formally,
+.sp
+	$RR ~~==~~ "{"0,~1,~2,~...,~Rm-1"}"$
+.sp
+	$r: HH -> RR$
+.sp
+and	$h( H sub 1 )~=~h( H sub 2 )~and~r( H sub 1 )~=~r( H sub 2 )
+~~ "\fBiff\fP" ~~ H sub 1 ~~=~~ H sub 2$ .
+.sp
+For a given function $h$ there are usually many possible functions $r$.
+One particularly simple pair of functions, referred to by Maurer and Lewis [10]
+as the 
+.ul
+division method, 
+is $h(H)~~=~~ left floor^ H/Rm right floor$ and
+$r(H)~~=~~ H~ "\fBmod\fP"~Rm$ . 
+.sp
+When $r$ is defined as above and $Rm$ is between $2 sup d$ and $2 sup d+1$ 
+the number of bits needed to 
+specify a remainder is the number of bits in the key less $d$.
+.pp
+Consider a new array
+$R [ LH ]$ into which the remainders will be stored.   
+In what follows $R$ will be kept in place of $T$ but it will be useful to
+talk about $T$ as if it were still there.  $R$ and the additional arrays to
+be introduced shortly specify just the information in $T$, albeit
+more compactly.  Each value $R [i]$ will hold the value $r(T[i])$ with the
+exception that when $T[i]$ is $-1$ (marking an empty location) then $R[i]$
+is also set to $-1$.  If
+there have been no collisions then each $R[i]$ paired with the value $i$
+unambiguously gives the transformed key that would have been stored in $T[i]$.
+However, if there have been collisions it is not possible
+to tell if a value of $R[i]$ is at its home location or if it has been moved
+from, say, $i-1$ and corresponds to a key, $H$, where $r(H)~=~ R[i]$ and $h(H)~=~i-1$.
+If there were some way to locate for each $R[i]$ where it was originally 
+hashed then the original keys could all be unambiguously determined.
+This can be done by maintaining two extra arrays of bits, the virgin array $V$,
+and the change array $C$.
+.pp
+The virgin array
+$V[ LH ]$ marks those 
+locations which have never been hashed to.  That is, $V[i]$ has a value of $1$
+stored if any of the stored keys in the hash table has $i$ as its hash
+address, and $0$ otherwise.  $V$ is maintained by initialising it to $0$
+and thereafter setting $V[h(H)] <-~1$ whenever a key $H$ is inserted in the
+memory.  The virginity of a location is unaffected by the move operations
+during insertion.
+The $V$ array is similar to the array of pass bits recommended in [1].
+.pp
+To understand the change array $C[ LH ]$ it is necessary to look more closely
+at the distribution of values of $R[i]$.  These remainders can be grouped 
+according to whether or not they share the same original hash address.
+Also recall that the hash table, as in BLP, is ordered, so,
+all the remainders in a particular group will occur at 
+consecutive locations. 
+The change bits $C[i]$ are used to delimit the 
+boundaries of these groups.  This is done by marking the first remainder
+(the one stored at the lowest address) of each group with a $1$.  All other 
+members of a group have $C[i]=0$.  To simplify the search and insertion
+algorithms it is also convenient to set $C[i]$ to 1 for all locations
+which are empty ($R[i]=-1$).
+Thus we have the formal definitions of the
+values of $V$ and $C$ in terms of the now notional array $T$ (the array
+$A$ is described later):
+.bp
+.nf
+.ls 1
+.ta 0.5i +0.75i +0.9i
+		\(lt\|$r(T[i])$	$T[i] != -1$
+	$R[i]~~==~~$	\(lk\|
+		\(lb\|$-1$ 	$T[i]=-1$
+.sp
+		\(lt\|$1	EXIST~ j~h(T[j])=i$
+	$V[i]~~==~~$	\(lk\|
+		\(lb\|$0$	otherwise
+.sp
+		\(lt\|$1	T[i] != T[i-1]~ roman or ~T[i]=-1$
+	$C[i]~~==~~$	\(lk\|
+		\(lb\|$0$	otherwise
+.sp 2
+		\(lt\|$a(i)	-Na <= a(i) <= Na$
+	$A[i]~~==~~$	\(lk\|
+		\(lb\|$inf$	otherwise
+.sp
+	where
+.sp
+		$Na ~>=~ 0$
+.br
+		$a(i)~==~ sum from j=lo to i |C[j]=1~"and"~R[j] != -1|~-~
+sum from j=lo to i V[j]$
+.fi
+.ls 2
+.ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i 
+.rh "Searching.
+For every group of remainders there will somewhere be a $V$ bit equal to $1$ 
+and a $C$
+bit  at a non-empty location equal to $1$.  That is,
+for every $V$ bit which is $1$ there is a corresponding $C$ bit 
+which is also $1$.
+.FC "Fig. 1."
+This correspondence is indicated in 
+Fig. 1 by the dotted lines.  When searching for a key $H$ in the table
+the location $h(H)$ is examined.  If the $V$ bit is $0$ then the search 
+can stop
+immediately.  Otherwise a search is made for the corresponding $C$ bit 
+which is $1$.  To do this a search is made down (or up) the hash table until
+an empty location is found.  The number of $V$ bits which are $1$
+from $h(H)$ to this empty
+location are counted.  The correct $C$ bit is then found by counting back
+up (or down) the array from the empty location
+for the same number of $C$ bits which are $1$.  Details of this algorithm
+follow.
+.ls 1
+.sp 
+.nf
+.ta 1.5c +1.35c +1.35c +1.35c +1.35c +1.35c +1.35c +1.35c +1.35c
+.sp
+.ne 2
+Step 1:	{initialise variables}
+	$H <-~ t(K);~~j <-~ h(H);~~rem <-~ r(H);~i <-~ j;~~count <-~ 0;$
+	{check virgin bit}
+	$if~ V[j]=0~then$ {search unsuccessful} $exit ;$
+.sp
+.ne 3
+Step 2:	{find first empty location down the table}
+	$while ~R[i] != -1~do~~begin~~count <-~count - V[i];~i <-~ i-1 ~end ;$
+.sp
+.ne 4
+Step 3:	{search back to find uppermost member of relevant group}
+	$while count < 0 ~do~begin~ i <-~i+1;~count <-~count +C[i];~end ;$
+	{$i$ now points at the first(lowest) member of the group associated}
+	{with the original location $j$}
+.sp
+.ne 6
+Step 4:	{search group associated with $j$}
+	$while R[i+1] <= rem ~and C[i+1]=0~do i <-~i+1 ;$
+	{check last location to see if key found}
+	$if R[i]=rem~ mark then$ {search successful}
+	$lineup            else$ {search unsuccessful} ;
+.sp 2
+.ls 2
+.fi
+.pp
+An example search is illustrated in Fig. 1 for the key 75.
+For this example $h$ is computed by dividing by 10 and rounding down, 
+$r$ is computed by taking the remainder modulo 10.  
+.br
+Step 1: The initial hash location
+for 75 is 7 and its remainder is 5.  The $V$ bit at location 7 is 1 so the 
+search continues.
+.br
+Step 2:
+The first empty location found by searching down the table is at location 3.
+There are three $V$ bits with a value of 1 between 7 and 3 at locations 
+4, 6 and 7.
+.br
+Step 3:
+Counting back from location 3 three $C$ bits are 1 at locations 4, 5 and 8.
+So the $C$ bit at location 8 corresponds to the $V$ bit at the 
+original hash location 7.
+.br
+Step 4:
+The group of remainders which share the same initial location 7 can then be 
+found in locations 8 and 9.  Thus the remainder 5 at location 8 can be
+unambiguously associated with the original key 75 and so it can be
+concluded that the information associated with the key 75 is present 
+at location 8 in the memory.
+.pp
+It still remains to specify the update
+algorithm and to address some issues of efficiency.  To this end a third
+array will be added.
+.rh "Speeding up search."
+It was found during the simulations reported in Section 4 
+that the most time consuming element of this search
+is step 2 when the table is scanned for an empty location.  The essential
+role played by the empty locations here is to provide a synchronisation
+between the 1 bits in the $V$ and $C$ arrays. 
+This lengthy search could be eliminated by maintaining two additional arrays,
+$#C[ LH ]$ and $#V[ LH ]$, which count from the start of memory the number of 
+$C$ and $V$ bits which are 1.  That is:
+.br
+	$#C[i] ~==~ sum from j=lo to i |C[j]=1~and~R[j] != -1 |$
+.br
+and	$#V[i] ~==~ sum from j=lo to i V[j]$ .
+.br
+.pp
+In order to find the $C$ bit corresponding to some $V[i]=1$ then all that 
+is necessary is to compute the difference $count <-~#C[i]-#V[i]$.  
+If $count$ is zero then the remainder stored at $i$ was originally
+hashed there and has not been moved.  If $count$ is positive then it is 
+necessary to scan down the memory until $'count'$ $C$ bits equal to 1 have been 
+found.  If $count$ is negative then it is necessary to scan up the memory
+until $'-count'$ $C$ bits which are 1 have been found.  Fig. 2 shows some
+examples of the various situations which can arise.
+.FC "Fig. 2."
+.pp
+In fact, it is not necessary to store $#C$ and $#V$ explicitly, it is 
+sufficient merely to store the differences $#C[i]-#V[i]$.  To do this the
+.ul
+At home
+array, $A[ LH ]$, will be used.
+.pp
+At this point it might seem that all earlier gains have been lost because
+in the most extreme case $#C[i]-#V[i]~=~M$.  To store a value of $A$
+will require as many bits as a memory index -- precisely the gain made by
+storing remainders rather than keys!\   However, all is not lost.  The values 
+of $A$ tend to cluster closely about 0.  Simulation
+shows that a hash memory which is 95% full has 99% of the $A$ values
+in the range -15 to +15.  Therefore the following strategy can be
+adopted.  Assign a fixed number of bits for storing each value of $A$, say
+5 bits.  Use these bits to represent the 31 values -15 to +15 and a 32nd
+value for $inf$.  Then anywhere that $#C[i]-#V[i]~<~-15~"or"~>+15$ assign $inf$
+to $A[i]$ otherwise assign the true difference.
+.pp
+When searching for a key a scan can now be done down (or up) the memory
+until a location $i$ where $A[i] != inf$ is found.  (At worst this will occur
+at the first unoccupied location where $A[i]$ will be zero.)\  From there
+a count can be made up (or down) the memory for the appropriate number of
+$C$ bits which are 1.
+.pp
+In the detailed algorithm given below some differences from the simpler search
+can be noted.
+In step 3, $count$ can be both
+positive and negative.  Therefore code is included to scan both up and down
+the memory as appropriate.  At the end of step 3, $i$ can be pointing at any
+member of the group associated with the original hash location.  (Above
+$i$ was always left pointing at the lowest member of the 
+group.)\    Therefore code is included for scanning both up and down the
+members of the group.  In order to prevent redundant checking of locations
+by this code a flag $direction$ is used.  It can take on three values
+depending on the direction of the memory scan: $"up"$, $"down"$, and $here$
+(no further searching need be done).
+.ls 1
+.sp 
+.nf
+.ta 1.5c +1.45c +1.45c +1.35c +1.35c +1.35c +1.35c +1.35c +1.35c
+.sp
+.ne 2
+{Search using at-home count}
+Step 1:	{initialise variables}
+	$H <-~ t(K);~~j <-~ h(H);~~rem <-~ r(H);~~i <-~ j;~~count <-~ 0;$
+	{check virgin bit}
+	$if~ V[j]=0~then$ {search unsuccessful} $exit ;$
+.sp
+.ne 5
+Step 2:	{find first well defined $A$ value down the memory}
+	$while ~A[i] = inf~do~begin~count <-~count - V[i];~i <-~i-1 ~end ;$
+	$count <-~count +A[i];$
+.sp
+.ne 16
+Step 3:	{Search either up or down until a member of sought group is found}
+	{Also ensure $direction$ is set for Step 4.}
+	$if count < 0 ~then$
+		$direction <-~"up";$
+		$repeat i <-~i+1;~count <-~count +C[i]~ until count = 0 ;$
+		$if R[i] ~>=~ rem ~then direction <-~here;$
+	$else if count > 0 ~then$
+		$direction <-~"down";$
+		$repeat ~count <-~count -C[i];~i <-~i-1~ until count = 0 ;$
+		$if R[i] ~<=~ rem ~then direction <-~here;$
+	$else${$count = 0$}
+		$if R[i] > rem ~then direction <-~"down"$
+		$else if R[i] < rem ~then direction <-~"up"$
+		$else direction <-~here ;$
+.sp
+.ne 16
+Step 4:	{search group associated with $j$}
+	$case direction~ "\fBof\fP"$
+	$here:	;${do nothing}
+	$"down":	repeat	if C[i] = 1 ~then direction <-~here$
+			$else$
+			$begin$
+				$i <-~i-1;$
+				$if R[i] ~<=~ rem ~then direction <-~here;$
+			$end$
+		$until direction = here ;$
+	$"up":	repeat	if C[i+1] = 1 ~then direction <-~here$
+			$else$
+			$begin$
+				$i <-~i+1;$
+				$if R[i] ~>=~ rem ~then direction <-~here;$
+			$end$
+		$until direction = here ;$
+	$end ;$
+.sp
+.ne 4
+Step 5:	{check last location to see if key found}
+	$if R[i]=rem~ mark then$ {search successful}
+	$lineup            else$ {search unsuccessful} ;
+.sp 2
+.ls 2
+.fi
+.FC "Fig. 3."
+.pp
+Fig. 3, gives an example of this searching algorithm.
+The same memory and key (75) as in Fig. 1 are used.  For the
+purposes of the example each $A$ value is allocated one bit.  This allows 
+only two values 0 and $inf$.  The search proceeds as follows:
+.br
+Step 1: The initial hash location
+for 75 is 7 and its remainder is 5.  The $V$ bit at location 7 is 1 so the 
+search continues.
+.br
+Step 2: 
+The first $A$ value not equal to $inf$ found by searching down the table 
+is at location 6.
+There is one $V$ bit with a value of 1 between 7 and 6, at location 7.
+$count$ is then set to $A[6]+1~=~1$.  So on the next step one $C$
+bit will be sought.
+.br
+Step 3:
+Counting back up from 6 the first $C$ bit equal to 1 is at location 8.
+So the $C$ bit at location 8 corresponds to the $V$ bit at the 
+original hash location 7.
+.br
+Step 4:
+The group of remainders which share the same initial location 7 can then be 
+found in locations 8 and 9.  The remainder 5 at location 8 can thus be
+unambiguously associated with the original key 75 and it can be
+concluded that the information associated with the key 75 is present 
+at location 8 in the memory.
+.rh "Insertion."
+Insertion of a new key into the memory requires three distinct steps:
+first locating whereabouts in the memory the key is to be placed;
+second deciding how the memory is to be rearranged to make room for the new
+key; and third moving the remainders whilst correctly preserving the
+$A$ and $C$ values.  (The $V$ bits remain fixed during the move.)\  
+The initial search can be done as explained above with the small addition that
+the correct insertion point must still be located when the key is not present.
+The second and third steps follow the algorithm in Amble and Knuth [1]
+with the addition that the values of the $A$ array must be re-calculated
+over the shifted memory locations and the $C$ but not the $V$ bits must
+be moved with the keys.  
+Details of this can be found in an earlier draft of this paper, [4].
+.sh "4 Performance"
+.pp
+Now I consider how long these algorithms will take to run.  The measure of 
+run time that I will use is the number of 
+.ul
+probes
+that each algorithm makes, that is, the number of times locations in the 
+hash table are examined or updated.  
+CPU time measures were taken as well and correlate well with the empirical 
+counts of probes given below.
+.FC "Table I"
+.FC "Table II"
+.rh "Searching."  
+Tables I and II list the results of simulations
+for successful and unsuccessful searches respectively.  Results are tabulated
+for ordinary BLP and for compact hashing with  
+different memory loadings and different sizes for
+the $A$ field.  If the number of keys stored
+in the memory is $N$ then the memory loading is measured by 
+$alpha ~==~N/M$, the fraction of locations in the memory which are full. 
+Values of
+Na were chosen to correspond to $A$ field lengths of 1, 2, 3,
+4, and 5 bits, that is for Na equal to 0, 1, 3, 7, and 15 respectively,
+and also for the case where no $A$ field was used.
+Increasing the size of the $A$ field beyond 5 bits had no effect at
+the memory loadings investigated.  So Na equal to 15 is effectively the
+same as an unbounded size for the $A$ values.  
+.pp
+The insertion procedure is 
+guaranteed to be optimum only for BLP, not for compact hashing.  If none
+of the values in $A$ is $inf$ then the sequence of locations examined by
+compact
+hashing is the same as for BLP and so the strategy will still be optimum.
+(This is easily seen by noting that in compact hashing
+$A[h(t(K))]$ determines the direction
+of the search depending on whether it is positive or negative.  During the 
+subsequent search no
+locations past the sought key will be probed.  This is exactly the same
+probing behaviour as in BLP.)\ 
+However, if no $A$ array is being used or if some values of $A$ are $inf$
+then extra locations need to be probed to find an empty location or one which
+is not equal to $inf$.
+.pp
+As expected the figures in Table I show that for Na at 15 and using optimum
+insertion the probes for a successful search are almost the same as for BLP.
+(The small differences are accounted for by statistical fluctuations
+in the simulation results.)\   
+.pp 
+As Na is decreased the number of probes needed for searching increases.
+This
+reflects the greater distances that must be traversed to find a value of 
+$A$ not equal to $inf$.  It is notable however that even a single bit allocated
+to the $A$ fields dramatically improves the performance.  Even at a
+memory density of 0.95 some 25% of non-empty locations have $A$ values of 0.
+.pp
+The pattern for unsuccessful searches is broadly the same as sketched above
+for successful searches except that in general unsuccessful searches
+are quicker than successful ones.  This is a result of the $V$ bits
+which allow many unsuccessful searches to be stopped after a single probe. 
+For example even at the maximum possible memory density of 1 some 36% of
+$V$ bits are zero.  This results in compact hashing being faster than
+the reported values for ordinary BLP.  
+However, unsuccessful BLP searches could be
+improved to a similar degree by incorporating $V$ bits.
+.FC "Table III"
+.rh "Insertion."
+The probes to insert a new key can be broken down into three components,
+those needed to locate the position where the key is to be inserted,
+those to decide the direction of movement 
+and those to effect the movement of the memory.
+The first of these will be slightly larger than
+a successful search and so the results of Table I have not been repeated.
+The second two are independent of Na as they are dependent only on
+the lengths of blocks of adjacent non-empty locations.  The values
+for these Na independent components are listed in Table III.
+In most cases
+this Na independent component is much larger than the search component.
+The exception occurs 
+where no $A$ values are being used, when the two components
+are comparable.
+.pp
+Cleary [5] examines a random insertion strategy for ordinary BLP
+where blocks of entries in the hash table are moved in a randomly chosen
+direction
+to accomodate a
+new entry rather than in the optimum way described by 
+Amble and Knuth [1].
+It is shown that this strategy can
+improve insertion times by a factor of 4 at the expense of small degradations
+(at most 15%) in retrieval times.  These
+results are shown by simulation to extend to compact hashing.  
+Indeed for small values of
+Na the optimum and random strategies show no significant differences in
+retrieval times.
+.rh "Analytic approximation."
+While analytic results are not available for the number of probes 
+needed for retrieval or insertion an
+approximation can be developed for some of the cases.  It is shown by
+Amble and Knuth [1] and Knuth [8] (problem 6.4-47) that the average
+length of a block of consecutive non-empty locations when using
+the optimum insertion strategy is approximately
+$(1- alpha ) sup -2 ~-~1$.  
+Let this block length be $L$.  
+.pp
+Consider the case of a successful search when no $A$ field is used.
+A successful scan of a block from an arbitrary
+position to the end takes on average $L/2~+~1/2$ probes.  
+During the initial scan down the memory in the simulations the initial check of the
+$V$ bit and the final empty location examined were each counted as a single probe.
+This gives a total of $L/2~+~5/2$ probes for the initial scan down. (This is not
+exact because there will be a correlation between the position 
+of a key's home location within a block 
+and the number of keys hashing to that home location).
+The scan back up a block will take $L/2~+1/2$ probes (exact for a successful search).
+This gives $(1- alpha ) sup -2 +2$ for the expected
+number of probes during a successful search.  These values are listed in Table I
+and are consistently low by about 10%.
+.pp
+For an unsuccessful search with no $A$ field the initial scan down the 
+memory will take $L/2~+5/2$ probes as above (again this will not be exact because
+the probability of a $V$ bit being one will be correlated with the 
+size of a block and its
+position within the block).
+An unsuccessful scan of a block takes $L/2~+~1/2$ probes.  (This assumes
+the keys in the block are distributed uniformly.  
+This gives the following probabilities that the search will stop at a 
+particular location in the block: the first location, $1/2L$; locations 2 
+through $L$, $1/L$; the empty $(L+1)$st location, $1/~2L$.
+This will not be true for compact hashing because the probability of stopping at a key
+which shares its home location with a large number of other keys will be smaller than
+for one which shares it with few others.)\ \ Summing these two terms gives $L~+~7/2$
+probes.
+Given that the keys are distributed randomly there is a probability of 
+$e sup {- alpha}$ that a given $V$ bit will be zero.  So the expected number 
+of probes overall for an unsuccessful search is 
+$e sup {- alpha}~+~(1-e sup {- alpha}) cdot ((1- alpha ) sup -2 + 5/2)$.
+These values are listed in Table II and are consistently low by about 5%.
+.pp
+Considering only the insertion component which is independent of Na then
+it is possible to derive an expression for the number of probes.
+There is an initial
+scan to move the memory down and insert the new key which will scan about half 
+the block ($L/2~+~5/2$ probes) 
+and a subsequent scan back up of the entire block ($L~+~1$ probes).  
+Empirically the probability
+that the entire block will subsequently be moved back up is a half which gives
+an expected $1/2(L~+~1)$ probes.
+Summing these three contributions gives $2(1- alpha ) sup -2 ~+~2$
+as the expected number of probes for an insertion (excluding the search time).
+Values for this expression are tabulated  in Table III, they are in good 
+agreement with the empirical values.
+.sh "Acknowledgements"
+.pp
+I would like to thank Ian Witten for careful checking of a draft version.
+Also John Andreae for discussions which showed that something like compact
+hashing might be possible.
+.sh "References"
+.ls 1
+.LB "[6]    "
+.sp
+.NI "[1]  "
+[1]\ \ O.\ Amble and D.\ E.\ Knuth, "Ordered Hash Tables,"
+.ul
+Computer Journal,
+vol. 17, pp135-142, 1974.
+.sp
+.NI "[1]  "
+[2]\ \ J.\ H.\ Andreae,
+.ul
+Thinking with the teachable machine.
+London: Academic Press, 1977.
+.sp
+.NI "[1]  "
+[3]\ \ J.\ L.\ Carter and M.\ N.\ Wegman, "Universal classes of hash 
+functions,"
+.ul
+J. Computer System Sci.,
+vol. 18, pp143-154, 1979.
+.sp
+.NI "[2]  "
+[4]\ \ J.\ G.\ Cleary, "Compact hash tables,"
+Research Report, 82/100/19,
+Department of Computer Science, University of Calgary, July 1982.
+.sp
+.NI "[3]  "
+[5]\ \ J.\ G.\ Cleary, "Random insertion for bidirectional linear probing
+can be better than optimum," 
+Research Report, 82/105/24,
+Department of Computer Science, University of Calgary, September 1982.
+.sp
+.NI "[5]  "
+[6]\ \ J. A. Feldman and J. R. Low, "Comment on Brent's Scatter Storage 
+Algorithm,"
+.ul
+CACM,
+vol. 16, p703, 1973.
+.sp
+.NI "[7]  "
+[7]\ \ G. D. Knott, "Hashing functions,"
+.ul
+The Computer Journal,
+vol. 18, pp265-278, 1975.
+.sp
+.NI "[7]  "
+[8]\ \ D.\ E.\ Knuth, 
+.ul
+The art of computer programming:Sorting and searching.
+Vol III.
+Reading, Massachusetts: Addison Wesley, 1973.
+.sp
+.NI "[8]  "
+[9]\ \ V.\ Y.\ Lum, "General performance analysis of key-to-address 
+transformation methods using an abstract file concept,"
+.ul
+CACM,
+vol. 16, pp603-612, 1973.
+.sp
+.NI "[12]  "
+[10]\ \ V.\ Y.\ Lum,\ P.\ S.\ T.\ Yuen and M.\ Dodd, "Key-to-address
+transformation techniques,"
+.ul
+CACM,
+vol. 14, pp228-239, 1971.
+.sp
+.NI "[13]  "
+[11]\ \ W. D. Maurer and T. G. Lewis, "Hash table methods,"
+.ul
+Comp. Surveys,
+vol. 7, pp5-19, 1975.
+.ls 2
+.in 0
+.bp 0
+\&\ 
+.RF
+.ta 0.5i +0.75i +0.75i +0.75i +0.75i +0.75i
+.nf
+
+	$i	T[i]	R[i]	V[i]	C[i]$
+	\l'3.5i'
+.br
+
+	12	\0\ -1	\ -1	0	1
+.br
+	11	101	\01	0	1
+.br
+	10	\087	\07	1	1
+.br
+	\09	\076	\06	0	0
+.br
+	\08	\075	\05	1	1
+.br
+	\07	\067	\07	1	0   
+.br
+	\06	\066	\06	1	0
+.br
+	\05	\065	\05	0	1
+.br
+	\04	\041	\01	1	1
+.br
+	\03	\0\ -1	\ -1	0	1
+.br
+	\02	\019	\09	0	0
+.br
+	\01	\018	\08	1	0
+.br
+	\00	\016	\06	0	1
+.br
+					     Step 1 Step 2 Step 3 Step 4
+.br
+
+	$h(H)~=~ left floor^ H/10 right floor$
+.br
+
+	$r(H)~=~ H~ roman mod ~10$
+.br
+
+.FG ""
+
+.bp 0
+\&\ 
+.RF
+.nf
+.ta 0.5i +0.75i +0.75i +0.75i +0.75i
+	$count~=~A[i]~=~#C[i]-#V[i]$
+.sp
+	$count = 0$			$count = 0$
+	$C$	$V$		$C$	$V$
+	0\|\(rt	1		0\|\(rt	1
+	0\|\(rk	0		0\|\(rk	1$<-~i$
+	1\|\(rb	1$<-~i$		1\|\(rb	0
+.sp
+	$count =1>0$		$count = 2 > 0$
+	$C$	$V$		$C$	$V$
+	0	1$<-~i$		0	1$<-~i$
+	1	0		1	0
+	0\|\(rt	1		1	1
+	0\|\(rk	0		0\|\(rt	0
+	1\|\(rb	0		0\|\(rk	0
+				1\|\(rb	0
+.sp
+	$count =-1<0$
+	$C$	$V$
+	0\|\(rt	0			\|\(rt
+	0\|\(rk	0			\|\(rk\ \ Group of entries which hash to 
+	1\|\(rb	0			\|\(rb\ \ location i
+	0	0
+	1	1$<-~i$			\ \ \ Corresponding $C$ and $V$ bits
+.FG ""
+.bp 0
+\&\ 
+.RF
+.ta 0.5i +0.5i +0.5i +0.5i +0.5i +0.9i +0.6i +0.4i
+$i	R[i]	V[i]	C[i]	#V[i]	#C[i]~~#C[i]-#V[i]	A[i]$
+.br
+\l'4.5i'
+.br
+12	\ -1	0	1	6	6	\00	0
+.br
+11	\01	0	1	6	6	\00	0
+.br
+10	\07	1	1	6	5	\ -1	$inf$
+.br
+\09	\06	0	0	5	4	\ -1	$inf$
+.br
+\08	\05	1	1	5	4	\ -1	$inf$
+.br
+\07	\07	1	0	4	3	\ -1	$inf$
+.br
+\06	\06	1	0	3	3	\00	0
+.br
+\05	\05	0	1	2	3	\01	$inf$
+.br
+\04	\01	1	1	2	2	\00	0
+.br
+\03	\ -1	0	1	1	1	\00	0
+.br
+\02	\09	0	0	1	1	\00	0
+.br
+\01	\08	1	0	1	1	\00	0
+.br
+\00	\06	0	1	0	1	\01	$inf$
+.br
+								Step 1 Step 2 Step 3 Step 4
+.sp 
+Note: 	Only one bit has been allowed for the values of $A$. 
+.br
+	So the only two possible values are 0 and $inf$.
+
+.FG ""
+.bp 0
+\&\ 
+.RF
+.ta 1.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+.ce
+Successful Search
+	\l'4i'
+
+	$alpha$	\0.25	\0.5	\0.75	\0.8	\0.85	\0.9	\0.95
+	\l'4i'
+	
+	$BLP sup 1$	\0\01.1	\0\01.3	\0\01.7	\0\02.0	\0\02.3	\0\02.9	\0\04.2
+	
+	Na
+	15	\0\01.1	\0\01.3	\0\01.7	\0\01.9	\0\02.2	\0\02.8	\0\04.6
+	\07	\0\01.1	\0\01.3	\0\01.7	\0\01.9	\0\02.2	\0\02.8	\0\09.7
+	\03	\0\01.1	\0\01.3	\0\01.7	\0\01.9	\0\02.4	\0\04.2	\025
+	\01	\0\01.1	\0\01.3	\0\02.0	\0\02.5	\0\04.1	\0\08.8	\045
+	\00	\0\01.1	\0\01.5	\0\03.3	\0\04.9	\0\07.9	\015	\061
+	\0-	\0\04.2	\0\07.1	\020	\030	\049	110	370
+	\0*	\0\03.77	\0\06.00	\018.0	\027.0	\046.4	102	402
+
+		$\& sup 1~$Taken from Amble and Knuth [1].
+		- No $A$ field used.
+		* Analytic approximation to line above.
+.FG ""
+.bp 0
+\&
+.RF
+.ta 1.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+.ce
+Unsuccessful Search
+	\l'4i'
+
+	$alpha$	\0.25	\0.5	\0.75	\0.8	\0.85	\0.9	\0.95
+	\l'4i'
+
+	$BLP sup 1$	\0\01.3	\0\01.5	\0\02.1	\0\02.3	\0\02.6	\0\03.1	\0\04.4
+
+	Na
+	15	\0\01.2	\0\01.4	\0\01.8	\0\01.9	\0\02.1	\0\02.4	\0\03.5
+	\07	\0\01.2	\0\01.4	\0\01.8	\0\01.9	\0\02.1	\0\02.4	\0\09.7
+	\03	\0\01.2	\0\01.4	\0\01.8	\0\01.9	\0\02.2	\0\03.3	\015
+	\01	\0\01.2	\0\01.4	\0\01.9	\0\02.2	\0\03.2	\0\06.0	\028
+	\00	\0\01.2	\0\01.5	\0\02.6	\0\03.4	\0\05.3	\0\09.9	\036
+	\0-	\0\01.7	\0\03.4	\011	\016	\028	\064	220
+	\0*	\0\01.72	\0\03.16	\010.2	\015.6	\027.3	\061.2	247
+
+		$\& sup 1~$Taken from Amble and Knuth [1].
+		- No $A$ field used.
+		* Analytic approximation to line above.
+.FG ""
+.bp 0
+\&
+.RF
+.ta 1.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i +0.5i
+	\l'4i'
+
+	$alpha$	\0.25	\0.5	\0.75	\0.8	\0.85	\0.9	\0.95
+	\l'4i'
+
+		\0\04.3	\0\08.8	\032	\049	\086	200	700
+	*	\0\04.56	\0\09.00	\033.0	\051.0	\089.9\
+	201	801
+
+	* Analytic approximation to line above
+.FG ""
+.bp 0
+\&
+.ce 
+List of Figures
+.sp 2
+Fig. 1. Example of compact hash memory and search for key.
+.sp 2
+Fig. 2. Examples showing different values of $#C[i]-#V[i]$.
+.sp 2
+Fig. 3. Example of calculation and use of array $A$.
+.sp 2
+.ce
+List of Tables
+.sp 2
+Table I. Average number of probes during a successful search.
+.sp 2
+Table II. Average number of probes during an unsuccessful search.
+.sp 2
+Table III. Average number of probes to move block of memory.
+.sp 2
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/pic b/src/test/java/org/xerial/snappy/testdata/calgary/pic
new file mode 100644
index 0000000..bdd7f36
Binary files /dev/null and b/src/test/java/org/xerial/snappy/testdata/calgary/pic differ
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/progc b/src/test/java/org/xerial/snappy/testdata/calgary/progc
new file mode 100644
index 0000000..5657d07
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/progc
@@ -0,0 +1,1487 @@
+/* 
+ * Compress - data compression program 
+ */
+#define	min(a,b)	((a>b) ? b : a)
+
+/*
+ * machine variants which require cc -Dmachine:  pdp11, z8000, pcxt
+ */
+
+/*
+ * Set USERMEM to the maximum amount of physical user memory available
+ * in bytes.  USERMEM is used to determine the maximum BITS that can be used
+ * for compression.
+ *
+ * SACREDMEM is the amount of physical memory saved for others; compress
+ * will hog the rest.
+ */
+#ifndef SACREDMEM
+#define SACREDMEM	0
+#endif
+
+#ifndef USERMEM
+# define USERMEM 	450000	/* default user memory */
+#endif
+
+#ifdef interdata		/* (Perkin-Elmer) */
+#define SIGNED_COMPARE_SLOW	/* signed compare is slower than unsigned */
+#endif
+
+#ifdef pdp11
+# define BITS 	12	/* max bits/code for 16-bit machine */
+# define NO_UCHAR	/* also if "unsigned char" functions as signed char */
+# undef USERMEM 
+#endif /* pdp11 */	/* don't forget to compile with -i */
+
+#ifdef z8000
+# define BITS 	12
+# undef vax		/* weird preprocessor */
+# undef USERMEM 
+#endif /* z8000 */
+
+#ifdef pcxt
+# define BITS   12
+# undef USERMEM
+#endif /* pcxt */
+
+#ifdef USERMEM
+# if USERMEM >= (433484+SACREDMEM)
+#  define PBITS	16
+# else
+#  if USERMEM >= (229600+SACREDMEM)
+#   define PBITS	15
+#  else
+#   if USERMEM >= (127536+SACREDMEM)
+#    define PBITS	14
+#   else
+#    if USERMEM >= (73464+SACREDMEM)
+#     define PBITS	13
+#    else
+#     define PBITS	12
+#    endif
+#   endif
+#  endif
+# endif
+# undef USERMEM
+#endif /* USERMEM */
+
+#ifdef PBITS		/* Preferred BITS for this memory size */
+# ifndef BITS
+#  define BITS PBITS
+# endif BITS
+#endif /* PBITS */
+
+#if BITS == 16
+# define HSIZE	69001		/* 95% occupancy */
+#endif
+#if BITS == 15
+# define HSIZE	35023		/* 94% occupancy */
+#endif
+#if BITS == 14
+# define HSIZE	18013		/* 91% occupancy */
+#endif
+#if BITS == 13
+# define HSIZE	9001		/* 91% occupancy */
+#endif
+#if BITS <= 12
+# define HSIZE	5003		/* 80% occupancy */
+#endif
+
+#ifdef M_XENIX			/* Stupid compiler can't handle arrays with */
+# if BITS == 16			/* more than 65535 bytes - so we fake it */
+#  define XENIX_16
+# else
+#  if BITS > 13			/* Code only handles BITS = 12, 13, or 16 */
+#   define BITS	13
+#  endif
+# endif
+#endif
+
+/*
+ * a code_int must be able to hold 2**BITS values of type int, and also -1
+ */
+#if BITS > 15
+typedef long int	code_int;
+#else
+typedef int		code_int;
+#endif
+
+#ifdef SIGNED_COMPARE_SLOW
+typedef unsigned long int count_int;
+typedef unsigned short int count_short;
+#else
+typedef long int	  count_int;
+#endif
+
+#ifdef NO_UCHAR
+ typedef char	char_type;
+#else
+ typedef	unsigned char	char_type;
+#endif /* UCHAR */
+char_type magic_header[] = { "\037\235" };	/* 1F 9D */
+
+/* Defines for third byte of header */
+#define BIT_MASK	0x1f
+#define BLOCK_MASK	0x80
+/* Masks 0x40 and 0x20 are free.  I think 0x20 should mean that there is
+   a fourth header byte (for expansion).
+*/
+#define INIT_BITS 9			/* initial number of bits/code */
+
+/*
+ * compress.c - File compression ala IEEE Computer, June 1984.
+ *
+ * Authors:	Spencer W. Thomas	(decvax!harpo!utah-cs!utah-gr!thomas)
+ *		Jim McKie		(decvax!mcvax!jim)
+ *		Steve Davies		(decvax!vax135!petsd!peora!srd)
+ *		Ken Turkowski		(decvax!decwrl!turtlevax!ken)
+ *		James A. Woods		(decvax!ihnp4!ames!jaw)
+ *		Joe Orost		(decvax!vax135!petsd!joe)
+ *
+ * $Header: compress.c,v 4.0 85/07/30 12:50:00 joe Release $
+ * $Log:	compress.c,v $
+ * Revision 4.0  85/07/30  12:50:00  joe
+ * Removed ferror() calls in output routine on every output except first.
+ * Prepared for release to the world.
+ * 
+ * Revision 3.6  85/07/04  01:22:21  joe
+ * Remove much wasted storage by overlaying hash table with the tables
+ * used by decompress: tab_suffix[1<<BITS], stack[8000].  Updated USERMEM
+ * computations.  Fixed dump_tab() DEBUG routine.
+ *
+ * Revision 3.5  85/06/30  20:47:21  jaw
+ * Change hash function to use exclusive-or.  Rip out hash cache.  These
+ * speedups render the megamemory version defunct, for now.  Make decoder
+ * stack global.  Parts of the RCS trunks 2.7, 2.6, and 2.1 no longer apply.
+ *
+ * Revision 3.4  85/06/27  12:00:00  ken
+ * Get rid of all floating-point calculations by doing all compression ratio
+ * calculations in fixed point.
+ *
+ * Revision 3.3  85/06/24  21:53:24  joe
+ * Incorporate portability suggestion for M_XENIX.  Got rid of text on #else
+ * and #endif lines.  Cleaned up #ifdefs for vax and interdata.
+ *
+ * Revision 3.2  85/06/06  21:53:24  jaw
+ * Incorporate portability suggestions for Z8000, IBM PC/XT from mailing list.
+ * Default to "quiet" output (no compression statistics).
+ *
+ * Revision 3.1  85/05/12  18:56:13  jaw
+ * Integrate decompress() stack speedups (from early pointer mods by McKie).
+ * Repair multi-file USERMEM gaffe.  Unify 'force' flags to mimic semantics
+ * of SVR2 'pack'.  Streamline block-compress table clear logic.  Increase 
+ * output byte count by magic number size.
+ * 
+ * Revision 3.0   84/11/27  11:50:00  petsd!joe
+ * Set HSIZE depending on BITS.  Set BITS depending on USERMEM.  Unrolled
+ * loops in clear routines.  Added "-C" flag for 2.0 compatibility.  Used
+ * unsigned compares on Perkin-Elmer.  Fixed foreground check.
+ *
+ * Revision 2.7   84/11/16  19:35:39  ames!jaw
+ * Cache common hash codes based on input statistics; this improves
+ * performance for low-density raster images.  Pass on #ifdef bundle
+ * from Turkowski.
+ *
+ * Revision 2.6   84/11/05  19:18:21  ames!jaw
+ * Vary size of hash tables to reduce time for small files.
+ * Tune PDP-11 hash function.
+ *
+ * Revision 2.5   84/10/30  20:15:14  ames!jaw
+ * Junk chaining; replace with the simpler (and, on the VAX, faster)
+ * double hashing, discussed within.  Make block compression standard.
+ *
+ * Revision 2.4   84/10/16  11:11:11  ames!jaw
+ * Introduce adaptive reset for block compression, to boost the rate
+ * another several percent.  (See mailing list notes.)
+ *
+ * Revision 2.3   84/09/22  22:00:00  petsd!joe
+ * Implemented "-B" block compress.  Implemented REVERSE sorting of tab_next.
+ * Bug fix for last bits.  Changed fwrite to putchar loop everywhere.
+ *
+ * Revision 2.2   84/09/18  14:12:21  ames!jaw
+ * Fold in news changes, small machine typedef from thomas,
+ * #ifdef interdata from joe.
+ *
+ * Revision 2.1   84/09/10  12:34:56  ames!jaw
+ * Configured fast table lookup for 32-bit machines.
+ * This cuts user time in half for b <= FBITS, and is useful for news batching
+ * from VAX to PDP sites.  Also sped up decompress() [fwrite->putc] and
+ * added signal catcher [plus beef in writeerr()] to delete effluvia.
+ *
+ * Revision 2.0   84/08/28  22:00:00  petsd!joe
+ * Add check for foreground before prompting user.  Insert maxbits into
+ * compressed file.  Force file being uncompressed to end with ".Z".
+ * Added "-c" flag and "zcat".  Prepared for release.
+ *
+ * Revision 1.10  84/08/24  18:28:00  turtlevax!ken
+ * Will only compress regular files (no directories), added a magic number
+ * header (plus an undocumented -n flag to handle old files without headers),
+ * added -f flag to force overwriting of possibly existing destination file,
+ * otherwise the user is prompted for a response.  Will tack on a .Z to a
+ * filename if it doesn't have one when decompressing.  Will only replace
+ * file if it was compressed.
+ *
+ * Revision 1.9  84/08/16  17:28:00  turtlevax!ken
+ * Removed scanargs(), getopt(), added .Z extension and unlimited number of
+ * filenames to compress.  Flags may be clustered (-Ddvb12) or separated
+ * (-D -d -v -b 12), or combination thereof.  Modes and other status is
+ * copied with copystat().  -O bug for 4.2 seems to have disappeared with
+ * 1.8.
+ *
+ * Revision 1.8  84/08/09  23:15:00  joe
+ * Made it compatible with vax version, installed jim's fixes/enhancements
+ *
+ * Revision 1.6  84/08/01  22:08:00  joe
+ * Sped up algorithm significantly by sorting the compress chain.
+ *
+ * Revision 1.5  84/07/13  13:11:00  srd
+ * Added C version of vax asm routines.  Changed structure to arrays to
+ * save much memory.  Do unsigned compares where possible (faster on
+ * Perkin-Elmer)
+ *
+ * Revision 1.4  84/07/05  03:11:11  thomas
+ * Clean up the code a little and lint it.  (Lint complains about all
+ * the regs used in the asm, but I'm not going to "fix" this.)
+ *
+ * Revision 1.3  84/07/05  02:06:54  thomas
+ * Minor fixes.
+ *
+ * Revision 1.2  84/07/05  00:27:27  thomas
+ * Add variable bit length output.
+ *
+ */
+static char rcs_ident[] = 
+"$Header: compress.c,v 4.0 85/07/30 12:50:00 joe Release $";
+
+#include <stdio.h>
+#include <ctype.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#define ARGVAL() (*++(*argv) || (--argc && *++argv))
+
+int n_bits;				/* number of bits/code */
+int maxbits = BITS;			/* user settable max # bits/code */
+code_int maxcode;			/* maximum code, given n_bits */
+code_int maxmaxcode = 1 << BITS;	/* should NEVER generate this code */
+#ifdef COMPATIBLE		/* But wrong! */
+# define MAXCODE(n_bits)	(1 << (n_bits) - 1)
+#else
+# define MAXCODE(n_bits)	((1 << (n_bits)) - 1)
+#endif /* COMPATIBLE */
+
+#ifdef XENIX_16
+count_int htab0[8192];
+count_int htab1[8192];
+count_int htab2[8192];
+count_int htab3[8192];
+count_int htab4[8192];
+count_int htab5[8192];
+count_int htab6[8192];
+count_int htab7[8192];
+count_int htab8[HSIZE-65536];
+count_int * htab[9] = {
+	htab0, htab1, htab2, htab3, htab4, htab5, htab6, htab7, htab8 };
+
+#define htabof(i)	(htab[(i) >> 13][(i) & 0x1fff])
+unsigned short code0tab[16384];
+unsigned short code1tab[16384];
+unsigned short code2tab[16384];
+unsigned short code3tab[16384];
+unsigned short code4tab[16384];
+unsigned short * codetab[5] = {
+	code0tab, code1tab, code2tab, code3tab, code4tab };
+
+#define codetabof(i)	(codetab[(i) >> 14][(i) & 0x3fff])
+
+#else	/* Normal machine */
+count_int htab [HSIZE];
+unsigned short codetab [HSIZE];
+#define htabof(i)	htab[i]
+#define codetabof(i)	codetab[i]
+#endif	/* XENIX_16 */
+code_int hsize = HSIZE;			/* for dynamic table sizing */
+count_int fsize;
+
+/*
+ * To save much memory, we overlay the table used by compress() with those
+ * used by decompress().  The tab_prefix table is the same size and type
+ * as the codetab.  The tab_suffix table needs 2**BITS characters.  We
+ * get this from the beginning of htab.  The output stack uses the rest
+ * of htab, and contains characters.  There is plenty of room for any
+ * possible stack (stack used to be 8000 characters).
+ */
+
+#define tab_prefixof(i)	codetabof(i)
+#ifdef XENIX_16
+# define tab_suffixof(i)	((char_type *)htab[(i)>>15])[(i) & 0x7fff]
+# define de_stack		((char_type *)(htab2))
+#else	/* Normal machine */
+# define tab_suffixof(i)	((char_type *)(htab))[i]
+# define de_stack		((char_type *)&tab_suffixof(1<<BITS))
+#endif	/* XENIX_16 */
+
+code_int free_ent = 0;			/* first unused entry */
+int exit_stat = 0;
+
+code_int getcode();
+
+Usage() {
+#ifdef DEBUG
+fprintf(stderr,"Usage: compress [-dDVfc] [-b maxbits] [file ...]\n");
+}
+int debug = 0;
+#else
+fprintf(stderr,"Usage: compress [-dfvcV] [-b maxbits] [file ...]\n");
+}
+#endif /* DEBUG */
+int nomagic = 0;	/* Use a 3-byte magic number header, unless old file */
+int zcat_flg = 0;	/* Write output on stdout, suppress messages */
+int quiet = 1;		/* don't tell me about compression */
+
+/*
+ * block compression parameters -- after all codes are used up,
+ * and compression rate changes, start over.
+ */
+int block_compress = BLOCK_MASK;
+int clear_flg = 0;
+long int ratio = 0;
+#define CHECK_GAP 10000	/* ratio check interval */
+count_int checkpoint = CHECK_GAP;
+/*
+ * the next two codes should not be changed lightly, as they must not
+ * lie within the contiguous general code space.
+ */ 
+#define FIRST	257	/* first free entry */
+#define	CLEAR	256	/* table clear output code */
+
+int force = 0;
+char ofname [100];
+#ifdef DEBUG
+int verbose = 0;
+#endif /* DEBUG */
+int (*bgnd_flag)();
+
+int do_decomp = 0;
+
+/*****************************************************************
+ * TAG( main )
+ *
+ * Algorithm from "A Technique for High Performance Data Compression",
+ * Terry A. Welch, IEEE Computer Vol 17, No 6 (June 1984), pp 8-19.
+ *
+ * Usage: compress [-dfvc] [-b bits] [file ...]
+ * Inputs:
+ *	-d:	    If given, decompression is done instead.
+ *
+ *      -c:         Write output on stdout, don't remove original.
+ *
+ *      -b:         Parameter limits the max number of bits/code.
+ *
+ *	-f:	    Forces output file to be generated, even if one already
+ *		    exists, and even if no space is saved by compressing.
+ *		    If -f is not used, the user will be prompted if stdin is
+ *		    a tty, otherwise, the output file will not be overwritten.
+ *
+ *      -v:	    Write compression statistics
+ *
+ * 	file ...:   Files to be compressed.  If none specified, stdin
+ *		    is used.
+ * Outputs:
+ *	file.Z:	    Compressed form of file with same mode, owner, and utimes
+ * 	or stdout   (if stdin used as input)
+ *
+ * Assumptions:
+ *	When filenames are given, replaces with the compressed version
+ *	(.Z suffix) only if the file decreases in size.
+ * Algorithm:
+ * 	Modified Lempel-Ziv method (LZW).  Basically finds common
+ * substrings and replaces them with a variable size code.  This is
+ * deterministic, and can be done on the fly.  Thus, the decompression
+ * procedure needs no input table, but tracks the way the table was built.
+ */
+
+main( argc, argv )
+register int argc; char **argv;
+{
+    int overwrite = 0;	/* Do not overwrite unless given -f flag */
+    char tempname[100];
+    char **filelist, **fileptr;
+    char *cp, *rindex(), *malloc();
+    struct stat statbuf;
+    extern onintr(), oops();
+
+
+    if ( (bgnd_flag = signal ( SIGINT, SIG_IGN )) != SIG_IGN ) {
+	signal ( SIGINT, onintr );
+	signal ( SIGSEGV, oops );
+    }
+
+#ifdef COMPATIBLE
+    nomagic = 1;	/* Original didn't have a magic number */
+#endif /* COMPATIBLE */
+
+    filelist = fileptr = (char **)(malloc(argc * sizeof(*argv)));
+    *filelist = NULL;
+
+    if((cp = rindex(argv[0], '/')) != 0) {
+	cp++;
+    } else {
+	cp = argv[0];
+    }
+    if(strcmp(cp, "uncompress") == 0) {
+	do_decomp = 1;
+    } else if(strcmp(cp, "zcat") == 0) {
+	do_decomp = 1;
+	zcat_flg = 1;
+    }
+
+#ifdef BSD4_2
+    /* 4.2BSD dependent - take it out if not */
+    setlinebuf( stderr );
+#endif /* BSD4_2 */
+
+    /* Argument Processing
+     * All flags are optional.
+     * -D => debug
+     * -V => print Version; debug verbose
+     * -d => do_decomp
+     * -v => unquiet
+     * -f => force overwrite of output file
+     * -n => no header: useful to uncompress old files
+     * -b maxbits => maxbits.  If -b is specified, then maxbits MUST be
+     *	    given also.
+     * -c => cat all output to stdout
+     * -C => generate output compatible with compress 2.0.
+     * if a string is left, must be an input filename.
+     */
+    for (argc--, argv++; argc > 0; argc--, argv++) {
+	if (**argv == '-') {	/* A flag argument */
+	    while (*++(*argv)) {	/* Process all flags in this arg */
+		switch (**argv) {
+#ifdef DEBUG
+		    case 'D':
+			debug = 1;
+			break;
+		    case 'V':
+			verbose = 1;
+			version();
+			break;
+#else
+		    case 'V':
+			version();
+			break;
+#endif /* DEBUG */
+		    case 'v':
+			quiet = 0;
+			break;
+		    case 'd':
+			do_decomp = 1;
+			break;
+		    case 'f':
+		    case 'F':
+			overwrite = 1;
+			force = 1;
+			break;
+		    case 'n':
+			nomagic = 1;
+			break;
+		    case 'C':
+			block_compress = 0;
+			break;
+		    case 'b':
+			if (!ARGVAL()) {
+			    fprintf(stderr, "Missing maxbits\n");
+			    Usage();
+			    exit(1);
+			}
+			maxbits = atoi(*argv);
+			goto nextarg;
+		    case 'c':
+			zcat_flg = 1;
+			break;
+		    case 'q':
+			quiet = 1;
+			break;
+		    default:
+			fprintf(stderr, "Unknown flag: '%c'; ", **argv);
+			Usage();
+			exit(1);
+		}
+	    }
+	}
+	else {		/* Input file name */
+	    *fileptr++ = *argv;	/* Build input file list */
+	    *fileptr = NULL;
+	    /* process nextarg; */
+	}
+	nextarg: continue;
+    }
+
+    if(maxbits < INIT_BITS) maxbits = INIT_BITS;
+    if (maxbits > BITS) maxbits = BITS;
+    maxmaxcode = 1 << maxbits;
+
+    if (*filelist != NULL) {
+	for (fileptr = filelist; *fileptr; fileptr++) {
+	    exit_stat = 0;
+	    if (do_decomp != 0) {			/* DECOMPRESSION */
+		/* Check for .Z suffix */
+		if (strcmp(*fileptr + strlen(*fileptr) - 2, ".Z") != 0) {
+		    /* No .Z: tack one on */
+		    strcpy(tempname, *fileptr);
+		    strcat(tempname, ".Z");
+		    *fileptr = tempname;
+		}
+		/* Open input file */
+		if ((freopen(*fileptr, "r", stdin)) == NULL) {
+			perror(*fileptr); continue;
+		}
+		/* Check the magic number */
+		if (nomagic == 0) {
+		    if ((getchar() != (magic_header[0] & 0xFF))
+		     || (getchar() != (magic_header[1] & 0xFF))) {
+			fprintf(stderr, "%s: not in compressed format\n",
+			    *fileptr);
+		    continue;
+		    }
+		    maxbits = getchar();	/* set -b from file */
+		    block_compress = maxbits & BLOCK_MASK;
+		    maxbits &= BIT_MASK;
+		    maxmaxcode = 1 << maxbits;
+		    if(maxbits > BITS) {
+			fprintf(stderr,
+			"%s: compressed with %d bits, can only handle %d bits\n",
+			*fileptr, maxbits, BITS);
+			continue;
+		    }
+		}
+		/* Generate output filename */
+		strcpy(ofname, *fileptr);
+		ofname[strlen(*fileptr) - 2] = '\0';  /* Strip off .Z */
+	    } else {					/* COMPRESSION */
+		if (strcmp(*fileptr + strlen(*fileptr) - 2, ".Z") == 0) {
+		    	fprintf(stderr, "%s: already has .Z suffix -- no change\n",
+			    *fileptr);
+		    continue;
+		}
+		/* Open input file */
+		if ((freopen(*fileptr, "r", stdin)) == NULL) {
+		    perror(*fileptr); continue;
+		}
+		stat ( *fileptr, &statbuf );
+		fsize = (long) statbuf.st_size;
+		/*
+		 * tune hash table size for small files -- ad hoc,
+		 * but the sizes match earlier #defines, which
+		 * serve as upper bounds on the number of output codes. 
+		 */
+		hsize = HSIZE;
+		if ( fsize < (1 << 12) )
+		    hsize = min ( 5003, HSIZE );
+		else if ( fsize < (1 << 13) )
+		    hsize = min ( 9001, HSIZE );
+		else if ( fsize < (1 << 14) )
+		    hsize = min ( 18013, HSIZE );
+		else if ( fsize < (1 << 15) )
+		    hsize = min ( 35023, HSIZE );
+		else if ( fsize < 47000 )
+		    hsize = min ( 50021, HSIZE );
+
+		/* Generate output filename */
+		strcpy(ofname, *fileptr);
+#ifndef BSD4_2		/* Short filenames */
+		if ((cp=rindex(ofname,'/')) != NULL)	cp++;
+		else					cp = ofname;
+		if (strlen(cp) > 12) {
+		    fprintf(stderr,"%s: filename too long to tack on .Z\n",cp);
+		    continue;
+		}
+#endif  /* BSD4_2		Long filenames allowed */
+		strcat(ofname, ".Z");
+	    }
+	    /* Check for overwrite of existing file */
+	    if (overwrite == 0 && zcat_flg == 0) {
+		if (stat(ofname, &statbuf) == 0) {
+		    char response[2];
+		    response[0] = 'n';
+		    fprintf(stderr, "%s already exists;", ofname);
+		    if (foreground()) {
+			fprintf(stderr, " do you wish to overwrite %s (y or n)? ",
+			ofname);
+			fflush(stderr);
+			read(2, response, 2);
+			while (response[1] != '\n') {
+			    if (read(2, response+1, 1) < 0) {	/* Ack! */
+				perror("stderr"); break;
+			    }
+			}
+		    }
+		    if (response[0] != 'y') {
+			fprintf(stderr, "\tnot overwritten\n");
+			continue;
+		    }
+		}
+	    }
+	    if(zcat_flg == 0) {		/* Open output file */
+		if (freopen(ofname, "w", stdout) == NULL) {
+		    perror(ofname);
+		    continue;
+		}
+		if(!quiet)
+			fprintf(stderr, "%s: ", *fileptr);
+	    }
+
+	    /* Actually do the compression/decompression */
+	    if (do_decomp == 0)	compress();
+#ifndef DEBUG
+	    else			decompress();
+#else
+	    else if (debug == 0)	decompress();
+	    else			printcodes();
+	    if (verbose)		dump_tab();
+#endif /* DEBUG */
+	    if(zcat_flg == 0) {
+		copystat(*fileptr, ofname);	/* Copy stats */
+		if((exit_stat == 1) || (!quiet))
+			putc('\n', stderr);
+	    }
+	}
+    } else {		/* Standard input */
+	if (do_decomp == 0) {
+		compress();
+#ifdef DEBUG
+		if(verbose)		dump_tab();
+#endif /* DEBUG */
+		if(!quiet)
+			putc('\n', stderr);
+	} else {
+	    /* Check the magic number */
+	    if (nomagic == 0) {
+		if ((getchar()!=(magic_header[0] & 0xFF))
+		 || (getchar()!=(magic_header[1] & 0xFF))) {
+		    fprintf(stderr, "stdin: not in compressed format\n");
+		    exit(1);
+		}
+		maxbits = getchar();	/* set -b from file */
+		block_compress = maxbits & BLOCK_MASK;
+		maxbits &= BIT_MASK;
+		maxmaxcode = 1 << maxbits;
+		fsize = 100000;		/* assume stdin large for USERMEM */
+		if(maxbits > BITS) {
+			fprintf(stderr,
+			"stdin: compressed with %d bits, can only handle %d bits\n",
+			maxbits, BITS);
+			exit(1);
+		}
+	    }
+#ifndef DEBUG
+	    decompress();
+#else
+	    if (debug == 0)	decompress();
+	    else		printcodes();
+	    if (verbose)	dump_tab();
+#endif /* DEBUG */
+	}
+    }
+    exit(exit_stat);
+}
+
+static int offset;
+long int in_count = 1;			/* length of input */
+long int bytes_out;			/* length of compressed output */
+long int out_count = 0;			/* # of codes output (for debugging) */
+
+/*
+ * compress stdin to stdout
+ *
+ * Algorithm:  use open addressing double hashing (no chaining) on the 
+ * prefix code / next character combination.  We do a variant of Knuth's
+ * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
+ * secondary probe.  Here, the modular division first probe is gives way
+ * to a faster exclusive-or manipulation.  Also do block compression with
+ * an adaptive reset, whereby the code table is cleared when the compression
+ * ratio decreases, but after the table fills.  The variable-length output
+ * codes are re-sized at this point, and a special CLEAR code is generated
+ * for the decompressor.  Late addition:  construct the table according to
+ * file size for noticeable speed improvement on small files.  Please direct
+ * questions about this implementation to ames!jaw.
+ */
+
+compress() {
+    register long fcode;
+    register code_int i = 0;
+    register int c;
+    register code_int ent;
+#ifdef XENIX_16
+    register code_int disp;
+#else	/* Normal machine */
+    register int disp;
+#endif
+    register code_int hsize_reg;
+    register int hshift;
+
+#ifndef COMPATIBLE
+    if (nomagic == 0) {
+	putchar(magic_header[0]); putchar(magic_header[1]);
+	putchar((char)(maxbits | block_compress));
+	if(ferror(stdout))
+		writeerr();
+    }
+#endif /* COMPATIBLE */
+
+    offset = 0;
+    bytes_out = 3;		/* includes 3-byte header mojo */
+    out_count = 0;
+    clear_flg = 0;
+    ratio = 0;
+    in_count = 1;
+    checkpoint = CHECK_GAP;
+    maxcode = MAXCODE(n_bits = INIT_BITS);
+    free_ent = ((block_compress) ? FIRST : 256 );
+
+    ent = getchar ();
+
+    hshift = 0;
+    for ( fcode = (long) hsize;  fcode < 65536L; fcode *= 2L )
+    	hshift++;
+    hshift = 8 - hshift;		/* set hash code range bound */
+
+    hsize_reg = hsize;
+    cl_hash( (count_int) hsize_reg);		/* clear hash table */
+
+#ifdef SIGNED_COMPARE_SLOW
+    while ( (c = getchar()) != (unsigned) EOF ) {
+#else
+    while ( (c = getchar()) != EOF ) {
+#endif
+	in_count++;
+	fcode = (long) (((long) c << maxbits) + ent);
+ 	i = ((c << hshift) ^ ent);	/* xor hashing */
+
+	if ( htabof (i) == fcode ) {
+	    ent = codetabof (i);
+	    continue;
+	} else if ( (long)htabof (i) < 0 )	/* empty slot */
+	    goto nomatch;
+ 	disp = hsize_reg - i;		/* secondary hash (after G. Knott) */
+	if ( i == 0 )
+	    disp = 1;
+probe:
+	if ( (i -= disp) < 0 )
+	    i += hsize_reg;
+
+	if ( htabof (i) == fcode ) {
+	    ent = codetabof (i);
+	    continue;
+	}
+	if ( (long)htabof (i) > 0 ) 
+	    goto probe;
+nomatch:
+	output ( (code_int) ent );
+	out_count++;
+ 	ent = c;
+#ifdef SIGNED_COMPARE_SLOW
+	if ( (unsigned) free_ent < (unsigned) maxmaxcode) {
+#else
+	if ( free_ent < maxmaxcode ) {
+#endif
+ 	    codetabof (i) = free_ent++;	/* code -> hashtable */
+	    htabof (i) = fcode;
+	}
+	else if ( (count_int)in_count >= checkpoint && block_compress )
+	    cl_block ();
+    }
+    /*
+     * Put out the final code.
+     */
+    output( (code_int)ent );
+    out_count++;
+    output( (code_int)-1 );
+
+    /*
+     * Print out stats on stderr
+     */
+    if(zcat_flg == 0 && !quiet) {
+#ifdef DEBUG
+	fprintf( stderr,
+		"%ld chars in, %ld codes (%ld bytes) out, compression factor: ",
+		in_count, out_count, bytes_out );
+	prratio( stderr, in_count, bytes_out );
+	fprintf( stderr, "\n");
+	fprintf( stderr, "\tCompression as in compact: " );
+	prratio( stderr, in_count-bytes_out, in_count );
+	fprintf( stderr, "\n");
+	fprintf( stderr, "\tLargest code (of last block) was %d (%d bits)\n",
+		free_ent - 1, n_bits );
+#else /* !DEBUG */
+	fprintf( stderr, "Compression: " );
+	prratio( stderr, in_count-bytes_out, in_count );
+#endif /* DEBUG */
+    }
+    if(bytes_out > in_count)	/* exit(2) if no savings */
+	exit_stat = 2;
+    return;
+}
+
+/*****************************************************************
+ * TAG( output )
+ *
+ * Output the given code.
+ * Inputs:
+ * 	code:	A n_bits-bit integer.  If == -1, then EOF.  This assumes
+ *		that n_bits =< (long)wordsize - 1.
+ * Outputs:
+ * 	Outputs code to the file.
+ * Assumptions:
+ *	Chars are 8 bits long.
+ * Algorithm:
+ * 	Maintain a BITS character long buffer (so that 8 codes will
+ * fit in it exactly).  Use the VAX insv instruction to insert each
+ * code in turn.  When the buffer fills up empty it and start over.
+ */
+
+static char buf[BITS];
+
+#ifndef vax
+char_type lmask[9] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
+char_type rmask[9] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
+#endif /* vax */
+
+output( code )
+code_int  code;
+{
+#ifdef DEBUG
+    static int col = 0;
+#endif /* DEBUG */
+
+    /*
+     * On the VAX, it is important to have the register declarations
+     * in exactly the order given, or the asm will break.
+     */
+    register int r_off = offset, bits= n_bits;
+    register char * bp = buf;
+
+#ifdef DEBUG
+	if ( verbose )
+	    fprintf( stderr, "%5d%c", code,
+		    (col+=6) >= 74 ? (col = 0, '\n') : ' ' );
+#endif /* DEBUG */
+    if ( code >= 0 ) {
+#ifdef vax
+	/* VAX DEPENDENT!! Implementation on other machines is below.
+	 *
+	 * Translation: Insert BITS bits from the argument starting at
+	 * offset bits from the beginning of buf.
+	 */
+	0;	/* Work around for pcc -O bug with asm and if stmt */
+	asm( "insv	4(ap),r11,r10,(r9)" );
+#else /* not a vax */
+/* 
+ * byte/bit numbering on the VAX is simulated by the following code
+ */
+	/*
+	 * Get to the first byte.
+	 */
+	bp += (r_off >> 3);
+	r_off &= 7;
+	/*
+	 * Since code is always >= 8 bits, only need to mask the first
+	 * hunk on the left.
+	 */
+	*bp = (*bp & rmask[r_off]) | (code << r_off) & lmask[r_off];
+	bp++;
+	bits -= (8 - r_off);
+	code >>= 8 - r_off;
+	/* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
+	if ( bits >= 8 ) {
+	    *bp++ = code;
+	    code >>= 8;
+	    bits -= 8;
+	}
+	/* Last bits. */
+	if(bits)
+	    *bp = code;
+#endif /* vax */
+	offset += n_bits;
+	if ( offset == (n_bits << 3) ) {
+	    bp = buf;
+	    bits = n_bits;
+	    bytes_out += bits;
+	    do
+		putchar(*bp++);
+	    while(--bits);
+	    offset = 0;
+	}
+
+	/*
+	 * If the next entry is going to be too big for the code size,
+	 * then increase it, if possible.
+	 */
+	if ( free_ent > maxcode || (clear_flg > 0))
+	{
+	    /*
+	     * Write the whole buffer, because the input side won't
+	     * discover the size increase until after it has read it.
+	     */
+	    if ( offset > 0 ) {
+		if( fwrite( buf, 1, n_bits, stdout ) != n_bits)
+			writeerr();
+		bytes_out += n_bits;
+	    }
+	    offset = 0;
+
+	    if ( clear_flg ) {
+    	        maxcode = MAXCODE (n_bits = INIT_BITS);
+	        clear_flg = 0;
+	    }
+	    else {
+	    	n_bits++;
+	    	if ( n_bits == maxbits )
+		    maxcode = maxmaxcode;
+	    	else
+		    maxcode = MAXCODE(n_bits);
+	    }
+#ifdef DEBUG
+	    if ( debug ) {
+		fprintf( stderr, "\nChange to %d bits\n", n_bits );
+		col = 0;
+	    }
+#endif /* DEBUG */
+	}
+    } else {
+	/*
+	 * At EOF, write the rest of the buffer.
+	 */
+	if ( offset > 0 )
+	    fwrite( buf, 1, (offset + 7) / 8, stdout );
+	bytes_out += (offset + 7) / 8;
+	offset = 0;
+	fflush( stdout );
+#ifdef DEBUG
+	if ( verbose )
+	    fprintf( stderr, "\n" );
+#endif /* DEBUG */
+	if( ferror( stdout ) )
+		writeerr();
+    }
+}
+
+/*
+ * Decompress stdin to stdout.  This routine adapts to the codes in the
+ * file building the "string" table on-the-fly; requiring no table to
+ * be stored in the compressed file.  The tables used herein are shared
+ * with those of the compress() routine.  See the definitions above.
+ */
+
+decompress() {
+    register char_type *stackp;
+    register int finchar;
+    register code_int code, oldcode, incode;
+
+    /*
+     * As above, initialize the first 256 entries in the table.
+     */
+    maxcode = MAXCODE(n_bits = INIT_BITS);
+    for ( code = 255; code >= 0; code-- ) {
+	tab_prefixof(code) = 0;
+	tab_suffixof(code) = (char_type)code;
+    }
+    free_ent = ((block_compress) ? FIRST : 256 );
+
+    finchar = oldcode = getcode();
+    if(oldcode == -1)	/* EOF already? */
+	return;			/* Get out of here */
+    putchar( (char)finchar );		/* first code must be 8 bits = char */
+    if(ferror(stdout))		/* Crash if can't write */
+	writeerr();
+    stackp = de_stack;
+
+    while ( (code = getcode()) > -1 ) {
+
+	if ( (code == CLEAR) && block_compress ) {
+	    for ( code = 255; code >= 0; code-- )
+		tab_prefixof(code) = 0;
+	    clear_flg = 1;
+	    free_ent = FIRST - 1;
+	    if ( (code = getcode ()) == -1 )	/* O, untimely death! */
+		break;
+	}
+	incode = code;
+	/*
+	 * Special case for KwKwK string.
+	 */
+	if ( code >= free_ent ) {
+            *stackp++ = finchar;
+	    code = oldcode;
+	}
+
+	/*
+	 * Generate output characters in reverse order
+	 */
+#ifdef SIGNED_COMPARE_SLOW
+	while ( ((unsigned long)code) >= ((unsigned long)256) ) {
+#else
+	while ( code >= 256 ) {
+#endif
+	    *stackp++ = tab_suffixof(code);
+	    code = tab_prefixof(code);
+	}
+	*stackp++ = finchar = tab_suffixof(code);
+
+	/*
+	 * And put them out in forward order
+	 */
+	do
+	    putchar ( *--stackp );
+	while ( stackp > de_stack );
+
+	/*
+	 * Generate the new entry.
+	 */
+	if ( (code=free_ent) < maxmaxcode ) {
+	    tab_prefixof(code) = (unsigned short)oldcode;
+	    tab_suffixof(code) = finchar;
+	    free_ent = code+1;
+	} 
+	/*
+	 * Remember previous code.
+	 */
+	oldcode = incode;
+    }
+    fflush( stdout );
+    if(ferror(stdout))
+	writeerr();
+}
+
+/*****************************************************************
+ * TAG( getcode )
+ *
+ * Read one code from the standard input.  If EOF, return -1.
+ * Inputs:
+ * 	stdin
+ * Outputs:
+ * 	code or -1 is returned.
+ */
+
+code_int
+getcode() {
+    /*
+     * On the VAX, it is important to have the register declarations
+     * in exactly the order given, or the asm will break.
+     */
+    register code_int code;
+    static int offset = 0, size = 0;
+    static char_type buf[BITS];
+    register int r_off, bits;
+    register char_type *bp = buf;
+
+    if ( clear_flg > 0 || offset >= size || free_ent > maxcode ) {
+	/*
+	 * If the next entry will be too big for the current code
+	 * size, then we must increase the size.  This implies reading
+	 * a new buffer full, too.
+	 */
+	if ( free_ent > maxcode ) {
+	    n_bits++;
+	    if ( n_bits == maxbits )
+		maxcode = maxmaxcode;	/* won't get any bigger now */
+	    else
+		maxcode = MAXCODE(n_bits);
+	}
+	if ( clear_flg > 0) {
+    	    maxcode = MAXCODE (n_bits = INIT_BITS);
+	    clear_flg = 0;
+	}
+	size = fread( buf, 1, n_bits, stdin );
+	if ( size <= 0 )
+	    return -1;			/* end of file */
+	offset = 0;
+	/* Round size down to integral number of codes */
+	size = (size << 3) - (n_bits - 1);
+    }
+    r_off = offset;
+    bits = n_bits;
+#ifdef vax
+    asm( "extzv   r10,r9,(r8),r11" );
+#else /* not a vax */
+	/*
+	 * Get to the first byte.
+	 */
+	bp += (r_off >> 3);
+	r_off &= 7;
+	/* Get first part (low order bits) */
+#ifdef NO_UCHAR
+	code = ((*bp++ >> r_off) & rmask[8 - r_off]) & 0xff;
+#else
+	code = (*bp++ >> r_off);
+#endif /* NO_UCHAR */
+	bits -= (8 - r_off);
+	r_off = 8 - r_off;		/* now, offset into code word */
+	/* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */
+	if ( bits >= 8 ) {
+#ifdef NO_UCHAR
+	    code |= (*bp++ & 0xff) << r_off;
+#else
+	    code |= *bp++ << r_off;
+#endif /* NO_UCHAR */
+	    r_off += 8;
+	    bits -= 8;
+	}
+	/* high order bits. */
+	code |= (*bp & rmask[bits]) << r_off;
+#endif /* vax */
+    offset += n_bits;
+
+    return code;
+}
+
+char *
+rindex(s, c)		/* For those who don't have it in libc.a */
+register char *s, c;
+{
+	char *p;
+	for (p = NULL; *s; s++)
+	    if (*s == c)
+		p = s;
+	return(p);
+}
+
+#ifdef DEBUG
+printcodes()
+{
+    /*
+     * Just print out codes from input file.  For debugging.
+     */
+    code_int code;
+    int col = 0, bits;
+
+    bits = n_bits = INIT_BITS;
+    maxcode = MAXCODE(n_bits);
+    free_ent = ((block_compress) ? FIRST : 256 );
+    while ( ( code = getcode() ) >= 0 ) {
+	if ( (code == CLEAR) && block_compress ) {
+   	    free_ent = FIRST - 1;
+   	    clear_flg = 1;
+	}
+	else if ( free_ent < maxmaxcode )
+	    free_ent++;
+	if ( bits != n_bits ) {
+	    fprintf(stderr, "\nChange to %d bits\n", n_bits );
+	    bits = n_bits;
+	    col = 0;
+	}
+	fprintf(stderr, "%5d%c", code, (col+=6) >= 74 ? (col = 0, '\n') : ' ' );
+    }
+    putc( '\n', stderr );
+    exit( 0 );
+}
+
+code_int sorttab[1<<BITS];	/* sorted pointers into htab */
+
+dump_tab()	/* dump string table */
+{
+    register int i, first;
+    register ent;
+#define STACK_SIZE	15000
+    int stack_top = STACK_SIZE;
+    register c;
+
+    if(do_decomp == 0) {	/* compressing */
+	register int flag = 1;
+
+	for(i=0; i<hsize; i++) {	/* build sort pointers */
+		if((long)htabof(i) >= 0) {
+			sorttab[codetabof(i)] = i;
+		}
+	}
+	first = block_compress ? FIRST : 256;
+	for(i = first; i < free_ent; i++) {
+		fprintf(stderr, "%5d: \"", i);
+		de_stack[--stack_top] = '\n';
+		de_stack[--stack_top] = '"';
+		stack_top = in_stack((htabof(sorttab[i])>>maxbits)&0xff, 
+                                     stack_top);
+		for(ent=htabof(sorttab[i]) & ((1<<maxbits)-1);
+		    ent > 256;
+		    ent=htabof(sorttab[ent]) & ((1<<maxbits)-1)) {
+			stack_top = in_stack(htabof(sorttab[ent]) >> maxbits,
+						stack_top);
+		}
+		stack_top = in_stack(ent, stack_top);
+		fwrite( &de_stack[stack_top], 1, STACK_SIZE-stack_top, stderr);
+	   	stack_top = STACK_SIZE;
+	}
+   } else if(!debug) {	/* decompressing */
+
+       for ( i = 0; i < free_ent; i++ ) {
+	   ent = i;
+	   c = tab_suffixof(ent);
+	   if ( isascii(c) && isprint(c) )
+	       fprintf( stderr, "%5d: %5d/'%c'  \"",
+			   ent, tab_prefixof(ent), c );
+	   else
+	       fprintf( stderr, "%5d: %5d/\\%03o \"",
+			   ent, tab_prefixof(ent), c );
+	   de_stack[--stack_top] = '\n';
+	   de_stack[--stack_top] = '"';
+	   for ( ; ent != NULL;
+		   ent = (ent >= FIRST ? tab_prefixof(ent) : NULL) ) {
+	       stack_top = in_stack(tab_suffixof(ent), stack_top);
+	   }
+	   fwrite( &de_stack[stack_top], 1, STACK_SIZE - stack_top, stderr );
+	   stack_top = STACK_SIZE;
+       }
+    }
+}
+
+int
+in_stack(c, stack_top)
+	register c, stack_top;
+{
+	if ( (isascii(c) && isprint(c) && c != '\\') || c == ' ' ) {
+	    de_stack[--stack_top] = c;
+	} else {
+	    switch( c ) {
+	    case '\n': de_stack[--stack_top] = 'n'; break;
+	    case '\t': de_stack[--stack_top] = 't'; break;
+	    case '\b': de_stack[--stack_top] = 'b'; break;
+	    case '\f': de_stack[--stack_top] = 'f'; break;
+	    case '\r': de_stack[--stack_top] = 'r'; break;
+	    case '\\': de_stack[--stack_top] = '\\'; break;
+	    default:
+	 	de_stack[--stack_top] = '0' + c % 8;
+	 	de_stack[--stack_top] = '0' + (c / 8) % 8;
+	 	de_stack[--stack_top] = '0' + c / 64;
+	 	break;
+	    }
+	    de_stack[--stack_top] = '\\';
+	}
+	return stack_top;
+}
+#endif /* DEBUG */
+
+writeerr()
+{
+    perror ( ofname );
+    unlink ( ofname );
+    exit ( 1 );
+}
+
+copystat(ifname, ofname)
+char *ifname, *ofname;
+{
+    struct stat statbuf;
+    int mode;
+    time_t timep[2];
+
+    fclose(stdout);
+    if (stat(ifname, &statbuf)) {		/* Get stat on input file */
+	perror(ifname);
+	return;
+    }
+    if ((statbuf.st_mode & S_IFMT/*0170000*/) != S_IFREG/*0100000*/) {
+	if(quiet)
+	    	fprintf(stderr, "%s: ", ifname);
+	fprintf(stderr, " -- not a regular file: unchanged");
+	exit_stat = 1;
+    } else if (statbuf.st_nlink > 1) {
+	if(quiet)
+	    	fprintf(stderr, "%s: ", ifname);
+	fprintf(stderr, " -- has %d other links: unchanged",
+		statbuf.st_nlink - 1);
+	exit_stat = 1;
+    } else if (exit_stat == 2 && (!force)) { /* No compression: rm file.Z */
+	if(!quiet)
+		fprintf(stderr, " -- file unchanged");
+    } else {			/* ***** Successful Compression ***** */
+	exit_stat = 0;
+	mode = statbuf.st_mode & 07777;
+	if (chmod(ofname, mode))		/* Copy modes */
+	    perror(ofname);
+	chown(ofname, statbuf.st_uid, statbuf.st_gid);	/* Copy ownership */
+	timep[0] = statbuf.st_atime;
+	timep[1] = statbuf.st_mtime;
+	utime(ofname, timep);	/* Update last accessed and modified times */
+	if (unlink(ifname))	/* Remove input file */
+	    perror(ifname);
+	if(!quiet)
+		fprintf(stderr, " -- replaced with %s", ofname);
+	return;		/* Successful return */
+    }
+
+    /* Unsuccessful return -- one of the tests failed */
+    if (unlink(ofname))
+	perror(ofname);
+}
+/*
+ * This routine returns 1 if we are running in the foreground and stderr
+ * is a tty.
+ */
+foreground()
+{
+	if(bgnd_flag) {	/* background? */
+		return(0);
+	} else {			/* foreground */
+		if(isatty(2)) {		/* and stderr is a tty */
+			return(1);
+		} else {
+			return(0);
+		}
+	}
+}
+
+onintr ( )
+{
+    unlink ( ofname );
+    exit ( 1 );
+}
+
+oops ( )	/* wild pointer -- assume bad input */
+{
+    if ( do_decomp == 1 ) 
+    	fprintf ( stderr, "uncompress: corrupt input\n" );
+    unlink ( ofname );
+    exit ( 1 );
+}
+
+cl_block ()		/* table clear for block compress */
+{
+    register long int rat;
+
+    checkpoint = in_count + CHECK_GAP;
+#ifdef DEBUG
+	if ( debug ) {
+    		fprintf ( stderr, "count: %ld, ratio: ", in_count );
+     		prratio ( stderr, in_count, bytes_out );
+		fprintf ( stderr, "\n");
+	}
+#endif /* DEBUG */
+
+    if(in_count > 0x007fffff) {	/* shift will overflow */
+	rat = bytes_out >> 8;
+	if(rat == 0) {		/* Don't divide by zero */
+	    rat = 0x7fffffff;
+	} else {
+	    rat = in_count / rat;
+	}
+    } else {
+	rat = (in_count << 8) / bytes_out;	/* 8 fractional bits */
+    }
+    if ( rat > ratio ) {
+	ratio = rat;
+    } else {
+	ratio = 0;
+#ifdef DEBUG
+	if(verbose)
+		dump_tab();	/* dump string table */
+#endif
+ 	cl_hash ( (count_int) hsize );
+	free_ent = FIRST;
+	clear_flg = 1;
+	output ( (code_int) CLEAR );
+#ifdef DEBUG
+	if(debug)
+    		fprintf ( stderr, "clear\n" );
+#endif /* DEBUG */
+    }
+}
+
+cl_hash(hsize)		/* reset code table */
+	register count_int hsize;
+{
+#ifndef XENIX_16	/* Normal machine */
+	register count_int *htab_p = htab+hsize;
+#else
+	register j;
+	register long k = hsize;
+	register count_int *htab_p;
+#endif
+	register long i;
+	register long m1 = -1;
+
+#ifdef XENIX_16
+    for(j=0; j<=8 && k>=0; j++,k-=8192) {
+	i = 8192;
+	if(k < 8192) {
+		i = k;
+	}
+	htab_p = &(htab[j][i]);
+	i -= 16;
+	if(i > 0) {
+#else
+	i = hsize - 16;
+#endif
+ 	do {				/* might use Sys V memset(3) here */
+		*(htab_p-16) = m1;
+		*(htab_p-15) = m1;
+		*(htab_p-14) = m1;
+		*(htab_p-13) = m1;
+		*(htab_p-12) = m1;
+		*(htab_p-11) = m1;
+		*(htab_p-10) = m1;
+		*(htab_p-9) = m1;
+		*(htab_p-8) = m1;
+		*(htab_p-7) = m1;
+		*(htab_p-6) = m1;
+		*(htab_p-5) = m1;
+		*(htab_p-4) = m1;
+		*(htab_p-3) = m1;
+		*(htab_p-2) = m1;
+		*(htab_p-1) = m1;
+		htab_p -= 16;
+	} while ((i -= 16) >= 0);
+#ifdef XENIX_16
+	}
+    }
+#endif
+    	for ( i += 16; i > 0; i-- )
+		*--htab_p = m1;
+}
+
+prratio(stream, num, den)
+FILE *stream;
+long int num, den;
+{
+	register int q;			/* Doesn't need to be long */
+
+	if(num > 214748L) {		/* 2147483647/10000 */
+		q = num / (den / 10000L);
+	} else {
+		q = 10000L * num / den;		/* Long calculations, though */
+	}
+	if (q < 0) {
+		putc('-', stream);
+		q = -q;
+	}
+	fprintf(stream, "%d.%02d%%", q / 100, q % 100);
+}
+
+version()
+{
+	fprintf(stderr, "%s\n", rcs_ident);
+	fprintf(stderr, "Options: ");
+#ifdef vax
+	fprintf(stderr, "vax, ");
+#endif
+#ifdef NO_UCHAR
+	fprintf(stderr, "NO_UCHAR, ");
+#endif
+#ifdef SIGNED_COMPARE_SLOW
+	fprintf(stderr, "SIGNED_COMPARE_SLOW, ");
+#endif
+#ifdef XENIX_16
+	fprintf(stderr, "XENIX_16, ");
+#endif
+#ifdef COMPATIBLE
+	fprintf(stderr, "COMPATIBLE, ");
+#endif
+#ifdef DEBUG
+	fprintf(stderr, "DEBUG, ");
+#endif
+#ifdef BSD4_2
+	fprintf(stderr, "BSD4_2, ");
+#endif
+	fprintf(stderr, "BITS = %d\n", BITS);
+}
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/progl b/src/test/java/org/xerial/snappy/testdata/calgary/progl
new file mode 100644
index 0000000..b9ae885
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/progl
@@ -0,0 +1,2244 @@
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; form.l -- screen forms handler
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(declare
+  (specials t)
+  (macros t))
+
+(eval-when (compile)
+  (load 'utilities)
+  (load 'constants)
+  (load 'zone)
+  (load 'look)
+  (load 'font)
+  (load 'text)
+  (load 'text-edit))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						generic fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct
+  (field		; generic field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'generic-field)		; type = generic
+  (zone (make-zone))		; bounding zone
+  (properties (list nil))	; empty property list
+)
+
+(defvar field-properties	; list of expected field properties
+  '("field-properties"
+    fill-ground		(solid pattern)		; should we draw when highlit?
+    fill-colour		(x_colour x_pattern)	; what colour or pattern?
+    empty-ground 	(solid pattern)		; should we draw when unlit?
+    empty-colour	(x_colour x_pattern)	; what colour or pattern?
+    border-colour	(x_colour) ; should we draw border (and what colour?)
+   ))	; can use this as real plist for online documentation
+
+(defun draw-field (f)		; draw field from scratch
+  (apply (concat 'draw- (field-type f))	; construct draw function name
+	 (ncons f)))				; then call it
+
+(defun init-field (f)		; initialize a field
+  (apply (concat 'init- (field-type f))	; construct init function name
+	 (ncons f)))				; then call it
+
+(defun resize-field (f box)		; resize a field
+  (apply				; construct resize function name
+    (concat 'resize- (field-type f))
+    (list f box)))				; then call it
+
+(defun toggle-field (f)		; toggle a field
+  (apply (concat 'toggle- (field-type f)) ; construct toggle fcn name
+	 (ncons f)))				; then call it
+
+(defun check-field (f p)	; check if point is inside field excl.border
+  (cond ((point-in-box-interior p (zone-box (field-zone f)))
+	 (apply			; if so, construct check function name
+	   (concat 'check- (field-type f))
+	   (list f p)))		; then call it and return result
+	(t nil)))		; otherwise return nil
+
+(defun fill-field (f)		; fill the field interior, if defined
+  (let ((b (get (field-properties f) 'fill-ground))	; check if has one
+	(c (get (field-properties f) 'fill-colour)))
+       (cond ((eq b 'solid)	; solid background
+	      (cond (c (clear-zone-interior (field-zone f) c))
+		    (t (clear-zone-interior (field-zone f) W-CONTRAST))))
+	     ((eq b 'pattern)	; patterned background
+	      (cond (c (pattern-zone-interior (field-zone f) c))
+		    (t (pattern-zone-interior (field-zone f) W-PATTERN-1))))
+       )))			; no background at all!
+
+(defun empty-field (f)		; empty the field interior, if defined
+  (let ((b (get (field-properties f) 'empty-ground)) ; check if has one
+	(c (get (field-properties f) 'empty-colour)))
+       (cond ((eq b 'solid)	; solid background
+	      (cond (c (clear-zone-interior (field-zone f) c))
+		    (t (clear-zone-interior (field-zone f) W-BACKGROUND))))
+	     ((eq b 'pattern)	; patterned background
+	      (cond (c (pattern-zone-interior (field-zone f) c))
+		    (t (pattern-zone-interior (field-zone f) W-PATTERN-1))))
+       )))			; no background at all!
+
+(defun draw-field-background (f)	; just what it says
+  (let ((b (get (field-properties f) 'empty-ground)) ; check if has one
+	(c (get (field-properties f) 'empty-colour)))
+       (cond ((eq b 'solid)	; solid background
+	      (cond (c (clear-zone (field-zone f) c))
+		    (t (clear-zone (field-zone f) W-BACKGROUND))))
+	     ((eq b 'pattern)	; patterned background
+	      (cond (c (pattern-zone (field-zone f) c))
+		    (t (pattern-zone (field-zone f) W-PATTERN-1))))
+       )))			; no background at all!
+
+(defun draw-field-border (f)		; draw outline, if any
+  (let ((c (get (field-properties f) 'border-colour)))
+       (cond (c (draw-zone-outline (field-zone f) c)))
+  ))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						aggregate fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct
+  (aggregate-field	; aggregate field = form
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'aggregate-field)		; type
+  (zone (make-zone))		; bounding zone
+  (properties (list nil))	; empty property list
+  subfields			; list of subfields
+  selection			; which subfield was last hit
+)
+  
+(defvar aggregate-field-properties
+  `("aggregate-field-properties"
+    = ,field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-aggregate-field (f)
+  (draw-field-background f)			; clear background, if any
+  (draw-field-border f)				; draw border, if any
+  (mapc 'draw-field (aggregate-field-subfields f)) ; draw subfields
+  (w-flush (window-w (zone-window (field-zone f)))) t) ; flush it out
+
+(defun init-aggregate-field (f)
+  (mapc 'init-field (aggregate-field-subfields f))
+  (alter-aggregate-field f selection nil) t)
+
+(defun resize-aggregate-field (f box)
+  (alter-zone (field-zone f) box box))
+
+(defun check-aggregate-field (f p)
+  (do ((subfields (aggregate-field-subfields f)	; go through subfields
+	 (cdr subfields))
+       (gotcha))
+      ((or (null subfields)				; stop when no more
+	   (setq gotcha (check-field (car subfields) p))) ; or when one is hit
+       (alter-aggregate-field f selection gotcha)	; remember which one
+       gotcha)))					; also return it
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						remote fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; A remote field is a field which activates another field when hit.
+;;; Usually the remote field has some functional significance!
+
+(defstruct
+  (remote-field		; remote field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'remote-field)		; type = remote
+  (zone (make-zone))		; bounding zone
+  (properties (list nil))	; empty plist
+  (target)			; the actual target field
+  (point)			; x,y coords to pretend to use
+)
+
+(defvar remote-field-properties
+  `("remote-field-properties"
+    = ,field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-remote-field (f) 't)	; nothing to draw
+
+(defun init-remote-field (f) 't)	; nothing to initialize
+
+(defun resize-remote-field (f box)
+  (alter-zone (field-zone f) box box))
+
+(defun check-remote-field (f p)
+  (check-field
+    (remote-field-target f)
+    (remote-field-point f)))		; return result of checking target
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						button fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct
+  (button-field		; button field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'button-field)		; type = button
+  (zone (make-zone))		; bounding zone
+  (properties
+    (list nil			; default properties
+	  'fill-ground 'solid
+	  'empty-ground 'solid
+	  'border-colour W-CONTRAST
+    ))
+  (value nil)			; value
+)
+
+(defvar button-field-properties
+  `("button-field-properties"
+    = ,field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-button-field (f)
+  (draw-field-border f)
+  (cond ((button-field-value f)
+	 (fill-field f))
+	(t (empty-field f))))
+
+(defun toggle-button-field (f)
+  (alter-button-field f value (not (button-field-value f)))
+  (clear-zone-interior (field-zone f) W-XOR))
+
+(defun init-button-field (f)
+  (alter-button-field f value nil))	; turn it off
+
+(defun resize-button-field (f box)
+  (alter-zone (field-zone f) box box))
+
+(defun check-button-field (f p)
+  (toggle-button-field f) f)	; if we get here it's a hit -> return self
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						radio-button fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Named for the buttons on radios in which only one is "in" at a time.
+
+(defstruct
+  (radio-button-field		; radio-button field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'radio-button-field)		; type = radio-button
+  (zone (make-zone))		; bounding zone
+  (properties (list nil))	; empty plist
+  (subfields nil)		; individual buttons
+  (selection nil)		; which one last hit
+)
+
+(defvar radio-button-field-properties
+  `("radio-button-field-properties"
+    = ,aggregate-field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-radio-button-field (f)
+  (draw-aggregate-field f))
+
+(defun init-radio-button-field (f)
+  (init-aggregate-field f))
+
+(defun resize-radio-button-field (f box)
+  (alter-zone (field-zone f) box box))
+
+(defun check-radio-button-field (f p)
+  (cond ((and (radio-button-field-selection f)	; if button previously sel'd
+	      (button-field-value
+		(radio-button-field-selection f))) ; and it has a value
+	 (toggle-field				; turn it off
+	   (radio-button-field-selection f))))
+  (check-aggregate-field f p)			; check individual buttons
+)		; this will turn back on if same one sel'd, and return it
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						text fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct
+  (text-field		; text field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'text-field)		; type = text
+  (zone (make-zone))		; bounding zone
+  (properties
+    (list nil
+	  'fill-ground 'solid
+	  'empty-ground 'solid
+	  'border-colour W-CONTRAST
+	  'x-offset 5		; offset from left
+    ))
+  (value nil)
+  (text '||)			; text of text
+)
+
+(defvar text-field-properties
+  `("text-field-properties"
+    x-offset (x_pixels)		; text offset from box ll, otherwise centred
+    y-offset (x_pixels)		; text offset from box ll, otherwise centred
+    + ,button-field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-text-field (f)
+  (draw-button-field f)
+  (w-flush (window-w (zone-window (field-zone f)))) ; guarantee text on top
+  (draw-text (text-field-text f)))
+
+(defun redraw-text-field (f)
+  (empty-field f)
+  (w-flush (window-w (zone-window (field-zone f)))) ; guarantee text on top
+  (draw-text (text-field-text f)))
+
+(defun init-text-field (f)	; position & position the text in the field
+  (let ((s (text-field-text f))
+	(x-offset (get (field-properties f) 'x-offset))	; x offset from ll
+	(y-offset (get (field-properties f) 'y-offset))); y offset from ll
+       (alter-text s
+	 zone (make-zone			; ensure it has a zone
+		window (zone-window (field-zone f))
+		box (box-interior (zone-box (field-zone f)))))
+       (format-text s)		; ensure text delta calculated
+       (cond ((null x-offset)		; x-offset specified?
+	      (setq x-offset		; nope! centre it left-right
+		    (/ (- (x (box-size (zone-box (field-zone f))))
+			  (x (text-delta s)))
+		       2))))
+       (cond ((null y-offset)		; y-offset specified?
+	      (setq y-offset		; nope! centre it up-down
+		    (/ (- (y (box-size (zone-box (field-zone f))))
+			  (font-x-height (look-font (text-look s))))
+		       2))))
+       (alter-text s			; now position the text
+	 offset (make-point x x-offset y y-offset))
+       ))
+
+(defun resize-text-field (f box)	; position the text in the field
+  (alter-zone (field-zone f) box box)
+  (init-text-field f))
+
+(defun check-text-field (f p)
+  (input-text-field f) f)	; if we get here it's a hit -> return self
+
+(defun input-text-field (f)
+  (alter-text (text-field-text f)
+    text '|| nn 0 kr 0 kl 0 delta (make-point x 0 y 0))
+  (draw-text-field f)
+  (edit-text-field f (ll (zone-box (text-zone (text-field-text f))))))
+
+(defun edit-text-field (f p)		; edit in middle of text field
+  (edit-text (text-field-text f) p)	; edit the text
+  (draw-field f))			; redraw
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						prompt fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct
+  (prompt-field		; prompt field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'prompt-field)		; type = prompt
+  (zone (make-zone))		; bounding zone
+  (properties
+    (list nil 'x-offset 0))	; put it exactly where spec indicates.
+  (value nil)
+  (text '||)			; text of prompt
+)
+
+(defvar prompt-field-properties
+  `("prompt-field-properties"
+    = ,text-field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-prompt-field (f)
+  (draw-text-field f))
+
+(defun init-prompt-field (f)
+  (init-text-field f))
+
+(defun resize-prompt-field (f box)	; position the text in the field
+  (resize-text-field f box))
+
+(defun check-prompt-field (f p) f) ; just return self
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						text-button fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; A text-button is a button tied to a text.
+;;; When the button is pressed, the text is input from the keyboard.
+;;; Zone could same as either the button (activation by button only)
+;;; or include both button & text (should then be adjacent)
+
+(defstruct
+  (text-button-field		; text-button field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'text-button-field)		; type = text-button
+  (zone (make-zone))		; bounding zone
+  (properties (list nil))	; empty plist
+  (button)			; button subfield
+  (text)			; text subfield
+)
+
+(defvar text-button-field-properties
+  `("text-button-field-properties"
+    = ,field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-text-button-field (f)
+  (draw-field (text-button-field-button f))
+  (draw-text-field (text-button-field-text f)))
+
+(defun init-text-button-field (f)
+  (init-field (text-button-field-button f))
+  (init-text-field (text-button-field-text f)))
+
+(defun resize-text-button-field (f box)
+  (alter-zone (field-zone f) box box))
+
+(defun toggle-text-button-field (f)	; toggle only the button part
+  (cond ((button-field-value		; and only if non-nil
+	   (text-button-field-button f))
+	 (toggle-button-field (text-button-field-button f)))))
+
+(defun check-text-button-field (f p)
+  (cond ((check-field (text-button-field-button f) p)
+	 (input-text-field			; input from scratch
+	   (text-button-field-text f)))	; get the data
+	(t (toggle-button-field			; must be pointing at text
+	     (text-button-field-button f))	; toggle only the button part
+	   (edit-text-field
+	     (text-button-field-text f) p))	; edit the data
+  )
+  (toggle-button-field			; toggle button back
+    (text-button-field-button f))
+  (alter-button-field (text-button-field-button f)
+    value nil)			; keep aggregate from toggling again
+  f)					; return self
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						labelled button fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct
+  (labelled-button-field ; labelled button field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'labelled-button-field)	; type = labelled-button
+  (zone (make-zone))		; bounding zone
+  (properties
+    (list nil
+	  'fill-ground 'solid
+	  'empty-ground 'solid
+	  'border-colour W-CONTRAST
+    ))
+  (value nil)			; value
+  (text '||)			; label text
+)
+
+(defvar labelled-button-field-properties
+  `("labelled-button-field-properties"
+    = ,text-field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-labelled-button-field (f)
+  (draw-text-field f))
+
+(defun init-labelled-button-field (f)
+  (init-text-field f))
+
+(defun resize-labelled-button-field (f box)
+  (resize-text-field f box))
+
+(defun check-labelled-button-field (f p)
+  (toggle-button-field f) f)	; if we get here it's a hit -> return self
+
+(defun toggle-labelled-button-field (f)
+  (toggle-button-field f))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;						expanded-bitmap fields
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defstruct
+  (expanded-bitmap-field	; expanded-bitmap field
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (type 'expanded-bitmap-field)	; type = expanded-bitmap
+  (zone (make-zone))		; bounding zone
+  (properties (list nil))	; empty plist
+  (subfields nil)		; individual bits
+  (selection nil)		; which one last hit
+  (nrows 1)
+  (ncols 1)
+)
+
+(defvar expanded-bitmap-field-properties
+  `("expanded-bitmap-field-properties"
+    = ,aggregate-field-properties
+   ))	; can use this as real plist for online documentation
+
+(defun draw-expanded-bitmap-field (f)
+  (draw-aggregate-field f))
+
+(defun init-expanded-bitmap-field (f)
+  (let ((s (divide-points			; calculate x,y dimensions
+	     (box-size (zone-box (field-zone f)))
+	     (make-point
+	       x (expanded-bitmap-field-ncols f)
+	       y (expanded-bitmap-field-nrows f)))))
+       (do ((z (field-zone f))
+	    (r nil)
+	    (x (x (ll (zone-box (field-zone f)))))
+	    (y (y (ll (zone-box (field-zone f))))
+	       (+ y dy))
+	    (dx (x s))
+	    (dy (y s))
+	    (nc (expanded-bitmap-field-nrows f))
+	    (nr (expanded-bitmap-field-nrows f))
+	    (j 0 (1+ j)))
+	   ((= j nr) (alter-aggregate-field f subfields (nreverse r)) 't)
+	   (do ((x x (+ x dx))
+		(p)
+		(i 0 (1+ i)))
+	       ((= i nc))			; create a row of buttons
+	       (setq p (make-point x x y y))
+	       (setq r (xcons r (make-button-field zone (append z nil))))
+	       (alter-zone (field-zone (car r))
+		 box (make-box ll p ur (add-points p s)))
+	   ))))
+
+(defun resize-expanded-bitmap-field (f box)
+  (alter-zone (field-zone f) box box)
+  (let ((s (divide-points			; calculate x,y dimensions
+	     (box-size box)
+	     (make-point
+	       x (expanded-bitmap-field-ncols f)
+	       y (expanded-bitmap-field-nrows f)))))
+       (do ((z (field-zone f))
+	    (r (expanded-bitmap-field-subfields f))
+	    (x (x (ll box)))
+	    (y (y (ll box)) (+ y dy))
+	    (dx (x s))
+	    (dy (y s))
+	    (nc (expanded-bitmap-field-nrows f))
+	    (nr (expanded-bitmap-field-nrows f))
+	    (j 0 (1+ j)))
+	   ((= j nr) t)
+	   (do ((x x (+ x dx))
+		(p)
+		(i 0 (1+ i)))
+	       ((= i nc))			; create a row of buttons
+	       (setq p (make-point x x y y))
+	       (resize-button-field (car r)
+		 (make-box ll p ur (add-points p s)))
+	       (setq r (cdr r))
+	   ))))
+
+(defun check-expanded-bitmap-field (f p)
+  (check-aggregate-field f p))	; if we get here it's a hit -> check subfields
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; utilities.l								;
+;;;									;
+;;; These macros and functions are thought to be generally useful.	;
+;;;									;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;							Macros		;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(declare
+  (macros t)		; keep macros around after compiling
+  (localf pairify* pairifyq* split2* sublist*)
+  (special compiled-with-help))
+
+(defmacro copy-all-but-last (ls)	; copy all but last member of list
+  `(let ((ls ,ls))
+	(firstn (1- (length ls))
+	  ls)))
+
+(defmacro all-but-last (ls)		; destructive all-but-last
+  `(let ((ls ,ls))
+	(cond ((cdr ls)
+	       (rplacd (nthcdr (- (length ls) 2) ls) nil)
+	       ls))))
+
+(def hex (macro (arglist)		; hex to integer conversion
+		`(car (hex-to-int ',(cdr arglist)))))
+
+;;; define properties on symbols for use by help routines
+
+(defmacro def-usage (fun usage returns group)
+  (cond (compiled-with-help	; flag controls help generation
+	  `(progn (putprop ,fun ,usage 'fcn-usage)
+		  (putprop ,fun ,returns 'fcn-returns)
+		  (putprop ,fun (nconc ,group (ncons ,fun)) 'fcn-group)))))
+(defvar compiled-with-help t)	; unless otherwise notified
+
+;;; (letenv 'l_bind_plist g_expr1 ... g_exprn) -- pair-list form of "let"
+;;; Lambda-binds pairs of "binding-objects" (see description of let,let*),
+;;; at RUN TIME, then evaluates g_expr1 to g_exprn, returning g_exprn. eg:
+;;; (apply 'letenv '(letenv '(a 1 b (+ c d))
+;;;		      (e)(f g)))
+;-> (eval (cons 'let (cons (pairify '(a 1 b (+ c d)))
+;;;			   '((e) (f g)))))
+;-> (let ((a 1) (b (+ c d)))
+;;;	 (e) (f g))
+(def letenv
+  (macro (x)
+    `(eval (cons 'let
+	     (cons
+	       (pairify ,(cadr x))	; plist of binding objects
+	       ',(cddr x))))))		; exprs to be eval'ed
+
+(def letenvq			; letenv, quoted binding objects
+  (macro (x)
+    `(eval (cons 'let
+	     (cons
+	       (pairifyq ,(cadr x))	; plist of binding objects
+	       ',(cddr x))))))		; exprs to be eval'ed
+
+(defmacro mergecar (L1 L2 cmpfn)	; merge, comparing by car's
+  `(merge ,L1 ,L2 '(lambda (e1 e2)		; (like sortcar)
+		     (funcall ,cmpfn (car e1) (car e2)))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;							Functions	;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; (all-but-last l_items)	-- copy all but last list element
+
+;(defun all-but-last (ls)
+;  (cond ((cdr ls) (cons (car ls) (all-but-last (cdr ls))))))
+
+;;; (alphap sx_char)
+(defun alphap (char)			; is char alphabetic?
+  (cond ((symbolp char)
+	 (setq char (car (exploden char)))))
+  (and (fixp char)
+       (or (and (>& char #.(1- #/A))
+		(<& char #.(1+ #/Z)))
+	   (and (>& char #.(1- #/a))
+		(<& char #.(1+ #/z))))))
+
+;;; (alphanumericp sx_char)
+(defun alphanumericp (char)		; is char alphabetic or numeric?
+  (cond ((symbolp char)
+	 (setq char (car (exploden char)))))
+  (and (fixp char)
+       (or (and (>& char #.(1- #/A))
+		(<& char #.(1+ #/Z)))
+	   (and (>& char #.(1- #/a))
+		(<& char #.(1+ #/z)))
+	   (and (>& char #.(1- #/0))
+		(<& char #.(1+ #/9))))))
+
+;;; (assqonc 'g_key 'g_val 'l_al)
+;;; like   (cond ((assq key alist))
+;;;		 (t (cadr (rplacd (last alist)
+;;;			    (ncons (cons key val))))))
+(defun assqonc (key val al)	; tack (key.val) on end if not found
+  (do ((al al (cdr al)))
+      ((or (eq key (caar al))
+	   (and (null (cdr al))
+		(rplacd al (setq al (ncons (cons key val))))))
+       (car al))))
+
+;;; (cartesian l_xset l_yset)
+(defun cartesian (xset yset)		; cartesian product of elements
+  (mapcan
+    '(lambda (x)
+       (mapcar
+	 '(lambda (y) (cons x y))
+	 yset))
+    xset))
+
+(defun concat-pairs (sb-list)	; concat neighbouring symbol pairs
+  (do ((s1 (car sb-list) s2)
+       (s2 (cadr sb-list) (car sbs-left))
+       (sbs-left (cddr sb-list) (cdr sbs-left))
+       (result nil (cons (concat s1 s2) result)))
+      ((null s2) (nreverse result))))
+;;; (detach l)
+;;; Detaches (and throws away) first element of list (converse of attach)
+;;; keeping the same initial list cell.
+(defun detach (l)
+  (cond (l (rplacd l (cddr (rplaca l (cadr l)))))))
+
+;;; (distribute x_Q x_N)
+;;; returns list of the form: (1 1 1 0 0 0 0 1 1) or (3 2 2 2 3)
+;;; i.e. a list of length <N> containing quantity <Q> evenly distributed
+;;; with the excess <Q mod N> surrounding a "core" of <Q div N>'s
+;;; Useful (?) for padding spaces in line adjustment.
+;(defun distribute (Q N)	; this one only does 1's and 0's
+;  (cond ((signp le Q) (duplicate N 0))
+;	((eq Q 1) (pad 0 N '(1)))
+;	(t (cons 1 (nconc
+;		     (distribute (- Q 2) (- N 2))
+;		     '(1))))))
+
+(defun distribute (Q N)		; distribute quantity Q among N elements
+  (let ((tmp (Divide (abs Q) N)))
+       (setq tmp (distribute0 (cadr tmp) N (car tmp) (1+ (car tmp))))
+       (cond ((signp ge Q) tmp)
+	     (t (mapcar 'minus tmp)))))
+
+(defun distribute0 (Q N X X1)
+  (cond ((signp le Q) (duplicate N X))
+	((eq Q 1) (pad X N (ncons X1)))
+	(t (cons X1 (nconc
+			  (distribute0 (- Q 2) (- N 2) X X1)
+			  (ncons X1))))))
+
+;;; (duplicate x_n g_object)
+;;; Returns list of n copies of object (nil if n <= 0)
+(defun duplicate (n object)
+  (do ((res nil (cons object res))
+       (i n (1- i)))
+      ((signp le i) res)))
+
+(defun e0 (in out)		; simulate binary insertion procedure
+  (let ((lin (length in))
+	(lout (length out)))
+       (cond ((> lin lout)
+	      (e0
+		(nthcdr lout in)
+		(mapcan 'list out (firstn lout in))))
+	     (t (nconc (mapcan 'list (firstn lin out) in)
+		       (nthcdr lin out))))))
+
+(defun e (files)		; determine file permutation for emacs insert
+  (let ((i (e0 (cdr (iota (length files))) '(0)))
+	(f (append files nil)))
+       (mapc '(lambda (f-index f-name)
+		(rplaca (nthcdr f-index f) f-name))
+	     i files)
+       f))
+
+;;; (firstn x_n l_listarg)
+(defun firstn (n l)		;  copy first <n> elements of list
+  (do ((n n (1- n))
+       (l l (cdr l))
+       (r nil))
+      ((not (plusp n)) (nreverse r))		; <nil> if n=0 or -ve
+      (setq r (cons (car l) r))))
+
+;;; (iota x_n)
+;;; APL index generator (0,1,2,...,<n>-1)
+(defun iota (n)
+  (do ((i (1- n) (1- i))
+       (res nil))
+      ((minusp i) res)
+      (setq res (cons i res))))
+
+(defun hex-to-int (numlist)		; eg. (hex-to-int '(12b3 120 8b))
+  (cond
+    (numlist			; terminate recursion on null numlist
+      (cons
+	(apply '+
+	       (maplist
+		 '(lambda (digits)
+		    (lsh
+		      (get '(hex |0| 0 |1| 1 |2| 2 |3| 3
+				 |4| 4 |5| 5 |6| 6 |7| 7
+				 |8| 8 |9| 9  a 10  b 11
+				  c 12  d 13  e 14  f 15)
+			   (car digits))
+		      (lsh (1- (length digits)) 2)))
+		 (explodec (car numlist))))
+	(hex-to-int (cdr numlist))))))  
+
+;;; (lctouc g_expr)
+;;; Returns s-expression formed by translating lower-case alphabetic
+;;; characters in <expr> to their upper-case equivalents.
+;;; Operates by imploding the translated characters, in the case of a
+;;; symbol or string, or by recursively calling on members of a list.
+;;; Other object types are returned unchanged.
+(defun lctouc (expr)
+    (cond
+	((dtpr expr) (mapcar 'uctolc expr))
+	((or (symbolp expr) (stringp expr))
+	 (implode
+	     (mapcar
+		 '(lambda (ch)
+		      (cond ((alphap ch)		; and-out lower-case bit
+			     (boole 1 #.(1- (1- #/a)) ch)) (t ch)))
+		 (exploden expr))))
+	(t expr)))
+
+;;; (log2 x_n)
+(defun log2 (n)			; log base 2 (truncated)
+  (do ((n (lsh n -1) (lsh n -1))
+       (p 0 (1+ p)))
+      ((zerop n) p)))
+
+;;; (lowerp sx_char)
+(defun lowerp (char)		; is char lower-case alphabetic?
+  (cond ((symbolp char)
+	 (setq char (car (exploden char)))))
+  (and (fixp char)
+       (or (and (> char #.(1- #/a))
+		(< char #.(1+ #/z))))))
+
+;;; (numericp sx_char)
+;;; returns t if char is numeric, otherwise nil
+(defun numericp (char)
+  (cond ((symbolp char)(setq char (car (exploden char)))))
+  (and (fixp char)
+       (and (> char #.(1- #/0))
+	    (< char #.(1+ #/9)))))
+
+;;; (pad g_item x_n l_list)
+;;; Returns <list> padded with copies of <item> to length <n>
+(defun pad (item n list)
+  (append list (duplicate (- n (length list)) item)))
+
+;;; (pairify l_items)	; make a-list from alternating elements
+(defun pairify (pl)
+  (pairify* nil pl))
+(defun pairify* (rs pl)		; tail-recursive local fun
+  (cond (pl (pairify* (cons (list (car pl) (cadr pl)) rs)
+		       (cddr pl)))
+	(t (nreverse rs))))
+
+;;; (pairifyq l_items)	; make a-list from alternating elements
+(defun pairifyq (pl)	; with each second element quoted
+  (pairifyq* nil pl))
+(defun pairifyq* (rs pl)		; tail-recursive local fun
+  (cond (pl (pairifyq* (cons (list (car pl) (kwote (cadr pl))) rs)
+		       (cddr pl)))
+	(t (nreverse rs))))
+
+;;; (penultimate l_items)	; cdr down to next-to-last list element
+(defun penultimate (ls)	
+  (cond ((cddr ls) (penultimate (cdr ls)))
+	(t ls)))
+
+;;; (split2 l_L)
+;;; Splits list <L> into two (new) second-level lists
+(defun split2* (L tc1 tc2)
+  (cond ((null L) (list (nreverse tc1) (nreverse tc2)))
+	(t (split2* (cddr L)
+	     (cons (car L) tc1)
+	     (cons (cadr L) tc2)))))
+
+(defun split2 (L)
+  (split2* L nil nil))
+
+;;; (sublist L IL)
+;;; Splits list <L> (destructively) into (length IL) sub-lists.
+;;; IL is a list of starting indices, base zero, should be unique positive
+;;; fixnums in ascending order, and shouldn't exceed the length of L.
+;;; Each resulting sublist <i> begins with (nthcdr (nth <i> IL) L)
+(defun sublist (L IL)
+  (sublist* 0 nil (cons nil L) IL))
+(defun sublist* (I R L IL)		; tail-recursion function
+  (cond ((and L IL)
+	 (cond
+	   ((<& I (car IL))
+	    (sublist* (1+ I) R (cdr L) IL))
+	   (t (sublist* (1+ I)
+			(cons (cdr L) R)
+			(prog1 (cdr L) (rplacd L nil))
+			(cdr IL)))))
+	(t (nreverse R))))
+
+(defun try-fun (fun l-arg)	; try function on each arg until non-nil
+  (cond ((funcall fun (car l-arg)))
+	(l-arg (try-fun fun (cdr l-arg)))))
+
+;;; (uctolc g_expr)
+;;; Returns s-expression formed by translating upper-case alphabetic
+;;; characters in <expr> to their lower-case equivalents.
+;;; Operates by imploding the translated characters, in the case of a
+;;; symbol or string, or by recursively calling on members of a list.
+;;; Other object types are returned unchanged.
+(defun uctolc (expr)
+    (cond
+	((dtpr expr) (mapcar 'uctolc expr))
+	((or (symbolp expr) (stringp expr))
+	 (implode
+	     (mapcar
+		 '(lambda (ch)
+		      (cond ((alphap ch)		; or-in lower-case bit
+			     (boole 7 #.(1- #/a) ch)) (t ch)))
+		 (exploden expr))))
+	(t expr)))
+
+;;; (unique a l) -- Scan <l> for an element <e> "equal" to <a>.
+;;; If found, return <e>. Otherwise nconc <a> onto <l>; return <a>.
+(defun unique (a l)			; ensure unique in list
+  (car
+    (do ((cdr_ul l (cdr ul))
+	 (ul l cdr_ul))
+	((null cdr_ul) (rplacd ul (ncons a)))
+	(cond ((equal a (car cdr_ul)) (return cdr_ul))))))
+
+;;; (upperp sx_char)
+(defun upperp (char)		; is char upper-case alphabetic?
+  (cond ((symbolp char)
+	 (setq char (car (exploden char)))))
+  (and (fixp char)
+       (or (and (> char #.(1- #/A))
+		(< char #.(1+ #/Z))))))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; zone.l -- data structures and routines for concrete window zones
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; a "point" is a pair of integer x,y coordinates
+;;; a "box" is a pair of points defining lower left and upper right corners
+;;; a "position" is a point coupled with a window
+;;; a "zone" is a box coupled with a window
+;;; a "window" is a machine, integer window id and, for compatibility
+;;;	with the toolbox, an integer toolbox window pointer
+;;; a "machine" is a name coupled with the j-process-id's of resident servers
+;;; The basic idea is to define a notion of a concrete position for a
+;;; display object, that can be incorporated into the object data structure.
+;;; Higher levels of software can use the objects without explicit reference
+;;; to server processes, windows and machines.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(declare
+  (specials t)			; global vars not local to this file
+  (macros t))			; compile macros as well
+
+(eval-when (compile)		; trust  to higher level for eval & load
+  (load 'utilities)		; utility functions
+  (load 'constants)		; common constants for window toolbox
+;  (load 'shape)		; arbitrarily shaped screen areas
+)
+
+(defstruct
+  (position		; a concrete display position
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (window (make-window))	; concrete window
+  (point (make-point))		; actual x, y coordinates
+)
+
+(defstruct
+  (zone			; a concrete display zone
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (window (make-window))	; concrete window
+  (box (make-box))		; bounding box of zone
+  (colour W-BACKGROUND)		; colour (for scrolling etc)
+  shape
+)
+
+(defstruct
+  (window		; concrete window
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (id 0)			; integer window id
+  (machine (make-machine))	; machine (workstation)
+  (w 0)				; toolbox window structure pointer
+)
+
+(defstruct
+  (machine		; machine (workstation)
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (name	'unknown-machine)	; machine name
+  (servers nil)			; plist of server processes living there
+)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; manipulation routines
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun add-points (p q)		; vector sum (x1+x2) (y1+y2)
+  (make-point
+    x (+ (x p) (x q))
+    y (+ (y p) (y q))))
+
+(defun subtract-points (p q)	; vector subtract (x1-x2) (y1-y2)
+  (make-point
+    x (- (x p) (x q))
+    y (- (y p) (y q))))
+
+(defun multiply-points (p q)	; vector multiply (x1*x2) (y1*y2)
+  (make-point
+    x (* (x p) (x q))
+    y (* (y p) (y q))))
+
+(defun divide-points (p q)	; vector division (x1-x2) (y1-y2)
+  (make-point
+    x (/ (x p) (x q))
+    y (/ (y p) (y q))))
+
+(defun move-point (p q)		; move point p to point q
+  (alter-point p
+    x (x q)
+    y (y q))
+  t)					; return true
+
+(defun box-size (b)		; size of box = ur - ll
+  (subtract-points (ur b) (ll b)))
+
+(defun box-interior (b)		; return box just inside this box dimensions
+  (make-box
+    ll (add-points (ll b) '(1 1))
+    ur (subtract-points (ur b) '(1 1))))
+
+(defun move-box (b p)		; move box b to point p (lower-left)
+  (let ((size (box-size b)))
+       (alter-box b
+	 ll p
+	 ur (add-points p size))
+       t))				; return true
+
+(defun point-in-box (p b)	; is point p in box b? (including boundary)
+  (and (>= (x p) (x (ll b)))
+       (<= (x p) (x (ur b)))
+       (>= (y p) (y (ll b)))
+       (<= (y p) (y (ur b)))
+  ))
+
+(defun point-in-box-interior (p b) ; is point p in box b? (excluding boundary)
+  (and (> (x p) (x (ll b)))
+       (< (x p) (x (ur b)))
+       (> (y p) (y (ll b)))
+       (< (y p) (y (ur b)))
+  ))
+
+(defun init-window (w)		; fill in  "window" structure
+  (let				; presuming window-w predefined
+    ((m (j-machine-name (w-get-manager (window-w w)))))
+    (alter-window w id (w-get-id (window-w w)))
+    (cond ((not (window-machine w))
+	   (alter-window w machine (make-machine name m)))
+	  (t (alter-machine (window-machine w) name m)))
+    (init-machine (window-machine w))	; also fill in machine structure
+    t))				; return true
+
+(defun init-machine (m)		; fill in "machine" structure
+  (cond				; presuming machine-name predefined
+    ((null (machine-servers m))		; if no plist, make new one
+     (alter-machine m servers (ncons 'servers:))))
+  (mapc '(lambda (pname)		; for each expected server name
+	   (let
+	     ((pid (j-search-machine-e jipc-error-code
+		     (machine-name m)
+		     pname)))		; try to find one on that machine
+	     (cond ((j-same-process pid J-NO-PROCESS)
+		    (putprop (machine-servers m) nil pname)) ; failed! use nil
+		   (t (putprop (machine-servers m) pid pname))))) ; success!
+	EXPECTED-WORKSTATION-SERVERS)	; global list of process names
+  t)					; return true
+
+(defvar EXPECTED-WORKSTATION-SERVERS	; global list of process names
+  '(window_manager creator savemem
+     text-composer))			; usually want at least these
+
+(defun window-box (w)		; box fills entire window
+  (let ((w-size (w-get-window-size (window-w w))))
+       (make-box
+	 ll (make-point x 0 y 0)
+	 ur (make-point x (car w-size) y (cadr w-size)))
+  ))
+
+(defun clear-zone (z colour)	; clear zone (including boundaries)
+  (let ((b (box-size (zone-box z))))
+       (w-clear-rectangle (window-w (zone-window z))
+	 (x (ll (zone-box z))) (y (ll (zone-box z)))
+	 (1+ (x b)) (1+ (y b))
+	 colour)))
+
+(defun clear-zone-interior (z colour)	; clear zone (excluding boundaries)
+  (let ((b (box-size (zone-box z))))
+       (w-clear-rectangle (window-w (zone-window z))
+	 (1+ (x (ll (zone-box z)))) (1+ (y (ll (zone-box z))))
+	 (1- (x b)) (1- (y b))
+	 colour)))
+
+(defun pattern-zone (z pattern)	; pattern zone (including boundaries)
+  (let ((b (zone-box z)))
+       (w-pattern-rectangle (window-w (zone-window z))
+	 (x (ll b)) (y (ll b))
+	 (1+ (x (ur b))) (1+ (y (ur b))) pattern)
+  ))
+
+(defun pattern-zone-interior (z pattern) ; pattern zone (excluding boundaries)
+  (let ((b (box-size (zone-box z))))
+       (w-pattern-rectangle (window-w (zone-window z))
+	 (1+ (x (ll (zone-box z)))) (1+ (y (ll (zone-box z))))
+	 (1- (x b)) (1- (y b)) pattern)
+  ))
+
+(defun draw-zone-outline (z colour)	; draw zone boundaries
+  (let* ((w (window-w (zone-window z)))
+	 (b (zone-box z))
+	 (ll (ll b))
+	 (ur (ur b)))
+	(w-draw-vector w (x ll) (y ll) (x ll) (y ur) colour)
+	(w-draw-vector w (x ll) (y ur) (x ur) (y ur) colour)
+	(w-draw-vector w (x ur) (y ur) (x ur) (y ll) colour)
+	(w-draw-vector w (x ur) (y ll) (x ll) (y ll) colour)
+  ))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; font.l -- font manipulation
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(eval-when (compile)
+  (load 'utilities)
+  (load 'constants))
+
+(defvar -installed-fonts nil)	; list of installed fonts
+
+(defstruct
+  (font			; font structure
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (name 'standard)
+  (size 8)
+  (body 8)
+  (cap-height 7)
+  (x-height 5)
+  (fixed-width 5)
+  (first 0)
+  (last 127)
+  glyph			; the actual characters
+)
+
+(defstruct
+  (glyph			; glyph structure
+    (:displace t)
+    (:list)
+    (:conc-name))
+  code
+  width
+  (bytes (byte-block 32))	; the actual bitmap
+)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; 				font manipulation routines
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun read-font (family size path)
+  (let ((p (infile path))		; open file
+	(x (new-vectori-long 2))
+	(f nil))
+       (setq f (make-font
+		 name family
+		 size (tyi p)
+		 body (tyi p)
+		 cap-height (tyi p)
+		 x-height (tyi p)
+		 fixed-width (tyi p)
+		 first (prog1 (tyi p) (tyi p))
+		 last (prog1 (tyi p) (tyi p))))
+       (alter-font f glyph
+	 (do ((i (font-first f) (1+ i))
+	      (r (ncons nil))
+	      (g))	   
+	     ((> i (font-last f)) (car r))
+	     (setq g (make-glyph code i))	; allocate char
+	     (do ((j 0 (1+ j)))			; read bitmap
+		 ((> j 31))
+		 (vseti-byte (glyph-bytes g) j (tyi p)))
+	     (alter-glyph g width (tyi p))	; read width
+	     (setq r (tconc r g))
+	 ))
+       (close p)			; close file
+
+       (rplacd				; install font
+	 (cond ((assoc (list (font-name f) (font-size f)) -installed-fonts))
+	       (t (car (setq -installed-fonts
+			     (cons (ncons (list (font-name f) (font-size f)))
+				   -installed-fonts)))))
+	 f)
+       f))				; return font
+
+(def-usage 'read-font '(|'st_family| |'x_size| |'st_path|)
+  'l_font-descriptor
+  (setq fcn-group (ncons "Font Manipulation:")))
+
+(defun install-font (f)
+  (cdr
+    (rplacd				; install font
+      (cond ((assoc (list (font-name f) (font-size f)) -installed-fonts))
+	    (t (car (setq -installed-fonts
+			  (cons (ncons (list (font-name f) (font-size f)))
+				-installed-fonts)))))
+      f)))
+
+(defun find-font (family size)	; always "finds" one even if dummy
+  (cond ((cdr (assoc (list family size) -installed-fonts)))
+	(t (install-font (make-font name family size size)))))
+
+(def-usage 'find-font
+  '(|'st_family| |'x_size|)
+  'l_font-descriptor
+  fcn-group)
+
+(defun create-font (driver font)
+  (j-send-se-list driver
+    (list 'make-font
+	  (font-name font)
+	  (font-size font)
+	  (font-body font)
+	  (font-cap-height font)
+	  (font-x-height font)
+	  (font-fixed-width font)
+	  (font-first font)
+	  (font-last font))))
+
+(defun download-glyph (driver font glyph)
+  (j-put-items
+    `((J-STRING set-glyph)
+       (J-STRING ,(font-name font))
+       (J-INT ,(font-size font))
+       (J-INT ,(glyph-code glyph))
+       (J-INT ,(glyph-width glyph))
+       (J-BLOCK ,(glyph-bytes glyph))))
+  (j-send driver))
+
+(defun download-font (driver font)
+  (do ((g (font-glyph font))
+       (font-size (font-size font)))
+      ((null g))
+      (j-put-items
+	`((J-STRING set-glyph)
+	  (J-STRING ,(font-name font))
+	  (J-INT ,font-size)))
+      (do ((gg g (cdr gg)))
+	  ((or (null gg) (j-put-items
+			   `((J-INT ,(glyph-code (car gg)))
+			     (J-INT ,(glyph-width (car gg)))
+			     (J-BLOCK
+			       ,(glyph-bytes (car gg))
+			       ,(+ font-size font-size)))))
+	   (setq g gg)))		; when buffer full, save remainder
+      (j-send driver)
+      (cond ((eq J-STRING (j-next-item-type))
+	     (j-gets j-comm-string 128)		; skip past message string
+	     (cond ((eq J-INT (j-next-item-type))(patom (j-geti))(terpr)))))
+  ))
+
+(def-usage 'download-font
+  '(|'x_process-id| |'l_font-descriptor|)
+  't
+  fcn-group)
+
+(defun read-create-download-font (driver family size path)
+  (let ((f (read-font family size path)))
+       (create-font driver f)
+       (download-font driver f)
+       f))
+
+(def-usage 'read-create-download-font
+  '(|'x_process-id| |'st_family| |'x_size| |'st_path|)
+  'l_font-descriptor
+  fcn-group)
+
+(defun font-depth (f)
+  (- (font-body f) (font-cap-height f)))
+
+(defun font-height (f)
+  (font-cap-height f))
+
+(defun get-font-list (sc) ; arg is string-composer or font-server pid
+  (j-send-se sc 'get-font-list)
+  (pairify (mapcar
+	     '(lambda (x)
+		(cond ((stringp (cadr x)) (concat (cadr x)))
+		      (t (cadr x))))
+	     (j-get-items))))
+
+(defun get-all-font-info (sc) ; arg is string-composer or font-server pid
+  (mapc '(lambda (f)
+	   (rplacd (apply 'find-font f)
+	     (cdr (progn
+		    (j-send-se-list sc (cons 'get-font-info f))
+		    (mapcar 'cadr (j-get-items))))))
+	(get-font-list sc)))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; text.l -- fancy text strings
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(declare
+  (specials t)
+  (macros t))
+
+(eval-when (compile)
+  (load 'utilities)
+  (load 'constants)
+  (load 'zone)
+  (load 'font)
+  (load 'look))
+
+(defstruct
+  (text		; text structure
+    (:displace t)
+    (:list)
+    (:conc-name))
+  (text '||)			; the text to draw
+  (look (make-look))		; what style to draw it in
+  (kl 0)			; (starting) left kerning mask
+  (zone (make-zone))		; specific window, clipping box
+  (offset (make-point))		; offset of start point from zone ll
+  (kr 0)			; (final) right kerning mask
+  (delta (make-point))		; change in (x,y) relative to start point
+  (nn -1)			; char count
+)
+
+;;; NOTE: clipping box of ((0 0) (-1 -1)) uses window boundaries
+
+(defun text-width (s)		; presumes non-rotated
+  (x (text-delta s)))
+
+(defun text-box (s)		; presumes non-rotated
+  (make-box
+    ll (subtract-points
+	 (text-start-point s)
+	 (make-point x 0 y (font-depth (look-font (text-look s)))))
+    ur (add-points
+	 (text-end-point s)
+	 (make-point x 0 y (font-height (look-font (text-look s)))))))
+
+(defun text-start-point (s)
+  (add-points
+    (ll (zone-box (text-zone s)))
+    (text-offset s)))
+
+(defun text-end-point (s)
+  (add-points
+    (text-start-point s)
+    (text-delta s)))
+
+(defun text-x (s)	; x coord of start of text object
+  (+ (x (ll (zone-box (text-zone s))))
+     (x (text-offset s))))
+
+(defun text-y (s)	; y coord of start of text object
+  (+ (y (ll (zone-box (text-zone s))))
+     (y (text-offset s))))
+
+(defun text-xx (s)	; x coord of end of text object
+  (+ (x (ll (zone-box (text-zone s))))
+     (x (text-offset s))
+     (x (text-delta s))))
+
+(defun text-yy (s)	; y coord of end of text object
+  (+ (y (ll (zone-box (text-zone s))))
+     (y (text-offset s))
+     (y (text-delta s))))
+
+(defun move-text (s p)	; move s to new x,y
+  (alter-text s
+    offset (subtract-points p (ll (zone-box (text-zone s))))))
+
+(defun draw-text (s)		; quietly draw text, clipping to zone box
+  (let (((x y) (text-start-point s))
+	(l (text-look s)))
+       (j-put-items
+	 `((J-STRING compose)
+	   (J-INT ,(window-id (zone-window (text-zone s))))
+	   (J-STRING ,(text-text s))
+	   (J-STRING ,(font-name (look-font l)))
+	   (J-INT ,(font-size (look-font l)))
+	   (J-INT ,(boole 7 (look-mode l) QUIET))
+	   (J-INT ,(look-colour l))
+	   (J-INT ,(look-gap l))
+	   (J-INT ,(look-ul l))
+	   (J-INT ,(text-kl s))
+	   (J-INT ,x)
+	   (J-INT ,y)
+	   (J-INT ,(x (cond
+			((zerop (boole 1 ROTATE-180 (look-mode l)))
+			 (ur (zone-box (text-zone s))))
+			(t (ll (zone-box (text-zone s)))))))
+	   (J-INT ,(y (cond
+			((zerop (boole 1 ROTATE-90 (look-mode l)))
+			 (ur (zone-box (text-zone s))))
+			(t (ll (zone-box (text-zone s)))))))
+	   (J-INT ,(text-nn s))
+	  ))
+       (j-send (get (machine-servers
+		      (window-machine
+			(zone-window
+			  (text-zone s))))
+		    'text-composer))
+  ))
+
+(defun undraw-text (s)	; quietly undraw text, clipping to zone box
+  (let (((x y) (text-start-point s))
+	(l (text-look s)))
+       (j-put-items
+	 `((J-STRING compose)
+	   (J-INT ,(window-id (zone-window (text-zone s))))
+	   (J-STRING ,(text-text s))
+	   (J-STRING ,(font-name (look-font l)))
+	   (J-INT ,(font-size (look-font l)))
+	   (J-INT ,(boole 7 OVERSTRIKE QUIET (look-mode l)))
+	   (J-INT ,(inverse-colour (look-colour l)))
+	   (J-INT ,(look-gap l))
+	   (J-INT ,(look-ul l))
+	   (J-INT ,(text-kl s))
+	   (J-INT ,x)
+	   (J-INT ,y)
+	   (J-INT ,(x (cond
+			((zerop (boole 1 ROTATE-180 (look-mode l)))
+			 (ur (zone-box (text-zone s))))
+			(t (ll (zone-box (text-zone s)))))))
+	   (J-INT ,(y (cond
+			((zerop (boole 1 ROTATE-90 (look-mode l)))
+			 (ur (zone-box (text-zone s))))
+			(t (ll (zone-box (text-zone s)))))))
+	   (J-INT ,(text-nn s))
+	  ))
+       (j-send (get (machine-servers
+		      (window-machine
+			(zone-window
+			  (text-zone s))))
+		    'text-composer))
+  ))
+
+(defun format-text (s)	; format text without drawing or clipping
+  (let ((memop (symbolp (text-text s)))	; can only memoize symbols
+	(k) (p) (q) (l (text-look s)))
+       (cond
+	 (memop					; are we memoizing? yes!
+	   (setq k (unique-look-id l))	; key based on look
+	   (setq p (get (text-text s) k))		; alist found on plist
+	   (setq q (assoc (text-kl s) p))))		; entry based on kl
+       (cond
+	 (q (alter-text s			; if info found
+	      kr (cadr q)			; record result
+	      delta (caddr q)			; then return
+	      nn (cadddr q)))
+	 (t					; otherwise compute data
+	   (j-put-items
+	     `((J-STRING compose)
+	       (J-INT 0)			; no window needed
+	       (J-STRING ,(text-text s))
+	       (J-STRING ,(font-name (look-font l)))
+	       (J-INT ,(font-size (look-font l)))
+	       (J-INT ,(boole 7 NO-DRAW (look-mode l)))
+	       (J-INT ,(look-colour l))
+	       (J-INT ,(look-gap l))
+	       (J-INT ,(look-ul l))
+	       (J-INT ,(text-kl s))
+	       (J-INT 0)			; starting point 0 0
+	       (J-INT 0)
+	       (J-INT -1)			; no clipping
+	       (J-INT -1)
+	       (J-INT -1)
+	      ))
+	   (j-send (get (machine-servers
+			  (window-machine
+			    (zone-window
+			      (text-zone s))))
+			'text-composer))
+	   (let ((kr (j-geti))			; now record result
+		 (xx (j-geti))
+		 (yy (j-geti))
+		 (nn (j-geti)))
+		(alter-text s
+		  kr kr
+		  delta (make-point x xx y yy)
+		  nn nn)
+		(cond (memop				; memoize if req'd
+			(cond (p (nconc p
+				   (ncons (list (text-kl s) kr
+						(text-delta s) nn))))
+			      (t (putprop (text-text s)
+				   (ncons (list (text-kl s) kr
+						(text-delta s) nn))
+				   k))))
+		))
+	 ))
+       't))					; always return t
+
+(defun scan-text (s p) ; scan text s for point p, return (kr delta nn)
+  (let (((x y) (text-start-point s))		; inside: check text
+	(l (text-look s)))
+       (j-put-items
+	 `((J-STRING compose)
+	   (J-INT 0)
+	   (J-STRING ,(text-text s))
+	   (J-STRING ,(font-name (look-font l)))
+	   (J-INT ,(font-size (look-font l)))
+	   (J-INT ,(boole 7 NO-DRAW (look-mode l)))
+	   (J-INT ,(look-colour l))
+	   (J-INT ,(look-gap l))
+	   (J-INT ,(look-ul l))
+	   (J-INT ,(text-kl s))
+	   (J-INT ,x)
+	   (J-INT ,y)
+	   (J-INT ,(x p))
+	   (J-INT ,(y p))
+	   (J-INT ,(text-nn s))
+	  ))
+       (j-send (get (machine-servers
+		      (window-machine
+			(zone-window
+			  (text-zone s))))
+		    'text-composer))
+       (let ((kr (j-geti))			; now record result
+	     (xx (j-geti))
+	     (yy (j-geti))
+	     (nn (j-geti)))
+	    (list kr (make-point x (- xx x) y (- yy y)) nn))
+  ))
+
+(defun format-draw-text (s)		; draw it while formatting
+  (let ((memop (symbolp (text-text s)))	; can only memoize symbols
+	((x y) (text-start-point s))
+	(k) (p) (q) (l (text-look s)))
+       (cond
+	 (memop					; are we memoizing? yes!
+	   (setq k (unique-look-id l))	; key based on look
+	   (setq p (get (text-text s) k))		; alist found on plist
+	   (setq q (assoc (text-kl s) p))))		; entry based on kl
+       (cond
+	 (q (alter-text s			; if info found
+	      kr (cadr q)			; record result
+	      delta (caddr q)
+	      nn (cadddr q))
+	    (draw-text s))			; draw it & return
+	 (t					; otherwise compute data
+	   (j-put-items
+	     `((J-STRING compose)
+	       (J-INT ,(window-id (zone-window (text-zone s))))
+	       (J-STRING ,(text-text s))
+	       (J-STRING ,(font-name (look-font l )))
+	       (J-INT ,(font-size (look-font l)))
+	       (J-INT ,(boole 4 (look-mode l) QUIET))
+	       (J-INT ,(look-colour l))
+	       (J-INT ,(look-gap l))
+	       (J-INT ,(look-ul l))
+	       (J-INT ,(text-kl s))
+	       (J-INT ,x)
+	       (J-INT ,y)
+	       (J-INT ,(x (cond
+			    ((zerop (boole 1 ROTATE-180 (look-mode l)))
+			     (ur (zone-box (text-zone s))))
+			    (t (ll (zone-box (text-zone s)))))))
+	       (J-INT ,(y (cond
+			    ((zerop (boole 1 ROTATE-90 (look-mode l)))
+			     (ur (zone-box (text-zone s))))
+			    (t (ll (zone-box (text-zone s)))))))
+	       (J-INT -1)			; format to end of text
+	      ))
+	   (j-send (get (machine-servers
+			  (window-machine
+			    (zone-window
+			      (text-zone s))))
+			'text-composer))
+	   (let ((kr (j-geti))			; now alter result data
+		 (xx (j-geti))
+		 (yy (j-geti))
+		 (nn (j-geti)))
+		(cond ((neq nn (length (exploden (text-text s))))
+		       (format-text s))	; actually clipped! reformat
+		      (t (alter-text s
+			   kr kr
+			   delta (make-point x (- xx x) y (- yy y))
+			   nn nn)
+			 (cond
+			   (memop		; memoize if req'd
+			     (cond (p (nconc p
+					(ncons (list (text-kl s) kr
+						     (text-delta s) nn))))
+				   (t (putprop (text-text s)
+					(ncons (list (text-kl s) kr
+						     (text-delta s) nn))
+					k))))
+			 ))
+		))
+	 ))
+       't))					; always return t
+
+(defun backspace-text (s n)	; undraw last n characters, remove from text
+  (cond				; this presumes s has valid delta,kr,nn
+    ((plusp (text-nn s))	; proceed only if length > 0
+     (setq n (min n (text-nn s)))	; can't delete more than nn chars
+     (let ((text (text-text s))
+	   (l (text-look s)))
+	  (alter-text s		; keep all but last n chars
+	    text (substring text 1 (- (text-nn s) n))
+	    nn (- (text-nn s) n))
+	  (format-text s)		; reformat to find the new end
+	  (j-put-items
+	    `((J-STRING compose)	; now undraw last character
+	      (J-INT ,(window-id (zone-window (text-zone s))))
+	      (J-STRING ,(substring text (- n))) ; undraw last n chars
+	      (J-STRING ,(font-name (look-font l)))
+	      (J-INT ,(font-size (look-font l)))
+	      (J-INT ,(boole 7 QUIET OVERSTRIKE (look-mode l)))
+	      (J-INT ,(inverse-colour (look-colour l)))
+	      (J-INT ,(look-gap l))
+	      (J-INT ,(look-ul l))
+	      (J-INT ,(text-kr s))
+	      (J-INT ,(text-xx s))
+	      (J-INT ,(text-yy s))
+	      (J-INT ,(x (cond
+			   ((zerop (boole 1 ROTATE-180 (look-mode l)))
+			    (ur (zone-box (text-zone s))))
+			   (t (ll (zone-box (text-zone s)))))))
+	      (J-INT ,(y (cond
+			   ((zerop (boole 1 ROTATE-90 (look-mode l)))
+			    (ur (zone-box (text-zone s))))
+			   (t (ll (zone-box (text-zone s)))))))
+	      (J-INT ,n)
+	     ))
+	  (j-send (get (machine-servers
+			 (window-machine
+			   (zone-window
+			     (text-zone s))))
+		       'text-composer))
+	  't))			; return t if able to do it; nil if nn <= 0
+  ))
+
+(defun append-text (s c)	; draw new char(s) & add to end of text
+  (cond ((fixp c)		; this presumes s has valid delta,kr,nn
+	 (setq c (ascii c))))
+  (j-put-items
+    `((J-STRING compose)	; draw new last character(s)
+      (J-INT ,(window-id (zone-window (text-zone s))))
+      (J-STRING ,c)
+      (J-STRING ,(font-name (look-font (text-look s))))
+      (J-INT ,(font-size (look-font (text-look s))))
+      (J-INT ,(boole 4 (look-mode (text-look s)) QUIET))	; be noisy!
+      (J-INT ,(look-colour (text-look s)))
+      (J-INT ,(look-gap (text-look s)))
+      (J-INT ,(look-ul (text-look s)))
+      (J-INT ,(text-kr s))	; this presumes s has valid delta,kr,nn
+      (J-INT ,(text-xx s))
+      (J-INT ,(text-yy s))
+	       (J-INT ,(x (cond
+			    ((zerop (boole 1 ROTATE-180 (look-mode l)))
+			     (ur (zone-box (text-zone s))))
+			    (t (ll (zone-box (text-zone s)))))))
+	       (J-INT ,(y (cond
+			    ((zerop (boole 1 ROTATE-90 (look-mode l)))
+			     (ur (zone-box (text-zone s))))
+			    (t (ll (zone-box (text-zone s)))))))
+      (J-INT -1)
+     ))
+  (j-send (get (machine-servers
+		 (window-machine
+		   (zone-window
+		     (text-zone s))))
+	       'text-composer))
+  (let ((kr (j-geti))
+	(xx (j-geti))
+	(yy (j-geti))
+	(nn (j-geti)))
+       (alter-text s
+	 text (concat (text-text s) c)
+	 kr kr
+	 delta (subtract-points
+		 (make-point x xx y yy)
+		 (text-start-point s))
+	 nn (+ (text-nn s) nn)))
+  't)
+
+(defun append-text-scroll (s c colour) ; draw and add new char(s)
+  (let ((w (window-id	;  while scrolling zone box b in specified colour
+	     (zone-window (text-zone s))))
+	(b (zone-box (text-zone s)))
+	(l (text-look s)))
+       (cond ((fixp c)
+	      (setq c (ascii c)))) ; this presumes s has valid delta,kr,nn
+       (j-put-items
+	 `((J-STRING compose)	; format new last character
+	   (J-INT ,w)
+	   (J-STRING ,c)
+	   (J-STRING ,(font-name (look-font l)))
+	   (J-INT ,(font-size (look-font l)))
+	   (J-INT ,(boole 7 NO-DRAW (look-mode l)))
+	   (J-INT ,(look-colour l))
+	   (J-INT ,(look-gap l))
+	   (J-INT ,(look-ul l))
+	   (J-INT ,(text-kr s)) ; this presumes s has valid delta,kr,nn
+	   (J-INT 0)
+	   (J-INT 0)
+	   (J-INT -1)
+	   (J-INT -1)
+	   (J-INT -1)
+	  ))
+       (j-send (get (machine-servers
+		      (window-machine
+			(zone-window
+			  (text-zone s))))
+		    'text-composer))
+       (let ((kr (j-geti))
+	     (xx (j-geti))
+	     (yy (j-geti))
+	     (nn (j-geti)))
+	    (apply
+	      'w-scroll-rectangle
+	      (nconc
+		(ncons (window-w (zone-window (text-zone s))))
+		(let ((direction (boole 1 ROTATION
+					(look-mode l))))
+		     (cond
+		       ((= direction ROTATE-0)
+			(list (text-xx s)
+			      (y (ll b))
+			      (- (x (ur b)) (text-xx s) -1)
+			      (- (y (ur b)) (y (ll b)) -1)
+			      WM-RIGHT xx))
+		       ((= direction ROTATE-90)
+			(list (x (ll b))
+			      (text-yy s)
+			      (- (x (ur b)) (x (ll b)) -1)
+			      (- (y (ur b)) (text-yy s) -1)
+			      WM-UP yy))
+		       ((= direction ROTATE-180)
+			(list (x (ll b))
+			      (y (ll b))
+			      (- (text-xx s) (x (ll b)) -1)
+			      (- (y (ur b)) (y (ll b)) -1)
+			      WM-LEFT (- xx)))
+		       ((= direction ROTATE-270)
+			(list (x (ll b))
+			      (y (ll b))
+			      (- (x (ur b)) (x (ll b)) -1)
+			      (- (text-yy s) (y (ll b)) -1)
+			      WM-DOWN (- yy)))
+		     ))
+		(ncons colour)))
+	    (w-flush (window-w (zone-window (text-zone s))))
+	    (j-put-items
+	      `((J-STRING compose)	; draw new last character
+		(J-INT ,w)
+		(J-STRING ,c)
+		(J-STRING ,(font-name (look-font l)))
+		(J-INT ,(font-size (look-font l)))
+		(J-INT ,(boole 7 (look-mode l) QUIET))
+		(J-INT ,(look-colour l))
+		(J-INT ,(look-gap l))
+		(J-INT ,(look-ul l))
+		(J-INT ,(text-kr s)) ; this presumes s has valid delta,kr,nn
+		(J-INT ,(text-xx s))
+		(J-INT ,(text-yy s))
+	       (J-INT ,(x (cond
+			    ((zerop (boole 1 ROTATE-180 (look-mode l)))
+			     (ur (zone-box (text-zone s))))
+			    (t (ll (zone-box (text-zone s)))))))
+	       (J-INT ,(y (cond
+			    ((zerop (boole 1 ROTATE-90 (look-mode l)))
+			     (ur (zone-box (text-zone s))))
+			    (t (ll (zone-box (text-zone s)))))))
+		(J-INT -1)
+	       ))
+	    (j-send (get (machine-servers
+			   (window-machine
+			     (zone-window
+			       (text-zone s))))
+			 'text-composer))
+	    (alter-text s
+	      text (concat (text-text s) c)
+	      kr kr
+	      delta (add-points
+		      (make-point x xx y yy)
+		      (text-delta s))
+	      nn (+ (text-nn s) nn))
+       )'t))
+
+(defun format-text-list (sl)			; chain the text objects
+  (do ((s (car sl) (car sl))			; so that xx,yy,kr of one
+       (sl (cdr sl) (cdr sl)))			; used as x,y,kl of next
+      ((null sl) (format-text s) 't)
+      (format-text s)
+      (alter-text (car sl)
+	kl (text-kr s))
+      (move-text (car sl) (text-end-point s))
+  ))
+
+(defun move-text-list (sl p)	; move whole list of text objects
+  (do ((s (car sl) (car sl))
+       (sl (cdr sl) (cdr sl))
+       (p p (text-end-point s)))
+      ((null s) 't)
+      (move-text s p)
+  ))
+
+(defun compress-text-list (sl)		; combine like-moded text objects
+  (do ((s (car sl) (car sl))			; to reduce communication
+       (sl (cdr sl) (cdr sl))
+       (new-text nil)
+       (new-end-point (text-start-point s))
+       (new-s (append (car sl) nil))	; top-level copy
+       (dx nil)
+       (gap (look-gap (text-look (car sl))))
+       (result nil))
+      ((null s) (alter-text new-s
+		   text (apply 'concat (nreverse new-text))
+		   nn -1)
+       (nreverse (cons new-s result)))		; return new s-list
+      (setq dx (- (x (text-start-point s))
+		  (x new-end-point)))
+      (cond ((and			; check most likely diffs first
+	       (or (eq dx 0) (>= dx (look-gap (text-look s))))
+	       (= (y (text-start-point s)) (y new-end-point))
+	       (eq (text-look s)
+		   (text-look new-s))
+	     )				; presume kerning doesn't matter!
+	     (cond ((plusp dx)		; horizontal movement
+		    (setq new-text
+			  (cons
+			    (implode
+			      (do ((dx (- dx gap 4) (- dx gap 4))
+				   (result nil))
+				  ((minusp dx)
+				   (do ((dx (+ dx 4 -1) (- dx gap 1)))
+				       ((minusp dx)
+					(cond ((eq dx -1)
+					       (setq result
+						     (cons 1 result)))))
+							; 0-pixel space
+				       (setq result (cons 2 result)))
+							; 1-pixel space
+				   result)
+				  (setq result (cons 3 result))
+							; 4-pixel space
+			      ))
+			    new-text))))
+	     (setq new-text (cons (text-text s) new-text))
+	     (setq new-end-point (text-end-point s))
+	    )
+	    (t (alter-text new-s
+		 text (apply 'concat (nreverse new-text))
+		 nn -1
+		 delta (subtract-points new-end-point
+			 (text-start-point new-s)))
+	       (setq result (cons new-s result))
+	       (setq new-s (append s nil)
+		     new-text (ncons (text-text s)))
+	       (setq
+		 new-end-point (text-start-point s)
+		 gap (look-gap (text-look s)))
+	    )
+      )))
+
+(defun draw-text-list (sl)
+  (mapc '(lambda (x) (draw-text x)) sl) 't)
+
+(defun undraw-text-list (sl)
+  (mapc '(lambda (x) (undraw-text x)) sl) 't)
+
+(defun format-draw-text-list (slist) ; format all on same line
+  (do ((s (car slist) (car sl))
+       (sl (cdr slist) (cdr sl)))
+      ((null sl) (format-draw-text s))	; format the last one
+      (format-draw-text s)
+      (move-text (car sl)	; chain xx,yy,kr to next one's x,y,kl
+	(text-end-point s))
+  ))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; text-edit.l -- rudimentary line editor for fancy character texts
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; These routines provide a simple line editor with control keys reminiscent
+;;; of the default EMACS key bindings.
+;;;
+;;; The calling program presumably has obtained a "point" event, at
+;;; position "p".  The cursor will be placed on the nearest character,
+;;; and then input is accepted from the keyboard, until such time as a
+;;; <return> key is accepted, or a point event occurs outside the text
+;;; zone boundary, or until a non-key, non-point event occurs.  Another
+;;; point event within the text zone causes the cursor to be re-positioned.
+;;;
+;;; Editing operations currently supported are:
+;;;	CTRL-A (ascii 1)	; control A = beginning of line
+;;;	CTRL-B (ascii 2)	; control B = backward-character
+;;;	CTRL-D (ascii 4)	; control D = delete next char
+;;;	CTRL-E (ascii 5)	; control E = end of line
+;;;	CTRL-F (ascii 6)	; control F = forward-character
+;;;	BACKSPACE (ascii 8)	; BACKSPACE = delete previous char
+;;;	CTRL-K (ascii 11)	; control K = kill to end of line
+;;;	CTRL-L (ascii 12)	; control L = redraw text
+;;;	RETURN (ascii 13)	; RETURN = "done"
+;;;	CTRL-T (ascii 20)	; control T = transpose previous 2 chars
+;;;	CTRL-Y (ascii 25)	; control Y = "yank" recently killed text
+
+(declare
+  (specials t)
+  (macros t))
+
+(eval-when (compile)
+  (load 'utilities)
+  (load 'constants)
+  (load 'zone)
+  (load 'font)
+  (load 'look)
+  (load 'text))
+
+
+(eval-when (compile eval load)
+  (defvar BACKSPACE (ascii 8))	; backspace char = delete previous char
+  (defvar RETURN (ascii 13))	; carriage return = "done"
+  (defvar CTRL-A (ascii 1))	; control A = beginning of line
+  (defvar CTRL-B (ascii 2))	; control B = backward-character
+  (defvar CTRL-D (ascii 4))	; control D = delete next char
+  (defvar CTRL-E (ascii 5))	; control E = end of line
+  (defvar CTRL-F (ascii 6))	; control F = forward-character
+  (defvar CTRL-K (ascii 11))	; control K = kill to end of line
+  (defvar CTRL-L (ascii 12))	; control L = redraw text
+  (defvar CTRL-T (ascii 20))	; control T = transpose previous 2 chars
+  (defvar CTRL-Y (ascii 25))	; control Y = "yank" recently killed text
+  (defvar TYPEAHEAD-THRESHOLD 5); can type at most 5 chars -> forced feedback
+)
+
+(defun edit-text (s p)	; edit a text at point p
+  (cond					; p outside zone => nil
+    ((not (point-in-box p (zone-box (text-zone s)))) nil)
+    (t					; p inside zone => edit text
+      (let
+	((w (window-w (zone-window (text-zone s))))
+	 (post (append s nil))
+	 (kill-text ""))
+	(split-texts s post p)	; split into left and right parts
+	(draw-cursor-leading-text post)	; highlight first char
+	(skip-stroke-release-events w)
+	(do ((e (w-get-next-event w)		; get an event
+		(w-get-next-event w))		; then keep getting events
+	     (l) (c))				; character list, character
+	    ((eq c '#.RETURN)		; stop when <return> is received
+	     (cond ((neq e WM-KEY)	; if not caused by key, put event back
+		    (w-put-back-event w)))
+	     (combine-texts s post)
+	     t)			; just return 't
+	    (cond			; main loop
+	      ((eq e WM-KEY)
+	       (setq c (concat (car (w-get-key w))))	; get the character
+	       (cond
+		 ((eq c '#.BACKSPACE)		; backspace char
+		  (text-delete-previous-character s post))
+		 ((eq c '#.CTRL-A)			; control A
+		  (text-beginning-of-line s post))
+		 ((eq c '#.CTRL-B)			; control B
+		  (text-backward-character s post))
+		 ((eq c '#.CTRL-D)			; control D
+		  (text-delete-next-character s post))
+		 ((eq c '#.CTRL-E)			; control E
+		  (text-end-of-line s post))
+		 ((eq c '#.CTRL-F)			; control F
+		  (text-forward-character s post))
+		 ((eq c '#.CTRL-K)			; control K
+		  (text-kill-to-end-of-line s post))
+		 ((eq c '#.CTRL-L)			; control L
+		  (text-redraw-display s post))
+		 ((eq c '#.CTRL-T)			; control T
+		  (text-transpose-characters s post))
+		 ((eq c '#.CTRL-Y)			; control Y
+		  (text-yank-from-killbuffer s post))
+		 ((neq c '#.RETURN)			; not <return>
+		  (text-insert-character s post))
+		 (t (w-put-back-event w))	; it's a <return>; put it back
+	       ))			; so loop control can get it again
+	      ((eq e WM-POINT-DEPRESSED)
+	       (setq p (w-get-point w))
+	       (cond				; check point in zone
+		 ((point-in-box p (zone-box (text-zone s)))
+		  (draw-cursor-leading-text post)	; un-highlight char
+		  (combine-texts s post)
+		  (split-texts s post p)
+		  (draw-cursor-leading-text post)	; highlight new char
+		  (skip-stroke-release-events w))
+		 (t (w-put-back-event w)	; outside zone => return
+		    (setq c '#.RETURN))))
+	      ((neq e WM-CANCEL)		; an event we can't handle
+	       (w-put-back-event w)		; so put it back, then return
+	       (setq c '#.RETURN))
+	    )))
+    )))
+
+(defun input-typeahead-keys (w n brk-fcn l)	; return keys typed ahead
+   (cond					; brk-fcn tests text
+     ((or (zerop n)				; already have max typeahead
+	  (not (w-any-events w))) (nreverse l))	; or there aren't any events
+     (t (let ((x (w-get-next-event w)))		; there's an event
+	     (cond
+	       ((neq x WM-KEY)
+		(w-put-back-event w) (nreverse l))	; but not a keystroke
+	       (t (setq x (car (w-get-key w)))		; it's a keystroke
+		  (cond
+		    ((funcall brk-fcn x)		; is it a break char?
+		     (w-put-back-event w) (nreverse l))	; it's a special char
+		    (t (input-typeahead-keys		; it's a regular char
+			 w (1- n) brk-fcn (cons x l)))	; tail recur for rest
+		  )))))))
+
+(defun split-texts (s post p)		; split text s at point p
+  (let					; yielding texts s and post
+    (((kr delta nn) (scan-text s p)))	; scan for char pos'n
+    (alter-text post			; text incl & after char pt'ed
+      text (cond ((substring (text-text s) (1+ nn)))	; if it exists!
+		 (""))			; otherwise,nothing
+      offset (add-points (text-offset s) delta)
+      kl kr
+      delta (subtract-points (text-delta s) delta)
+      nn (- (text-nn s) nn))
+    (alter-text s kr kr delta delta nn nn	; truncate text
+      text (cond ((substring (text-text s) 1 nn))
+		 ("")))
+  ))
+
+(defun skip-stroke-release-events (w)
+  (do ((e (w-get-next-event w)
+	  (w-get-next-event w)))
+      ((neq e WM-POINT-STROKE)		; get events until non-point-stroke
+       (cond ((neq e WM-POINT-RELEASED)	; should be point-release
+	      (w-put-back-event w))))	; if not, put it back
+  ))
+
+(defun combine-texts (s post)	; recombine texts
+  (alter-text s
+    text (concat (text-text s) (text-text post))
+    nn (+ (text-nn s) (text-nn post))
+    delta (add-points (text-delta s) (text-delta post))
+    kr (text-kr post))
+  (format-text s))
+
+(defun draw-cursor-leading-text (s)	; highlight first char of text
+  (let ((c (append s nil)))
+       (alter-text c			; get first char
+	 text (concat (cond ((substring (text-text c) 1 1))	; if any
+			    (t 'a))))	; otherwise use a typical character
+       (format-text c)
+       (w-clear-rectangle
+	 (window-w (zone-window (text-zone c)))
+	 (text-x c)
+	 (y (ll (zone-box (text-zone c))))
+	 (min (x (text-delta c))
+	      (- (x (ur (zone-box (text-zone c))))
+		 (text-x c) -1))
+	 (- (y (ur (zone-box (text-zone c))))
+	    (y (ll (zone-box (text-zone c)))) -1)
+	 W-XOR)
+       (w-flush (window-w (zone-window (text-zone c))))
+       t))
+
+(defun text-delete-previous-character (s post)
+  (let ((l (input-typeahead-keys w TYPEAHEAD-THRESHOLD
+	     '(lambda (x)	; break on first non-BS
+		(not (equal x #.(get_pname BACKSPACE))))
+	     (ncons '#.BACKSPACE))))
+       (alter-text s
+	 nn (max 0 (- (text-nn s) (length l))))
+       (alter-text s
+	 text (cond ((substring
+		       (text-text s)
+		       1 (text-nn s)))
+		    ("")))
+       (format-text s)
+       (w-scroll-rectangle
+	 (window-w (zone-window (text-zone s)))
+	 (text-xx s)
+	 (y (ll (zone-box (text-zone s))))
+	 (- (x (ur (zone-box (text-zone s))))
+	    (text-xx s) 1)
+	 (1+ (y (box-size (zone-box (text-zone s)))))
+	 WM-LEFT
+	 (- (x (text-start-point post))
+	    (x (text-end-point s)))
+	 (zone-colour (text-zone s)))
+       (w-flush
+	 (window-w (zone-window (text-zone s))))
+       (move-text post (text-end-point s))
+       (alter-text post kl (text-kr s))))
+
+(defun text-beginning-of-line (s post)
+  (draw-cursor-leading-text post)	; un-highlight first char
+  (alter-text post
+    text (concat (text-text s) (text-text post))
+    nn (+  (text-nn s) (text-nn post))
+    delta (add-points (text-delta s) (text-delta post))
+    kl 0
+    offset (text-offset s))
+  (alter-text s text "" nn 0 delta '(0 0) kr 0)
+  (draw-cursor-leading-text post))	; highlight new first char
+
+(defun text-backward-character (s post)
+  (let ((l (input-typeahead-keys w TYPEAHEAD-THRESHOLD
+	     '(lambda (x)	; break on first non-BS
+		(not (equal x #.(get_pname CTRL-B))))
+	     (ncons '#.CTRL-B))))
+       (draw-cursor-leading-text post)	; un-highlight first char
+       (alter-text post
+	 text (get_pname (concat (substring (text-text s) (- (length l)))
+			   (text-text post)))
+	 nn (1+ (text-nn post)))
+       (alter-text s
+	 text (substring (text-text s) 1 (- (text-nn s) (length l)))
+	 nn (- (text-nn s) (length l)))
+       (format-text s)
+       (alter-text post
+	 kl (text-kr s)
+	 offset (add-points (text-offset s) (text-delta s))
+	 delta (subtract-points
+		 (text-end-point post)
+		 (text-end-point s)))
+       (draw-cursor-leading-text post)	; highlight new first char
+  ))
+
+(defun text-forward-character (s post)
+  (let ((l (input-typeahead-keys w TYPEAHEAD-THRESHOLD
+	     '(lambda (x)	; break on first non-BS
+		(not (equal x #.(get_pname CTRL-F))))
+	     (ncons '#.CTRL-F))))
+       (draw-cursor-leading-text post)	; un-highlight first char
+       (alter-text s
+	 text (get_pname (concat (text-text s)
+			   (substring (text-text post) 1 (length l))))
+	 nn (+ (text-nn s) (length l)))
+       (format-text s)
+       (alter-text post
+	 text (substring (text-text post) (1+ (length l)))
+	 nn (- (text-nn post) (length l))
+	 kl (text-kr s)
+	 offset (add-points (text-offset s) (text-delta s))
+	 delta (subtract-points
+		 (text-end-point post)
+		 (text-end-point s)))
+       (draw-cursor-leading-text post)	; highlight new first char
+  ))
+
+(defun text-end-of-line (s post)
+  (draw-cursor-leading-text post)	; un-highlight first char
+  (alter-text s
+    text (concat (text-text s) (text-text post))
+    nn (+  (text-nn s) (text-nn post))
+    delta (add-points (text-delta s) (text-delta post))
+    kr (text-kr post))
+  (alter-text post
+    text ""
+    nn 0
+    offset (add-points (text-offset post) (text-delta post))
+    delta '(0 0)
+    kl (text-kr s))
+  (draw-cursor-leading-text post))	; highlight new first char
+  
+(defun text-kill-to-end-of-line (s post)
+  (w-clear-rectangle
+    (window-w (zone-window (text-zone post)))
+    (text-x post)
+    (y (ll (zone-box (text-zone post))))
+    (- (x (ur (zone-box (text-zone post)))) (text-x post))
+    (1+ (y (box-size (zone-box (text-zone post)))))
+    (zone-colour (text-zone post)))
+  (setq kill-text (text-text post))
+  (alter-text post
+    text ""
+    nn 0
+    delta '(0 0)
+    kl (text-kr s))
+  (draw-cursor-leading-text post))	; highlight new first char
+  
+(defun text-yank-from-killbuffer (s post)
+  (append-text-scroll s kill-text
+    (zone-colour (text-zone s)))
+  (move-text post (text-end-point s))
+  (alter-text post
+    kl (text-kr s)))
+
+(defun text-transpose-characters (s post)
+  (let ((tmp (append s nil)))
+       (alter-text tmp
+	 nn (- (text-nn tmp) 2))
+       (let (((kr delta nn) (scan-text tmp '(-1 -1)))) ; find 2nd prev char
+	    (alter-text tmp
+	      text (substring (text-text tmp) -2)
+	      offset (add-points (text-offset tmp) delta)
+	      kl kr)
+	    (format-text tmp)
+	    (w-clear-rectangle
+	      (window-w (zone-window (text-zone tmp)))
+	      (text-x tmp)
+	      (y (ll (zone-box (text-zone tmp))))
+	      (x (text-delta tmp))
+	      (1+ (y (box-size (zone-box (text-zone tmp)))))
+	      (zone-colour (text-zone tmp)))
+	    (w-flush (window-w (zone-window (text-zone tmp))))
+	    (alter-text tmp
+	      text (get_pname (concat
+				(substring (text-text tmp) 2 1)
+				(substring (text-text tmp) 1 1))))
+	    (format-draw-text tmp)
+	    (alter-text s
+	      text (get_pname
+		     (concat
+		       (substring (text-text s) 1 (- (text-nn s) 2))
+		       (text-text tmp)))
+	      kr (text-kr tmp))
+       )))
+
+(defun text-delete-next-character (s post)
+  (let ((l (input-typeahead-keys w TYPEAHEAD-THRESHOLD
+	     '(lambda (x)	; break on first non-BS
+		(not (equal x #.(get_pname CTRL-D))))
+	     (ncons '#.CTRL-D))))
+       (alter-text post
+	 nn (length l))
+       (let (((kl delta nn)		; scan for nn'th char position
+	      (scan-text post '(-1 -1))))
+	    (w-scroll-rectangle
+	      (window-w (zone-window (text-zone post)))
+	      (text-x post)
+	      (y (ll (zone-box (text-zone post))))
+	      (- (x (ur (zone-box (text-zone post))))
+		 (text-x post) 1)
+	      (1+ (y (box-size (zone-box (text-zone post)))))
+	      WM-LEFT
+	      (x delta)
+	      (zone-colour (text-zone post)))
+	    (alter-text post
+	      nn (max 0 (- (length (exploden (text-text post)))
+			   (length l)))
+	      kl kl)
+	    (alter-text post
+	      text (cond ((substring
+			    (text-text post)
+			    (- (text-nn post))))
+			 ("")))
+	    (format-text post)
+	    (draw-cursor-leading-text post)
+	    (w-flush (window-w (zone-window (text-zone post))))
+       )))
+
+(defun text-insert-character (s post)
+  (let ((l (input-typeahead-keys w TYPEAHEAD-THRESHOLD
+	     '(lambda (x)	; break on first BS or CR
+		(memq (concat x) '#.(list BACKSPACE RETURN)))
+	     (ncons c))))
+       (append-text-scroll s (concatl l)
+	 (zone-colour (text-zone s)))
+       (move-text post (text-end-point s))
+       (alter-text post
+	 kl (text-kr s))))
+
+(defun text-redraw-display (s post)
+  (clear-zone (text-zone s) (zone-colour (text-zone s)))
+  (w-flush (window-w (zone-window (text-zone post))))
+  (format-draw-text s)
+  (alter-text post
+    kl (text-kr s)
+    offset (add-points (text-offset s) (text-delta s)))
+  (format-draw-text post)
+  (draw-cursor-leading-text post))
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/progp b/src/test/java/org/xerial/snappy/testdata/calgary/progp
new file mode 100644
index 0000000..1f03c6d
--- /dev/null
+++ b/src/test/java/org/xerial/snappy/testdata/calgary/progp
@@ -0,0 +1,1966 @@
+program interval(input,output);
+{dataflow simulator for real interval arithmetic}
+
+const
+	IMem = 500; {number of instructions}
+	DMem = 200;  {number of interval variables allowed}
+	Par = 3;   {max number of paramters for an operator}
+	Maxexp = 10; Minexp = -9;
+	Maxinf =10000; Mininf =-10000; {Tied to values of Minman and Maxman}
+	Maxman = 9999; Minman = -9999; {cannot exceed sqrt(maxint)}
+	Splitman = 1000; {Smallest normalized mantisa}
+	Digits = 4; {number of digits in mantissa}
+
+type
+	Positive= 0..maxint;
+	State  = -1..99;  {Used for holding state of operator -1:done}
+	OpType = (print,pr,tr,soln,readr,halve,halves,linh,mult,add,intgr,
+less,leq,noteq,sqrr,minr,maxr,modu,absr,trig,expr,lb,ub,copy,stop); {!!}
+	Ptr    = 1..DMem;
+	Loc    = 1..IMem;
+	Loc0   = 0..IMem;
+	EdgeT  = (hout,lin,hin,lout); {Warning this order is important in}
+				      {predicates such as gtS,geS}
+	CardT  = (finite,infinite);
+	ExpT   = Minexp..Maxexp;
+	ManT   = Mininf..Maxinf; 
+	Pflag  = (PNull,PSoln,PTrace,PPrint);
+	Sreal  = record
+		    edge:EdgeT;
+		    cardinality:CardT;
+		    exp:ExpT; {exponent}
+		    mantissa:ManT;
+		 end;
+	Int    = record
+		    hi:Sreal;
+		    lo:Sreal;
+	 end;
+	Instr  = record
+		    Code:OpType;
+		    Pars: array[0..Par] of 0..DMem;
+		 end;
+	DataMem= record
+		    D        :array [Ptr] of Int;
+		    S        :array [Loc] of State;
+		    LastHalve:Loc;
+		    RHalve   :array [Loc] of real;
+		 end;
+	DataFlags=record
+		    PF	     :array [Ptr] of Pflag;
+		 end;
+var
+	Debug  : (none,activity,post,trace,dump);
+	Cut    : (once,all);
+	GlobalEnd,Verifiable:boolean;
+	HalveThreshold:real;
+	I      : array [Loc] of Instr; {Memory holding instructions}
+	End    : Loc; {last instruction in I}
+	ParN   : array [OpType] of -1..Par; {number of parameters for each 
+			opcode. -1 means no result}
+        ParIntersect : array [OpType] of boolean ;
+	DInit  : DataMem; {initial memory which is cleared and 
+				used in first call}
+	DF     : DataFlags; {hold flags for variables, e.g. print/trace}
+	MaxDMem:0..DMem;
+	Shift  : array[0..Digits] of 1..maxint;{array of constant multipliers}
+						{used for alignment etc.}
+	Dummy  :Positive;
+	{constant intervals and Sreals}
+	PlusInfS,MinusInfS,PlusSmallS,MinusSmallS,ZeroS,
+	PlusFiniteS,MinusFiniteS:Sreal;
+	Zero,All,AllFinite:Int;
+
+procedure deblank;
+var Ch:char;
+begin
+   while (not eof) and (input^ in [' ','	']) do read(Ch);
+end;
+
+procedure InitialOptions;
+
+#include '/user/profs/cleary/bin/options.i';
+
+   procedure Option;
+   begin
+      case Opt of
+      'a','A':Debug:=activity;
+      'd','D':Debug:=dump;
+      'h','H':HalveThreshold:=StringNum/100;
+      'n','N':Debug:=none;
+      'p','P':Debug:=post;
+      't','T':Debug:=trace;
+      'v','V':Verifiable:=true;
+      end;
+   end;
+
+begin
+   Debug:=trace;
+   Verifiable:=false;
+   HalveThreshold:=67/100;
+   Options;
+   writeln(Debug);
+   writeln('Verifiable:',Verifiable);
+   writeln('Halve threshold',HalveThreshold);
+end;{InitialOptions}
+
+procedure NormalizeUp(E,M:integer;var S:Sreal;var Closed:boolean);
+begin
+with S do
+begin
+   if M=0 then S:=ZeroS else
+   if M>0 then
+   begin
+      while M>=Maxinf do
+      begin 
+	 if M mod 10 > 0 then begin Closed:=false;M:=(M div 10)+1 end
+	 else M:=M div 10;
+	 E:=E+1;
+      end;
+	 
+      while M < Maxinf div 10 do
+      begin M:=M*10; E:=E-1; 
+      end;
+
+      if E > Maxexp then {overflow-set to infinity}
+      begin 
+	 S:=PlusInfS;
+	 Closed:=false;
+      end else
+      if E < Minexp then {underflow-set to smallest positive value}
+      begin 
+         S:=PlusSmallS;
+         Closed:=false;
+      end else
+      begin cardinality:=finite;exp:=E;mantissa:=M;
+      end;
+   end else	 
+   if M < 0 then
+   begin
+      while M <= Mininf do
+      begin 
+	 if M mod 10 < 0 then Closed:=false else
+	 if M mod 10 > 0 then halt;
+	 M:=M div 10;
+	 E:=E+1;
+      end;
+	 
+      while M > (Mininf div 10) do
+      begin M:=M*10; E:=E-1; 
+      end;
+
+      if E > Maxexp then {overflow-set to most negative value}
+      begin 
+         S:=MinusFiniteS;
+         Closed:=false;
+      end 
+      else
+      if E < Minexp then {underflow-set to zero}
+      begin
+         S:=ZeroS;
+         Closed:=false;
+      end else
+      begin
+         cardinality:=finite;exp:=E;mantissa:=M;
+      end;
+   end;
+end;
+end;{NormalizeUp}
+
+procedure NormalizeDn(E,M:integer;var S:Sreal;var Closed:boolean);
+begin
+with S do
+begin
+   if M=0 then S:=ZeroS else
+   if M>0 then
+   begin
+      while M >= Maxinf do
+      begin 
+	 if M mod 10 > 0 then Closed:=false else
+	 if M mod 10 < 0 then halt;
+	 M:=M div 10;
+	 E:=E+1;
+      end;
+	 
+      while (M < Maxinf div 10) do
+      begin M:=M*10; E:=E-1; 
+      end;
+
+      if E > Maxexp then {overflow-set to largest positive value}
+      begin 
+	 S:=PlusFiniteS;
+	 Closed:=false;
+      end else
+      if E < Minexp then {underflow-set to zero}
+      begin S:=ZeroS; Closed:=false;
+      end else
+      begin cardinality:=finite;exp:=E;mantissa:=M;
+      end;
+   end else	 
+   if M < 0 then
+   begin
+      while M <= Mininf do
+      begin 
+	 if M mod 10 < 0 then 
+	 begin Closed:=false; M:=M div 10 -1;end
+	 else 
+	 if M mod 10 = 0 then M:=M div 10 
+	 else halt;
+	 E:=E+1;
+      end;
+	 
+      while (M>Mininf div 10) do
+      begin M:=M*10; E:=E-1; 
+      end;
+
+      if E > Maxexp then {overflow}
+      begin 
+         S:=MinusInfS;
+         Closed:=false;
+      end 
+      else
+      if E < Minexp then {underflow}
+      begin S:=MinusSmallS; Closed:=false;
+      end else
+      begin
+         cardinality:=finite;exp:=E;mantissa:=M;
+      end;
+   end;
+end;
+end;{NormalizeDn}
+
+procedure WriteS(X:Sreal);
+var E,M:integer;
+begin
+with X do
+begin
+   case edge of
+   lin: write('[');
+   lout: write('(');
+   hin,hout:
+   end;
+   
+   case cardinality of
+   infinite: write('inf':Digits+4); 
+   finite: 
+      if mantissa = 0 then write(0:Digits+1,' ':3)
+      else begin
+         M:=mantissa;
+	 E:=exp; 
+         while (M mod 10 = 0) do
+	 begin M:=M div 10; E:=E+1;
+	 end;
+         write(M:Digits+1,'e',E-Digits:2);
+      end;
+   end;
+   
+   case edge of 
+   hin: write(']');
+   hout:write(')');
+   lin,lout:
+   end;
+end;
+end;{WriteS}
+
+procedure WriteInt(I:Int);
+begin
+   with I do begin WriteS(lo); write(','); WriteS(hi); end;
+end;{WriteInt}
+   
+procedure DumpS(X:Sreal);
+begin
+with X do
+   write(edge:4,cardinality:9,mantissa:7,exp:3);
+end;{DumpS}
+
+procedure DumpInt(I:Int);
+begin
+   with I do begin DumpS(lo); write(' || '); DumpS(hi); end;
+end;{DumpInt}
+   
+procedure ReadInt(var I:Int);
+
+var   Ch:char;
+      Cll,Clu:boolean;
+	
+   procedure ReadSUp(var X:Sreal; var Closed:boolean);
+   var E,M:integer;
+   begin
+      with X do
+      begin
+         deblank;
+         case input^ of
+         '~':begin X:=PlusInfS;read(Ch);
+	     end;
+         '-','+','0','1','2','3','4','5','6','7','8','9':
+	 begin
+	    cardinality:=finite;
+   	    read(M);
+	    read(E); E:=E+Digits;
+	    NormalizeUp(E,M,X,Closed);
+	 end;
+	 end;{case}
+      end;
+   end;{ReadSUp}
+
+   procedure ReadSDn(var X:Sreal; var Closed:boolean);
+   var E,M:integer;
+       Ch:char;
+   begin
+      with X do
+      begin
+         deblank;
+         case input^ of
+         '~':begin X:=MinusInfS;read(Ch);
+	     end;
+         '-','+','0','1','2','3','4','5','6','7','8','9':
+	 begin
+	    cardinality:=finite;
+   	    read(M);
+	    read(E); E:=E+Digits;
+	    NormalizeDn(E,M,X,Closed);
+	 end;
+	 end;{case}
+      end;
+   end;{ReadSDn}
+begin{ReadInt}
+   with I do 
+   begin 
+      deblank; read(Ch); 
+      case Ch of
+      '[':Cll:=true;
+      '(':Cll:=false;
+      end;
+      ReadSDn(lo,Cll);if Cll then lo.edge:=lin else lo.edge:=lout;
+      deblank;
+      read(Ch); assert(Ch=',');
+      Clu:=true;
+      ReadSUp(hi,Clu);
+      deblank;
+      read(Ch);
+      case Ch of
+      ']':if Clu then hi.edge:=hin else hi.edge:=hout;
+      ')':hi.edge:=hout;
+      end;
+   end;
+end;{ReadInt}
+   
+procedure DumpTables;
+var tL:Loc; tPar:0..Par; tOp:OpType;
+begin
+	for tOp := print to stop do
+	   writeln(tOp:6,ParN[tOp]:2);
+	writeln;
+
+	for tL := 1 to End do
+	with I[tL] do
+	begin
+	   write(Code:5);
+	   for tPar := 0 to Par do
+	      if Pars[tPar] <> 0 then write(Pars[tPar]:4);
+	   writeln;
+	end;
+	writeln('number of memory locations used:',MaxDMem:0);
+	writeln;
+end;{DumpTables}
+	
+procedure AlignUp
+   (E0:ExpT;M0:ManT;E1:ExpT;M1:ManT;var E,N0,N1:integer;var Closed:boolean);
+{Align mantissas M0,M1 preserving accuracy and rounding up wherever possible}
+{common resulting exponents in E, and mantissas in N0,N1}
+var D:Positive;
+begin
+   if M0=0 then begin E:=E1;N0:=0;N1:=M1;end else
+   if M1=0 then begin E:=E0;N0:=M0;N1:=0;end else
+   if E0=E1 then
+   begin E:=E0; N0:=M0; N1:=M1;
+   end else
+   if (E0>E1) then AlignUp(E1,M1,E0,M0,E,N1,N0,Closed) else
+   begin
+      D:=E1-E0;
+      if D>= 2*Digits then
+      begin 
+         N1:=M1*Maxinf; E:=E1-Digits;
+	 if M0<0 then N0:=0 else N0:=1;
+	 Closed:=false;
+      end else
+      if D > Digits then
+      begin 
+         N1:=M1*Maxinf; E:=E1-Digits; 
+	 if (M0 mod Shift[D-Digits]) = 0 
+	 then N0:=(M0 div Shift[D-Digits])
+	 else
+	    if M0 > 0 then N0:=(M0 div Shift[D-Digits])+1
+	              else N0:=(M0 div Shift[D-Digits]);
+      end else
+      {Digits>=D>=0}
+      begin N1:=M1*Shift[D]; E:=E1-D; N0:=M0;
+      end;
+   end;
+end;{AlignUp}
+
+function gtS(X,Y:Sreal):boolean;
+{X>Y  careful need to be able to compare x] and (x etc.}
+var gt:boolean;
+begin
+   if (X.exp=Y.exp)and(X.mantissa=Y.mantissa) then gt:=X.edge>Y.edge else
+   if X.exp = Y.exp then gt:= (X.mantissa > Y.mantissa) else
+   if X.mantissa = 0 then gt:= 0 > Y.mantissa else
+   if Y.mantissa = 0 then gt:= X.mantissa > 0 else
+   if (X.mantissa>0) and (Y.mantissa>0) then gt:= (X.exp > Y.exp) else
+   if (X.mantissa>0) and (Y.mantissa<0) then gt:= true else
+   if (X.mantissa<0) and (Y.mantissa>0) then gt:= false else
+   if (X.mantissa<0) and (Y.mantissa<0) then gt:= (X.exp < Y.exp) 
+   else  writeln('error in gtS');
+   
+   gtS:=gt;
+end;{gtS}
+   
+function geS(X,Y:Sreal):boolean;
+{X>=Y  careful need to be able to compare x] and (x etc.}
+begin
+   if (X.exp=Y.exp)and(X.mantissa=Y.mantissa) then geS:=X.edge>=Y.edge else
+   if X.exp = Y.exp then geS:= (X.mantissa >= Y.mantissa) else
+   if X.mantissa = 0 then geS:= 0 >= Y.mantissa else
+   if Y.mantissa = 0 then geS:= X.mantissa >= 0 else
+   if (X.mantissa>0) and (Y.mantissa>0) then geS:= (X.exp > Y.exp) else
+   if (X.mantissa>0) and (Y.mantissa<0) then geS:= true else
+   if (X.mantissa<0) and (Y.mantissa>0) then geS:= false else
+   if (X.mantissa<0) and (Y.mantissa<0) then geS:= (X.exp < Y.exp) 
+   else  writeln('error in geS');
+end;{geS}
+   
+function Point(X:Int):boolean;
+{X=[x,x]}
+begin
+with X do
+   Point:=(lo.edge=lin)and (hi.edge=hin) and 
+	  (lo.mantissa=hi.mantissa) and
+	  (lo.exp=hi.exp);
+end;{Point}
+
+procedure maxS(X,Y:Sreal;var max:Sreal);
+begin
+	if gtS(X,Y) then max:=X else max:=Y;
+end;
+
+procedure minS(X,Y:Sreal;var min:Sreal);
+begin
+	if gtS(X,Y) then min:=Y else min:=X;
+end;
+
+procedure Inter(P,Q:Int;var R:Int);
+begin
+   minS(P.hi,Q.hi,R.hi);
+   maxS(P.lo,Q.lo,R.lo);
+end;
+
+function CheckHi(X:Sreal):boolean;
+var OK:boolean;
+begin
+   OK:=true;
+   with X do
+   begin
+      case cardinality of
+      infinite:
+         if (exp=Maxexp)and(mantissa=Maxinf) then
+	 else writeln('**Invalid hi infinity');
+      finite:
+      begin
+         if (mantissa=Maxinf) or (mantissa=Mininf) then
+	 begin OK:=false; writeln('**Invalid finite value - hi');
+	 end;
+	 
+         if mantissa = 0 then
+	    if (exp=0) then 
+	    else 
+	    begin OK:=false; writeln('**Invalid zero - hi')
+	    end
+	 else
+	 begin
+	    if (mantissa > 0) then
+	       if mantissa >= (Maxinf div 10) then {OK}
+	       else 
+	       begin OK:=false; writeln('**Incorrect normalization - hi') 
+	       end
+	    else{mantissa<0}
+	       if mantissa > (Mininf div 10) then
+	       begin OK:=false; writeln('**Incorrect normalization - hi') 
+	       end;
+	 end;
+      end;
+      end;{case}
+
+      if not (edge in [hin,hout]) then
+      begin
+         OK:=false;
+	 writeln('**hi edge value incorrect');
+      end;
+   end;
+   
+   CheckHi:=OK;
+end;{CheckHi}
+  
+function CheckLo(X:Sreal):boolean;
+var OK:boolean;
+begin
+   OK:=true;
+   with X do
+   begin
+      case cardinality of
+      infinite:
+         if (exp=Maxexp)and(mantissa=Mininf) then
+	 else writeln('**Invalid lo infinity');
+      finite:
+      begin
+         if (mantissa=Maxinf) or (mantissa=Mininf) then
+	 begin OK:=false; writeln('**Invalid finite value - hi');
+	 end;
+	 
+         if mantissa = 0 then
+	    if (exp=0) then 
+	    else 
+	    begin OK:=false; writeln('**Invalid zero - lo')
+	    end
+	 else
+	 begin
+	       if (mantissa > 0) then
+	          if mantissa >= (Maxinf div 10) then{OK}
+		  else 
+		  begin OK:=false; writeln('**Incorrect normalization - lo') 
+		  end
+	       else{mantissa<0}
+	          if mantissa > (Mininf div 10) then
+		  begin OK:=false; writeln('**Incorrect normalization - lo') 
+		  end;
+	 end;
+      end;
+      end;{case}
+
+      if not (edge in [lin,lout]) then
+      begin
+         OK:=false;
+	 writeln('**lo edge value incorrect');
+      end;
+   end;
+   
+   CheckLo:=OK;
+end;{CheckLo}
+  
+function CheckInt(I:Int):boolean;
+var OK:boolean;
+begin
+   OK:=CheckHi(I.hi) and CheckLo(I.lo);
+   if gtS(I.lo,I.hi) then
+   begin
+      OK:=false;
+      writeln('**Limits out of order');
+   end;
+
+   if not OK then 
+   begin writeln('**Error in Check'); DumpInt(I);
+   end;
+   
+   CheckInt:=OK;
+end;
+
+procedure DumpMem(var DCurr:DataMem);
+var tD:Ptr; tL:Loc;
+begin
+   with DCurr do
+   begin
+        writeln('LastHalve:',LastHalve:0);
+	
+    	for tL:= 1 to End do
+	   writeln(tL:3,S[tL]:2,RHalve[tL]);
+	writeln;
+	
+	for tD:= 1 to MaxDMem do 
+	begin 
+	   write(tD:5);
+	   DumpInt(D[tD]);
+	   assert(CheckInt(D[tD]));
+	   writeln;
+	end;
+	writeln;
+   end;
+end;{DumpMem}
+
+procedure WriteMem(var DCurr:DataMem);
+var tD:Ptr; 
+begin
+   with DCurr do
+   begin
+	for tD:= 1 to MaxDMem do 
+	if (DF.PF[tD] > PNull) or (Debug > activity) then
+	begin 
+	   write(tD:5);
+	   WriteInt(D[tD]);
+	   writeln;
+	end;
+	writeln;
+   end;
+end;{WriteMem}
+
+procedure OuterExec
+(PC:Loc0;DCurr:DataMem;Change:boolean;First:State;
+ var OldCounter:Positive;Level:Positive);
+
+var Counter:Positive;
+    Fail,AllPoints,LocalChange:boolean;
+
+procedure NewOuter(F:State);
+begin OuterExec(PC,DCurr,Change,F,Counter,Level+1);
+end;
+
+{!!}
+procedure execprint(PC:Loc; L:Ptr; R0:Int);
+begin
+   DF.PF[L]:=PSoln;
+   writeln;
+   write(PC:3,L:5);
+   WriteInt(R0);
+   writeln;
+end;
+
+procedure execpr(var Sr:State; L:Ptr);
+begin
+   Sr:=-1; DF.PF[L]:=PPrint;
+end;{execpr}
+
+procedure exectr(var Sr:State; L:Ptr);
+begin
+   Sr:=-1; DF.PF[L]:=PTrace;
+end;{exectr}
+
+procedure execsoln(var Sr:State; L:Ptr);
+begin
+   Sr:=-1; DF.PF[L]:=PSoln;
+end;{execsoln}
+
+procedure execreadr(var Sr:State;var R0:Int);
+begin
+   writeln;
+   write('<<');
+   ReadInt(R0);
+   Sr:=-1;
+end;
+
+function GetReal(E,M:integer):real;
+{convert E-exponent,M-mantissa into genuine Pascal real number}
+var x:real;
+begin
+   x:=M/Maxinf;
+   while E>0 do begin x:=x*10; E:=E-1; end; 
+   while E<0 do begin x:=x/10; E:=E+1; end;
+   GetReal:=x; 
+end;{GetReal} 
+   
+procedure Ratio(Lo,Hi:Sreal;var ERat,MRat:integer); 
+{compute ratio of Hi to Lo in exponent mantissa form}
+begin
+   if Lo.mantissa=0 then
+   begin{treat zero as if smallest possible positive number}
+      ERat:=Hi.exp-Minexp;
+      MRat:=Hi.mantissa*10;
+   end else
+   if Hi.mantissa=0 then
+   begin{treat zero as if smallest possible negative number}
+      ERat:=Minexp-Lo.exp;
+      MRat:=Lo.mantissa*10;
+   end
+   else begin
+      ERat:=Hi.exp-Lo.exp;
+      MRat:=(Hi.mantissa*Maxinf) div Lo.mantissa;
+   end;
+end;{Ratio}
+    
+function Adjacent(X:Int):boolean;
+{are hi and lo bounds adjacent points}
+begin
+   with X do
+   if (hi.mantissa=0) or (lo.mantissa=0) then
+      Adjacent:=
+         ((hi.mantissa=0)and(lo.mantissa=Mininf div 10)and(lo.exp=Minexp)) or
+         ((lo.mantissa=0)and(hi.mantissa=Maxinf div 10)and(hi.exp=Minexp)) 
+   else
+      Adjacent:=
+         ((lo.exp=hi.exp)and(lo.mantissa+1=hi.mantissa)) or
+	 ((hi.exp=lo.exp+1)and(hi.mantissa=(lo.mantissa div 10)+1)) or
+	 ((hi.exp=lo.exp-1)and((hi.mantissa div 10)-1=lo.mantissa));
+end;{Adjacent}
+
+procedure exechalve
+   (var PC:Loc0;var Sr:State;var R0:Int;var OK:boolean;var Change:boolean);
+{Reduce range of R0 (suceeds twice for two 'halves')}
+
+var EDiff,MDiff,ERat,MRat,MidE,MidM,M0,M1,HiM,HiE:integer;
+    Dummy:boolean;
+    Mid:Sreal;
+    R,D:real;
+    OldPC:Loc;
+   
+    procedure AtEnd;{What to do afer a successful halve}
+    begin  
+	DCurr.LastHalve:=PC; PC:=0; Sr:=0;
+    end;
+
+begin{exechalve}
+OldPC:=PC;
+with R0 do
+ begin
+      if DCurr.LastHalve >= PC then {not our turn yet} else
+      if (lo.mantissa = hi.mantissa) and (lo.exp=hi.exp) and
+         (lo.edge=lin) and (hi.edge=hin)
+      then {single point cant be divided} Sr:=-1 
+      else
+      if Adjacent(R0) and 
+	 (((lo.edge=lout) and (hi.edge=hout)) or
+	  ((lo.cardinality=infinite)and(hi.edge=hout)) or 
+	  ((hi.cardinality=infinite)and(lo.edge=lout))
+	 )
+      then Sr:=-1
+      else
+      if Sr=0 then
+         begin
+            AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+            MDiff:=M0+M1;
+	    D:=GetReal(EDiff,MDiff);
+	    if D < DCurr.RHalve[PC]*HalveThreshold 
+	    then {already narrowed enough dont bother} 
+	       Change:=true {otherwise can terminate too early}
+	    else begin
+	       DCurr.RHalve[PC]:=D;
+               NewOuter(1);
+               NewOuter(2);
+	       OK:=false;{fail after both alternatives tried}
+	    end
+         end
+   else{Sr=1,2}
+   if Adjacent(R0)
+   then begin{two adjacent points - needs special care}
+      if (hi.edge=hin) and (hi.cardinality=finite) then
+      begin
+         case Sr of
+	 1:hi.edge:=hout;
+	 2:begin lo:=hi; lo.edge:=lin;
+	   end;
+	 end;
+
+         AtEnd;
+      end
+      else if (lo.edge=lin) and (lo.cardinality=finite) then 
+      begin
+         case Sr of
+	 1:begin hi:=lo; hi.edge:=hin;
+	   end;
+	 2:lo.edge:=lout;
+	 end;
+         AtEnd;
+      end else {cant be narrowed} Sr:=-1;
+
+   end{adjacent} else
+   begin
+      if (lo.mantissa < 0) and (hi.mantissa > 0) then
+      begin
+         MidM:=0; MidE:=0;
+      end else
+      begin
+         Ratio(lo,hi,ERat,MRat);
+         if MRat < 0 then MRat:=-MRat;
+         R:=GetReal(ERat,MRat);
+(*writeln(ERat,MRat,R);*)
+         AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+         MDiff:=M0+M1;
+         if (R > 4) or (R < 0.25) then
+         begin{divide hi by sqrt of ratio to get midpoint}
+	    if hi.mantissa = 0 
+	    then begin HiM:=Mininf div 10; HiE:=Minexp;
+	    end else
+	    begin HiM:=hi.mantissa; HiE:=hi.exp;
+	    end;
+	    if ERat < 0 then MidE:=HiE-((ERat-1) div 2)
+	 	        else MidE:=HiE-(ERat div 2);
+	    if odd(ERat) 
+	       then MidM:=trunc(HiM*(Maxinf div 100)/sqrt(MRat*10))
+	       else MidM:=trunc(HiM*(Maxinf div 100)/sqrt(MRat));
+(*writeln(MidE,MidM);*)
+         end else
+         begin{take (hi+lo)/2 as midpoint}
+            MidM:=MDiff div 2 - M1;
+	    MidE:=EDiff;
+         end;
+      end;
+      if MidM >= 0 then NormalizeDn(MidE,MidM,Mid,Dummy)
+      		   else NormalizeUp(MidE,MidM,Mid,Dummy);
+      case Sr of
+      1:begin hi:=Mid; hi.edge:=hout;
+        end;
+      2:begin lo:=Mid; lo.edge:=lin;
+        end;
+      end;
+(*DumpInt(R0);writeln;*)
+      AtEnd;
+   end;{if Sr}
+
+   AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+   MDiff:=M0+M1;
+   DCurr.RHalve[OldPC]:=GetReal(EDiff,MDiff);
+
+ end;{with}
+end;{exechalve}
+
+procedure exechalves
+   (var PC:Loc0;var Sr:State;var R0:Int;var OK:boolean;var Change:boolean);
+{Reduce range of R0 (suceeds twice for two 'halves')}
+{Simple version thats averages exponents}
+
+var EDiff,MDiff,ERat,MRat,MidE,MidM,M0,M1,HiM,HiE:integer;
+    Dummy:boolean;
+    Mid:Sreal;
+    R,D:real;
+    OldPC:Loc;
+   
+    procedure AtEnd;{What to do afer a successful halve}
+    begin  
+	DCurr.LastHalve:=PC; PC:=0; Sr:=0;
+    end;
+
+    procedure Average(Lo,Hi:Sreal;var Exp:integer);
+    {compute average of exponents allowing for zero}
+    {infinities happen to work because of representation}
+    var Le,He:integer;
+    begin
+       if Lo.mantissa = 0 then
+	  Le := Minexp
+       else
+	  Le := Lo.exp;
+       if Hi.mantissa = 0 then
+	  He := Minexp
+       else
+	  He := Hi.exp;
+       Exp:= (He + Le - 2*Minexp) div 2 + Minexp;
+writeln(Exp,Hi.exp,Lo.exp,Minexp,He,Le);
+    end;{Average}
+
+begin{exechalves}
+OldPC:=PC;
+with R0 do
+ begin
+      if DCurr.LastHalve >= PC then {not our turn yet} else
+      if (lo.mantissa = hi.mantissa) and (lo.exp=hi.exp) and
+         (lo.edge=lin) and (hi.edge=hin)
+      then {single point cant be divided} Sr:=-1 
+      else
+      if Adjacent(R0) and 
+	 (((lo.edge=lout) and (hi.edge=hout)) or
+	  ((lo.cardinality=infinite)and(hi.edge=hout)) or 
+	  ((hi.cardinality=infinite)and(lo.edge=lout))
+	 )
+      then Sr:=-1
+      else
+      if Sr=0 then
+         begin
+            AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+            MDiff:=M0+M1;
+	    D:=GetReal(EDiff,MDiff);
+	    if D < DCurr.RHalve[PC]*HalveThreshold 
+	    then {already narrowed enough dont bother} 
+	       Change:=true {otherwise can terminate too early}
+	    else begin
+	       DCurr.RHalve[PC]:=D;
+               NewOuter(1);
+               NewOuter(2);
+	       OK:=false;{fail after both alternatives tried}
+	    end
+         end
+   else{Sr=1,2}
+   if Adjacent(R0)
+   then begin{two adjacent points - needs special care}
+      if (hi.edge=hin) and (hi.cardinality=finite) then
+      begin
+         case Sr of
+	 1:hi.edge:=hout;
+	 2:begin lo:=hi; lo.edge:=lin;
+	   end;
+	 end;
+
+         AtEnd;
+      end
+      else if (lo.edge=lin) and (lo.cardinality=finite) then 
+      begin
+         case Sr of
+	 1:begin hi:=lo; hi.edge:=hin;
+	   end;
+	 2:lo.edge:=lout;
+	 end;
+         AtEnd;
+      end else {cant be narrowed} Sr:=-1;
+
+   end{adjacent} else
+   begin
+      if (lo.mantissa < 0) and (hi.mantissa > 0) then
+      begin
+         MidM:=0; MidE:=0;
+      end else
+      begin
+         Ratio(lo,hi,ERat,MRat);
+(*writeln(ERat,MRat,R);*)
+         AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+         MDiff:=M0+M1;
+         if (ERat > 1) or (ERat < -1) then
+         begin{Average exponents}
+	    if hi.mantissa <= 0 
+	    then begin MidM:= -Splitman;
+	    end else
+	    begin MidM:= Splitman; assert(lo.mantissa >= 0);
+	    end;
+            Average(lo,hi,MidE);
+         end else
+         begin{take (hi+lo)/2 as midpoint}
+            MidM:=MDiff div 2 - M1;
+	    MidE:=EDiff;
+         end;
+      end;
+      if MidM >= 0 then NormalizeDn(MidE,MidM,Mid,Dummy)
+      		   else NormalizeUp(MidE,MidM,Mid,Dummy);
+      case Sr of
+      1:begin lo:=Mid; lo.edge:=lin;
+        end;
+      2:begin hi:=Mid; hi.edge:=hout;
+        end;
+      end;
+(*DumpInt(R0);writeln;*)
+      AtEnd;
+   end;{if Sr}
+
+   AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+   MDiff:=M0+M1;
+   DCurr.RHalve[OldPC]:=GetReal(EDiff,MDiff);
+
+ end;{with}
+end;{exechalves}
+
+procedure execlinh
+   (var PC:Loc0;var Sr:State;var R0:Int;var OK:boolean;var Change:boolean);
+{Reduce range of R0 (suceeds twice for two 'halves')}
+
+var EDiff,MDiff,MidE,MidM,M0,M1:integer;
+    Dummy:boolean;
+    Mid:Sreal;
+    D:real;
+    OldPC:Loc;
+   
+    procedure AtEnd;{What to do afer a successful halve}
+    begin  
+	DCurr.LastHalve:=PC; PC:=0; Sr:=0;
+    end;
+
+begin{execlinh}
+OldPC:=PC;
+with R0 do
+ begin
+      if DCurr.LastHalve >= PC then {not our turn yet} else
+      if (lo.mantissa = hi.mantissa) and (lo.exp=hi.exp) and
+         (lo.edge=lin) and (hi.edge=hin)
+      then {single point cant be divided} Sr:=-1 
+      else
+      if Adjacent(R0) and 
+	 (((lo.edge=lout) and (hi.edge=hout)) or
+	  ((lo.cardinality=infinite)and(hi.edge=hout)) or 
+	  ((hi.cardinality=infinite)and(lo.edge=lout))
+	 )
+      then Sr:=-1
+      else
+      if Sr=0 then
+         begin
+            AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+            MDiff:=M0+M1;
+	    D:=GetReal(EDiff,MDiff);
+	    if D < DCurr.RHalve[PC]*HalveThreshold
+	    then {already narrowed enough dont bother} 
+	       Change:=true {otherwise possible to terminate early}
+	    else begin
+	       DCurr.RHalve[PC]:=D;
+               NewOuter(1);
+               NewOuter(2);
+	       OK:=false;{fail after both alternatives tried}
+	    end
+         end
+   else{Sr=1,2}
+   if Adjacent(R0)
+   then begin{two adjacent points - needs special care}
+      if (hi.edge=hin) and (hi.cardinality=finite) then
+      begin
+         case Sr of
+	 1:begin lo:=hi; lo.edge:=lin;
+	   end;
+	 2:hi.edge:=hout;
+	 end;
+         AtEnd;
+      end
+      else if (lo.edge=lin) and (lo.cardinality=finite) then 
+      begin
+         case Sr of
+	 1:lo.edge:=lout;
+	 2:begin hi:=lo; hi.edge:=hin;
+	   end;
+	 end;
+         AtEnd;
+      end else {cant be narrowed} Sr:=-1;
+   end{adjacent} else
+   begin
+      if (lo.mantissa < 0) and (hi.mantissa > 0) then
+      begin
+         MidM:=0; MidE:=0;
+      end else
+      begin
+         AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+         MDiff:=M0+M1;
+         MidM:=MDiff div 2 - M1;
+	 MidE:=EDiff;
+      end;
+      if MidM >= 0 then NormalizeDn(MidE,MidM,Mid,Dummy)
+      		   else NormalizeUp(MidE,MidM,Mid,Dummy);
+      case Sr of
+      1:begin lo:=Mid; lo.edge:=lin;
+        end;
+      2:begin hi:=Mid; hi.edge:=hout;
+        end;
+      end;
+      
+      AtEnd;
+   end;{if Sr}
+
+   AlignUp(hi.exp,hi.mantissa,lo.exp,-lo.mantissa,EDiff,M0,M1,Dummy);
+   MDiff:=M0+M1;
+   DCurr.RHalve[OldPC]:=GetReal(EDiff,MDiff);
+
+ end;{with}
+end;{execlinh}
+
+procedure execmult(var Sr:State;T0,T1,T2:Int;var R0,R1,R2:Int;var OK:boolean);
+var Q0,Q1,Q2:Int;
+
+   procedure multS(S0,S1:Sreal;var U,D:Sreal);
+   var M,E:integer;
+       Closed,Clu,Cld:boolean;
+   begin
+      M:=S0.mantissa*S1.mantissa;
+(*DumpS(S0);write('//');DumpS(S1);write(M);*)
+      Closed:=(S0.edge in [hin,lin]) and (S1.edge in [hin,lin]);
+      if ((S0.mantissa=0) and (S0.edge in [hin,lin])) or
+         ((S1.mantissa=0) and (S1.edge in [hin,lin]))
+      then Closed:=true; 
+      Clu:=Closed; Cld:=Closed;
+      if (S0.cardinality=infinite) or (S1.cardinality=infinite) then
+      begin
+         if M < 0 then begin D:=MinusInfS; U:=MinusInfS; end else
+	 if M > 0 then begin D:=PlusInfS; U:=PlusInfS; end else
+	 begin {M=0} D:=ZeroS; U:=ZeroS; end;
+	 Closed:=((S0.cardinality=infinite)and(S0.edge in [hin,lin]))or
+	         ((S1.cardinality=infinite)and(S1.edge in [hin,lin]));
+	 Clu:=Closed;Cld:=Closed;
+      end
+      else{everybody finite}
+      begin
+         E:=S0.exp+S1.exp-Digits;
+	 NormalizeUp(E,M,U,Clu);
+	 NormalizeDn(E,M,D,Cld);
+      end;
+      if Clu then U.edge:=hin else U.edge:=hout;
+      if Cld then D.edge:=lin else D.edge:=lout;      
+(*writeln(E);DumpS(U);write('::');DumpS(D);writeln;*)
+   end;{multS}
+         
+   procedure mult(Ta,Tb:Int;var R:Int);
+   var U0,U1,U2,U3,U4,U5,D0,D1,D2,D3,D4,D5:Sreal;
+   begin
+      multS(Ta.hi,Tb.hi,U0,D0);
+      multS(Ta.hi,Tb.lo,U1,D1);
+      multS(Ta.lo,Tb.hi,U2,D2);
+      multS(Ta.lo,Tb.lo,U3,D3);
+      maxS(U0,U1,U4);maxS(U2,U3,U5);maxS(U4,U5,R.hi);
+      minS(D0,D1,D4);minS(D2,D3,D5);minS(D4,D5,R.lo);
+   end;
+   
+   procedure InvS(S:Sreal;var W:Sreal);
+   var E,M,Rem:integer;
+       Closed:boolean;
+   begin
+      Closed:= S.edge in [hin,lin];
+      if (S.cardinality = infinite) then
+         W:=ZeroS
+      else
+      if (S.mantissa = 0) then
+         case S.edge of
+	 hin,hout:W:=MinusInfS;
+	 lin,lout:W:=PlusInfS;
+	 end
+      else
+      begin
+         M:=(Maxinf*Maxinf) div S.mantissa;
+	 Rem:=(Maxinf*Maxinf) mod S.mantissa;
+	 if Rem < 0 then halt;
+	 E:=-S.exp;
+	 case S.edge of
+	 lin,lout: begin 
+	     	      if (Rem > 0) and (M > 0) then 
+		      begin M:=M+1;Closed:=false; 
+		      end;
+		      NormalizeUp(E,M,W,Closed);
+	           end;
+	 hin,hout: begin 
+	     	      if (Rem > 0) and (M < 0) then 
+		      begin M:=M-1;Closed:=false;
+		      end;
+		      NormalizeDn(E,M,W,Closed);
+	           end;
+	 end;
+      end;
+      
+      if Closed then
+         case S.edge of
+         hin:W.edge:=lin;
+         lin:W.edge:=hin;
+         end
+      else
+         case S.edge of
+	 hin,hout:W.edge:=lout;
+	 lin,lout:W.edge:=hout;
+	 end;
+
+      
+   end;{InvS}	 
+   
+   procedure Inv(T:Int;var X:Int;Pos:boolean);
+   {1/T positive -> X}
+   {If 1/T splits to two intervals then use Pos to select which to use}
+   begin
+      if (T.lo.mantissa < 0) and (T.hi.mantissa > 0) then
+         if (T.lo.cardinality=infinite) and (T.hi.cardinality=infinite) then
+	    X:=All
+	 else if Pos then
+	 begin InvS(T.hi,X.lo); X.hi:=PlusInfS; X.hi.edge:=hin;
+	 end else 
+	 begin InvS(T.lo,X.hi); X.lo:=MinusInfS; X.lo.edge:=lin;
+	 end
+      else
+      begin InvS(T.hi,X.lo); InvS(T.lo,X.hi);
+      end;
+   end;{Inv}
+   
+   procedure divi(Ta,Tb:Int;var R:Int);
+   var X:Int;
+   begin
+      if (Tb.lo.mantissa < 0) and (Tb.hi.mantissa > 0) then
+         if (Ta.lo.mantissa < 0) and (Ta.hi.mantissa > 0) then
+	 { need do nothing as R will be set to [inf,inf]}
+	 else
+	 
+         begin
+	    {if both same sign get positive side of inverse}
+	    {else get negative}
+	    Inv(Tb,X,(Ta.hi.mantissa <= 0) = (R.hi.mantissa <= 0));
+	    mult(Ta,X,R);
+	 end
+      else {Tb wont give split inverse}
+      begin
+         Inv(Tb,X,true);
+	 mult(Ta,X,R);
+      end;
+(*
+DumpInt(Tb);writeln('//');DumpInt(X);writeln;
+DumpInt(Ta);writeln('\\');DumpInt(R);writeln;
+*)
+   end;
+   
+   function Split(T:Int):boolean;
+   begin
+      Split:=(T.lo.mantissa<0) and (T.hi.mantissa>0) 
+      	      and ((T.lo.cardinality=finite) or (T.hi.cardinality=finite));
+   end;{Split}
+
+   function Zin(T:Int):boolean;
+   {check if 0 in range of interval}
+   begin
+      if (T.lo.mantissa > 0) then Zin:=false else
+      if (T.lo.mantissa = 0) then
+	 Zin:=(T.lo.edge=lin) else
+      if (T.hi.mantissa < 0) then Zin:=false else
+      if (T.hi.mantissa = 0) then
+         Zin:=(T.hi.edge=hin) 
+      else
+         Zin:=true;
+   end;{Zin}
+   
+begin{execmult}
+   case Sr of
+   0,10:begin
+        if T2=Zero then
+           if (T1=Zero) or (T0=Zero) then Sr:=-1
+           else
+	   if not Zin(T0) then begin R1:=Zero; Sr:=-1; end else
+	   if not Zin(T1) then begin R0:=Zero; Sr:=-1; end 
+	   else
+           begin
+              NewOuter(11); NewOuter(12);OK:=false;     
+           end
+        else if (Sr=0) then
+        begin
+	   if (T0.hi.mantissa > 0) and (T0.lo.mantissa < 0) and Split(T1) 
+           then  begin NewOuter(1); NewOuter(2); OK:=false; end
+           else if (T1.hi.mantissa > 0) and 
+	           (T1.lo.mantissa < 0) and Split(T0) 
+                then  begin NewOuter(3); NewOuter(4); OK:=false; end;
+	end;
+     end;
+   1:begin R0.lo:=ZeroS; R0.lo.edge:=lin; T0:=R0; Sr:=10;
+     end;
+   2:begin R0.hi:=ZeroS; R0.hi.edge:=hout; T0:=R0; Sr:=10;
+     end;
+   3:begin R1.lo:=ZeroS; R1.lo.edge:=lin; T1:=R1; Sr:=10;
+     end;
+   4:begin R1.hi:=ZeroS; R1.hi.edge:=hout; T1:=R1; Sr:=10;
+     end;
+   11:begin R0:=Zero; Sr:=-1;
+      end;
+   12:begin R1:=Zero; Sr:=-1;
+      end;
+   end;
+   
+   if OK and (Sr<>-1) then
+   begin
+      mult(T0,T1,Q2); Inter(R2,Q2,R2);
+      Q1:=R1; divi(T2,T0,Q1); Inter(R1,Q1,R1);
+      Q0:=R0; divi(T2,T1,Q0); Inter(R0,Q0,R0);
+      Sr:=10;
+   end;
+end;{execmult}
+
+procedure execadd(T0,T1,T2:Int;var R0,R1,R2:Int);
+  procedure addhi(S0,S1:Sreal; var S2:Sreal);
+  var Closed:boolean;  Exp,M0,M1:integer;
+  begin{addhi}
+  with S2 do
+  begin
+     if (S0.cardinality=infinite)or(S1.cardinality=infinite) then
+     begin  
+        S2:=PlusInfS;
+        Closed:=((S0.cardinality=infinite)and(S0.edge=hin))or
+	        ((S1.cardinality=infinite)and(S1.edge=hin));
+     end else
+     begin
+        Closed:=(S0.edge=hin)and(S1.edge=hin);
+        AlignUp(S0.exp,S0.mantissa,S1.exp,S1.mantissa,Exp,M0,M1,Closed);
+	NormalizeUp(Exp,M0+M1,S2,Closed)
+     end;
+     if Closed then S2.edge:=hin else S2.edge:=hout;
+  end;
+  end;{addhi}
+  
+  procedure addlo(S0,S1:Sreal; var S2:Sreal);
+  var Closed:boolean;  Exp,M0,M1:integer;
+  begin{addlo}
+  with S2 do
+  begin
+     if (S0.cardinality=infinite)or(S1.cardinality=infinite) then
+     begin  
+        S2:=MinusInfS;
+        Closed:=((S0.cardinality=infinite)and(S0.edge=lin))or
+	        ((S1.cardinality=infinite)and(S1.edge=lin));
+     end else
+     begin
+        Closed:=(S0.edge=lin)and(S1.edge=lin);
+        AlignUp(S0.exp,-S0.mantissa,S1.exp,-S1.mantissa,Exp,M0,M1,Closed);
+	NormalizeUp(Exp,M0+M1,S2,Closed); mantissa:=-mantissa;
+     end;
+     if Closed then S2.edge:=lin else S2.edge:=lout;
+  end;
+  end;{addlo}
+  
+  procedure subhi(S0,S1:Sreal; var S2:Sreal);
+  var Closed:boolean;  Exp,M0,M1:integer;
+  begin{subhi}
+  with S2 do
+  begin
+     if (S0.cardinality=infinite)or(S1.cardinality=infinite) then
+     begin  
+        S2:=PlusInfS;
+        Closed:=((S0.cardinality=infinite)and(S0.edge=hin))or
+	        ((S1.cardinality=infinite)and(S1.edge=lin));
+     end else
+     begin
+        Closed:=(S0.edge=hin)and(S1.edge=lin);
+        AlignUp(S0.exp,S0.mantissa,S1.exp,-S1.mantissa,Exp,M0,M1,Closed);
+	NormalizeUp(Exp,M0+M1,S2,Closed);
+     end;
+     if Closed then S2.edge:=hin else S2.edge:=hout;
+  end;
+  end;{subhi}
+  
+  procedure sublo(S0,S1:Sreal; var S2:Sreal);
+  var Closed:boolean;  Exp,M0,M1:integer;
+  begin{sublo}
+  with S2 do
+  begin
+     if (S0.cardinality=infinite)or(S1.cardinality=infinite) then
+     begin  
+        S2:=MinusInfS;
+        Closed:=((S0.cardinality=infinite)and(S0.edge=lin))or
+	        ((S1.cardinality=infinite)and(S1.edge=hin));
+     end else
+     begin
+        Closed:=(S0.edge=lin)and(S1.edge=hin);
+        AlignUp(S0.exp,-S0.mantissa,S1.exp,S1.mantissa,Exp,M0,M1,Closed);
+	NormalizeUp(Exp,M0+M1,S2,Closed);mantissa:=-mantissa;
+     end;
+     if Closed then S2.edge:=lin else S2.edge:=lout;
+  end;
+  end;{sublo}
+  
+begin{execadd}
+   addhi(T0.hi,T1.hi,R2.hi);
+   addlo(T0.lo,T1.lo,R2.lo);
+   
+   subhi(T2.hi,T0.lo,R1.hi);
+   sublo(T2.lo,T0.hi,R1.lo);
+   
+   subhi(T2.hi,T1.lo,R0.hi);
+   sublo(T2.lo,T1.hi,R0.lo);
+end;{execadd}
+
+
+
+
+procedure execintgr(var Sr:State; var R:Int);
+      
+  procedure floor (var R : Sreal);
+  var sign , dum : boolean ;
+      E, M ,t    : integer ;
+  
+  begin
+     sign := false ;
+     with R do
+        begin
+           if (mantissa < 0) then
+              begin
+                 sign := true ;
+                 mantissa := - mantissa ;
+              end ;
+           if (exp <= 0) then
+              begin
+                 if sign or ((mantissa = 0) & (edge = hout)) then
+                    begin
+                       M := 1 ; 
+                       sign := true ;
+                    end 
+                 else
+                    M := 0 ;
+                 E := Digits ;
+                 NormalizeUp (E,M,R,dum) ;
+                 edge := hin ;
+              end 
+        
+           else {exp >0}
+              if (exp <= Digits) then
+                 begin
+                    M := 1 ;
+                    E := exp ;
+                    while (E < Digits) do
+                       begin
+                          M := M * 10 ;
+                          E := E + 1 ;
+                       end ;
+                    t := mantissa mod M ;
+                    M := mantissa div M ;
+                    if (sign & ((edge = hout) or(t > 0))) then
+                       M := M + 1 ; 
+                    if (not sign & (t = 0)) & (edge = hout) then
+                       M := M - 1 ;
+                    E := Digits ;
+                    NormalizeUp (E,M,R,dum) ;
+                    edge := hin ;
+                 end 
+              else
+                 if ((edge = hout)&(exp = (Digits+1))) & (not sign & (mantissa = Splitman)) then
+                    begin
+                       mantissa := Maxman ;
+                       exp := Digits ;
+                       edge := hin ;
+                    end ;
+           if sign then
+              mantissa := - mantissa ;
+        end ;{with R}
+  end ; {floor} 
+  procedure ceiling (var R : Sreal);
+  var sign , dum : boolean ;
+      E, M , t   : integer ;
+  
+  begin
+     sign := false ;
+     with R do
+        begin
+           if (mantissa < 0) then
+              begin
+                 sign := true ;
+                 mantissa := - mantissa ;
+              end ;
+           if (exp <= 0) then
+              begin
+                 if sign or ((mantissa = 0) & (edge = lin)) then
+                    M := 0 
+                 else
+                    M := 1 ;
+                 E := Digits ;
+                 NormalizeDn (E,M,R,dum) ;
+                 edge := lin ;
+              end 
+        
+           else {exp > 0}
+              if (exp <= Digits) then
+                 begin
+                    M := 1 ;
+                    E := exp ;
+                    while (E < Digits) do
+                       begin
+                          M := M * 10 ;
+                          E := E + 1 ;
+                       end ;
+                    t := mantissa mod M ;
+                    M := mantissa div M ;
+                    if ( not sign & ((edge = lout) or(t > 0))) then
+                       M := M + 1 ;
+                    if (sign & (t = 0)) & (edge = lout) then
+                       M := M - 1 ;
+                    E := Digits ;
+                    NormalizeDn (E,M,R,dum) ;
+                    edge := lin ;
+                 end 
+              else
+                 if ((edge = lout)&(exp = (Digits+1))) & (sign & (mantissa = Splitman)) then
+                    begin
+                       mantissa := Maxman ;
+                       exp := Digits ;
+                       edge := lin ;
+                    end ;
+           if sign then
+              mantissa := - mantissa ;
+        end ;{with R}
+  end ; {ceiling} 
+begin
+   with R do
+      begin
+(*         writeln ('IN EXECINTGR :') ;
+         writeln ;
+         writeln ('HI : ', hi.mantissa , hi.exp) ;
+         writeln ;
+         writeln ('LO : ', lo.mantissa , lo.exp) ;
+         writeln ;
+*)
+         if (hi.cardinality <> infinite) then
+            floor (hi) ;
+         if (lo.cardinality <> infinite) then
+            ceiling (lo) ;
+         if ((hi.mantissa = lo.mantissa) & (hi.exp = lo.exp)) then
+            Sr := - 1 ;
+(*         writeln ('OUT EXECINTGR :') ;
+         writeln ;
+         writeln ('HI : ', hi.mantissa , hi.exp) ;
+         writeln ;
+         writeln ('LO : ', lo.mantissa , lo.exp) ;
+         writeln ;
+*)
+      end ;
+end;{execintgr}
+
+
+
+
+
+
+
+
+
+
+
+
+
+  procedure execlb (R1 : Int ; var R : Int) ;
+  begin
+     R := R1 ;
+     with R.lo do
+        if (cardinality = infinite) then
+           R.hi := MinusFiniteS 
+        else
+           R.hi := R.lo ;
+     R.hi.edge := hin ;
+     R.lo := MinusInfS ;
+  end ;
+
+procedure execub (var X , Xd : Int) ;
+var     Dum : Int ;     
+  begin
+     Xd := X ;
+     execadd (Xd, Dum, Zero, Dum, Xd, Dum) ;
+     execlb (Xd,Xd) ;
+     execadd (Xd, Dum, Zero, Dum, Xd, Dum) ;
+  end ;
+
+procedure execcopy (R0 :Int; var R1:Int);
+begin
+  R1:=R0;
+end;
+
+procedure execless(var Sr:State; var R0,R1:Int);
+{R0 < R1}
+begin
+   if Point(R0) or Point(R1) then Sr:=-1;
+   if gtS(R1.lo,R0.hi) then Sr:= -1 else
+   begin
+      R0.hi:=R1.hi;
+      R0.hi.edge:=hout;
+      R1.lo:=R0.lo;
+      R1.lo.edge:=lout;
+   end;
+end;{execless}
+
+procedure execleq(var Sr:State; var R0,R1:Int);
+{R0 =< R1}
+begin
+   if Point(R0) or Point(R1) then Sr:=-1;
+   if geS(R1.lo,R0.hi) then Sr:= -1 else
+   begin
+      R0.hi:=R1.hi;
+      R1.lo:=R0.lo;
+   end;
+end;{execleq}
+
+procedure execnoteq(var Sr:State; var R0,R1:Int);
+{R0 <> R1}
+begin
+   case Sr of
+   0:{nothing done yet}
+     begin
+     if gtS(R0.lo,R1.hi) or gtS(R1.lo,R0.hi) 
+     then Sr:=-1 {no need to check in future}
+     else 
+     begin
+        if Point(R0) then 
+	begin
+	   OuterExec(PC,DCurr,true,1,Counter,Level+1);
+	   Sr:=2;
+	   execless(Sr,R1,R0);
+	end else
+	if Point(R1) then
+	begin
+	   OuterExec(PC,DCurr,true,2,Counter,Level+1);
+	   Sr:=1;
+	   execless(Sr,R0,R1);
+	end;
+     end;
+     end;
+   1:execless(Sr,R0,R1);
+   2:execless(Sr,R1,R0);
+   end;
+end;{execnoteq}
+
+procedure execsqrr(var R0,R1:Int);
+begin{execsqrr}
+end;{execsqrr}
+
+procedure execminr(var R0,R1,R2:Int);
+begin{execminr}
+end;{execminr}
+
+procedure execmaxr(var R0,R1,R2:Int);
+  procedure chmaxhi(S0,S1:Sreal; var S2:Sreal);
+  var Closed:boolean;  Exp,M0,M1:integer;
+  begin{chmaxhi}
+  with S2 do
+  begin
+     if (S0.cardinality=infinite)or(S1.cardinality=infinite) then
+     begin  
+        S2:=PlusInfS;
+        Closed:=((S0.cardinality=infinite)and(S0.edge=hin))or
+	        ((S1.cardinality=infinite)and(S1.edge=hin));
+     end else
+     begin
+        Closed:=(S0.edge=hin)and(S1.edge=hin);
+        AlignUp(S0.exp,S0.mantissa,S1.exp,S1.mantissa,Exp,M0,M1,Closed);
+        if M1 > M0 then
+           M0 := M1 ;
+	NormalizeUp(Exp,M0,S2,Closed)
+     end;
+     if Closed then S2.edge:=hin else S2.edge:=hout;
+  end;
+  end;{chmaxhi}
+  
+  procedure chmaxlo(S0,S1:Sreal; var S2:Sreal);
+  var Closed:boolean;  Exp,M0,M1:integer;
+  begin{chmaxlo}
+  with S2 do
+  begin
+     if (S0.cardinality=infinite)or(S1.cardinality=infinite) then
+     begin  
+        S2:=MinusInfS;
+        Closed:=((S0.cardinality=infinite)and(S0.edge=lin))or
+	        ((S1.cardinality=infinite)and(S1.edge=lin));
+     end else
+     begin
+        Closed:=(S0.edge=lin)and(S1.edge=lin);
+        AlignUp(S0.exp,-S0.mantissa,S1.exp,-S1.mantissa,Exp,M0,M1,Closed);
+	NormalizeUp(Exp,M0+M1,S2,Closed); mantissa:=-mantissa;
+     end;
+     if Closed then S2.edge:=lin else S2.edge:=lout;
+  end;
+  end;{addlo}
+begin{execmaxr}
+end;{execmaxr}
+
+procedure execmodu(var R0,R1,R2:Int);
+begin{execmodu}
+end;{execmodu}
+
+procedure execabsr(var R0,R1:Int);
+begin{execabsr}
+end;{execabsr}
+
+procedure exectrig(var R0,R1,R2:Int);
+begin{exectrig}
+end;{exectrig}
+
+procedure execexpr(var R0,R1:Int);
+begin{execexpr}
+end;{execexpr}
+
+
+function Exec(I:Instr;var PC:Loc0;var Change:boolean):boolean;
+var
+	R:array[0..Par] of Int;  {working registers}
+	Sr:State;  {State register}
+	P:0..Par;
+	E:boolean;
+	NewPC:Loc0;
+	TraceChange:boolean;
+
+   procedure WritePars; {write out list of parameter registers for curr ins}
+   begin
+   with I do
+   begin
+      write(PC:2,Code:5,Sr:3);
+      for P := 0 to Par do
+         if Pars[P] <> 0 then 
+	 begin
+	    write(Pars[P]:3);
+	    WriteInt(R[P]);
+	 end;
+      writeln;
+   end;
+   end;{WritePars}
+
+begin{Exec}
+with I,DCurr do
+begin
+   Counter:=Counter+1;
+   {get parameters}
+   for P := 0 to ParN[Code] do 
+   begin R[P]:=D[Pars[P]]; assert(CheckInt(R[P]));
+   end;
+   
+   Sr:=S[PC];
+   if Debug >= trace then  begin write(' '); WritePars; end;
+   E:=true;
+   Change:=false;
+   NewPC:=PC;
+
+{!!}case Code of 
+   print: execprint(PC,Pars[0],R[0]);
+   pr   : execpr(Sr,Pars[0]);
+   tr   : exectr(Sr,Pars[0]);
+   soln : execsoln(Sr,Pars[0]);
+   readr: execreadr(Sr,R[0]);
+   halve: exechalve(NewPC,Sr,R[0],E,Change);
+   halves:exechalves(NewPC,Sr,R[0],E,Change);
+   linh : execlinh(NewPC,Sr,R[0],E,Change);
+   mult : execmult (Sr,R[0],R[1],R[2],R[0],R[1],R[2],E);
+   add  : execadd  (R[0],R[1],R[2],R[0],R[1],R[2]);
+   intgr: execintgr(Sr,R[0]);
+   less : execless (Sr,R[0],R[1]);
+   leq  : execleq  (Sr,R[0],R[1]);
+   noteq: execnoteq(Sr,R[0],R[1]);
+   sqrr : execsqrr(R[0],R[1]);
+   minr : execminr(R[0],R[1],R[2]);
+   maxr : execmaxr(R[0],R[1],R[2]);
+   modu : execmodu(R[0],R[1],R[2]);
+   absr : execabsr(R[0],R[1]);
+   trig : exectrig(R[0],R[1],R[2]);
+   expr : execexpr(R[0],R[1]);
+   lb   : execlb (R[0],R[1]);
+   ub   : execub (R[0],R[1]);
+   copy : execcopy(R[0],R[1]);
+   end;
+
+   TraceChange:=false;
+   AllPoints:=true;
+   for P := 0 to ParN[Code] do
+   with D[Pars[P]] do
+   begin
+      if DF.PF[Pars[P]]=PPrint then TraceChange:=true;
+      assert(CheckLo(R[P].lo));assert(CheckHi(R[P].hi));
+      if ParIntersect [Code] then
+         begin
+            maxS(R[P].lo,lo,R[P].lo);
+            minS(R[P].hi,hi,R[P].hi);
+         end ;
+      if gtS(R[P].lo,R[P].hi) then 
+      begin E:=false; assert(CheckLo(R[P].lo));assert(CheckHi(R[P].hi));
+      end
+      else begin
+         if D[Pars[P]] <> R[P] then 
+         begin 
+	    D[Pars[P]] := R[P]; 
+	    Change:=true;
+	    if DF.PF[Pars[P]] = PTrace then TraceChange:=true;
+         end;
+         AllPoints:=AllPoints and Point(R[P]);
+         assert(CheckInt(R[P])); assert(CheckInt(D[Pars[P]]));
+      end;
+   end;
+
+   if (Debug=activity) and TraceChange then writeln;
+   if (Debug >=activity) then 
+   begin if Change then write('*') else write ('.');
+   end;
+   Exec:=E;
+   if E then
+   begin
+      if AllPoints then Sr:=-1; 
+      if (Sr <> S[PC]) then begin S[PC]:=Sr; Change:=true; end;
+      if (Debug=activity) and TraceChange then WritePars;
+      if Debug >= post then  WritePars;
+      if Debug = dump then DumpMem(DCurr);
+   end else 
+   if Debug >= activity then 
+   begin writeln('FAILED'); write(' '); WritePars; 
+   end;
+   PC:=NewPC;
+end;
+end;{Exec}
+
+begin{OuterExec}
+   writeln;
+   writeln(Level:2,'Entering  Count:',OldCounter:0); OldCounter:=0;
+   Counter:=0;
+   Fail:=false;
+   if First <> 0 then DCurr.S[PC]:=First;
+   {Run simulation until failure or nothing further to be done}
+   repeat
+        if (PC = End) then 
+   	begin PC:=1; Change:=false; DCurr.LastHalve:=1; end;
+   	while (PC < End) and not Fail and not GlobalEnd do
+   	with I[PC] do
+   	begin
+   	   if DCurr.S[PC] > -1 then
+	   begin Fail:=not Exec(I[PC],PC,LocalChange); 
+	      Change:=Change or LocalChange;
+	   end;
+   	   PC:=PC+1;
+   	end;
+   until Fail or (not Change) or GlobalEnd;
+   writeln;
+   write(Level:2,'Exiting  Count:',Counter:0);
+   if not (Fail or GlobalEnd) then
+   begin 
+      if (Cut=once) then GlobalEnd:=true;
+      writeln('SOLUTION');
+      WriteMem(DCurr);
+   end 
+   else writeln;
+end;{OuterExec}
+
+
+procedure Clear;
+var tL:Loc; 
+    tD,tDF:Ptr; 
+    tPar:1..Par; 
+    DI:1..Digits;
+    J:1..Maxexp;
+    MaxDiff:real;
+begin
+   Shift[0]:=1;
+   for DI:= 1 to Digits do Shift[DI]:=Shift[DI-1]*10;
+
+   with PlusInfS do
+   begin
+      edge:=hin;cardinality:=infinite;mantissa:=Maxinf;
+      exp:=Maxexp;
+   end;
+   with MinusInfS do
+   begin
+      edge:=lin;cardinality:=infinite;mantissa:=Mininf;
+      exp:=Maxexp;
+   end;
+   with PlusFiniteS do
+   begin
+      edge:=hin;cardinality:=finite;mantissa:=Maxman;
+      exp:=Maxexp;
+   end;
+   with MinusFiniteS do
+   begin
+      edge:=lin;cardinality:=finite;mantissa:=Minman;
+      exp:=Maxexp;
+   end;
+   with ZeroS do
+   begin exp:=0;mantissa:=0;edge:=hin;cardinality:=finite;
+   end;
+   with PlusSmallS do
+   begin exp:=Minexp;mantissa:=Maxinf div 10; cardinality:=finite;
+   end;
+   with MinusSmallS do
+   begin exp:=Minexp;mantissa:=Mininf div 10; cardinality:=finite;
+   end;
+   
+
+
+   with Zero do
+   begin lo:=ZeroS;lo.edge:=lin; hi:=ZeroS;hi.edge:=hin;
+   end;
+   with All do
+   begin hi:=PlusInfS; lo:=MinusInfS;
+   end;
+   with AllFinite do
+   begin lo:=MinusFiniteS; hi:=PlusFiniteS;
+   end;
+
+   with DF do
+   begin
+        for tDF:= 1 to DMem do PF[tDF]:=PNull;
+   end;
+  
+   with DInit do
+   begin
+	for tD:= 1 to DMem do
+	   if Verifiable then D[tD]:=AllFinite
+	   		 else D[tD]:=All;
+	LastHalve:=1;
+
+	MaxDiff:=2;
+	for J:=1 to Maxexp do MaxDiff:=MaxDiff*10;
+	
+	for tL := 1 to IMem do
+	begin
+	   RHalve[tL]:=MaxDiff;
+	   S[tL]:=0;
+	   with I[tL] do
+	   for tPar := 1 to Par do
+		Pars[tPar]:=0;
+	end;
+
+{!!}	ParN[print]:=0;
+        ParN[pr]:=0;
+        ParN[tr]:=0;
+        ParN[soln]:=0;
+	ParN[halve]:=0;
+	ParN[halves]:=0;
+	ParN[readr]:=0;
+	ParN[linh]:=0;
+	ParN[mult]:=2;
+	ParN[add]:=2;
+	ParN[intgr]:= 0;
+	ParN[less]:= 1;
+	ParN[leq]:= 1;
+	ParN[noteq]:= 1;
+	ParN[sqrr]:= 1;
+	ParN[minr]:=2;
+	ParN[maxr]:=2;
+	ParN[modu]:= 1;
+	ParN[absr]:= 1;
+	ParN[trig]:=2;
+	ParN[expr]:= 1;
+        ParN[lb]:= 1;
+        ParN[ub]:= 1; 
+        ParN[copy]:= 1; 
+	ParN[stop]:=-1;
+{!!}	ParIntersect[print]:= true;
+        ParIntersect[pr]:= true;
+        ParIntersect[tr]:= true;
+        ParIntersect[soln]:= true;
+	ParIntersect[halve]:=true;
+	ParIntersect[halves]:=true;
+	ParIntersect[readr]:=true;
+	ParIntersect[linh]:=true;
+	ParIntersect[mult]:=true;
+	ParIntersect[add]:=true;
+	ParIntersect[intgr]:= true;
+	ParIntersect[less]:= true;
+	ParIntersect[leq]:= true;
+	ParIntersect[noteq]:= true;
+	ParIntersect[sqrr]:= true;
+	ParIntersect[minr]:= true;
+	ParIntersect[maxr]:= true;
+	ParIntersect[modu]:= true;
+	ParIntersect[absr]:= true;
+	ParIntersect[trig]:= true;
+	ParIntersect[expr]:= true;
+        ParIntersect[lb]:= false;
+        ParIntersect[ub]:= false;
+	ParIntersect[stop]:= true;
+	ParIntersect[copy]:= true;
+   end;
+end;{Clear}
+	
+procedure ReadInstr;
+var
+	tP:0..Par;
+	Op:OpType;
+	tDat:Ptr;
+begin
+   with DInit do
+   begin
+	End:=1;
+	MaxDMem:=0;
+	repeat
+	   with I[End] do
+	   begin
+	      read(Op);
+	      Code:=Op;
+	      for tP := 0 to ParN[Op] do with I[End] do 
+	      begin
+	         read(tDat); Pars[tP]:=tDat;
+		 if tDat>MaxDMem then MaxDMem:=tDat;
+		 if MaxDMem > DMem then 
+		 begin writeln('Too many variables');halt;
+		 end;
+	      end;
+	      readln;
+	   end;
+	   End:=End+1; 
+	   if End >= IMem then begin writeln('Too many instructions');halt;end;
+	until Op = stop;
+	End:=End-1;
+
+	while not eof do {read constant values for memory locations}
+	begin
+
+   	   read(tDat);
+	   if tDat > DMem then writeln('Variable out of range',tDat,DMem);
+	   ReadInt(D[tDat]);
+	   readln;
+	end;
+   end;
+end;{ReadInstr}
+
+begin
+	GlobalEnd:=false;
+	InitialOptions;
+	readln(Cut);
+	writeln(Cut);
+	Clear;
+	{ set to initial values, read instructions}
+	ReadInstr;
+	if Debug = dump then begin DumpTables; DumpMem(DInit); end;
+	if Debug >= activity then WriteMem(DInit);
+	Dummy:=0;
+	OuterExec(1,DInit,false,0,Dummy,0);
+	if Debug = dump then DumpMem(DInit);
+end.
diff --git a/src/test/java/org/xerial/snappy/testdata/calgary/trans b/src/test/java/org/xerial/snappy/testdata/calgary/trans
new file mode 100644
index 0000000..146f653
Binary files /dev/null and b/src/test/java/org/xerial/snappy/testdata/calgary/trans differ
diff --git a/stylesheet.css b/stylesheet.css
new file mode 100644
index 0000000..2683c03
--- /dev/null
+++ b/stylesheet.css
@@ -0,0 +1,36 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { background-color: #FFFFFF; color:#000000; font-family: Arial, sans-serif; }
+
+code { font-family: mono-space, Arial, sans-serif; }
+
+/* Headings */
+h1 { font-size: 145% }
+
+a:link { color: #006699; }
+a:hover { color: #6699CC; } 
+a:active { color: #6699CC; }
+a:visited { color: #333366; }
+ 
+/* Table colors */
+.TableHeadingColor     { background: #3399CC; color:#FFFFFF } /* Dark mauve */
+.TableSubHeadingColor  { background: #EEEEFF; color:#000000 } /* Light mauve */
+.TableRowColor         { background: #FFFFFF; color:#000000 } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont   { font-size: 100%; font-family: Arial, sans-serif; color:#000000 }
+.FrameHeadingFont { font-size:  90%; font-family: Arial, sans-serif; color:#000000 }
+.FrameItemFont    { font-size:  90%; font-family: Arial, sans-serif; color:#000000 }
+
+/* Navigation bar fonts and colors */
+.NavBarCell1    { background-color:#EEEEFF; color:#000000} /* Light mauve */
+.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */
+.NavBarFont1    { font-family: Arial, sans-serif; color:#000000;color:#000000;}
+.NavBarFont1Rev { font-family: Arial, sans-serif; color:#FFFFFF;color:#FFFFFF;}
+
+.NavBarCell2    { font-family: Arial, sans-serif; background-color:#FFFFFF; color:#000000}
+.NavBarCell3    { font-family: Arial, sans-serif; background-color:#FFFFFF; color:#000000}
+
diff --git a/wiki/Milestone.wiki b/wiki/Milestone.wiki
new file mode 100644
index 0000000..13d61b0
--- /dev/null
+++ b/wiki/Milestone.wiki
@@ -0,0 +1,55 @@
+#summary Release plans of snappy-java
+
+
+== Features under consideration == 
+  * `SnappyIndexer` for parallel compression/decompression
+  * CUI commands (snap/unsnap)
+
+== snappy-java-1.0.4 (September 22nd, 2011) ==
+  * Upgrade to snappy-1.0.4
+  * Enhanced the Javadoc 
+
+== snappy-java-1.0.3.3 (September 10th, 2011) ==
+  * Add support for Oracle JRockit JVM. (issue 28)
+
+== snappy-java-1.0.3.2 (August 23rd, 2011) ==
+  * Upgrade from the previous release is optional
+  * Add system properites to switch sytem installed native library or bundled library (issue 20, issue 26)
+  * source code tar ball (issue 25)
+  * primitive array read/write support (issue 24)
+
+== snappy-java-1.0.3.1 (August 2nd, 2011) ==
+  * Maintenance release (no significant change)
+  * Refactoring code
+  * Rebuild win32 binary
+
+== snappy-java-1.0.3 (July 11st, 2011) == 
+  * Deprected SnappyException. Instead snappy-java uses IOException to issue errors. This change is necessary to support JNI code injection to a parent class loader.
+
+== snappy-java-1.0.3-rc4 (June 27t	{h, 2011) ==
+  * JNI interface injection so that multiple applications can share the native code. Issue 21
+
+== snappy-java-1.0.3-rc3 (June 21st, 2011) == 
+  * Fixes issue 18, issue 19
+  * Reduces memory footprint (contribution from Arec Wysoker)
+
+== snappy-java-1.0.3-rc2 (June 7th, 2011) == 
+  * Fixes issue 17
+
+== snappy-java-1.0.3-rc1 (June 4th, 2011) == 
+  * Upgrade to snappy-1.0.3 done.
+  * libstdc++ embedding (only for Linux version)  done.
+  * Minor bug fixes 
+
+== snappy-java-1.0.1-rc4 (April 11th, 2011) ==
+  * Primitive array support (e.g. `int[]`, `float[]`, etc.) issue 10
+  * String compression/decompression 
+
+== snappy-java-1.0.1-rc3 (April 4th, 2011) ==
+  * Running tests under win32/mac32, etc.
+
+== snappy-java-1.0.1-rc2 (April 2nd, 2011) ==
+  * Adding `SnappyOutputStream` `SnappyInputStream`  issue 3
+
+
+  * March 29th. Started snappy-java project
\ No newline at end of file
diff --git a/wiki/apidocs/allclasses-frame.html b/wiki/apidocs/allclasses-frame.html
new file mode 100644
index 0000000..7be1f5f
--- /dev/null
+++ b/wiki/apidocs/allclasses-frame.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+All Classes (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy" target="classFrame">OSInfo</A>
+<BR>
+<A HREF="org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy" target="classFrame">Snappy</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy" target="classFrame">SnappyBundleActivator</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy" target="classFrame">SnappyCodec</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy" target="classFrame">SnappyError</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy" target="classFrame">SnappyErrorCode</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy" target="classFrame">SnappyException</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy" target="classFrame">SnappyInputStream</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy" target="classFrame">SnappyLoader</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy" target="classFrame">SnappyNative</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy" target="classFrame"><I>SnappyNativeAPI</I></A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy" target="classFrame">SnappyOutputStream</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/allclasses-noframe.html b/wiki/apidocs/allclasses-noframe.html
new file mode 100644
index 0000000..d2d14b1
--- /dev/null
+++ b/wiki/apidocs/allclasses-noframe.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:32 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+All Classes (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<BR>
+<A HREF="org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy">SnappyBundleActivator</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><I>SnappyNativeAPI</I></A>
+<BR>
+<A HREF="org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/constant-values.html b/wiki/apidocs/constant-values.html
new file mode 100644
index 0000000..48412ce
--- /dev/null
+++ b/wiki/apidocs/constant-values.html
@@ -0,0 +1,233 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Constant Field Values (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Constant Field Values (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+Constant Field Values</H1>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+<B>Contents</B><UL>
+<LI><A HREF="#org.xerial">org.xerial.*</A>
+</UL>
+
+<A NAME="org.xerial"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left"><FONT SIZE="+2">
+org.xerial.*</FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="3">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyCodec.DEFAULT_VERSION"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final int</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyCodec.html#DEFAULT_VERSION">DEFAULT_VERSION</A></CODE></TD>
+<TD ALIGN="right"><CODE>1</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyCodec.MAGIC_LEN"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final int</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyCodec.html#MAGIC_LEN">MAGIC_LEN</A></CODE></TD>
+<TD ALIGN="right"><CODE>8</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyCodec.MINIMUM_COMPATIBLE_VERSION"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final int</CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyCodec.html#MINIMUM_COMPATIBLE_VERSION">MINIMUM_COMPATIBLE_VERSION</A></CODE></TD>
+<TD ALIGN="right"><CODE>1</CODE></TD>
+</TR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<P>
+
+<TABLE BORDER="1" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="3">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyLoader.KEY_SNAPPY_DISABLE_BUNDLED_LIBS"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_DISABLE_BUNDLED_LIBS">KEY_SNAPPY_DISABLE_BUNDLED_LIBS</A></CODE></TD>
+<TD ALIGN="right"><CODE>"org.xerial.snappy.disable.bundled.libs"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyLoader.KEY_SNAPPY_LIB_NAME"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_LIB_NAME">KEY_SNAPPY_LIB_NAME</A></CODE></TD>
+<TD ALIGN="right"><CODE>"org.xerial.snappy.lib.name"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyLoader.KEY_SNAPPY_LIB_PATH"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_LIB_PATH">KEY_SNAPPY_LIB_PATH</A></CODE></TD>
+<TD ALIGN="right"><CODE>"org.xerial.snappy.lib.path"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyLoader.KEY_SNAPPY_TEMPDIR"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_TEMPDIR">KEY_SNAPPY_TEMPDIR</A></CODE></TD>
+<TD ALIGN="right"><CODE>"org.xerial.snappy.tempdir"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyLoader.KEY_SNAPPY_USE_SYSTEMLIB"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_USE_SYSTEMLIB">KEY_SNAPPY_USE_SYSTEMLIB</A></CODE></TD>
+<TD ALIGN="right"><CODE>"org.xerial.snappy.use.systemlib"</CODE></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<A NAME="org.xerial.snappy.SnappyLoader.SNAPPY_SYSTEM_PROPERTIES_FILE"><!-- --></A><TD ALIGN="right"><FONT SIZE="-1">
+<CODE>public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD ALIGN="left"><CODE><A HREF="org/xerial/snappy/SnappyLoader.html#SNAPPY_SYSTEM_PROPERTIES_FILE">SNAPPY_SYSTEM_PROPERTIES_FILE</A></CODE></TD>
+<TD ALIGN="right"><CODE>"org-xerial-snappy.properties"</CODE></TD>
+</TR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+<P>
+
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?constant-values.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="constant-values.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/deprecated-list.html b/wiki/apidocs/deprecated-list.html
new file mode 100644
index 0000000..f915e92
--- /dev/null
+++ b/wiki/apidocs/deprecated-list.html
@@ -0,0 +1,160 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Deprecated List (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Deprecated List (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Deprecated API</B></H2>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+<B>Contents</B><UL>
+<LI><A HREF="#exception">Deprecated Exceptions</A>
+</UL>
+
+<A NAME="exception"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Deprecated Exceptions</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><A HREF="org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">org.xerial.snappy.SnappyException</A>
+<BR>
+          <I>Snappy-java now uses <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io"><CODE>IOException</CODE></A></I> </TD>
+</TR>
+</TABLE>
+ 
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Deprecated</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?deprecated-list.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="deprecated-list.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/help-doc.html b/wiki/apidocs/help-doc.html
new file mode 100644
index 0000000..c18e3b8
--- /dev/null
+++ b/wiki/apidocs/help-doc.html
@@ -0,0 +1,216 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:32 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+API Help (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="API Help (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+How This API Document Is Organized</H1>
+</CENTER>
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.<H3>
+Package</H3>
+<BLOCKQUOTE>
+
+<P>
+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:<UL>
+<LI>Interfaces (italic)<LI>Classes<LI>Enums<LI>Exceptions<LI>Errors<LI>Annotation Types</UL>
+</BLOCKQUOTE>
+<H3>
+Class/Interface</H3>
+<BLOCKQUOTE>
+
+<P>
+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:<UL>
+<LI>Class inheritance diagram<LI>Direct Subclasses<LI>All Known Subinterfaces<LI>All Known Implementing Classes<LI>Class/interface declaration<LI>Class/interface description
+<P>
+<LI>Nested Class Summary<LI>Field Summary<LI>Constructor Summary<LI>Method Summary
+<P>
+<LI>Field Detail<LI>Constructor Detail<LI>Method Detail</UL>
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.</BLOCKQUOTE>
+</BLOCKQUOTE>
+<H3>
+Annotation Type</H3>
+<BLOCKQUOTE>
+
+<P>
+Each annotation type has its own separate page with the following sections:<UL>
+<LI>Annotation Type declaration<LI>Annotation Type description<LI>Required Element Summary<LI>Optional Element Summary<LI>Element Detail</UL>
+</BLOCKQUOTE>
+</BLOCKQUOTE>
+<H3>
+Enum</H3>
+<BLOCKQUOTE>
+
+<P>
+Each enum has its own separate page with the following sections:<UL>
+<LI>Enum declaration<LI>Enum description<LI>Enum Constant Summary<LI>Enum Constant Detail</UL>
+</BLOCKQUOTE>
+<H3>
+Use</H3>
+<BLOCKQUOTE>
+Each documented package, class and interface has its own Use page.  This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A.  You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.</ [...]
+<H3>
+Tree (Class Hierarchy)</H3>
+<BLOCKQUOTE>
+There is a <A HREF="overview-tree.html">Class Hierarchy</A> page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with <code>java.lang.Object</code>. The interfaces do not inherit from <code>java.lang.Object</code>.<UL>
+<LI>When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.<LI>When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.</UL>
+</BLOCKQUOTE>
+<H3>
+Deprecated API</H3>
+<BLOCKQUOTE>
+The <A HREF="deprecated-list.html">Deprecated API</A> page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.</BLOCKQUOTE>
+<H3>
+Index</H3>
+<BLOCKQUOTE>
+The <A HREF="index-all.html">Index</A> contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.</BLOCKQUOTE>
+<H3>
+Prev/Next</H3>
+These links take you to the next or previous class, interface, package, or related page.<H3>
+Frames/No Frames</H3>
+These links show and hide the HTML frames.  All pages are available with or without frames.
+<P>
+<H3>
+Serialized Form</H3>
+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.
+<P>
+<H3>
+Constant Field Values</H3>
+The <a href="constant-values.html">Constant Field Values</a> page lists the static final fields and their values.
+<P>
+<FONT SIZE="-1">
+<EM>
+This help file applies to API documentation generated using the standard doclet.</EM>
+</FONT>
+<BR>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?help-doc.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="help-doc.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/index-all.html b/wiki/apidocs/index-all.html
new file mode 100644
index 0000000..6b0a54e
--- /dev/null
+++ b/wiki/apidocs/index-all.html
@@ -0,0 +1,697 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Index (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="./stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Index (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="./index.html?index-all.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="./allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="./allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<A HREF="#_A_">A</A> <A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_F_">F</A> <A HREF="#_G_">G</A> <A HREF="#_H_">H</A> <A HREF="#_I_">I</A> <A HREF="#_K_">K</A> <A HREF="#_M_">M</A> <A HREF="#_N_">N</A> <A HREF="#_O_">O</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_V_">V</A> <A HREF="#_W_">W</A> <HR>
+<A NAME="_A_"><!-- --></A><H2>
+<B>A</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/Snappy.html#arrayCopy(java.lang.Object, int, int, java.lang.Object, int)"><B>arrayCopy(Object, int, int, Object, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Copy bytes from source to destination
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#arrayCopy(java.lang.Object, int, int, java.lang.Object, int)"><B>arrayCopy(Object, int, int, Object, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#arrayCopy(java.lang.Object, int, int, java.lang.Object, int)"><B>arrayCopy(Object, int, int, Object, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_C_"><!-- --></A><H2>
+<B>C</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#close()"><B>close()</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Close the stream
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#close()"><B>close()</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>close the stream
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#compatibleVersion"><B>compatibleVersion</B></A> - 
+Variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(byte[])"><B>compress(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>High-level API for compressing the input byte array.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(byte[], int, int, byte[], int)"><B>compress(byte[], int, int, byte[], int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input buffer content in [inputOffset,
+ ...inputOffset+inputLength) then output to the specified output buffer.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(java.nio.ByteBuffer, java.nio.ByteBuffer)"><B>compress(ByteBuffer, ByteBuffer)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the content in the given input buffer.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(char[])"><B>compress(char[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input char array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(double[])"><B>compress(double[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input double array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(float[])"><B>compress(float[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input float array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(int[])"><B>compress(int[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input int array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(long[])"><B>compress(long[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input long array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(short[])"><B>compress(short[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input short array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(java.lang.String)"><B>compress(String)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input String
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(java.lang.String, java.lang.String)"><B>compress(String, String)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input string using the given encoding
+<DT><A HREF="./org/xerial/snappy/Snappy.html#compress(java.lang.String, java.nio.charset.Charset)"><B>compress(String, Charset)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input string using the given encoding
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#currentHeader()"><B>currentHeader()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_D_"><!-- --></A><H2>
+<B>D</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#DEFAULT_VERSION"><B>DEFAULT_VERSION</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_E_"><!-- --></A><H2>
+<B>E</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyError.html#errorCode"><B>errorCode</B></A> - 
+Variable in error org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyException.html#errorCode"><B>errorCode</B></A> - 
+Variable in exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+</DL>
+<HR>
+<A NAME="_F_"><!-- --></A><H2>
+<B>F</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#flush()"><B>flush()</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_G_"><!-- --></A><H2>
+<B>G</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/OSInfo.html#getArchName()"><B>getArchName()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyErrorCode.html#getErrorCode(int)"><B>getErrorCode(int)</B></A> - 
+Static method in enum org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyException.html#getErrorCode()"><B>getErrorCode()</B></A> - 
+Method in exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+<DT><A HREF="./org/xerial/snappy/SnappyErrorCode.html#getErrorMessage(int)"><B>getErrorMessage(int)</B></A> - 
+Static method in enum org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyError.html#getMessage()"><B>getMessage()</B></A> - 
+Method in error org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyException.html#getMessage()"><B>getMessage()</B></A> - 
+Method in exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+<DT><A HREF="./org/xerial/snappy/OSInfo.html#getNativeLibFolderPathForCurrentOS()"><B>getNativeLibFolderPathForCurrentOS()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/Snappy.html#getNativeLibraryVersion()"><B>getNativeLibraryVersion()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Get the native library version of the snappy
+<DT><A HREF="./org/xerial/snappy/OSInfo.html#getOSName()"><B>getOSName()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#getVersion()"><B>getVersion()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD>Get the snappy-java version by reading pom.properties embedded in jar.
+</DL>
+<HR>
+<A NAME="_H_"><!-- --></A><H2>
+<B>H</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#headerSize()"><B>headerSize()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_I_"><!-- --></A><H2>
+<B>I</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyErrorCode.html#id"><B>id</B></A> - 
+Variable in enum org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#isNativeLibraryLoaded()"><B>isNativeLibraryLoaded()</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/Snappy.html#isValidCompressedBuffer(byte[], int, int)"><B>isValidCompressedBuffer(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Returns true iff the contents of compressed buffer [offset,
+ offset+length) can be uncompressed successfully.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#isValidCompressedBuffer(byte[])"><B>isValidCompressedBuffer(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Returns true iff the contents of compressed buffer [offset,
+ offset+length) can be uncompressed successfully.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#isValidCompressedBuffer(java.nio.ByteBuffer)"><B>isValidCompressedBuffer(ByteBuffer)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Returns true iff the contents of compressed buffer [pos() ...
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#isValidCompressedBuffer(java.nio.ByteBuffer, int, int)"><B>isValidCompressedBuffer(ByteBuffer, int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#isValidCompressedBuffer(java.lang.Object, int, int)"><B>isValidCompressedBuffer(Object, int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#isValidCompressedBuffer(java.nio.ByteBuffer, int, int)"><B>isValidCompressedBuffer(ByteBuffer, int, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#isValidCompressedBuffer(java.lang.Object, int, int)"><B>isValidCompressedBuffer(Object, int, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#isValidMagicHeader()"><B>isValidMagicHeader()</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_K_"><!-- --></A><H2>
+<B>K</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_DISABLE_BUNDLED_LIBS"><B>KEY_SNAPPY_DISABLE_BUNDLED_LIBS</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_LIB_NAME"><B>KEY_SNAPPY_LIB_NAME</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_LIB_PATH"><B>KEY_SNAPPY_LIB_PATH</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_TEMPDIR"><B>KEY_SNAPPY_TEMPDIR</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_USE_SYSTEMLIB"><B>KEY_SNAPPY_USE_SYSTEMLIB</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_M_"><!-- --></A><H2>
+<B>M</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#magic"><B>magic</B></A> - 
+Variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#MAGIC_HEADER"><B>MAGIC_HEADER</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#MAGIC_LEN"><B>MAGIC_LEN</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/OSInfo.html#main(java.lang.String[])"><B>main(String[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/Snappy.html#maxCompressedLength(int)"><B>maxCompressedLength(int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Get the maximum byte size needed for compressing data of the given byte
+ size.
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#maxCompressedLength(int)"><B>maxCompressedLength(int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#maxCompressedLength(int)"><B>maxCompressedLength(int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#MINIMUM_COMPATIBLE_VERSION"><B>MINIMUM_COMPATIBLE_VERSION</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_N_"><!-- --></A><H2>
+<B>N</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#nativeLibraryVersion()"><B>nativeLibraryVersion()</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#nativeLibraryVersion()"><B>nativeLibraryVersion()</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_O_"><!-- --></A><H2>
+<B>O</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/package-summary.html"><B>org.xerial.snappy</B></A> - package org.xerial.snappy<DD>Snappy API for compressing/decompressing data.<DT><A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy"><B>OSInfo</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD>Provides OS name and architecture name.<DT><A HREF="./org/xerial/snappy/OSInfo.html#OSInfo()"><B>OSInfo()</B></A> - 
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_R_"><!-- --></A><H2>
+<B>R</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/Snappy.html#rawCompress(java.lang.Object, int)"><B>rawCompress(Object, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input data and produce a byte array of the uncompressed data
+<DT><A HREF="./org/xerial/snappy/Snappy.html#rawCompress(java.lang.Object, int, int, byte[], int)"><B>rawCompress(Object, int, int, byte[], int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Compress the input buffer [offset,...
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#rawCompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><B>rawCompress(ByteBuffer, int, int, ByteBuffer, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#rawCompress(java.lang.Object, int, int, java.lang.Object, int)"><B>rawCompress(Object, int, int, Object, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#rawCompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><B>rawCompress(ByteBuffer, int, int, ByteBuffer, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#rawCompress(java.lang.Object, int, int, java.lang.Object, int)"><B>rawCompress(Object, int, int, Object, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#rawRead(java.lang.Object, int, int)"><B>rawRead(Object, int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read uncompressed data into the specified array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#rawUncompress(byte[], int, int, java.lang.Object, int)"><B>rawUncompress(byte[], int, int, Object, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the content in the input buffer.
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#rawUncompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><B>rawUncompress(ByteBuffer, int, int, ByteBuffer, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#rawUncompress(java.lang.Object, int, int, java.lang.Object, int)"><B>rawUncompress(Object, int, int, Object, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#rawUncompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><B>rawUncompress(ByteBuffer, int, int, ByteBuffer, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#rawUncompress(java.lang.Object, int, int, java.lang.Object, int)"><B>rawUncompress(Object, int, int, Object, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#rawWrite(java.lang.Object, int, int)"><B>rawWrite(Object, int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the raw byte array data.
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(byte[], int, int)"><B>read(byte[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Reads up to len bytes of data from the input stream into an array of
+ bytes.
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(long[], int, int)"><B>read(long[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read long array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(long[])"><B>read(long[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read long array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(double[], int, int)"><B>read(double[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read double array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(double[])"><B>read(double[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read double array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(int[])"><B>read(int[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read int array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(int[], int, int)"><B>read(int[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read int array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(float[], int, int)"><B>read(float[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read float array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(float[])"><B>read(float[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read float array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(short[], int, int)"><B>read(short[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read short array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read(short[])"><B>read(short[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Read short array from the stream
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#read()"><B>read()</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Reads the next byte of uncompressed data from the input stream.
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#readHeader(java.io.InputStream)"><B>readHeader(InputStream)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_S_"><!-- --></A><H2>
+<B>S</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><B>Snappy</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD>Snappy API for data compression/decompression<DT><A HREF="./org/xerial/snappy/Snappy.html#Snappy()"><B>Snappy()</B></A> - 
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#SNAPPY_SYSTEM_PROPERTIES_FILE"><B>SNAPPY_SYSTEM_PROPERTIES_FILE</B></A> - 
+Static variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><B>SnappyBundleActivator</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD>OSGi bundle entry point<DT><A HREF="./org/xerial/snappy/SnappyBundleActivator.html#SnappyBundleActivator()"><B>SnappyBundleActivator()</B></A> - 
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy">SnappyBundleActivator</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><B>SnappyCodec</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD>Preamble header for <A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.<DT><A HREF="./org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><B>SnappyError</B></A> - Error in <A HREF="./org/xerial/snappy/pa [...]
+Constructor for error org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.Error)"><B>SnappyError(SnappyErrorCode, Error)</B></A> - 
+Constructor for error org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.String)"><B>SnappyError(SnappyErrorCode, String)</B></A> - 
+Constructor for error org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><B>SnappyErrorCode</B></A> - Enum in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD>Error codes of snappy-java<DT><A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><B>SnappyException</B></A> - Exception in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD><B>Deprecated.</B> <I>Snappy-java now uses <A HREF= [...]
+Constructor for exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+<DT><A HREF="./org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode)"><B>SnappyException(SnappyErrorCode)</B></A> - 
+Constructor for exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+<DT><A HREF="./org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.Exception)"><B>SnappyException(SnappyErrorCode, Exception)</B></A> - 
+Constructor for exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+<DT><A HREF="./org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.String)"><B>SnappyException(SnappyErrorCode, String)</B></A> - 
+Constructor for exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><B>SnappyInputStream</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD>A stream filter for reading data compressed by <A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.<DT><A HREF="./org/xerial/snappy/SnappyInputStream.html#SnappyInputStream(java.io.InputStream)"><B>SnappyInputSt [...]
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A>
+<DD>Create a filter for reading compressed data as a uncompressed stream
+<DT><A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><B>SnappyLoader</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD><b>Internal only - Do not use this class.</b> This class loads a native
+ library of snappy-java (snappyjava.dll, libsnappy.so, etc.) according to the
+ user platform (<i>os.name</i> and <i>os.arch</i>).<DT><A HREF="./org/xerial/snappy/SnappyLoader.html#SnappyLoader()"><B>SnappyLoader()</B></A> - 
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><B>SnappyNative</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD><b>Internal only - Do not use this class.</b> JNI interface of the
+ <A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><CODE>SnappyNativeAPI</CODE></A> implementation.<DT><A HREF="./org/xerial/snappy/SnappyNative.html#SnappyNative()"><B>SnappyNative()</B></A> - 
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><B>SnappyNativeAPI</B></A> - Interface in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD><b>Internal only - Do not use this class.</b>
+ 
+ Interface to access the native code of Snappy.<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><B>SnappyOutputStream</B></A> - Class in <A HREF="./org/xerial/snappy/package-summary.html">org.xerial.snappy</A><DD>This class implements a stream filter for writing compressed data using
+ Snappy.<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#SnappyOutputStream(java.io.OutputStream)"><B>SnappyOutputStream(OutputStream)</B></A> - 
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#SnappyOutputStream(java.io.OutputStream, int)"><B>SnappyOutputStream(OutputStream, int)</B></A> - 
+Constructor for class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyBundleActivator.html#start(org.osgi.framework.BundleContext)"><B>start(BundleContext)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy">SnappyBundleActivator</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyBundleActivator.html#stop(org.osgi.framework.BundleContext)"><B>stop(BundleContext)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy">SnappyBundleActivator</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_T_"><!-- --></A><H2>
+<B>T</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#throw_error(int)"><B>throw_error(int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#throw_error(int)"><B>throw_error(int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyException.html#throwException(int)"><B>throwException(int)</B></A> - 
+Static method in exception org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A>
+<DD><B>Deprecated.</B>  
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#toString()"><B>toString()</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/OSInfo.html#translateArchNameToFolderName(java.lang.String)"><B>translateArchNameToFolderName(String)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/OSInfo.html#translateOSNameToFolderName(java.lang.String)"><B>translateOSNameToFolderName(String)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_U_"><!-- --></A><H2>
+<B>U</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompress(byte[])"><B>uncompress(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>High-level API for uncompressing the input byte array.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompress(byte[], int, int, byte[], int)"><B>uncompress(byte[], int, int, byte[], int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the content in the input buffer.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompress(java.nio.ByteBuffer, java.nio.ByteBuffer)"><B>uncompress(ByteBuffer, ByteBuffer)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the content in the input buffer.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressCharArray(byte[])"><B>uncompressCharArray(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input data as char array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressCharArray(byte[], int, int)"><B>uncompressCharArray(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, .., offset+length) as a char array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressDoubleArray(byte[])"><B>uncompressDoubleArray(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input as a double array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressedLength(byte[])"><B>uncompressedLength(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Get the uncompressed byte size of the given compressed input.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressedLength(byte[], int, int)"><B>uncompressedLength(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Get the uncompressed byte size of the given compressed input.
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressedLength(java.nio.ByteBuffer)"><B>uncompressedLength(ByteBuffer)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Get the uncompressed byte size of the given compressed input.
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#uncompressedLength(java.nio.ByteBuffer, int, int)"><B>uncompressedLength(ByteBuffer, int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNative.html#uncompressedLength(java.lang.Object, int, int)"><B>uncompressedLength(Object, int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#uncompressedLength(java.nio.ByteBuffer, int, int)"><B>uncompressedLength(ByteBuffer, int, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/SnappyNativeAPI.html#uncompressedLength(java.lang.Object, int, int)"><B>uncompressedLength(Object, int, int)</B></A> - 
+Method in interface org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A>
+<DD> 
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressFloatArray(byte[])"><B>uncompressFloatArray(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input as a float array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressFloatArray(byte[], int, int)"><B>uncompressFloatArray(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, offset+length) as a float array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressIntArray(byte[])"><B>uncompressIntArray(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input data as an int array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressIntArray(byte[], int, int)"><B>uncompressIntArray(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, offset+length) as an int array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressLongArray(byte[])"><B>uncompressLongArray(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input data as a long array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressLongArray(byte[], int, int)"><B>uncompressLongArray(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, offset+length) as a long array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressShortArray(byte[])"><B>uncompressShortArray(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input as a short array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressShortArray(byte[], int, int)"><B>uncompressShortArray(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, offset+length) as a short array
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressString(byte[])"><B>uncompressString(byte[])</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input as a String
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressString(byte[], int, int)"><B>uncompressString(byte[], int, int)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, offset+length) as a String
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressString(byte[], int, int, java.lang.String)"><B>uncompressString(byte[], int, int, String)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, offset+length) as a String of the given
+ encoding
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressString(byte[], int, int, java.nio.charset.Charset)"><B>uncompressString(byte[], int, int, Charset)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input[offset, offset+length) as a String of the given
+ encoding
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressString(byte[], java.lang.String)"><B>uncompressString(byte[], String)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input as a String of the given encoding
+<DT><A HREF="./org/xerial/snappy/Snappy.html#uncompressString(byte[], java.nio.charset.Charset)"><B>uncompressString(byte[], Charset)</B></A> - 
+Static method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A>
+<DD>Uncompress the input as a String of the given encoding
+</DL>
+<HR>
+<A NAME="_V_"><!-- --></A><H2>
+<B>V</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyErrorCode.html#valueOf(java.lang.String)"><B>valueOf(String)</B></A> - 
+Static method in enum org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>
+<DD>Returns the enum constant of this type with the specified name.
+<DT><A HREF="./org/xerial/snappy/SnappyErrorCode.html#values()"><B>values()</B></A> - 
+Static method in enum org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>
+<DD>Returns an array containing the constants of this enum type, in
+the order they are declared.
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#version"><B>version</B></A> - 
+Variable in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A NAME="_W_"><!-- --></A><H2>
+<B>W</B></H2>
+<DL>
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(byte[], int, int)"><B>write(byte[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Writes len bytes from the specified byte array starting at offset off to
+ this output stream.
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(long[], int, int)"><B>write(long[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input long array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(double[], int, int)"><B>write(double[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input double array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(float[], int, int)"><B>write(float[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input float array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(int[], int, int)"><B>write(int[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input int array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(short[], int, int)"><B>write(short[], int, int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input short array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(long[])"><B>write(long[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(double[])"><B>write(double[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(float[])"><B>write(float[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(int[])"><B>write(int[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(short[])"><B>write(short[])</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Compress the input array data
+<DT><A HREF="./org/xerial/snappy/SnappyOutputStream.html#write(int)"><B>write(int)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A>
+<DD>Writes the specified byte to this output stream.
+<DT><A HREF="./org/xerial/snappy/SnappyCodec.html#writeHeader(java.io.OutputStream)"><B>writeHeader(OutputStream)</B></A> - 
+Method in class org.xerial.snappy.<A HREF="./org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A>
+<DD> 
+</DL>
+<HR>
+<A HREF="#_A_">A</A> <A HREF="#_C_">C</A> <A HREF="#_D_">D</A> <A HREF="#_E_">E</A> <A HREF="#_F_">F</A> <A HREF="#_G_">G</A> <A HREF="#_H_">H</A> <A HREF="#_I_">I</A> <A HREF="#_K_">K</A> <A HREF="#_M_">M</A> <A HREF="#_N_">N</A> <A HREF="#_O_">O</A> <A HREF="#_R_">R</A> <A HREF="#_S_">S</A> <A HREF="#_T_">T</A> <A HREF="#_U_">U</A> <A HREF="#_V_">V</A> <A HREF="#_W_">W</A> 
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Index</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="./help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="./index.html?index-all.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="index-all.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="./allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="./allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/index.html b/wiki/apidocs/index.html
new file mode 100644
index 0000000..4a754c3
--- /dev/null
+++ b/wiki/apidocs/index.html
@@ -0,0 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Mon Sep 26 23:28:32 JST 2011-->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Snappy for Java 1.0.4.1-SNAPSHOT API
+</TITLE>
+<SCRIPT type="text/javascript">
+    targetPage = "" + window.location.search;
+    if (targetPage != "" && targetPage != "undefined")
+        targetPage = targetPage.substring(1);
+    if (targetPage.indexOf(":") != -1)
+        targetPage = "undefined";
+    function loadFrames() {
+        if (targetPage != "" && targetPage != "undefined")
+             top.classFrame.location = top.targetPage;
+    }
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+</HEAD>
+<FRAMESET cols="20%,80%" title="" onLoad="top.loadFrames()">
+<FRAME src="allclasses-frame.html" name="packageFrame" title="All classes and interfaces (except non-static nested types)">
+<FRAME src="org/xerial/snappy/package-summary.html" name="classFrame" title="Package, class and interface descriptions" scrolling="yes">
+<NOFRAMES>
+<H2>
+Frame Alert</H2>
+
+<P>
+This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+<BR>
+Link to<A HREF="org/xerial/snappy/package-summary.html">Non-frame version.</A>
+</NOFRAMES>
+</FRAMESET>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/OSInfo.html b/wiki/apidocs/org/xerial/snappy/OSInfo.html
new file mode 100644
index 0000000..537ebe8
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/OSInfo.html
@@ -0,0 +1,354 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:30 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+OSInfo (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="OSInfo (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/OSInfo.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS 
+ <A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/OSInfo.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="OSInfo.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class OSInfo</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.OSInfo</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public class <B>OSInfo</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></DL>
+</PRE>
+
+<P>
+Provides OS name and architecture name.
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/OSInfo.html#OSInfo()">OSInfo</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/OSInfo.html#getArchName()">getArchName</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/OSInfo.html#getNativeLibFolderPathForCurrentOS()">getNativeLibFolderPathForCurrentOS</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/OSInfo.html#getOSName()">getOSName</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/OSInfo.html#main(java.lang.String[])">main</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] args)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/OSInfo.html#translateArchNameToFolderName(java.lang.String)">translateArchNameToFolderName</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> archName)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/OSInfo.html#translateOSNameToFolderName(java.lang.String)">translateOSNameToFolderName</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> osName)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="OSInfo()"><!-- --></A><H3>
+OSInfo</H3>
+<PRE>
+public <B>OSInfo</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="main(java.lang.String[])"><!-- --></A><H3>
+main</H3>
+<PRE>
+public static void <B>main</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A>[] args)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getNativeLibFolderPathForCurrentOS()"><!-- --></A><H3>
+getNativeLibFolderPathForCurrentOS</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getNativeLibFolderPathForCurrentOS</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getOSName()"><!-- --></A><H3>
+getOSName</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getOSName</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getArchName()"><!-- --></A><H3>
+getArchName</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getArchName</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="translateOSNameToFolderName(java.lang.String)"><!-- --></A><H3>
+translateOSNameToFolderName</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>translateOSNameToFolderName</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> osName)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="translateArchNameToFolderName(java.lang.String)"><!-- --></A><H3>
+translateArchNameToFolderName</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>translateArchNameToFolderName</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> archName)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/OSInfo.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV CLASS 
+ <A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/OSInfo.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="OSInfo.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/Snappy.html b/wiki/apidocs/org/xerial/snappy/Snappy.html
new file mode 100644
index 0000000..4d150db
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/Snappy.html
@@ -0,0 +1,1472 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:30 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/Snappy.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/Snappy.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="Snappy.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class Snappy</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.Snappy</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public class <B>Snappy</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></DL>
+</PRE>
+
+<P>
+Snappy API for data compression/decompression
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#Snappy()">Snappy</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#arrayCopy(java.lang.Object, int, int, java.lang.Object, int)">arrayCopy</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> src,
+          int offset,
+          int byteLength,
+          <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> dest,
+          int dest_offset)</CODE>
+
+<BR>
+          Copy bytes from source to destination</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(byte[])">compress</A></B>(byte[] input)</CODE>
+
+<BR>
+          High-level API for compressing the input byte array.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(byte[], int, int, byte[], int)">compress</A></B>(byte[] input,
+         int inputOffset,
+         int inputLength,
+         byte[] output,
+         int outputOffset)</CODE>
+
+<BR>
+          Compress the input buffer content in [inputOffset,
+ ...inputOffset+inputLength) then output to the specified output buffer.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(java.nio.ByteBuffer, java.nio.ByteBuffer)">compress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed,
+         <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed)</CODE>
+
+<BR>
+          Compress the content in the given input buffer.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(char[])">compress</A></B>(char[] input)</CODE>
+
+<BR>
+          Compress the input char array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(double[])">compress</A></B>(double[] input)</CODE>
+
+<BR>
+          Compress the input double array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(float[])">compress</A></B>(float[] input)</CODE>
+
+<BR>
+          Compress the input float array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(int[])">compress</A></B>(int[] input)</CODE>
+
+<BR>
+          Compress the input int array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(long[])">compress</A></B>(long[] input)</CODE>
+
+<BR>
+          Compress the input long array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(short[])">compress</A></B>(short[] input)</CODE>
+
+<BR>
+          Compress the input short array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(java.lang.String)">compress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> s)</CODE>
+
+<BR>
+          Compress the input String</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(java.lang.String, java.nio.charset.Charset)">compress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> s,
+         <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A> encoding)</CODE>
+
+<BR>
+          Compress the input string using the given encoding</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#compress(java.lang.String, java.lang.String)">compress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> s,
+         <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoding)</CODE>
+
+<BR>
+          Compress the input string using the given encoding</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#getNativeLibraryVersion()">getNativeLibraryVersion</A></B>()</CODE>
+
+<BR>
+          Get the native library version of the snappy</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#isValidCompressedBuffer(byte[])">isValidCompressedBuffer</A></B>(byte[] input)</CODE>
+
+<BR>
+          Returns true iff the contents of compressed buffer [offset,
+ offset+length) can be uncompressed successfully.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#isValidCompressedBuffer(byte[], int, int)">isValidCompressedBuffer</A></B>(byte[] input,
+                        int offset,
+                        int length)</CODE>
+
+<BR>
+          Returns true iff the contents of compressed buffer [offset,
+ offset+length) can be uncompressed successfully.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#isValidCompressedBuffer(java.nio.ByteBuffer)">isValidCompressedBuffer</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed)</CODE>
+
+<BR>
+          Returns true iff the contents of compressed buffer [pos() ...</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#maxCompressedLength(int)">maxCompressedLength</A></B>(int byteSize)</CODE>
+
+<BR>
+          Get the maximum byte size needed for compressing data of the given byte
+ size.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#rawCompress(java.lang.Object, int)">rawCompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> data,
+            int byteSize)</CODE>
+
+<BR>
+          Compress the input data and produce a byte array of the uncompressed data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#rawCompress(java.lang.Object, int, int, byte[], int)">rawCompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+            int inputOffset,
+            int inputLength,
+            byte[] output,
+            int outputOffset)</CODE>
+
+<BR>
+          Compress the input buffer [offset,...</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#rawUncompress(byte[], int, int, java.lang.Object, int)">rawUncompress</A></B>(byte[] input,
+              int inputOffset,
+              int inputLength,
+              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+              int outputOffset)</CODE>
+
+<BR>
+          Uncompress the content in the input buffer.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompress(byte[])">uncompress</A></B>(byte[] input)</CODE>
+
+<BR>
+          High-level API for uncompressing the input byte array.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompress(byte[], int, int, byte[], int)">uncompress</A></B>(byte[] input,
+           int inputOffset,
+           int inputLength,
+           byte[] output,
+           int outputOffset)</CODE>
+
+<BR>
+          Uncompress the content in the input buffer.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompress(java.nio.ByteBuffer, java.nio.ByteBuffer)">uncompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+           <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed)</CODE>
+
+<BR>
+          Uncompress the content in the input buffer.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static char[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressCharArray(byte[])">uncompressCharArray</A></B>(byte[] input)</CODE>
+
+<BR>
+          Uncompress the input data as char array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static char[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressCharArray(byte[], int, int)">uncompressCharArray</A></B>(byte[] input,
+                    int offset,
+                    int length)</CODE>
+
+<BR>
+          Uncompress the input[offset, .., offset+length) as a char array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static double[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressDoubleArray(byte[])">uncompressDoubleArray</A></B>(byte[] input)</CODE>
+
+<BR>
+          Uncompress the input as a double array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressedLength(byte[])">uncompressedLength</A></B>(byte[] input)</CODE>
+
+<BR>
+          Get the uncompressed byte size of the given compressed input.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressedLength(byte[], int, int)">uncompressedLength</A></B>(byte[] input,
+                   int offset,
+                   int length)</CODE>
+
+<BR>
+          Get the uncompressed byte size of the given compressed input.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressedLength(java.nio.ByteBuffer)">uncompressedLength</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed)</CODE>
+
+<BR>
+          Get the uncompressed byte size of the given compressed input.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static float[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressFloatArray(byte[])">uncompressFloatArray</A></B>(byte[] input)</CODE>
+
+<BR>
+          Uncompress the input as a float array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static float[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressFloatArray(byte[], int, int)">uncompressFloatArray</A></B>(byte[] input,
+                     int offset,
+                     int length)</CODE>
+
+<BR>
+          Uncompress the input[offset, offset+length) as a float array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressIntArray(byte[])">uncompressIntArray</A></B>(byte[] input)</CODE>
+
+<BR>
+          Uncompress the input data as an int array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressIntArray(byte[], int, int)">uncompressIntArray</A></B>(byte[] input,
+                   int offset,
+                   int length)</CODE>
+
+<BR>
+          Uncompress the input[offset, offset+length) as an int array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static long[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressLongArray(byte[])">uncompressLongArray</A></B>(byte[] input)</CODE>
+
+<BR>
+          Uncompress the input data as a long array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static long[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressLongArray(byte[], int, int)">uncompressLongArray</A></B>(byte[] input,
+                    int offset,
+                    int length)</CODE>
+
+<BR>
+          Uncompress the input[offset, offset+length) as a long array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static short[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressShortArray(byte[])">uncompressShortArray</A></B>(byte[] input)</CODE>
+
+<BR>
+          Uncompress the input as a short array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static short[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressShortArray(byte[], int, int)">uncompressShortArray</A></B>(byte[] input,
+                     int offset,
+                     int length)</CODE>
+
+<BR>
+          Uncompress the input[offset, offset+length) as a short array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressString(byte[])">uncompressString</A></B>(byte[] input)</CODE>
+
+<BR>
+          Uncompress the input as a String</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressString(byte[], java.nio.charset.Charset)">uncompressString</A></B>(byte[] input,
+                 <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A> encoding)</CODE>
+
+<BR>
+          Uncompress the input as a String of the given encoding</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressString(byte[], int, int)">uncompressString</A></B>(byte[] input,
+                 int offset,
+                 int length)</CODE>
+
+<BR>
+          Uncompress the input[offset, offset+length) as a String</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressString(byte[], int, int, java.nio.charset.Charset)">uncompressString</A></B>(byte[] input,
+                 int offset,
+                 int length,
+                 <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A> encoding)</CODE>
+
+<BR>
+          Uncompress the input[offset, offset+length) as a String of the given
+ encoding</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressString(byte[], int, int, java.lang.String)">uncompressString</A></B>(byte[] input,
+                 int offset,
+                 int length,
+                 <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoding)</CODE>
+
+<BR>
+          Uncompress the input[offset, offset+length) as a String of the given
+ encoding</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/Snappy.html#uncompressString(byte[], java.lang.String)">uncompressString</A></B>(byte[] input,
+                 <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoding)</CODE>
+
+<BR>
+          Uncompress the input as a String of the given encoding</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="Snappy()"><!-- --></A><H3>
+Snappy</H3>
+<PRE>
+public <B>Snappy</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="arrayCopy(java.lang.Object, int, int, java.lang.Object, int)"><!-- --></A><H3>
+arrayCopy</H3>
+<PRE>
+public static void <B>arrayCopy</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> src,
+                             int offset,
+                             int byteLength,
+                             <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> dest,
+                             int dest_offset)
+                      throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Copy bytes from source to destination
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>src</CODE> - pointer to the source array<DD><CODE>offset</CODE> - byte offset in the source array<DD><CODE>byteLength</CODE> - the number of bytes to copy<DD><CODE>dest</CODE> - pointer to the destination array<DD><CODE>dest_offset</CODE> - byte offset in the destination array
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(byte[])"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(byte[] input)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>High-level API for compressing the input byte array. This method performs
+ array copy to generate the result. If you want to reduce the memory copy
+ cost, use <A HREF="../../../org/xerial/snappy/Snappy.html#compress(byte[], int, int, byte[], int)"><CODE>compress(byte[], int, int, byte[], int)</CODE></A> or
+ <A HREF="../../../org/xerial/snappy/Snappy.html#compress(java.nio.ByteBuffer, java.nio.ByteBuffer)"><CODE>compress(ByteBuffer, ByteBuffer)</CODE></A>.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - the input data
+<DT><B>Returns:</B><DD>the compressed byte array
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(byte[], int, int, byte[], int)"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static int <B>compress</B>(byte[] input,
+                           int inputOffset,
+                           int inputLength,
+                           byte[] output,
+                           int outputOffset)
+                    throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input buffer content in [inputOffset,
+ ...inputOffset+inputLength) then output to the specified output buffer.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>inputOffset</CODE> - <DD><CODE>inputLength</CODE> - <DD><CODE>output</CODE> - <DD><CODE>outputOffset</CODE> - 
+<DT><B>Returns:</B><DD>byte size of the compressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE> - when failed to access the input/output buffer</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(java.nio.ByteBuffer, java.nio.ByteBuffer)"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static int <B>compress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed,
+                           <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed)
+                    throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the content in the given input buffer. After the compression,
+ you can retrieve the compressed data from the output buffer [pos() ...
+ limit()) (compressed data size = limit() - pos() = remaining())
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>uncompressed</CODE> - buffer[pos() ... limit()) containing the input data<DD><CODE>compressed</CODE> - output of the compressed data. Uses range [pos()..].
+<DT><B>Returns:</B><DD>byte size of the compressed data.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A></CODE> - when the input is not a direct buffer
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(char[])"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(char[] input)</PRE>
+<DL>
+<DD>Compress the input char array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(double[])"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(double[] input)</PRE>
+<DL>
+<DD>Compress the input double array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(float[])"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(float[] input)</PRE>
+<DL>
+<DD>Compress the input float array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(int[])"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(int[] input)</PRE>
+<DL>
+<DD>Compress the input int array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(long[])"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(long[] input)</PRE>
+<DL>
+<DD>Compress the input long array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(short[])"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(short[] input)</PRE>
+<DL>
+<DD>Compress the input short array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(java.lang.String)"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> s)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input String
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>s</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(java.lang.String, java.lang.String)"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> s,
+                              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoding)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A>,
+                              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input string using the given encoding
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>s</CODE> - <DD><CODE>encoding</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></CODE>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="compress(java.lang.String, java.nio.charset.Charset)"><!-- --></A><H3>
+compress</H3>
+<PRE>
+public static byte[] <B>compress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> s,
+                              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A> encoding)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input string using the given encoding
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>s</CODE> - <DD><CODE>encoding</CODE> - 
+<DT><B>Returns:</B><DD>the compressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></CODE>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getNativeLibraryVersion()"><!-- --></A><H3>
+getNativeLibraryVersion</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getNativeLibraryVersion</B>()</PRE>
+<DL>
+<DD>Get the native library version of the snappy
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>native library version</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidCompressedBuffer(byte[], int, int)"><!-- --></A><H3>
+isValidCompressedBuffer</H3>
+<PRE>
+public static boolean <B>isValidCompressedBuffer</B>(byte[] input,
+                                              int offset,
+                                              int length)
+                                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Returns true iff the contents of compressed buffer [offset,
+ offset+length) can be uncompressed successfully. Does not return the
+ uncompressed data. Takes time proportional to the input length, but is
+ usually at least a factor of four faster than actual decompression.
+<P>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidCompressedBuffer(byte[])"><!-- --></A><H3>
+isValidCompressedBuffer</H3>
+<PRE>
+public static boolean <B>isValidCompressedBuffer</B>(byte[] input)
+                                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Returns true iff the contents of compressed buffer [offset,
+ offset+length) can be uncompressed successfully. Does not return the
+ uncompressed data. Takes time proportional to the input length, but is
+ usually at least a factor of four faster than actual decompression.
+<P>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidCompressedBuffer(java.nio.ByteBuffer)"><!-- --></A><H3>
+isValidCompressedBuffer</H3>
+<PRE>
+public static boolean <B>isValidCompressedBuffer</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed)
+                                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Returns true iff the contents of compressed buffer [pos() ... limit())
+ can be uncompressed successfully. Does not return the uncompressed data.
+ Takes time proportional to the input length, but is usually at least a
+ factor of four faster than actual decompression.
+<P>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="maxCompressedLength(int)"><!-- --></A><H3>
+maxCompressedLength</H3>
+<PRE>
+public static int <B>maxCompressedLength</B>(int byteSize)</PRE>
+<DL>
+<DD>Get the maximum byte size needed for compressing data of the given byte
+ size.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>byteSize</CODE> - byte size of the data to compress
+<DT><B>Returns:</B><DD>maximum byte size of the compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawCompress(java.lang.Object, int)"><!-- --></A><H3>
+rawCompress</H3>
+<PRE>
+public static byte[] <B>rawCompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> data,
+                                 int byteSize)</PRE>
+<DL>
+<DD>Compress the input data and produce a byte array of the uncompressed data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>data</CODE> - input array. The input MUST be an array type<DD><CODE>byteSize</CODE> - the input byte size
+<DT><B>Returns:</B><DD>compressed data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawCompress(java.lang.Object, int, int, byte[], int)"><!-- --></A><H3>
+rawCompress</H3>
+<PRE>
+public static int <B>rawCompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                              int inputOffset,
+                              int inputLength,
+                              byte[] output,
+                              int outputOffset)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input buffer [offset,... ,offset+length) contents, then
+ write the compressed data to the output buffer[offset, ...)
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - input array. This MUST be a primitive array type<DD><CODE>inputOffset</CODE> - byte offset at the output array<DD><CODE>inputLength</CODE> - byte length of the input data<DD><CODE>output</CODE> - output array. This MUST be a primitive array type<DD><CODE>outputOffset</CODE> - byte offset at the output array
+<DT><B>Returns:</B><DD>byte size of the compressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawUncompress(byte[], int, int, java.lang.Object, int)"><!-- --></A><H3>
+rawUncompress</H3>
+<PRE>
+public static int <B>rawUncompress</B>(byte[] input,
+                                int inputOffset,
+                                int inputLength,
+                                <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+                                int outputOffset)
+                         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the content in the input buffer. The uncompressed data is
+ written to the output buffer.
+ 
+ Note that if you pass the wrong data or the range [inputOffset,
+ inputOffset + inputLength) that cannot be uncompressed, your JVM might
+ crash due to the access violation exception issued in the native code
+ written in C++. To avoid this type of crash, use
+ <A HREF="../../../org/xerial/snappy/Snappy.html#isValidCompressedBuffer(byte[], int, int)"><CODE>isValidCompressedBuffer(byte[], int, int)</CODE></A> first.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - input byte array<DD><CODE>inputOffset</CODE> - byte offset in the input byte array<DD><CODE>inputLength</CODE> - byte length of the input data<DD><CODE>output</CODE> - output buffer, MUST be a primitive type array<DD><CODE>outputOffset</CODE> - byte offset in the output buffer
+<DT><B>Returns:</B><DD>the byte size of the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE> - when failed to uncompress the input data</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompress(byte[])"><!-- --></A><H3>
+uncompress</H3>
+<PRE>
+public static byte[] <B>uncompress</B>(byte[] input)
+                         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>High-level API for uncompressing the input byte array.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed byte array
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompress(byte[], int, int, byte[], int)"><!-- --></A><H3>
+uncompress</H3>
+<PRE>
+public static int <B>uncompress</B>(byte[] input,
+                             int inputOffset,
+                             int inputLength,
+                             byte[] output,
+                             int outputOffset)
+                      throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the content in the input buffer. The uncompressed data is
+ written to the output buffer.
+ 
+ Note that if you pass the wrong data or the range [inputOffset,
+ inputOffset + inputLength) that cannot be uncompressed, your JVM might
+ crash due to the access violation exception issued in the native code
+ written in C++. To avoid this type of crash, use
+ <A HREF="../../../org/xerial/snappy/Snappy.html#isValidCompressedBuffer(byte[], int, int)"><CODE>isValidCompressedBuffer(byte[], int, int)</CODE></A> first.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>inputOffset</CODE> - <DD><CODE>inputLength</CODE> - <DD><CODE>output</CODE> - <DD><CODE>outputOffset</CODE> - 
+<DT><B>Returns:</B><DD>the byte size of the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompress(java.nio.ByteBuffer, java.nio.ByteBuffer)"><!-- --></A><H3>
+uncompress</H3>
+<PRE>
+public static int <B>uncompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                             <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed)
+                      throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the content in the input buffer. The result is dumped to the
+ specified output buffer.
+ 
+ Note that if you pass the wrong data or the range [pos(), limit()) that
+ cannot be uncompressed, your JVM might crash due to the access violation
+ exception issued in the native code written in C++. To avoid this type of
+ crash, use <A HREF="../../../org/xerial/snappy/Snappy.html#isValidCompressedBuffer(java.nio.ByteBuffer)"><CODE>isValidCompressedBuffer(ByteBuffer)</CODE></A> first.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>compressed</CODE> - buffer[pos() ... limit()) containing the input data<DD><CODE>uncompressed</CODE> - output of the the uncompressed data. It uses buffer[pos()..]
+<DT><B>Returns:</B><DD>uncompressed data size
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE> - when failed to uncompress the given input
+<DD><CODE><A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A></CODE> - when the input is not a direct buffer</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressCharArray(byte[])"><!-- --></A><H3>
+uncompressCharArray</H3>
+<PRE>
+public static char[] <B>uncompressCharArray</B>(byte[] input)
+                                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input data as char array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressCharArray(byte[], int, int)"><!-- --></A><H3>
+uncompressCharArray</H3>
+<PRE>
+public static char[] <B>uncompressCharArray</B>(byte[] input,
+                                         int offset,
+                                         int length)
+                                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, .., offset+length) as a char array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressDoubleArray(byte[])"><!-- --></A><H3>
+uncompressDoubleArray</H3>
+<PRE>
+public static double[] <B>uncompressDoubleArray</B>(byte[] input)
+                                      throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input as a double array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressedLength(byte[])"><!-- --></A><H3>
+uncompressedLength</H3>
+<PRE>
+public static int <B>uncompressedLength</B>(byte[] input)
+                              throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Get the uncompressed byte size of the given compressed input. This
+ operation takes O(1) time.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>uncompressed byte size of the the given input data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE> - when failed to uncompress the given input. The error code is
+             <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#PARSING_ERROR"><CODE>SnappyErrorCode.PARSING_ERROR</CODE></A></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressedLength(byte[], int, int)"><!-- --></A><H3>
+uncompressedLength</H3>
+<PRE>
+public static int <B>uncompressedLength</B>(byte[] input,
+                                     int offset,
+                                     int length)
+                              throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Get the uncompressed byte size of the given compressed input. This
+ operation takes O(1) time.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - 
+<DT><B>Returns:</B><DD>uncompressed byte size of the the given input data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE> - when failed to uncompress the given input. The error code is
+             <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#PARSING_ERROR"><CODE>SnappyErrorCode.PARSING_ERROR</CODE></A></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressedLength(java.nio.ByteBuffer)"><!-- --></A><H3>
+uncompressedLength</H3>
+<PRE>
+public static int <B>uncompressedLength</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed)
+                              throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Get the uncompressed byte size of the given compressed input. This
+ operation taks O(1) time.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>compressed</CODE> - input data [pos() ... limit())
+<DT><B>Returns:</B><DD>uncompressed byte length of the given input
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE> - when failed to uncompress the given input. The error code is
+             <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#PARSING_ERROR"><CODE>SnappyErrorCode.PARSING_ERROR</CODE></A>
+<DD><CODE><A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A></CODE> - when the input is not a direct buffer</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressFloatArray(byte[])"><!-- --></A><H3>
+uncompressFloatArray</H3>
+<PRE>
+public static float[] <B>uncompressFloatArray</B>(byte[] input)
+                                    throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input as a float array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressFloatArray(byte[], int, int)"><!-- --></A><H3>
+uncompressFloatArray</H3>
+<PRE>
+public static float[] <B>uncompressFloatArray</B>(byte[] input,
+                                           int offset,
+                                           int length)
+                                    throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, offset+length) as a float array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressIntArray(byte[])"><!-- --></A><H3>
+uncompressIntArray</H3>
+<PRE>
+public static int[] <B>uncompressIntArray</B>(byte[] input)
+                                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input data as an int array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressIntArray(byte[], int, int)"><!-- --></A><H3>
+uncompressIntArray</H3>
+<PRE>
+public static int[] <B>uncompressIntArray</B>(byte[] input,
+                                       int offset,
+                                       int length)
+                                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, offset+length) as an int array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressLongArray(byte[])"><!-- --></A><H3>
+uncompressLongArray</H3>
+<PRE>
+public static long[] <B>uncompressLongArray</B>(byte[] input)
+                                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input data as a long array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressLongArray(byte[], int, int)"><!-- --></A><H3>
+uncompressLongArray</H3>
+<PRE>
+public static long[] <B>uncompressLongArray</B>(byte[] input,
+                                         int offset,
+                                         int length)
+                                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, offset+length) as a long array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressShortArray(byte[])"><!-- --></A><H3>
+uncompressShortArray</H3>
+<PRE>
+public static short[] <B>uncompressShortArray</B>(byte[] input)
+                                    throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input as a short array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressShortArray(byte[], int, int)"><!-- --></A><H3>
+uncompressShortArray</H3>
+<PRE>
+public static short[] <B>uncompressShortArray</B>(byte[] input,
+                                           int offset,
+                                           int length)
+                                    throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, offset+length) as a short array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressString(byte[])"><!-- --></A><H3>
+uncompressString</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>uncompressString</B>(byte[] input)
+                               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input as a String
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed dasta
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressString(byte[], int, int)"><!-- --></A><H3>
+uncompressString</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>uncompressString</B>(byte[] input,
+                                      int offset,
+                                      int length)
+                               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, offset+length) as a String
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressString(byte[], int, int, java.lang.String)"><!-- --></A><H3>
+uncompressString</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>uncompressString</B>(byte[] input,
+                                      int offset,
+                                      int length,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoding)
+                               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A>,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, offset+length) as a String of the given
+ encoding
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - <DD><CODE>encoding</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressString(byte[], int, int, java.nio.charset.Charset)"><!-- --></A><H3>
+uncompressString</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>uncompressString</B>(byte[] input,
+                                      int offset,
+                                      int length,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A> encoding)
+                               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A>,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></PRE>
+<DL>
+<DD>Uncompress the input[offset, offset+length) as a String of the given
+ encoding
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>offset</CODE> - <DD><CODE>length</CODE> - <DD><CODE>encoding</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressString(byte[], java.lang.String)"><!-- --></A><H3>
+uncompressString</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>uncompressString</B>(byte[] input,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> encoding)
+                               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A>,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></PRE>
+<DL>
+<DD>Uncompress the input as a String of the given encoding
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>encoding</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressString(byte[], java.nio.charset.Charset)"><!-- --></A><H3>
+uncompressString</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>uncompressString</B>(byte[] input,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/charset/Charset.html?is-external=true" title="class or interface in java.nio.charset">Charset</A> encoding)
+                               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A>,
+                                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></PRE>
+<DL>
+<DD>Uncompress the input as a String of the given encoding
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - <DD><CODE>encoding</CODE> - 
+<DT><B>Returns:</B><DD>the uncompressed data
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/UnsupportedEncodingException.html?is-external=true" title="class or interface in java.io">UnsupportedEncodingException</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/Snappy.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/Snappy.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="Snappy.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyBundleActivator.html b/wiki/apidocs/org/xerial/snappy/SnappyBundleActivator.html
new file mode 100644
index 0000000..82efcde
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyBundleActivator.html
@@ -0,0 +1,293 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyBundleActivator (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyBundleActivator (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyBundleActivator.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyBundleActivator.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyBundleActivator.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyBundleActivator</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyBundleActivator</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD>org.osgi.framework.BundleActivator</DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public class <B>SnappyBundleActivator</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A><DT>implements org.osgi.framework.BundleActivator</DL>
+</PRE>
+
+<P>
+OSGi bundle entry point
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html#SnappyBundleActivator()">SnappyBundleActivator</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html#start(org.osgi.framework.BundleContext)">start</A></B>(org.osgi.framework.BundleContext context)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html#stop(org.osgi.framework.BundleContext)">stop</A></B>(org.osgi.framework.BundleContext context)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SnappyBundleActivator()"><!-- --></A><H3>
+SnappyBundleActivator</H3>
+<PRE>
+public <B>SnappyBundleActivator</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="start(org.osgi.framework.BundleContext)"><!-- --></A><H3>
+start</H3>
+<PRE>
+public void <B>start</B>(org.osgi.framework.BundleContext context)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE>start</CODE> in interface <CODE>org.osgi.framework.BundleActivator</CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="stop(org.osgi.framework.BundleContext)"><!-- --></A><H3>
+stop</H3>
+<PRE>
+public void <B>stop</B>(org.osgi.framework.BundleContext context)
+          throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE>stop</CODE> in interface <CODE>org.osgi.framework.BundleActivator</CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyBundleActivator.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyBundleActivator.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyBundleActivator.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyCodec.html b/wiki/apidocs/org/xerial/snappy/SnappyCodec.html
new file mode 100644
index 0000000..8eabbc5
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyCodec.html
@@ -0,0 +1,483 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyCodec (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyCodec (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyCodec.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyCodec.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyCodec.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyCodec</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyCodec</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public class <B>SnappyCodec</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></DL>
+</PRE>
+
+<P>
+Preamble header for <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.
+ 
+ <p>
+ The magic header is the following 8 bytes data:
+ 
+ <pre>
+ -126, 'S', 'N', 'A', 'P', 'P', 'Y', 0
+ </pre>
+ 
+ </p>
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#compatibleVersion">compatibleVersion</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#DEFAULT_VERSION">DEFAULT_VERSION</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#magic">magic</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static byte[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#MAGIC_HEADER">MAGIC_HEADER</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#MAGIC_LEN">MAGIC_LEN</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#MINIMUM_COMPATIBLE_VERSION">MINIMUM_COMPATIBLE_VERSION</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#version">version</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#currentHeader()">currentHeader</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#headerSize()">headerSize</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#isValidMagicHeader()">isValidMagicHeader</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#readHeader(java.io.InputStream)">readHeader</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A> in)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#toString()">toString</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html#writeHeader(java.io.OutputStream)">writeHeader</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A> out)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="MAGIC_HEADER"><!-- --></A><H3>
+MAGIC_HEADER</H3>
+<PRE>
+public static final byte[] <B>MAGIC_HEADER</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="MAGIC_LEN"><!-- --></A><H3>
+MAGIC_LEN</H3>
+<PRE>
+public static final int <B>MAGIC_LEN</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyCodec.MAGIC_LEN">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="DEFAULT_VERSION"><!-- --></A><H3>
+DEFAULT_VERSION</H3>
+<PRE>
+public static final int <B>DEFAULT_VERSION</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyCodec.DEFAULT_VERSION">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="MINIMUM_COMPATIBLE_VERSION"><!-- --></A><H3>
+MINIMUM_COMPATIBLE_VERSION</H3>
+<PRE>
+public static final int <B>MINIMUM_COMPATIBLE_VERSION</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyCodec.MINIMUM_COMPATIBLE_VERSION">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="magic"><!-- --></A><H3>
+magic</H3>
+<PRE>
+public final byte[] <B>magic</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="version"><!-- --></A><H3>
+version</H3>
+<PRE>
+public final int <B>version</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="compatibleVersion"><!-- --></A><H3>
+compatibleVersion</H3>
+<PRE>
+public final int <B>compatibleVersion</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="toString()"><!-- --></A><H3>
+toString</H3>
+<PRE>
+public <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>toString</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#toString()" title="class or interface in java.lang">toString</A></CODE> in class <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="headerSize()"><!-- --></A><H3>
+headerSize</H3>
+<PRE>
+public static int <B>headerSize</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="writeHeader(java.io.OutputStream)"><!-- --></A><H3>
+writeHeader</H3>
+<PRE>
+public void <B>writeHeader</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A> out)
+                 throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidMagicHeader()"><!-- --></A><H3>
+isValidMagicHeader</H3>
+<PRE>
+public boolean <B>isValidMagicHeader</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="readHeader(java.io.InputStream)"><!-- --></A><H3>
+readHeader</H3>
+<PRE>
+public static <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A> <B>readHeader</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A> in)
+                              throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="currentHeader()"><!-- --></A><H3>
+currentHeader</H3>
+<PRE>
+public static <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A> <B>currentHeader</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyCodec.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyCodec.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyCodec.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyError.html b/wiki/apidocs/org/xerial/snappy/SnappyError.html
new file mode 100644
index 0000000..363434e
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyError.html
@@ -0,0 +1,344 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyError (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyError (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyError.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyError.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyError.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyError</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">java.lang.Throwable</A>
+      <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang">java.lang.Error</A>
+          <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyError</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</A></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public class <B>SnappyError</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang">Error</A></DL>
+</PRE>
+
+<P>
+Used when serious errors (unchecked exception) are observed.
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+<DT><B>See Also:</B><DD><A HREF="../../../serialized-form.html#org.xerial.snappy.SnappyError">Serialized Form</A></DL>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyError.html#errorCode">errorCode</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode)">SnappyError</A></B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.Error)">SnappyError</A></B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang">Error</A> e)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.String)">SnappyError</A></B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> message)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyError.html#getMessage()">getMessage</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Throwable"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#fillInStackTrace()" title="class or interface in java.lang">fillInStackTrace</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#getCause()" title="class or interface in java.lang">getCause</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#getLocalizedMessage()" title="clas [...]
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="errorCode"><!-- --></A><H3>
+errorCode</H3>
+<PRE>
+public final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>errorCode</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SnappyError(org.xerial.snappy.SnappyErrorCode)"><!-- --></A><H3>
+SnappyError</H3>
+<PRE>
+public <B>SnappyError</B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code)</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.Error)"><!-- --></A><H3>
+SnappyError</H3>
+<PRE>
+public <B>SnappyError</B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code,
+                   <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang">Error</A> e)</PRE>
+<DL>
+</DL>
+<HR>
+
+<A NAME="SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.String)"><!-- --></A><H3>
+SnappyError</H3>
+<PRE>
+public <B>SnappyError</B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code,
+                   <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> message)</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getMessage()"><!-- --></A><H3>
+getMessage</H3>
+<PRE>
+public <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getMessage</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#getMessage()" title="class or interface in java.lang">getMessage</A></CODE> in class <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</A></CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyError.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyError.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyError.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyErrorCode.html b/wiki/apidocs/org/xerial/snappy/SnappyErrorCode.html
new file mode 100644
index 0000000..7333565
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyErrorCode.html
@@ -0,0 +1,467 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyErrorCode (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyErrorCode (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyErrorCode.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyErrorCode.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyErrorCode.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#enum_constant_summary">ENUM CONSTANTS</A> | <A HREF="#field_summary">FIELD</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#enum_constant_detail">ENUM CONSTANTS</A> | <A HREF="#field_detail">FIELD</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Enum SnappyErrorCode</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">java.lang.Enum</A><<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>>
+      <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyErrorCode</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</A><<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public enum <B>SnappyErrorCode</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</A><<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>></DL>
+</PRE>
+
+<P>
+Error codes of snappy-java
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+<!-- =========== ENUM CONSTANT SUMMARY =========== -->
+
+<A NAME="enum_constant_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Enum Constant Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#FAILED_TO_LOAD_NATIVE_LIBRARY">FAILED_TO_LOAD_NATIVE_LIBRARY</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#FAILED_TO_UNCOMPRESS">FAILED_TO_UNCOMPRESS</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#NOT_A_DIRECT_BUFFER">NOT_A_DIRECT_BUFFER</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#OUT_OF_MEMORY">OUT_OF_MEMORY</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#PARSING_ERROR">PARSING_ERROR</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#UNKNOWN">UNKNOWN</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ <!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#id">id</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#getErrorCode(int)">getErrorCode</A></B>(int id)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#getErrorMessage(int)">getErrorMessage</A></B>(int id)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#valueOf(java.lang.String)">valueOf</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> name)</CODE>
+
+<BR>
+          Returns the enum constant of this type with the specified name.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html#values()">values</A></B>()</CODE>
+
+<BR>
+          Returns an array containing the constants of this enum type, in
+the order they are declared.</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Enum"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true#compareTo(E)" title="class or interface in java.lang">compareTo</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true#getDeclaringClass()" title="class or interface in  [...]
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#notify()" title="class or interface in java.lang">notify</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#notifyAll()" title="class or interface in java.lang">notifyAll< [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ============ ENUM CONSTANT DETAIL =========== -->
+
+<A NAME="enum_constant_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Enum Constant Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="UNKNOWN"><!-- --></A><H3>
+UNKNOWN</H3>
+<PRE>
+public static final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>UNKNOWN</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="FAILED_TO_LOAD_NATIVE_LIBRARY"><!-- --></A><H3>
+FAILED_TO_LOAD_NATIVE_LIBRARY</H3>
+<PRE>
+public static final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>FAILED_TO_LOAD_NATIVE_LIBRARY</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="PARSING_ERROR"><!-- --></A><H3>
+PARSING_ERROR</H3>
+<PRE>
+public static final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>PARSING_ERROR</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="NOT_A_DIRECT_BUFFER"><!-- --></A><H3>
+NOT_A_DIRECT_BUFFER</H3>
+<PRE>
+public static final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>NOT_A_DIRECT_BUFFER</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="OUT_OF_MEMORY"><!-- --></A><H3>
+OUT_OF_MEMORY</H3>
+<PRE>
+public static final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>OUT_OF_MEMORY</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+<HR>
+
+<A NAME="FAILED_TO_UNCOMPRESS"><!-- --></A><H3>
+FAILED_TO_UNCOMPRESS</H3>
+<PRE>
+public static final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>FAILED_TO_UNCOMPRESS</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="id"><!-- --></A><H3>
+id</H3>
+<PRE>
+public final int <B>id</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="values()"><!-- --></A><H3>
+values</H3>
+<PRE>
+public static <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>[] <B>values</B>()</PRE>
+<DL>
+<DD>Returns an array containing the constants of this enum type, in
+the order they are declared.  This method may be used to iterate
+over the constants as follows:
+<pre>
+for (SnappyErrorCode c : SnappyErrorCode.values())
+    System.out.println(c);
+</pre>
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>an array containing the constants of this enum type, in
+the order they are declared</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="valueOf(java.lang.String)"><!-- --></A><H3>
+valueOf</H3>
+<PRE>
+public static <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>valueOf</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> name)</PRE>
+<DL>
+<DD>Returns the enum constant of this type with the specified name.
+The string must match <I>exactly</I> an identifier used to declare an
+enum constant in this type.  (Extraneous whitespace characters are 
+not permitted.)
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>name</CODE> - the name of the enum constant to be returned.
+<DT><B>Returns:</B><DD>the enum constant with the specified name
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang">IllegalArgumentException</A></CODE> - if this enum type has no constant
+with the specified name
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/NullPointerException.html?is-external=true" title="class or interface in java.lang">NullPointerException</A></CODE> - if the argument is null</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getErrorCode(int)"><!-- --></A><H3>
+getErrorCode</H3>
+<PRE>
+public static <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>getErrorCode</B>(int id)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getErrorMessage(int)"><!-- --></A><H3>
+getErrorMessage</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getErrorMessage</B>(int id)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyErrorCode.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyErrorCode.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyErrorCode.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#enum_constant_summary">ENUM CONSTANTS</A> | <A HREF="#field_summary">FIELD</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#enum_constant_detail">ENUM CONSTANTS</A> | <A HREF="#field_detail">FIELD</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyException.html b/wiki/apidocs/org/xerial/snappy/SnappyException.html
new file mode 100644
index 0000000..c898fe2
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyException.html
@@ -0,0 +1,402 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyException (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyException (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyException.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyException.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyException.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyException</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">java.lang.Throwable</A>
+      <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">java.lang.Exception</A>
+          <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyException</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</A></DD>
+</DL>
+<HR>
+<B>Deprecated.</B> <I>Snappy-java now uses <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io"><CODE>IOException</CODE></A></I>
+<P>
+<DL>
+<DT><PRE><FONT SIZE="-1"><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</A>
+</FONT>public class <B>SnappyException</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A></DL>
+</PRE>
+
+<P>
+Exception in snappy-java
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+<DT><B>See Also:</B><DD><A HREF="../../../serialized-form.html#org.xerial.snappy.SnappyException">Serialized Form</A></DL>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#errorCode">errorCode</A></B></CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+</TABLE>
+ 
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#SnappyException(int)">SnappyException</A></B>(int code)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode)">SnappyException</A></B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.Exception)">SnappyException</A></B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode,
+                <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A> e)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.String)">SnappyException</A></B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode,
+                <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> message)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#getErrorCode()">getErrorCode</A></B>()</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#getMessage()">getMessage</A></B>()</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyException.html#throwException(int)">throwException</A></B>(int errorCode)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Throwable"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#fillInStackTrace()" title="class or interface in java.lang">fillInStackTrace</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#getCause()" title="class or interface in java.lang">getCause</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#getLocalizedMessage()" title="clas [...]
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="errorCode"><!-- --></A><H3>
+errorCode</H3>
+<PRE>
+public final <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>errorCode</B></PRE>
+<DL>
+<DD><B>Deprecated.</B> <DL>
+</DL>
+</DL>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SnappyException(int)"><!-- --></A><H3>
+SnappyException</H3>
+<PRE>
+public <B>SnappyException</B>(int code)</PRE>
+<DL>
+<DD><B>Deprecated.</B> </DL>
+<HR>
+
+<A NAME="SnappyException(org.xerial.snappy.SnappyErrorCode)"><!-- --></A><H3>
+SnappyException</H3>
+<PRE>
+public <B>SnappyException</B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode)</PRE>
+<DL>
+<DD><B>Deprecated.</B> </DL>
+<HR>
+
+<A NAME="SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.Exception)"><!-- --></A><H3>
+SnappyException</H3>
+<PRE>
+public <B>SnappyException</B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode,
+                       <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A> e)</PRE>
+<DL>
+<DD><B>Deprecated.</B> </DL>
+<HR>
+
+<A NAME="SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.String)"><!-- --></A><H3>
+SnappyException</H3>
+<PRE>
+public <B>SnappyException</B>(<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode,
+                       <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> message)</PRE>
+<DL>
+<DD><B>Deprecated.</B> </DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getErrorCode()"><!-- --></A><H3>
+getErrorCode</H3>
+<PRE>
+public <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>getErrorCode</B>()</PRE>
+<DL>
+<DD><B>Deprecated.</B> <DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="throwException(int)"><!-- --></A><H3>
+throwException</H3>
+<PRE>
+public static void <B>throwException</B>(int errorCode)
+                           throws <A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A></PRE>
+<DL>
+<DD><B>Deprecated.</B> <DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getMessage()"><!-- --></A><H3>
+getMessage</H3>
+<PRE>
+public <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getMessage</B>()</PRE>
+<DL>
+<DD><B>Deprecated.</B> <DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true#getMessage()" title="class or interface in java.lang">getMessage</A></CODE> in class <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</A></CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyException.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyException.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyException.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyInputStream.html b/wiki/apidocs/org/xerial/snappy/SnappyInputStream.html
new file mode 100644
index 0000000..e432b47
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyInputStream.html
@@ -0,0 +1,660 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyInputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyInputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyInputStream.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyInputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyInputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyInputStream</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">java.io.InputStream</A>
+      <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyInputStream</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</A></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public class <B>SnappyInputStream</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A></DL>
+</PRE>
+
+<P>
+A stream filter for reading data compressed by <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#SnappyInputStream(java.io.InputStream)">SnappyInputStream</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A> input)</CODE>
+
+<BR>
+          Create a filter for reading compressed data as a uncompressed stream</TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#close()">close</A></B>()</CODE>
+
+<BR>
+          Close the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#rawRead(java.lang.Object, int, int)">rawRead</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> array,
+        int byteOffset,
+        int byteLength)</CODE>
+
+<BR>
+          Read uncompressed data into the specified array</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read()">read</A></B>()</CODE>
+
+<BR>
+          Reads the next byte of uncompressed data from the input stream.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(byte[], int, int)">read</A></B>(byte[] b,
+     int off,
+     int len)</CODE>
+
+<BR>
+          Reads up to len bytes of data from the input stream into an array of
+ bytes.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(double[])">read</A></B>(double[] d)</CODE>
+
+<BR>
+          Read double array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(double[], int, int)">read</A></B>(double[] d,
+     int off,
+     int len)</CODE>
+
+<BR>
+          Read double array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(float[])">read</A></B>(float[] d)</CODE>
+
+<BR>
+          Read float array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(float[], int, int)">read</A></B>(float[] d,
+     int off,
+     int len)</CODE>
+
+<BR>
+          Read float array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(int[])">read</A></B>(int[] d)</CODE>
+
+<BR>
+          Read int array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(int[], int, int)">read</A></B>(int[] d,
+     int off,
+     int len)</CODE>
+
+<BR>
+          Read int array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(long[])">read</A></B>(long[] d)</CODE>
+
+<BR>
+          Read long array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(long[], int, int)">read</A></B>(long[] d,
+     int off,
+     int len)</CODE>
+
+<BR>
+          Read long array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(short[])">read</A></B>(short[] d)</CODE>
+
+<BR>
+          Read short array from the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html#read(short[], int, int)">read</A></B>(short[] d,
+     int off,
+     int len)</CODE>
+
+<BR>
+          Read short array from the stream</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.io.InputStream"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true#available()" title="class or interface in java.io">available</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true#mark(int)" title="class or interface in java.io">mark</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true#markSupported()" title="class or interface in java.io">ma [...]
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SnappyInputStream(java.io.InputStream)"><!-- --></A><H3>
+SnappyInputStream</H3>
+<PRE>
+public <B>SnappyInputStream</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A> input)
+                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Create a filter for reading compressed data as a uncompressed stream
+<P>
+<DL>
+<DT><B>Parameters:</B><DD><CODE>input</CODE> - 
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="close()"><!-- --></A><H3>
+close</H3>
+<PRE>
+public void <B>close</B>()
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Close the stream
+<P>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true#close()" title="class or interface in java.io">close</A></CODE> in interface <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</A></CODE><DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-ext [...]
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(byte[], int, int)"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(byte[] b,
+                int off,
+                int len)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Reads up to len bytes of data from the input stream into an array of
+ bytes.
+<P>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true#read(byte[], int, int)" title="class or interface in java.io">read</A></CODE> in class <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawRead(java.lang.Object, int, int)"><!-- --></A><H3>
+rawRead</H3>
+<PRE>
+public int <B>rawRead</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> array,
+                   int byteOffset,
+                   int byteLength)
+            throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read uncompressed data into the specified array
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>array</CODE> - <DD><CODE>byteOffset</CODE> - <DD><CODE>byteLength</CODE> - 
+<DT><B>Returns:</B><DD>written bytes
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(long[], int, int)"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(long[] d,
+                int off,
+                int len)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read long array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - input<DD><CODE>off</CODE> - offset<DD><CODE>len</CODE> - the number of long elements to read
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(long[])"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(long[] d)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read long array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - 
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(double[], int, int)"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(double[] d,
+                int off,
+                int len)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read double array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - input<DD><CODE>off</CODE> - offset<DD><CODE>len</CODE> - the number of double elements to read
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(double[])"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(double[] d)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read double array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - 
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(int[])"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(int[] d)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read int array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - 
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(int[], int, int)"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(int[] d,
+                int off,
+                int len)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read int array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - input<DD><CODE>off</CODE> - offset<DD><CODE>len</CODE> - the number of int elements to read
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(float[], int, int)"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(float[] d,
+                int off,
+                int len)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read float array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - input<DD><CODE>off</CODE> - offset<DD><CODE>len</CODE> - the number of float elements to read
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(float[])"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(float[] d)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read float array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - 
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(short[], int, int)"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(short[] d,
+                int off,
+                int len)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read short array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - input<DD><CODE>off</CODE> - offset<DD><CODE>len</CODE> - the number of short elements to read
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read(short[])"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>(short[] d)
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Read short array from the stream
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - 
+<DT><B>Returns:</B><DD>the total number of bytes read into the buffer, or -1 if there is
+         no more data because the end of the stream has been reached.
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="read()"><!-- --></A><H3>
+read</H3>
+<PRE>
+public int <B>read</B>()
+         throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Reads the next byte of uncompressed data from the input stream. The value
+ byte is returned as an int in the range 0 to 255. If no byte is available
+ because the end of the stream has been reached, the value -1 is returned.
+ This method blocks until input data is available, the end of the stream
+ is detected, or an exception is thrown.
+<P>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true#read()" title="class or interface in java.io">read</A></CODE> in class <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyInputStream.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyInputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyInputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyLoader.html b/wiki/apidocs/org/xerial/snappy/SnappyLoader.html
new file mode 100644
index 0000000..cf4d249
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyLoader.html
@@ -0,0 +1,444 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyLoader (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyLoader (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyLoader.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyLoader.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyLoader.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyLoader</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyLoader</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public class <B>SnappyLoader</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></DL>
+</PRE>
+
+<P>
+<b>Internal only - Do not use this class.</b> This class loads a native
+ library of snappy-java (snappyjava.dll, libsnappy.so, etc.) according to the
+ user platform (<i>os.name</i> and <i>os.arch</i>). The natively compiled
+ libraries bundled to snappy-java contain the codes of the original snappy and
+ JNI programs to access Snappy.
+ 
+ In default, no configuration is required to use snappy-java, but you can load
+ your own native library created by 'make native' command.
+ 
+ This SnappyLoader searches for native libraries (snappyjava.dll,
+ libsnappy.so, etc.) in the following order:
+ <ol>
+ <li>If system property <i>org.xerial.snappy.use.systemlib</i> is set to true,
+ lookup folders specified by <i>java.lib.path</i> system property (This is the
+ default path that JVM searches for native libraries)
+ <li>(System property: <i>org.xerial.snappy.lib.path</i>)/(System property:
+ <i>org.xerial.lib.name</i>)
+ <li>One of the libraries embedded in snappy-java-(version).jar extracted into
+ (System property: <i>java.io.tempdir</i>). If
+ <i>org.xerial.snappy.tempdir</i> is set, use this folder instead of
+ <i>java.io.tempdir</i>.
+ </ol>
+ 
+ <p>
+ If you do not want to use folder <i>java.io.tempdir</i>, set the System
+ property <i>org.xerial.snappy.tempdir</i>. For example, to use
+ <i>/tmp/leo</i> as a temporary folder to copy native libraries, use -D option
+ of JVM:
+ 
+ <pre>
+ <code>
+ java -Dorg.xerial.snappy.tempdir="/tmp/leo" ...
+ </code>
+ </pre>
+ 
+ </p>
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+<!-- =========== FIELD SUMMARY =========== -->
+
+<A NAME="field_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Field Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_DISABLE_BUNDLED_LIBS">KEY_SNAPPY_DISABLE_BUNDLED_LIBS</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_LIB_NAME">KEY_SNAPPY_LIB_NAME</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_LIB_PATH">KEY_SNAPPY_LIB_PATH</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_TEMPDIR">KEY_SNAPPY_TEMPDIR</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#KEY_SNAPPY_USE_SYSTEMLIB">KEY_SNAPPY_USE_SYSTEMLIB</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#SNAPPY_SYSTEM_PROPERTIES_FILE">SNAPPY_SYSTEM_PROPERTIES_FILE</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#SnappyLoader()">SnappyLoader</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#getVersion()">getVersion</A></B>()</CODE>
+
+<BR>
+          Get the snappy-java version by reading pom.properties embedded in jar.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html#isNativeLibraryLoaded()">isNativeLibraryLoaded</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ============ FIELD DETAIL =========== -->
+
+<A NAME="field_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Field Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SNAPPY_SYSTEM_PROPERTIES_FILE"><!-- --></A><H3>
+SNAPPY_SYSTEM_PROPERTIES_FILE</H3>
+<PRE>
+public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>SNAPPY_SYSTEM_PROPERTIES_FILE</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyLoader.SNAPPY_SYSTEM_PROPERTIES_FILE">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="KEY_SNAPPY_LIB_PATH"><!-- --></A><H3>
+KEY_SNAPPY_LIB_PATH</H3>
+<PRE>
+public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>KEY_SNAPPY_LIB_PATH</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyLoader.KEY_SNAPPY_LIB_PATH">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="KEY_SNAPPY_LIB_NAME"><!-- --></A><H3>
+KEY_SNAPPY_LIB_NAME</H3>
+<PRE>
+public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>KEY_SNAPPY_LIB_NAME</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyLoader.KEY_SNAPPY_LIB_NAME">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="KEY_SNAPPY_TEMPDIR"><!-- --></A><H3>
+KEY_SNAPPY_TEMPDIR</H3>
+<PRE>
+public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>KEY_SNAPPY_TEMPDIR</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyLoader.KEY_SNAPPY_TEMPDIR">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="KEY_SNAPPY_USE_SYSTEMLIB"><!-- --></A><H3>
+KEY_SNAPPY_USE_SYSTEMLIB</H3>
+<PRE>
+public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>KEY_SNAPPY_USE_SYSTEMLIB</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyLoader.KEY_SNAPPY_USE_SYSTEMLIB">Constant Field Values</A></DL>
+</DL>
+<HR>
+
+<A NAME="KEY_SNAPPY_DISABLE_BUNDLED_LIBS"><!-- --></A><H3>
+KEY_SNAPPY_DISABLE_BUNDLED_LIBS</H3>
+<PRE>
+public static final <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>KEY_SNAPPY_DISABLE_BUNDLED_LIBS</B></PRE>
+<DL>
+<DL>
+<DT><B>See Also:</B><DD><A HREF="../../../constant-values.html#org.xerial.snappy.SnappyLoader.KEY_SNAPPY_DISABLE_BUNDLED_LIBS">Constant Field Values</A></DL>
+</DL>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SnappyLoader()"><!-- --></A><H3>
+SnappyLoader</H3>
+<PRE>
+public <B>SnappyLoader</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="isNativeLibraryLoaded()"><!-- --></A><H3>
+isNativeLibraryLoaded</H3>
+<PRE>
+public static boolean <B>isNativeLibraryLoaded</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getVersion()"><!-- --></A><H3>
+getVersion</H3>
+<PRE>
+public static <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>getVersion</B>()</PRE>
+<DL>
+<DD>Get the snappy-java version by reading pom.properties embedded in jar.
+ This version data is used as a suffix of a dll file extracted from the
+ jar.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>the version string</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyLoader.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyLoader.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyLoader.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | <A HREF="#field_summary">FIELD</A> | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: <A HREF="#field_detail">FIELD</A> | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyNative.html b/wiki/apidocs/org/xerial/snappy/SnappyNative.html
new file mode 100644
index 0000000..40a257e
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyNative.html
@@ -0,0 +1,597 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyNative (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyNative (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyNative.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyNative.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNative.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyNative</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyNative</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public class <B>SnappyNative</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A><DT>implements <A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></DL>
+</PRE>
+
+<P>
+<b>Internal only - Do not use this class.</b> JNI interface of the
+ <A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><CODE>SnappyNativeAPI</CODE></A> implementation. The native method in this class is
+ defined in SnappyNative.h (genereted by javah) and SnappyNative.cpp
+ 
+ <p>
+ <b> DO NOT USE THIS CLASS since the direct use of this class might break the
+ native library code loading in <A HREF="../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><CODE>SnappyLoader</CODE></A>. </b>
+ </p>
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#SnappyNative()">SnappyNative</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#arrayCopy(java.lang.Object, int, int, java.lang.Object, int)">arrayCopy</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> src,
+          int offset,
+          int byteLength,
+          <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> dest,
+          int dOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#isValidCompressedBuffer(java.nio.ByteBuffer, int, int)">isValidCompressedBuffer</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                        int offset,
+                        int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#isValidCompressedBuffer(java.lang.Object, int, int)">isValidCompressedBuffer</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                        int offset,
+                        int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#maxCompressedLength(int)">maxCompressedLength</A></B>(int source_bytes)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#nativeLibraryVersion()">nativeLibraryVersion</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#rawCompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)">rawCompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> input,
+            int inputOffset,
+            int inputLength,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+            int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#rawCompress(java.lang.Object, int, int, java.lang.Object, int)">rawCompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+            int inputOffset,
+            int inputByteLength,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+            int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#rawUncompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)">rawUncompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+              int inputOffset,
+              int inputLength,
+              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed,
+              int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#rawUncompress(java.lang.Object, int, int, java.lang.Object, int)">rawUncompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+              int inputOffset,
+              int inputLength,
+              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+              int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#throw_error(int)">throw_error</A></B>(int errorCode)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#uncompressedLength(java.nio.ByteBuffer, int, int)">uncompressedLength</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                   int offset,
+                   int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNative.html#uncompressedLength(java.lang.Object, int, int)">uncompressedLength</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                   int offset,
+                   int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SnappyNative()"><!-- --></A><H3>
+SnappyNative</H3>
+<PRE>
+public <B>SnappyNative</B>()</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="nativeLibraryVersion()"><!-- --></A><H3>
+nativeLibraryVersion</H3>
+<PRE>
+public <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>nativeLibraryVersion</B>()</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#nativeLibraryVersion()">nativeLibraryVersion</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawCompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><!-- --></A><H3>
+rawCompress</H3>
+<PRE>
+public int <B>rawCompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> input,
+                       int inputOffset,
+                       int inputLength,
+                       <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                       int outputOffset)
+                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawCompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)">rawCompress</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawCompress(java.lang.Object, int, int, java.lang.Object, int)"><!-- --></A><H3>
+rawCompress</H3>
+<PRE>
+public int <B>rawCompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                       int inputOffset,
+                       int inputByteLength,
+                       <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+                       int outputOffset)</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawCompress(java.lang.Object, int, int, java.lang.Object, int)">rawCompress</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawUncompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><!-- --></A><H3>
+rawUncompress</H3>
+<PRE>
+public int <B>rawUncompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                         int inputOffset,
+                         int inputLength,
+                         <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed,
+                         int outputOffset)
+                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawUncompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)">rawUncompress</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawUncompress(java.lang.Object, int, int, java.lang.Object, int)"><!-- --></A><H3>
+rawUncompress</H3>
+<PRE>
+public int <B>rawUncompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                         int inputOffset,
+                         int inputLength,
+                         <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+                         int outputOffset)
+                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawUncompress(java.lang.Object, int, int, java.lang.Object, int)">rawUncompress</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="maxCompressedLength(int)"><!-- --></A><H3>
+maxCompressedLength</H3>
+<PRE>
+public int <B>maxCompressedLength</B>(int source_bytes)</PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#maxCompressedLength(int)">maxCompressedLength</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressedLength(java.nio.ByteBuffer, int, int)"><!-- --></A><H3>
+uncompressedLength</H3>
+<PRE>
+public int <B>uncompressedLength</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                              int offset,
+                              int len)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#uncompressedLength(java.nio.ByteBuffer, int, int)">uncompressedLength</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressedLength(java.lang.Object, int, int)"><!-- --></A><H3>
+uncompressedLength</H3>
+<PRE>
+public int <B>uncompressedLength</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                              int offset,
+                              int len)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#uncompressedLength(java.lang.Object, int, int)">uncompressedLength</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidCompressedBuffer(java.nio.ByteBuffer, int, int)"><!-- --></A><H3>
+isValidCompressedBuffer</H3>
+<PRE>
+public boolean <B>isValidCompressedBuffer</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                                       int offset,
+                                       int len)
+                                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#isValidCompressedBuffer(java.nio.ByteBuffer, int, int)">isValidCompressedBuffer</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidCompressedBuffer(java.lang.Object, int, int)"><!-- --></A><H3>
+isValidCompressedBuffer</H3>
+<PRE>
+public boolean <B>isValidCompressedBuffer</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                                       int offset,
+                                       int len)
+                                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#isValidCompressedBuffer(java.lang.Object, int, int)">isValidCompressedBuffer</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="arrayCopy(java.lang.Object, int, int, java.lang.Object, int)"><!-- --></A><H3>
+arrayCopy</H3>
+<PRE>
+public void <B>arrayCopy</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> src,
+                      int offset,
+                      int byteLength,
+                      <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> dest,
+                      int dOffset)
+               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#arrayCopy(java.lang.Object, int, int, java.lang.Object, int)">arrayCopy</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="throw_error(int)"><!-- --></A><H3>
+throw_error</H3>
+<PRE>
+public void <B>throw_error</B>(int errorCode)
+                 throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#throw_error(int)">throw_error</A></CODE> in interface <CODE><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyNative.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyNative.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNative.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyNativeAPI.html b/wiki/apidocs/org/xerial/snappy/SnappyNativeAPI.html
new file mode 100644
index 0000000..f21dd1f
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyNativeAPI.html
@@ -0,0 +1,511 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyNativeAPI (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyNativeAPI (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyNativeAPI.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyNativeAPI.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNativeAPI.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Interface SnappyNativeAPI</H2>
+<DL>
+<DT><B>All Known Implementing Classes:</B> <DD><A HREF="../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public interface <B>SnappyNativeAPI</B></DL>
+</PRE>
+
+<P>
+<b>Internal only - Do not use this class.</b>
+ 
+ Interface to access the native code of Snappy. Although this class members
+ are public, do not use them directly. Use <A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><CODE>Snappy</CODE></A> API instead.
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#arrayCopy(java.lang.Object, int, int, java.lang.Object, int)">arrayCopy</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> src,
+          int offset,
+          int byteLength,
+          <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> dest,
+          int dOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#isValidCompressedBuffer(java.nio.ByteBuffer, int, int)">isValidCompressedBuffer</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                        int offset,
+                        int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#isValidCompressedBuffer(java.lang.Object, int, int)">isValidCompressedBuffer</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                        int offset,
+                        int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#maxCompressedLength(int)">maxCompressedLength</A></B>(int source_bytes)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#nativeLibraryVersion()">nativeLibraryVersion</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawCompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)">rawCompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> input,
+            int inputOffset,
+            int inputLength,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+            int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawCompress(java.lang.Object, int, int, java.lang.Object, int)">rawCompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+            int inputOffset,
+            int inputByteLength,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+            int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawUncompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)">rawUncompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+              int inputOffset,
+              int inputLength,
+              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed,
+              int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#rawUncompress(java.lang.Object, int, int, java.lang.Object, int)">rawUncompress</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+              int inputOffset,
+              int inputLength,
+              <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+              int outputOffset)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#throw_error(int)">throw_error</A></B>(int errorCode)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#uncompressedLength(java.nio.ByteBuffer, int, int)">uncompressedLength</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                   int offset,
+                   int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html#uncompressedLength(java.lang.Object, int, int)">uncompressedLength</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                   int offset,
+                   int len)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="nativeLibraryVersion()"><!-- --></A><H3>
+nativeLibraryVersion</H3>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> <B>nativeLibraryVersion</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawCompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><!-- --></A><H3>
+rawCompress</H3>
+<PRE>
+int <B>rawCompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> input,
+                int inputOffset,
+                int inputLength,
+                <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                int outputOffset)
+                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawCompress(java.lang.Object, int, int, java.lang.Object, int)"><!-- --></A><H3>
+rawCompress</H3>
+<PRE>
+int <B>rawCompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                int inputOffset,
+                int inputByteLength,
+                <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+                int outputOffset)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawUncompress(java.nio.ByteBuffer, int, int, java.nio.ByteBuffer, int)"><!-- --></A><H3>
+rawUncompress</H3>
+<PRE>
+int <B>rawUncompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                  int inputOffset,
+                  int inputLength,
+                  <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> uncompressed,
+                  int outputOffset)
+                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawUncompress(java.lang.Object, int, int, java.lang.Object, int)"><!-- --></A><H3>
+rawUncompress</H3>
+<PRE>
+int <B>rawUncompress</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                  int inputOffset,
+                  int inputLength,
+                  <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> output,
+                  int outputOffset)
+                  throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="maxCompressedLength(int)"><!-- --></A><H3>
+maxCompressedLength</H3>
+<PRE>
+int <B>maxCompressedLength</B>(int source_bytes)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressedLength(java.nio.ByteBuffer, int, int)"><!-- --></A><H3>
+uncompressedLength</H3>
+<PRE>
+int <B>uncompressedLength</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                       int offset,
+                       int len)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="uncompressedLength(java.lang.Object, int, int)"><!-- --></A><H3>
+uncompressedLength</H3>
+<PRE>
+int <B>uncompressedLength</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                       int offset,
+                       int len)
+                       throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidCompressedBuffer(java.nio.ByteBuffer, int, int)"><!-- --></A><H3>
+isValidCompressedBuffer</H3>
+<PRE>
+boolean <B>isValidCompressedBuffer</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/nio/ByteBuffer.html?is-external=true" title="class or interface in java.nio">ByteBuffer</A> compressed,
+                                int offset,
+                                int len)
+                                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isValidCompressedBuffer(java.lang.Object, int, int)"><!-- --></A><H3>
+isValidCompressedBuffer</H3>
+<PRE>
+boolean <B>isValidCompressedBuffer</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> input,
+                                int offset,
+                                int len)
+                                throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="arrayCopy(java.lang.Object, int, int, java.lang.Object, int)"><!-- --></A><H3>
+arrayCopy</H3>
+<PRE>
+void <B>arrayCopy</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> src,
+               int offset,
+               int byteLength,
+               <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> dest,
+               int dOffset)
+               throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="throw_error(int)"><!-- --></A><H3>
+throw_error</H3>
+<PRE>
+void <B>throw_error</B>(int errorCode)
+                 throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyNativeAPI.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyNativeAPI.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNativeAPI.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | CONSTR | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | CONSTR | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/SnappyOutputStream.html b/wiki/apidocs/org/xerial/snappy/SnappyOutputStream.html
new file mode 100644
index 0000000..8b3f411
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/SnappyOutputStream.html
@@ -0,0 +1,704 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+SnappyOutputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="SnappyOutputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyOutputStream.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyOutputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyOutputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.xerial.snappy</FONT>
+<BR>
+Class SnappyOutputStream</H2>
+<PRE>
+<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</A>
+  <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">java.io.OutputStream</A>
+      <IMG SRC="../../../resources/inherit.gif" ALT="extended by "><B>org.xerial.snappy.SnappyOutputStream</B>
+</PRE>
+<DL>
+<DT><B>All Implemented Interfaces:</B> <DD><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Flushable.html?is-external=true" title="class or interface in java.io">Flushable</A></DD>
+</DL>
+<HR>
+<DL>
+<DT><PRE>public class <B>SnappyOutputStream</B><DT>extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A></DL>
+</PRE>
+
+<P>
+This class implements a stream filter for writing compressed data using
+ Snappy.
+ 
+ The input data is blocked into 32kb size (in default), and each block is
+ compressed and then passed to the given <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io"><CODE>OutputStream</CODE></A>.
+ 
+ The output data format is:
+ <ol>
+ <li>snappy codec header defined in <A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><CODE>SnappyCodec</CODE></A> (8 bytes)
+ <li>compressed block 1 : a pair of (compressed data size [4 byte integer.
+ Big-endian], compressed data...)
+ <li>compressed block 2
+ <li>...
+ </ol>
+ 
+ Note that the compressed data created by <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A> cannot be
+ uncompressed by <A HREF="../../../org/xerial/snappy/Snappy.html#uncompress(byte[])"><CODE>Snappy.uncompress(byte[])</CODE></A> since the output formats of
+ <A HREF="../../../org/xerial/snappy/Snappy.html#compress(byte[])"><CODE>Snappy.compress(byte[])</CODE></A> and <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A> are different.
+ Use <A HREF="../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><CODE>SnappyInputStream</CODE></A> for uncompress the data generated by
+ <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.
+<P>
+
+<P>
+<DL>
+<DT><B>Author:</B></DT>
+  <DD>leo</DD>
+</DL>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#SnappyOutputStream(java.io.OutputStream)">SnappyOutputStream</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A> out)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#SnappyOutputStream(java.io.OutputStream, int)">SnappyOutputStream</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A> out,
+                   int blockSize)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#close()">close</A></B>()</CODE>
+
+<BR>
+          close the stream</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#flush()">flush</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#rawWrite(java.lang.Object, int, int)">rawWrite</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> array,
+         int byteOffset,
+         int byteLength)</CODE>
+
+<BR>
+          Compress the raw byte array data.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(byte[], int, int)">write</A></B>(byte[] b,
+      int off,
+      int len)</CODE>
+
+<BR>
+          Writes len bytes from the specified byte array starting at offset off to
+ this output stream.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(double[])">write</A></B>(double[] f)</CODE>
+
+<BR>
+          Compress the input array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(double[], int, int)">write</A></B>(double[] f,
+      int off,
+      int len)</CODE>
+
+<BR>
+          Compress the input double array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(float[])">write</A></B>(float[] f)</CODE>
+
+<BR>
+          Compress the input array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(float[], int, int)">write</A></B>(float[] f,
+      int off,
+      int len)</CODE>
+
+<BR>
+          Compress the input float array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(int)">write</A></B>(int b)</CODE>
+
+<BR>
+          Writes the specified byte to this output stream.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(int[])">write</A></B>(int[] f)</CODE>
+
+<BR>
+          Compress the input array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(int[], int, int)">write</A></B>(int[] f,
+      int off,
+      int len)</CODE>
+
+<BR>
+          Compress the input int array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(long[])">write</A></B>(long[] d)</CODE>
+
+<BR>
+          Compress the input array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(long[], int, int)">write</A></B>(long[] d,
+      int off,
+      int len)</CODE>
+
+<BR>
+          Compress the input long array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(short[])">write</A></B>(short[] f)</CODE>
+
+<BR>
+          Compress the input array data</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html#write(short[], int, int)">write</A></B>(short[] f,
+      int off,
+      int len)</CODE>
+
+<BR>
+          Compress the input short array data</TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.io.OutputStream"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true#write(byte[])" title="class or interface in java.io">write</A></CODE></TD>
+</TR>
+</TABLE>
+ <A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A></B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#equals(java.lang.Object)" title="class or interface in java.lang">equals</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#getClass()" title="class or interface in java.lang">getClass</A>, <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true#hashCode()" title="class or interface in java.l [...]
+</TR>
+</TABLE>
+ 
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="SnappyOutputStream(java.io.OutputStream)"><!-- --></A><H3>
+SnappyOutputStream</H3>
+<PRE>
+public <B>SnappyOutputStream</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A> out)
+                   throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DL>
+<HR>
+
+<A NAME="SnappyOutputStream(java.io.OutputStream, int)"><!-- --></A><H3>
+SnappyOutputStream</H3>
+<PRE>
+public <B>SnappyOutputStream</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A> out,
+                          int blockSize)
+                   throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DL>
+<DT><B>Parameters:</B><DD><CODE>out</CODE> - <DD><CODE>blockSize</CODE> - byte size of the internal buffer size
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="write(byte[], int, int)"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(byte[] b,
+                  int off,
+                  int len)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Writes len bytes from the specified byte array starting at offset off to
+ this output stream. The general contract for write(b, off, len) is that
+ some of the bytes in the array b are written to the output stream in
+ order; element b[off] is the first byte written and b[off+len-1] is the
+ last byte written by this operation.
+<P>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true#write(byte[], int, int)" title="class or interface in java.io">write</A></CODE> in class <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(long[], int, int)"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(long[] d,
+                  int off,
+                  int len)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input long array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - input array<DD><CODE>off</CODE> - offset in the array<DD><CODE>len</CODE> - the number of elements in the array to copy
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(double[], int, int)"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(double[] f,
+                  int off,
+                  int len)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input double array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - input array<DD><CODE>off</CODE> - offset in the array<DD><CODE>len</CODE> - the number of elements in the array to copy
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(float[], int, int)"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(float[] f,
+                  int off,
+                  int len)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input float array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - input array<DD><CODE>off</CODE> - offset in the array<DD><CODE>len</CODE> - the number of elements in the array to copy
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(int[], int, int)"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(int[] f,
+                  int off,
+                  int len)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input int array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - input array<DD><CODE>off</CODE> - offset in the array<DD><CODE>len</CODE> - the number of elements in the array to copy
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(short[], int, int)"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(short[] f,
+                  int off,
+                  int len)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input short array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - input array<DD><CODE>off</CODE> - offset in the array<DD><CODE>len</CODE> - the number of elements in the array to copy
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(long[])"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(long[] d)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>d</CODE> - 
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(double[])"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(double[] f)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - 
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(float[])"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(float[] f)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - 
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(int[])"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(int[] f)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - 
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(short[])"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(short[] f)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the input array data
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>f</CODE> - 
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="rawWrite(java.lang.Object, int, int)"><!-- --></A><H3>
+rawWrite</H3>
+<PRE>
+public void <B>rawWrite</B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</A> array,
+                     int byteOffset,
+                     int byteLength)
+              throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Compress the raw byte array data.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>array</CODE> - array data of any type (e.g., byte[], float[], long[], ...)<DD><CODE>byteOffset</CODE> - <DD><CODE>byteLength</CODE> - 
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="write(int)"><!-- --></A><H3>
+write</H3>
+<PRE>
+public void <B>write</B>(int b)
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>Writes the specified byte to this output stream. The general contract for
+ write is that one byte is written to the output stream. The byte to be
+ written is the eight low-order bits of the argument b. The 24 high-order
+ bits of b are ignored.
+<P>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true#write(int)" title="class or interface in java.io">write</A></CODE> in class <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</A></CODE></DL>
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="flush()"><!-- --></A><H3>
+flush</H3>
+<PRE>
+public void <B>flush</B>()
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Flushable.html?is-external=true#flush()" title="class or interface in java.io">flush</A></CODE> in interface <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Flushable.html?is-external=true" title="class or interface in java.io">Flushable</A></CODE><DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-ex [...]
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="close()"><!-- --></A><H3>
+close</H3>
+<PRE>
+public void <B>close</B>()
+           throws <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></PRE>
+<DL>
+<DD>close the stream
+<P>
+<DD><DL>
+<DT><B>Specified by:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true#close()" title="class or interface in java.io">close</A></CODE> in interface <CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</A></CODE><DT><B>Overrides:</B><DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-ex [...]
+</DD>
+<DD><DL>
+
+<DT><B>Throws:</B>
+<DD><CODE><A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</A></CODE></DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/SnappyOutputStream.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ <A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><B>PREV CLASS</B></A> 
+ NEXT CLASS</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/SnappyOutputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyOutputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY: NESTED | FIELD | <A HREF="#constructor_summary">CONSTR</A> | <A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL: FIELD | <A HREF="#constructor_detail">CONSTR</A> | <A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/OSInfo.html b/wiki/apidocs/org/xerial/snappy/class-use/OSInfo.html
new file mode 100644
index 0000000..91f7b51
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/OSInfo.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.OSInfo (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.OSInfo (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useOSInfo.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="OSInfo.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.OSInfo</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.OSInfo
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useOSInfo.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="OSInfo.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/Snappy.html b/wiki/apidocs/org/xerial/snappy/class-use/Snappy.html
new file mode 100644
index 0000000..02be3a8
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/Snappy.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.Snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.Snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappy.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="Snappy.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.Snappy</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.Snappy
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappy.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="Snappy.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyBundleActivator.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyBundleActivator.html
new file mode 100644
index 0000000..5ff5808
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyBundleActivator.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyBundleActivator (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyBundleActivator (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyBundleActivator.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyBundleActivator.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyBundleActivator</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.SnappyBundleActivator
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyBundleActivator.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyBundleActivator.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyCodec.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyCodec.html
new file mode 100644
index 0000000..bb4f9b2
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyCodec.html
@@ -0,0 +1,174 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyCodec (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyCodec (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyCodec.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyCodec.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyCodec</B></H2>
+</CENTER>
+<A NAME="org.xerial.snappy"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A> in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A></FONT></TH>
+</TR>
+</TABLE>
+ 
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A> that return <A HREF="../../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A></CODE></FONT></TD>
+<TD><CODE><B>SnappyCodec.</B><B><A HREF="../../../../org/xerial/snappy/SnappyCodec.html#currentHeader()">currentHeader</A></B>()</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A></CODE></FONT></TD>
+<TD><CODE><B>SnappyCodec.</B><B><A HREF="../../../../org/xerial/snappy/SnappyCodec.html#readHeader(java.io.InputStream)">readHeader</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io">InputStream</A> in)</CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyCodec.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyCodec.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyError.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyError.html
new file mode 100644
index 0000000..0aa8e36
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyError.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyError (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyError (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyError.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyError.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyError</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.SnappyError
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyError.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyError.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyErrorCode.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyErrorCode.html
new file mode 100644
index 0000000..6ed3fcc
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyErrorCode.html
@@ -0,0 +1,263 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyErrorCode (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyErrorCode (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyErrorCode.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyErrorCode.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyErrorCode</B></H2>
+</CENTER>
+<A NAME="org.xerial.snappy"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A></FONT></TH>
+</TR>
+</TABLE>
+ 
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Fields in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A> declared as <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B>SnappyException.</B><B><A HREF="../../../../org/xerial/snappy/SnappyException.html#errorCode">errorCode</A></B></CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B>SnappyError.</B><B><A HREF="../../../../org/xerial/snappy/SnappyError.html#errorCode">errorCode</A></B></CODE>
+
+<BR>
+           </TD>
+</TR>
+</TABLE>
+ 
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A> that return <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B>SnappyException.</B><B><A HREF="../../../../org/xerial/snappy/SnappyException.html#getErrorCode()">getErrorCode</A></B>()</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B>SnappyErrorCode.</B><B><A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html#getErrorCode(int)">getErrorCode</A></B>(int id)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></CODE></FONT></TD>
+<TD><CODE><B>SnappyErrorCode.</B><B><A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html#valueOf(java.lang.String)">valueOf</A></B>(<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> name)</CODE>
+
+<BR>
+          Returns the enum constant of this type with the specified name.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A>[]</CODE></FONT></TD>
+<TD><CODE><B>SnappyErrorCode.</B><B><A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html#values()">values</A></B>()</CODE>
+
+<BR>
+          Returns an array containing the constants of this enum type, in
+the order they are declared.</TD>
+</TR>
+</TABLE>
+ 
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Constructors in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A> with parameters of type <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode)">SnappyError</A></B>(<A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.Error)">SnappyError</A></B>(<A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang">Error</A> e)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/xerial/snappy/SnappyError.html#SnappyError(org.xerial.snappy.SnappyErrorCode, java.lang.String)">SnappyError</A></B>(<A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> code,
+            <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> message)</CODE>
+
+<BR>
+           </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode)">SnappyException</A></B>(<A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.Exception)">SnappyException</A></B>(<A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode,
+                <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A> e)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/xerial/snappy/SnappyException.html#SnappyException(org.xerial.snappy.SnappyErrorCode, java.lang.String)">SnappyException</A></B>(<A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> errorCode,
+                <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</A> message)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+</TABLE>
+ 
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyErrorCode.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyErrorCode.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyException.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyException.html
new file mode 100644
index 0000000..3c3100d
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyException.html
@@ -0,0 +1,166 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyException (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyException (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyException.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyException.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyException</B></H2>
+</CENTER>
+<A NAME="org.xerial.snappy"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A> in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A></FONT></TH>
+</TR>
+</TABLE>
+ 
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A> that throw <A HREF="../../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static void</CODE></FONT></TD>
+<TD><CODE><B>SnappyException.</B><B><A HREF="../../../../org/xerial/snappy/SnappyException.html#throwException(int)">throwException</A></B>(int errorCode)</CODE>
+
+<BR>
+          <B>Deprecated.</B>  </TD>
+</TR>
+</TABLE>
+ 
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyException.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyException.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyInputStream.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyInputStream.html
new file mode 100644
index 0000000..a5288e0
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyInputStream.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyInputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyInputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyInputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyInputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyInputStream</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.SnappyInputStream
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyInputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyInputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyLoader.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyLoader.html
new file mode 100644
index 0000000..b5dc10f
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyLoader.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyLoader (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyLoader (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyLoader.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyLoader.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyLoader</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.SnappyLoader
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyLoader.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyLoader.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyNative.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyNative.html
new file mode 100644
index 0000000..ec2b7cc
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyNative.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyNative (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyNative (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyNative.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNative.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyNative</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.SnappyNative
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyNative.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNative.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyNativeAPI.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyNativeAPI.html
new file mode 100644
index 0000000..8facf87
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyNativeAPI.html
@@ -0,0 +1,167 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Interface org.xerial.snappy.SnappyNativeAPI (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Interface org.xerial.snappy.SnappyNativeAPI (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyNativeAPI.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNativeAPI.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Interface<br>org.xerial.snappy.SnappyNativeAPI</B></H2>
+</CENTER>
+<A NAME="org.xerial.snappy"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A> in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A></FONT></TH>
+</TR>
+</TABLE>
+ 
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Classes in <A HREF="../../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A> that implement <A HREF="../../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE> class</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A></B></CODE>
+
+<BR>
+          <b>Internal only - Do not use this class.</b> JNI interface of the
+ <A HREF="../../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><CODE>SnappyNativeAPI</CODE></A> implementation.</TD>
+</TR>
+</TABLE>
+ 
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyNativeAPI.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyNativeAPI.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/class-use/SnappyOutputStream.html b/wiki/apidocs/org/xerial/snappy/class-use/SnappyOutputStream.html
new file mode 100644
index 0000000..82f894b
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/class-use/SnappyOutputStream.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Class org.xerial.snappy.SnappyOutputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.xerial.snappy.SnappyOutputStream (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyOutputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyOutputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.xerial.snappy.SnappyOutputStream</B></H2>
+</CENTER>
+No usage of org.xerial.snappy.SnappyOutputStream
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/xerial/snappy/\class-useSnappyOutputStream.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="SnappyOutputStream.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/package-frame.html b/wiki/apidocs/org/xerial/snappy/package-frame.html
new file mode 100644
index 0000000..3dd465a
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/package-frame.html
@@ -0,0 +1,91 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+org.xerial.snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+
+</HEAD>
+
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameTitleFont">
+<A HREF="../../../org/xerial/snappy/package-summary.html" target="classFrame">org.xerial.snappy</A></FONT>
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Interfaces</FONT> 
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="SnappyNativeAPI.html" title="interface in org.xerial.snappy" target="classFrame"><I>SnappyNativeAPI</I></A></FONT></TD>
+</TR>
+</TABLE>
+
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Classes</FONT> 
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="OSInfo.html" title="class in org.xerial.snappy" target="classFrame">OSInfo</A>
+<BR>
+<A HREF="Snappy.html" title="class in org.xerial.snappy" target="classFrame">Snappy</A>
+<BR>
+<A HREF="SnappyBundleActivator.html" title="class in org.xerial.snappy" target="classFrame">SnappyBundleActivator</A>
+<BR>
+<A HREF="SnappyCodec.html" title="class in org.xerial.snappy" target="classFrame">SnappyCodec</A>
+<BR>
+<A HREF="SnappyInputStream.html" title="class in org.xerial.snappy" target="classFrame">SnappyInputStream</A>
+<BR>
+<A HREF="SnappyLoader.html" title="class in org.xerial.snappy" target="classFrame">SnappyLoader</A>
+<BR>
+<A HREF="SnappyNative.html" title="class in org.xerial.snappy" target="classFrame">SnappyNative</A>
+<BR>
+<A HREF="SnappyOutputStream.html" title="class in org.xerial.snappy" target="classFrame">SnappyOutputStream</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Enums</FONT> 
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="SnappyErrorCode.html" title="enum in org.xerial.snappy" target="classFrame">SnappyErrorCode</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Exceptions</FONT> 
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="SnappyException.html" title="class in org.xerial.snappy" target="classFrame">SnappyException</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+<TABLE BORDER="0" WIDTH="100%" SUMMARY="">
+<TR>
+<TD NOWRAP><FONT size="+1" CLASS="FrameHeadingFont">
+Errors</FONT> 
+<FONT CLASS="FrameItemFont">
+<BR>
+<A HREF="SnappyError.html" title="class in org.xerial.snappy" target="classFrame">SnappyError</A></FONT></TD>
+</TR>
+</TABLE>
+
+
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/package-summary.html b/wiki/apidocs/org/xerial/snappy/package-summary.html
new file mode 100644
index 0000000..d225e52
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/package-summary.html
@@ -0,0 +1,284 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+org.xerial.snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="org.xerial.snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-use.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV PACKAGE 
+ NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/package-summary.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<H2>
+Package org.xerial.snappy
+</H2>
+Snappy API for compressing/decompressing data.
+<P>
+<B>See:</B>
+<BR>
+          <A HREF="#package_description"><B>Description</B></A>
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Interface Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy">SnappyNativeAPI</A></B></TD>
+<TD><b>Internal only - Do not use this class.</b>
+ 
+ Interface to access the native code of Snappy.</TD>
+</TR>
+</TABLE>
+ 
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy">OSInfo</A></B></TD>
+<TD>Provides OS name and architecture name.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy">Snappy</A></B></TD>
+<TD>Snappy API for data compression/decompression</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy">SnappyBundleActivator</A></B></TD>
+<TD>OSGi bundle entry point</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy">SnappyCodec</A></B></TD>
+<TD>Preamble header for <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy">SnappyInputStream</A></B></TD>
+<TD>A stream filter for reading data compressed by <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy">SnappyLoader</A></B></TD>
+<TD><b>Internal only - Do not use this class.</b> This class loads a native
+ library of snappy-java (snappyjava.dll, libsnappy.so, etc.) according to the
+ user platform (<i>os.name</i> and <i>os.arch</i>).</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy">SnappyNative</A></B></TD>
+<TD><b>Internal only - Do not use this class.</b> JNI interface of the
+ <A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><CODE>SnappyNativeAPI</CODE></A> implementation.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy">SnappyOutputStream</A></B></TD>
+<TD>This class implements a stream filter for writing compressed data using
+ Snappy.</TD>
+</TR>
+</TABLE>
+ 
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Enum Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A></B></TD>
+<TD>Error codes of snappy-java</TD>
+</TR>
+</TABLE>
+ 
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Exception Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">SnappyException</A></B></TD>
+<TD><B>Deprecated.</B> <I>Snappy-java now uses <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io"><CODE>IOException</CODE></A></I></TD>
+</TR>
+</TABLE>
+ 
+
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Error Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">SnappyError</A></B></TD>
+<TD>Used when serious errors (unchecked exception) are observed.</TD>
+</TR>
+</TABLE>
+ 
+
+<P>
+<A NAME="package_description"><!-- --></A><H2>
+Package org.xerial.snappy Description
+</H2>
+
+<P>
+Snappy API for compressing/decompressing data.
+ 
+ Usage
+ First, import <A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><CODE>Snappy</CODE></A> in your Java code:
+ <code>
+ <pre>
+ import org.xerial.snappy.Snappy;
+ </pre>
+ </code>
+ Then use <A HREF="../../../org/xerial/snappy/Snappy.html#compress(byte[])"><CODE>Snappy.compress(byte[])</CODE></A> and <A HREF="../../../org/xerial/snappy/Snappy.html#uncompress(byte[])"><CODE>Snappy.uncompress(byte[])</CODE></A>:
+ <code>
+ <pre>
+ String input = "Hello snappy-java! Snappy-java is a JNI-based wrapper of Snappy, a fast compresser/decompresser.";
+ byte[] compressed = Snappy.compress(input.getBytes("UTF-8"));
+ byte[] uncompressed = Snappy.uncompress(compressed);
+ String result = new String(uncompressed, "UTF-8");
+ System.out.println(result);
+ </pre>
+ </code>
+ 
+ <p>In addition, high-level methods (Snappy.compress(String), Snappy.compress(float[] ..) etc. ) and low-level ones (e.g. Snappy.rawCompress(.. ), Snappy.rawUncompress(..), etc.), which minimize memory copies, can be used. </p>
+ 
+ <h3>Stream-based API</h3>
+ Stream-based compressor/decompressor SnappyOutputStream, SnappyInputStream are also available for reading/writing large data sets.
+<P>
+
+<P>
+<DL>
+</DL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-use.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV PACKAGE 
+ NEXT PACKAGE</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/package-summary.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="package-summary.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/package-tree.html b/wiki/apidocs/org/xerial/snappy/package-tree.html
new file mode 100644
index 0000000..6fd1716
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/package-tree.html
@@ -0,0 +1,179 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+org.xerial.snappy Class Hierarchy (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="org.xerial.snappy Class Hierarchy (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/package-tree.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For Package org.xerial.snappy
+</H2>
+</CENTER>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><B>Object</B></A><UL>
+<LI TYPE="circle">java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io"><B>InputStream</B></A> (implements java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</A>)
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><B>SnappyInputStream</B></A></UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy"><B>OSInfo</B></A><LI TYPE="circle">java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io"><B>OutputStream</B></A> (implements java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeabl [...]
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><B>SnappyOutputStream</B></A></UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><B>Snappy</B></A><LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><B>SnappyBundleActivator</B></A> (implements org.osgi.framework.BundleActivator)
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><B>SnappyCodec</B></A><LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><B>SnappyLoader</B></A><LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><B>SnappyNative</B></A> (implements org.xerial.snappy.<A HREF="../../. [...]
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang"><B>Throwable</B></A> (implements java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</A>)
+<UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang"><B>Error</B></A><UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><B>SnappyError</B></A></UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang"><B>Exception</B></A><UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><B>SnappyException</B></A></UL>
+</UL>
+</UL>
+</UL>
+<H2>
+Interface Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><B>SnappyNativeAPI</B></A></UL>
+<H2>
+Enum Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><B>Object</B></A><UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><B>Enum</B></A><E> (implements java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</A><T>, java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html?is-external=true" titl [...]
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="../../../org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><B>SnappyErrorCode</B></A></UL>
+</UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/package-tree.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="package-tree.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/org/xerial/snappy/package-use.html b/wiki/apidocs/org/xerial/snappy/package-use.html
new file mode 100644
index 0000000..e7f2c76
--- /dev/null
+++ b/wiki/apidocs/org/xerial/snappy/package-use.html
@@ -0,0 +1,176 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Uses of Package org.xerial.snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Package org.xerial.snappy (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/package-use.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="package-use.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Package<br>org.xerial.snappy</B></H2>
+</CENTER>
+<A NAME="org.xerial.snappy"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Classes in <A HREF="../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A> used by <A HREF="../../../org/xerial/snappy/package-summary.html">org.xerial.snappy</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../org/xerial/snappy/class-use/SnappyCodec.html#org.xerial.snappy"><B>SnappyCodec</B></A></B>
+
+<BR>
+          Preamble header for <A HREF="../../../org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><CODE>SnappyOutputStream</CODE></A>.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../org/xerial/snappy/class-use/SnappyErrorCode.html#org.xerial.snappy"><B>SnappyErrorCode</B></A></B>
+
+<BR>
+          Error codes of snappy-java</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../org/xerial/snappy/class-use/SnappyException.html#org.xerial.snappy"><B>SnappyException</B></A></B>
+
+<BR>
+          <B>Deprecated.</B> <I>Snappy-java now uses <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io"><CODE>IOException</CODE></A></I></TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../org/xerial/snappy/class-use/SnappyNativeAPI.html#org.xerial.snappy"><B>SnappyNativeAPI</B></A></B>
+
+<BR>
+          <b>Internal only - Do not use this class.</b>
+ 
+ Interface to access the native code of Snappy.</TD>
+</TR>
+</TABLE>
+ 
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../index.html?org/xerial/snappy/package-use.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="package-use.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/overview-tree.html b/wiki/apidocs/overview-tree.html
new file mode 100644
index 0000000..0fe4f1d
--- /dev/null
+++ b/wiki/apidocs/overview-tree.html
@@ -0,0 +1,181 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Class Hierarchy (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Class Hierarchy (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+Hierarchy For All Packages</H2>
+</CENTER>
+<DL>
+<DT><B>Package Hierarchies:</B><DD><A HREF="org/xerial/snappy/package-tree.html">org.xerial.snappy</A></DL>
+<HR>
+<H2>
+Class Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><B>Object</B></A><UL>
+<LI TYPE="circle">java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/InputStream.html?is-external=true" title="class or interface in java.io"><B>InputStream</B></A> (implements java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</A>)
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyInputStream.html" title="class in org.xerial.snappy"><B>SnappyInputStream</B></A></UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/OSInfo.html" title="class in org.xerial.snappy"><B>OSInfo</B></A><LI TYPE="circle">java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io"><B>OutputStream</B></A> (implements java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</A>, ja [...]
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyOutputStream.html" title="class in org.xerial.snappy"><B>SnappyOutputStream</B></A></UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/Snappy.html" title="class in org.xerial.snappy"><B>Snappy</B></A><LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyBundleActivator.html" title="class in org.xerial.snappy"><B>SnappyBundleActivator</B></A> (implements org.osgi.framework.BundleActivator)
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyCodec.html" title="class in org.xerial.snappy"><B>SnappyCodec</B></A><LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyLoader.html" title="class in org.xerial.snappy"><B>SnappyLoader</B></A><LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyNative.html" title="class in org.xerial.snappy"><B>SnappyNative</B></A> (implements org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyNativeAPI. [...]
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang"><B>Throwable</B></A> (implements java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</A>)
+<UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang"><B>Error</B></A><UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy"><B>SnappyError</B></A></UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang"><B>Exception</B></A><UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy"><B>SnappyException</B></A></UL>
+</UL>
+</UL>
+</UL>
+<H2>
+Interface Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyNativeAPI.html" title="interface in org.xerial.snappy"><B>SnappyNativeAPI</B></A></UL>
+<H2>
+Enum Hierarchy
+</H2>
+<UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><B>Object</B></A><UL>
+<LI TYPE="circle">java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><B>Enum</B></A><E> (implements java.lang.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</A><T>, java.io.<A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html?is-external=true" titl [...]
+<UL>
+<LI TYPE="circle">org.xerial.snappy.<A HREF="org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy"><B>SnappyErrorCode</B></A></UL>
+</UL>
+</UL>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev">  <FONT CLASS="NavBarFont1Rev"><B>Tree</B></FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?overview-tree.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="overview-tree.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/package-list b/wiki/apidocs/package-list
new file mode 100644
index 0000000..f511398
--- /dev/null
+++ b/wiki/apidocs/package-list
@@ -0,0 +1 @@
+org.xerial.snappy
diff --git a/wiki/apidocs/resources/inherit.gif b/wiki/apidocs/resources/inherit.gif
new file mode 100644
index 0000000..c814867
Binary files /dev/null and b/wiki/apidocs/resources/inherit.gif differ
diff --git a/wiki/apidocs/serialized-form.html b/wiki/apidocs/serialized-form.html
new file mode 100644
index 0000000..3f6319f
--- /dev/null
+++ b/wiki/apidocs/serialized-form.html
@@ -0,0 +1,211 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0_21) on Mon Sep 26 23:28:31 JST 2011 -->
+<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<TITLE>
+Serialized Form (Snappy for Java 1.0.4.1-SNAPSHOT API)
+</TITLE>
+
+<META NAME="date" CONTENT="2011-09-26">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Serialized Form (Snappy for Java 1.0.4.1-SNAPSHOT API)";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?serialized-form.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="serialized-form.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H1>
+Serialized Form</H1>
+</CENTER>
+<HR SIZE="4" NOSHADE>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="center"><FONT SIZE="+2">
+<B>Package</B> <B>org.xerial.snappy</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<A NAME="org.xerial.snappy.SnappyError"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class <A HREF="org/xerial/snappy/SnappyError.html" title="class in org.xerial.snappy">org.xerial.snappy.SnappyError</A> extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Error.html?is-external=true" title="class or interface in java.lang">Error</A> implements Serializable</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<B>serialVersionUID: </B>1L
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TH>
+</TR>
+</TABLE>
+
+<H3>
+errorCode</H3>
+<PRE>
+<A HREF="org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>errorCode</B></PRE>
+<DL>
+<DL>
+</DL>
+</DL>
+
+<P>
+<A NAME="org.xerial.snappy.SnappyException"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Class <A HREF="org/xerial/snappy/SnappyException.html" title="class in org.xerial.snappy">org.xerial.snappy.SnappyException</A> extends <A HREF="http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</A> implements Serializable</B></FONT></TH>
+</TR>
+</TABLE>
+
+<P>
+<B>serialVersionUID: </B>1L
+
+<P>
+<A NAME="serializedForm"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Serialized Fields</B></FONT></TH>
+</TR>
+</TABLE>
+
+<H3>
+errorCode</H3>
+<PRE>
+<A HREF="org/xerial/snappy/SnappyErrorCode.html" title="enum in org.xerial.snappy">SnappyErrorCode</A> <B>errorCode</B></PRE>
+<DL>
+<DD><B>Deprecated.</B> <DL>
+</DL>
+</DL>
+
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Class</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <FONT CLASS="NavBarFont1">Use</FONT> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="org/xerial/snappy/package-tree.html"><FONT CLASS="NavBarFont1"><B>Tree</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="index-all.html"><FONT CLASS="NavBarFont1"><B>Index</B></FONT></A> </TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A> </TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+ PREV 
+ NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="index.html?serialized-form.html" target="_top"><B>FRAMES</B></A>   
+ <A HREF="serialized-form.html" target="_top"><B>NO FRAMES</B></A>   
+ <SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+Copyright © 2011 <a href="http://www.xerial.org/">xerial.org</a>. All Rights Reserved.
+</BODY>
+</HTML>
diff --git a/wiki/apidocs/stylesheet.css b/wiki/apidocs/stylesheet.css
new file mode 100644
index 0000000..2683c03
--- /dev/null
+++ b/wiki/apidocs/stylesheet.css
@@ -0,0 +1,36 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { background-color: #FFFFFF; color:#000000; font-family: Arial, sans-serif; }
+
+code { font-family: mono-space, Arial, sans-serif; }
+
+/* Headings */
+h1 { font-size: 145% }
+
+a:link { color: #006699; }
+a:hover { color: #6699CC; } 
+a:active { color: #6699CC; }
+a:visited { color: #333366; }
+ 
+/* Table colors */
+.TableHeadingColor     { background: #3399CC; color:#FFFFFF } /* Dark mauve */
+.TableSubHeadingColor  { background: #EEEEFF; color:#000000 } /* Light mauve */
+.TableRowColor         { background: #FFFFFF; color:#000000 } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont   { font-size: 100%; font-family: Arial, sans-serif; color:#000000 }
+.FrameHeadingFont { font-size:  90%; font-family: Arial, sans-serif; color:#000000 }
+.FrameItemFont    { font-size:  90%; font-family: Arial, sans-serif; color:#000000 }
+
+/* Navigation bar fonts and colors */
+.NavBarCell1    { background-color:#EEEEFF; color:#000000} /* Light mauve */
+.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */
+.NavBarFont1    { font-family: Arial, sans-serif; color:#000000;color:#000000;}
+.NavBarFont1Rev { font-family: Arial, sans-serif; color:#FFFFFF;color:#FFFFFF;}
+
+.NavBarCell2    { font-family: Arial, sans-serif; background-color:#FFFFFF; color:#000000}
+.NavBarCell3    { font-family: Arial, sans-serif; background-color:#FFFFFF; color:#000000}
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/snappy-java.git



More information about the pkg-java-commits mailing list