summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2003-04-29 10:12:15 +0000
committerBruno Haible <bruno@clisp.org>2009-06-23 12:10:24 +0200
commitcde7e9fa958cdb60d1762921d4704c6b1c3e2504 (patch)
treed5003e47cbac8839b22dbf9ee20723b141a42472
parentb6d32da76eb3a2aebea75850c5696c0122cfa385 (diff)
downloadgettext-cde7e9fa958cdb60d1762921d4704c6b1c3e2504.tar.gz
Support Java .properties files as alternative syntax, like PO files.
-rw-r--r--NEWS7
-rw-r--r--gettext-tools/doc/ChangeLog20
-rw-r--r--gettext-tools/doc/gettext.texi30
-rw-r--r--gettext-tools/doc/msgattrib.texi20
-rw-r--r--gettext-tools/doc/msgcat.texi20
-rw-r--r--gettext-tools/doc/msgcmp.texi12
-rw-r--r--gettext-tools/doc/msgcomm.texi20
-rw-r--r--gettext-tools/doc/msgconv.texi20
-rw-r--r--gettext-tools/doc/msgen.texi20
-rw-r--r--gettext-tools/doc/msgexec.texi12
-rw-r--r--gettext-tools/doc/msgfilter.texi20
-rw-r--r--gettext-tools/doc/msgfmt.texi12
-rw-r--r--gettext-tools/doc/msggrep.texi20
-rw-r--r--gettext-tools/doc/msginit.texi20
-rw-r--r--gettext-tools/doc/msgmerge.texi20
-rw-r--r--gettext-tools/doc/msgunfmt.texi8
-rw-r--r--gettext-tools/doc/msguniq.texi20
-rw-r--r--gettext-tools/doc/xgettext.texi9
-rw-r--r--gettext-tools/src/ChangeLog121
-rw-r--r--gettext-tools/src/FILES10
-rw-r--r--gettext-tools/src/Makefile.am23
-rw-r--r--gettext-tools/src/Makefile.msvc8
-rw-r--r--gettext-tools/src/Makefile.vms8
-rw-r--r--gettext-tools/src/message.c1
-rw-r--r--gettext-tools/src/message.h3
-rw-r--r--gettext-tools/src/msgattrib.c19
-rw-r--r--gettext-tools/src/msgcat.c26
-rw-r--r--gettext-tools/src/msgcmp.c12
-rw-r--r--gettext-tools/src/msgcomm.c19
-rw-r--r--gettext-tools/src/msgconv.c31
-rw-r--r--gettext-tools/src/msgen.c19
-rw-r--r--gettext-tools/src/msgexec.c13
-rw-r--r--gettext-tools/src/msgfilter.c20
-rw-r--r--gettext-tools/src/msgfmt.c31
-rw-r--r--gettext-tools/src/msggrep.c19
-rw-r--r--gettext-tools/src/msginit.c19
-rw-r--r--gettext-tools/src/msgl-cat.c20
-rw-r--r--gettext-tools/src/msgl-iconv.c3
-rw-r--r--gettext-tools/src/msgmerge.c29
-rw-r--r--gettext-tools/src/msgunfmt.c9
-rw-r--r--gettext-tools/src/msguniq.c19
-rw-r--r--gettext-tools/src/po-gram-gen.y20
-rw-r--r--gettext-tools/src/po-lex.c7
-rw-r--r--gettext-tools/src/read-po-abstract.c54
-rw-r--r--gettext-tools/src/read-po-abstract.h21
-rw-r--r--gettext-tools/src/read-po.c23
-rw-r--r--gettext-tools/src/read-po.h9
-rw-r--r--gettext-tools/src/read-properties.c543
-rw-r--r--gettext-tools/src/read-properties.h30
-rw-r--r--gettext-tools/src/write-java.c4
-rw-r--r--gettext-tools/src/write-java.h3
-rw-r--r--gettext-tools/src/write-po.c142
-rw-r--r--gettext-tools/src/write-po.h2
-rw-r--r--gettext-tools/src/write-properties.c291
-rw-r--r--gettext-tools/src/write-properties.h33
-rw-r--r--gettext-tools/src/write-tcl.c4
-rw-r--r--gettext-tools/src/write-tcl.h4
-rw-r--r--gettext-tools/src/x-po.c36
-rw-r--r--gettext-tools/src/x-properties.h29
-rw-r--r--gettext-tools/src/xgettext.c17
-rw-r--r--gettext-tools/src/xgettext.h4
-rw-r--r--gettext-tools/tests/ChangeLog22
-rw-r--r--gettext-tools/tests/Makefile.am31
-rwxr-xr-xgettext-tools/tests/msgattrib-1560
-rwxr-xr-xgettext-tools/tests/msgcat-1142
-rwxr-xr-xgettext-tools/tests/msgcat-1227
-rwxr-xr-xgettext-tools/tests/msgcmp-341
-rwxr-xr-xgettext-tools/tests/msgcomm-2439
-rwxr-xr-xgettext-tools/tests/msgconv-427
-rwxr-xr-xgettext-tools/tests/msgen-237
-rwxr-xr-xgettext-tools/tests/msgexec-393
-rwxr-xr-xgettext-tools/tests/msgfilter-397
-rwxr-xr-xgettext-tools/tests/msgfmt-1361
-rwxr-xr-xgettext-tools/tests/msggrep-6155
-rwxr-xr-xgettext-tools/tests/msgmerge-2360
-rwxr-xr-xgettext-tools/tests/msgmerge-2440
-rwxr-xr-xgettext-tools/tests/msgunfmt-443
-rwxr-xr-xgettext-tools/tests/msguniq-424
-rw-r--r--gettext-tools/tests/msguniq-a.inp4286
-rwxr-xr-xgettext-tools/tests/xgettext-2482
80 files changed, 7162 insertions, 173 deletions
diff --git a/NEWS b/NEWS
index c195c5d39..8a518f1d2 100644
--- a/NEWS
+++ b/NEWS
@@ -20,6 +20,13 @@ Version 0.12-pre1 - February 2003
C format strings in C++. This is needed for proper internationalization
of C++ programs.
+ - Java
+
+ All the tools that manipulate PO files can work with .properties files
+ as well, if given the --properties-input and/or --properties-output
+ option. To create a .properties file from a PO or POT file, use
+ "msgcat --properties-output".
+
- Smalltalk
xgettext now also supports Smalltalk.
diff --git a/gettext-tools/doc/ChangeLog b/gettext-tools/doc/ChangeLog
index 96fd1fba2..34d00b152 100644
--- a/gettext-tools/doc/ChangeLog
+++ b/gettext-tools/doc/ChangeLog
@@ -1,5 +1,25 @@
2003-04-22 Bruno Haible <bruno@clisp.org>
+ * gettext.texi (Java): Document how to use .properties files.
+ * msgattrib.texi: Document options -P and -p.
+ * msgcat.texi: Likewise.
+ * msgcomm.texi: Likewise.
+ * msgconv.texi: Likewise.
+ * msgen.texi: Likewise.
+ * msgfilter.texi: Likewise.
+ * msggrep.texi: Likewise.
+ * msginit.texi: Likewise.
+ * msgmerge.texi: Likewise.
+ * msguniq.texi: Likewise.
+ * msgcmp.texI: Document option -P.
+ * msgexec.texi: Likewise.
+ * msgfmt.texi: Likewise.
+ * msgunfmt.texi: Document option -p.
+ * xgettext.texi: Document options -L JavaProperties and
+ --properties-output.
+
+2003-04-22 Bruno Haible <bruno@clisp.org>
+
* gettext.texi (Plural forms): Add info about Faroese.
Reported by Jacob Sparre Andersen <sparre@crs4.it>.
diff --git a/gettext-tools/doc/gettext.texi b/gettext-tools/doc/gettext.texi
index b35d07669..dbcfde499 100644
--- a/gettext-tools/doc/gettext.texi
+++ b/gettext-tools/doc/gettext.texi
@@ -7804,10 +7804,25 @@ applications. For example, @code{"file "+filename+" not found"} becomes
Only after this is done, can the strings be marked and extracted.
GNU gettext uses the native Java internationalization mechanism, namely
-@code{ResourceBundle}s. To convert a PO file to a ResourceBundle, the
-@code{msgfmt} program can be used with the option @code{--java} or
-@code{--java2}. To convert a ResourceBundle back to a PO file, the
-@code{msgunfmt} program can be used with the option @code{--java}.
+@code{ResourceBundle}s. There are two formats of @code{ResourceBundle}s:
+@code{.properties} files and @code{.class} files. The @code{.properties}
+format is a text file which the translators can directly edit, like PO
+files, but which doesn't support plural forms. Whereas the @code{.class}
+format is compiled from @code{.java} source code and can support plural
+forms (provided it is accessed through an appropriate API, see below).
+
+To convert a PO file to a @code{.properties} file, the @code{msgcat}
+program can be used with the option @code{--properties-output}. To convert
+a @code{.properties} file back to a PO file, the @code{msgcat} program
+can be used with the option @code{--properties-input}. All the tools
+that manipulate PO files can work with @code{.properties} files as well,
+if given the @code{--properties-input} and/or @code{--properties-output}
+option.
+
+To convert a PO file to a ResourceBundle class, the @code{msgfmt} program
+can be used with the option @code{--java} or @code{--java2}. To convert a
+ResourceBundle back to a PO file, the @code{msgunfmt} program can be used
+with the option @code{--java}.
Two different programmatic APIs can be used to access ResourceBundles.
Note that both APIs work with all kinds of ResourceBundles, whether
@@ -7822,9 +7837,10 @@ In particular, its @code{getString} function returns a string translation.
Note that a missing translation yields a @code{MissingResourceException}.
This has the advantage of being the standard API. And it does not require
-any additional libraries, only the @code{msgfmt} generated @code{.class}
-files. But it cannot do plural handling, even if the resource was generated
-from a PO file with plural handling.
+any additional libraries, only the @code{msgcat} generated @code{.properties}
+files or the @code{msgfmt} generated @code{.class} files. But it cannot do
+plural handling, even if the resource was generated by @code{msgfmt} from
+a PO file with plural handling.
@item
The @code{gnu.gettext.GettextResource} API.
diff --git a/gettext-tools/doc/msgattrib.texi b/gettext-tools/doc/msgattrib.texi
index 7f7bb232d..f4c31702b 100644
--- a/gettext-tools/doc/msgattrib.texi
+++ b/gettext-tools/doc/msgattrib.texi
@@ -118,6 +118,18 @@ obsolete messages and makes them non-obsolete.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgattrib} option}
+@opindex --properties-input@r{, @code{msgattrib} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -149,6 +161,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgattrib} option}
+@opindex --properties-output@r{, @code{msgattrib} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgattrib} option}
diff --git a/gettext-tools/doc/msgcat.texi b/gettext-tools/doc/msgcat.texi
index 795ced53f..0e61e18ba 100644
--- a/gettext-tools/doc/msgcat.texi
+++ b/gettext-tools/doc/msgcat.texi
@@ -82,6 +82,18 @@ printed.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgcat} option}
+@opindex --properties-input@r{, @code{msgcat} option}
+Assume the input files are Java ResourceBundles in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -124,6 +136,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgcat} option}
+@opindex --properties-output@r{, @code{msgcat} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgcat} option}
diff --git a/gettext-tools/doc/msgcmp.texi b/gettext-tools/doc/msgcmp.texi
index 9091cd485..80b7eee15 100644
--- a/gettext-tools/doc/msgcmp.texi
+++ b/gettext-tools/doc/msgcmp.texi
@@ -42,6 +42,18 @@ Apply @var{ref}.pot to each of the domains in @var{def}.po.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgcmp} option}
+@opindex --properties-input@r{, @code{msgcmp} option}
+Assume the input files are Java ResourceBundles in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Informative output
@table @samp
diff --git a/gettext-tools/doc/msgcomm.texi b/gettext-tools/doc/msgcomm.texi
index 79786193e..0ad42036a 100644
--- a/gettext-tools/doc/msgcomm.texi
+++ b/gettext-tools/doc/msgcomm.texi
@@ -80,6 +80,18 @@ printed.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgcomm} option}
+@opindex --properties-input@r{, @code{msgcomm} option}
+Assume the input files are Java ResourceBundles in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -111,6 +123,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgcomm} option}
+@opindex --properties-output@r{, @code{msgcomm} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgcomm} option}
diff --git a/gettext-tools/doc/msgconv.texi b/gettext-tools/doc/msgconv.texi
index c850263ef..814824413 100644
--- a/gettext-tools/doc/msgconv.texi
+++ b/gettext-tools/doc/msgconv.texi
@@ -53,6 +53,18 @@ Specify encoding for output.
The default encoding is the current locale's encoding.
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgconv} option}
+@opindex --properties-input@r{, @code{msgconv} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -82,6 +94,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgconv} option}
+@opindex --properties-output@r{, @code{msgconv} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgconv} option}
diff --git a/gettext-tools/doc/msgen.texi b/gettext-tools/doc/msgen.texi
index fceb8913b..bc8e47e85 100644
--- a/gettext-tools/doc/msgen.texi
+++ b/gettext-tools/doc/msgen.texi
@@ -46,6 +46,18 @@ Write output to specified file.
The results are written to standard output if no output file is specified
or if it is @samp{-}.
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgen} option}
+@opindex --properties-input@r{, @code{msgen} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -75,6 +87,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgen} option}
+@opindex --properties-output@r{, @code{msgen} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgen} option}
diff --git a/gettext-tools/doc/msgexec.texi b/gettext-tools/doc/msgexec.texi
index e060f0c48..7163fa40f 100644
--- a/gettext-tools/doc/msgexec.texi
+++ b/gettext-tools/doc/msgexec.texi
@@ -56,6 +56,18 @@ file will be written relative to the current directory, though.
If no @var{inputfile} is given or if it is @samp{-}, standard input is read.
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgexec} option}
+@opindex --properties-input@r{, @code{msgexec} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Informative output
@table @samp
diff --git a/gettext-tools/doc/msgfilter.texi b/gettext-tools/doc/msgfilter.texi
index 1431c15b7..3b30525be 100644
--- a/gettext-tools/doc/msgfilter.texi
+++ b/gettext-tools/doc/msgfilter.texi
@@ -94,6 +94,18 @@ Suppress automatic printing of pattern space.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgfilter} option}
+@opindex --properties-input@r{, @code{msgfilter} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -127,6 +139,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgfilter} option}
+@opindex --properties-output@r{, @code{msgfilter} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgfilter} option}
diff --git a/gettext-tools/doc/msgfmt.texi b/gettext-tools/doc/msgfmt.texi
index 6de0b046b..144436856 100644
--- a/gettext-tools/doc/msgfmt.texi
+++ b/gettext-tools/doc/msgfmt.texi
@@ -116,6 +116,18 @@ Specify the base directory of @file{.msg} message catalogs.
The @samp{-l} and @samp{-d} options are mandatory. The @file{.msg} file is
written in the specified directory.
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgfmt} option}
+@opindex --properties-input@r{, @code{msgfmt} option}
+Assume the input files are Java ResourceBundles in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Input file interpretation
@table @samp
diff --git a/gettext-tools/doc/msggrep.texi b/gettext-tools/doc/msggrep.texi
index 0e7e19336..b8dfe5ff5 100644
--- a/gettext-tools/doc/msggrep.texi
+++ b/gettext-tools/doc/msggrep.texi
@@ -133,6 +133,18 @@ Ignore case distinctions.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msggrep} option}
+@opindex --properties-input@r{, @code{msggrep} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -160,6 +172,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msggrep} option}
+@opindex --properties-output@r{, @code{msggrep} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msggrep} option}
diff --git a/gettext-tools/doc/msginit.texi b/gettext-tools/doc/msginit.texi
index 96aa34a87..e2f539174 100644
--- a/gettext-tools/doc/msginit.texi
+++ b/gettext-tools/doc/msginit.texi
@@ -38,6 +38,18 @@ If no output file is given, it depends on the @samp{--locale} option or the
user's locale setting. If it is @samp{-}, the results are written to
standard output.
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msginit} option}
+@opindex --properties-input@r{, @code{msginit} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@table @samp
@@ -54,6 +66,14 @@ of all installed locales. The default is the user's locale setting.
Declares that the PO file will not have a human translator and is instead
automatically generated.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msginit} option}
+@opindex --properties-output@r{, @code{msginit} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msginit} option}
diff --git a/gettext-tools/doc/msgmerge.texi b/gettext-tools/doc/msgmerge.texi
index 1832e85e0..d2830d073 100644
--- a/gettext-tools/doc/msgmerge.texi
+++ b/gettext-tools/doc/msgmerge.texi
@@ -128,6 +128,18 @@ Do not use fuzzy matching when an exact match is not found. This may speed
up the operation considerably.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msgmerge} option}
+@opindex --properties-input@r{, @code{msgmerge} option}
+Assume the input files are Java ResourceBundles in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -157,6 +169,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgmerge} option}
+@opindex --properties-output@r{, @code{msgmerge} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgmerge} option}
diff --git a/gettext-tools/doc/msgunfmt.texi b/gettext-tools/doc/msgunfmt.texi
index a0051bbb4..afd4f19bc 100644
--- a/gettext-tools/doc/msgunfmt.texi
+++ b/gettext-tools/doc/msgunfmt.texi
@@ -110,6 +110,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msgunfmt} option}
+@opindex --properties-output@r{, @code{msgunfmt} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msgunfmt} option}
diff --git a/gettext-tools/doc/msguniq.texi b/gettext-tools/doc/msguniq.texi
index eb3707f01..42c897ebb 100644
--- a/gettext-tools/doc/msguniq.texi
+++ b/gettext-tools/doc/msguniq.texi
@@ -66,6 +66,18 @@ Print only unique messages, discard duplicates.
@end table
+@subsection Input file syntax
+
+@table @samp
+@item -P
+@itemx --properties-input
+@opindex -P@r{, @code{msguniq} option}
+@opindex --properties-input@r{, @code{msguniq} option}
+Assume the input file is a Java ResourceBundle in Java @code{.properties}
+syntax, not in PO file syntax.
+
+@end table
+
@subsection Output details
@c --no-escape and --escape omitted on purpose. They are not useful.
@@ -108,6 +120,14 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item -p
+@itemx --properties-output
+@opindex -p@r{, @code{msguniq} option}
+@opindex --properties-output@r{, @code{msguniq} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{msguniq} option}
diff --git a/gettext-tools/doc/xgettext.texi b/gettext-tools/doc/xgettext.texi
index 425672c89..959456296 100644
--- a/gettext-tools/doc/xgettext.texi
+++ b/gettext-tools/doc/xgettext.texi
@@ -71,7 +71,8 @@ is written to standard output.
Specifies the language of the input files. The supported languages
are @code{C}, @code{C++}, @code{ObjectiveC}, @code{PO}, @code{Python},
@code{Lisp}, @code{EmacsLisp}, @code{librep}, @code{Smalltalk}, @code{Java},
-@code{awk}, @code{YCP}, @code{Tcl}, @code{PHP}, @code{RST}, @code{Glade}.
+@code{JavaProperties}, @code{awk}, @code{YCP}, @code{Tcl}, @code{PHP},
+@code{RST}, @code{Glade}.
@item -C
@itemx --c++
@@ -210,6 +211,12 @@ Write out a strict Uniforum conforming PO file. Note that this
Uniforum format should be avoided because it doesn't support the
GNU extensions.
+@item --properties-output
+@opindex --properties-output@r{, @code{xgettext} option}
+Write out a Java ResourceBundle in Java @code{.properties} syntax. Note
+that this file format doesn't support plural forms and silently drops
+obsolete messages.
+
@item -w @var{number}
@itemx --width=@var{number}
@opindex -w@r{, @code{xgettext} option}
diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog
index 7fde60e23..6d1948d29 100644
--- a/gettext-tools/src/ChangeLog
+++ b/gettext-tools/src/ChangeLog
@@ -1,3 +1,124 @@
+2003-04-26 Bruno Haible <bruno@clisp.org>
+
+ * message.h (msgdomain_list_ty): Add field 'encoding'.
+ * message.c (msgdomain_list_alloc): Initialize it.
+ * read-properties.h: New file.
+ * read-properties.c: New file.
+ * read-po-abstract.h (abstract_po_reader_class_ty): In
+ directive_message field, add force_fuzzy argument.
+ (po_scan_start, po_scan_end): Remove declarations.
+ (input_syntax_ty): New type.
+ (po_callback_message): Add force_fuzzy argument.
+ * read-po-abstract.c (call_directive_message, po_callback_message):
+ Add force_fuzzy argument.
+ (po_scan_start, po_scan_end): Make static.
+ (po_scan): Add support for syntax_properties. Move
+ error_message_count handling to here.
+ (po_callback_message): Move po_lex_charset_set invocation away.
+ * read-po.h (default_po_reader_class_ty): In add_message field, add
+ force_fuzzy argument.
+ (default_directive_message, default_add_message): Add force_fuzzy
+ argument.
+ (inout_syntax): New declaration.
+ * read-po.c (call_add_message): Add force_fuzzy argument.
+ (default_directive_message, default_add_message): Likewise.
+ (input_syntax): New variable.
+ (read_po): Pass input_syntax to po_scan(). Set mdlp->encoding if
+ possible.
+ * po-gram-gen.y: Pass force_fuzzy = false.
+ (do_callback_message): New function. Move po_lex_charset_set
+ invocation to here.
+ * po-lex.c (lex_end): Move error_message_count handling away.
+ * write-properties.h: New file.
+ * write-properties.c: New file.
+ * write-po.h (message_print_syntax_properties): New declaration.
+ * write-po.c (use_syntax_properties): New variable.
+ (message_print_syntax_properties): New function.
+ (msgdomain_list_print_po): New function, extracted from
+ msgdomain_list_print.
+ (msgdomain_list_print): Add check for plural forms. Add support for
+ writing the .properties format.
+ (extract_po): Renamed from extract.
+ * write-java.h (msgdomain_write_java): Add canon_encoding argument.
+ * write-java.c (msgdomain_write_java): Likewise.
+ * write-tcl.h (msgdomain_write_tcl): Likewise.
+ * write-tcl.c (msgdomain_write_tcl): Likewise.
+ * msgl-cat.c (catenate_msgdomain_list): Use mdlp->encoding if there
+ is no header entry. Set total_mdlp->encoding if possible.
+ * msgl-iconv.c (iconv_msgdomain_list): Use mdlp->encoding if there
+ is no header entry. Set mdlp->encoding.
+ * msgattrib.c (long_options): Add --properties-input/output.
+ (main): Handle them.
+ (usage): Document options -P and -p.
+ * msgcat.c (long_options): Add --properties-input/output.
+ (main): Handle them. If option -p is used, convert to UTF-8 and
+ ignore the to_code.
+ (usage): Document options -P and -p.
+ * msgcomm.c (long_options): Add --properties-input/output.
+ (main): Handle them.
+ (usage): Document options -P and -p.
+ * msgconv.c (long_options): Add --properties-input/output.
+ (main): Handle them. If option -p is used, ignore the to_code.
+ (usage): Document options -P and -p.
+ * msgen.c (long_options): Add --properties-input/output.
+ (main): Handle them.
+ (usage): Document options -P and -p.
+ * msgfilter.c (long_options): Add --properties-input/output.
+ (main): Handle them.
+ (usage): Document options -P and -p.
+ * msggrep.c (long_options): Add --properties-input/output.
+ (main): Handle them.
+ (usage): Document options -P and -p.
+ * msginit.c (long_options): Add --properties-input/output.
+ (main): Handle them.
+ (usage): Document options -P and -p.
+ * msgmerge.c (long_options): Add --properties-input/output.
+ (main): Handle them. In update mode, --properties-input implies
+ --properties-output.
+ (usage): Document options -P and -p.
+ (merge): Set result->encoding if possible.
+ * msguniq.c (long_options): Add --properties-input/output.
+ (main): Handle them.
+ (usage): Document options -P and -p.
+ * msgcmp.c (long_options): Add --properties-input.
+ (main): Handle it.
+ (usage): Document option -P.
+ * msgexec.c (long_options): Add --properties-input.
+ (main): Handle it.
+ (usage): Document option -P.
+ * msgfmt.c (long_options): Add --properties-input.
+ (main): Handle it. Pass the known canon_encoding to
+ msgdomain_write_java and msgdomain_write_tcl.
+ (usage): Document option -P.
+ (msgfmt_add_message): Add force_fuzzy argument.
+ (read_po_file_msgfmt): Pass input_syntax to po_scan().
+ * msgunfmt.c (long_options): Add --properties-output.
+ (main): Handle it.
+ (usage): Document option -p.
+ * x-properties.h: New file.
+ * x-po.c (extract_add_message): Add force_fuzzy argument.
+ (extract): Renamed from extract_po. Pass input_syntax to po_scan().
+ (extract_po): New function.
+ (extract_properties): New function.
+ * xgettext.h: Include read-po.h.
+ * xgettext.c (long_options): Add --properties-output.
+ (main): Handle it.
+ (usage): Document options -L JavaProperties and --properties-output.
+ (exclude_directive_message): Add force_fuzzy argument.
+ (read_exclusion_file): Pass input_syntax to po_scan().
+ (table): Add support for .properties format.
+ * Makefile.am (noinst_HEADERS): Add read-properties.h,
+ write-properties.h, x-properties.h.
+ (COMMON_SOURCE): Add read-properties.c.
+ (libgettextsrc_la_SOURCES): Add write-properties.c.
+ * Makefile.msvc (OBJECTS): Add read-properties.obj,
+ write-properties.obj.
+ (read-properties.obj, write-properties.obj): New rules.
+ * Makefile.vms (OBJECTS): Add read-properties.obj,
+ write-properties.obj.
+ (read-properties.obj, write-properties.obj): New rules.
+ * FILES: Update.
+
2003-04-21 Bruno Haible <bruno@clisp.org>
* read-po-abstract.h (po_scan_file): Remove declaration.
diff --git a/gettext-tools/src/FILES b/gettext-tools/src/FILES
index d8b35fa2f..6f9c17a0f 100644
--- a/gettext-tools/src/FILES
+++ b/gettext-tools/src/FILES
@@ -35,6 +35,9 @@ msgl-ascii.c
write-po.h
write-po.c
Output of a list-of-messages to a PO file.
+write-properties.h
+write-properties.c
+ Output of a list-of-messages to a Java .properties file.
+-------------- Reading PO files
| open-po.h
@@ -54,8 +57,10 @@ write-po.c
| po-hash-gen.y
| po-gram.h
| po-gram-gen.y
+| read-properties.h
+| read-properties.c
| read-po-abstract.c
-| Parsing of PO files.
+| Parsing of PO files and Java .properties files.
| read-po-abstract.h
| General parser structure.
| po-hash.h
@@ -65,6 +70,9 @@ write-po.c
| po-gram.h
| po-gram-gen.y
| Parsing of PO files, based on po-lex.{h,c}.
+| read-properties.h
+| read-properties.c
+| Parsing of Java .properties files.
| read-po-abstract.c
| Top-level parser functions and callbacks.
|
diff --git a/gettext-tools/src/Makefile.am b/gettext-tools/src/Makefile.am
index 15103e822..4c1d99b9e 100644
--- a/gettext-tools/src/Makefile.am
+++ b/gettext-tools/src/Makefile.am
@@ -35,13 +35,14 @@ lib_LTLIBRARIES = libgettextsrc.la libgettextpo.la
include_HEADERS = gettext-po.h
noinst_HEADERS = pos.h message.h po-gram.h po-hash.h po-charset.h po-lex.h \
-open-po.h read-po-abstract.h read-po.h str-list.h write-po.h dir-list.h \
-file-list.h po-gram-gen.h po-gram-gen2.h po-hash-gen.h msgl-charset.h \
-msgl-equal.h msgl-iconv.h msgl-ascii.h msgl-cat.h msgl-english.h msgfmt.h \
-msgunfmt.h read-mo.h write-mo.h read-java.h write-java.h read-tcl.h \
-write-tcl.h po-time.h plural-table.h format.h xgettext.h x-c.h x-po.h \
-x-python.h x-lisp.h x-elisp.h x-librep.h x-smalltalk.h x-java.h x-awk.h \
-x-ycp.h x-tcl.h x-php.h x-rst.h x-glade.h
+open-po.h read-po-abstract.h read-po.h read-properties.h str-list.h \
+write-po.h write-properties.h dir-list.h file-list.h po-gram-gen.h \
+po-gram-gen2.h po-hash-gen.h msgl-charset.h msgl-equal.h msgl-iconv.h \
+msgl-ascii.h msgl-cat.h msgl-english.h msgfmt.h msgunfmt.h read-mo.h \
+write-mo.h read-java.h write-java.h read-tcl.h write-tcl.h po-time.h \
+plural-table.h format.h xgettext.h x-c.h x-po.h x-python.h x-lisp.h x-elisp.h \
+x-librep.h x-smalltalk.h x-java.h x-properties.h x-awk.h x-ycp.h x-tcl.h \
+x-php.h x-rst.h x-glade.h
EXTRA_DIST += FILES project-id ChangeLog.0
@@ -86,7 +87,7 @@ JAVACOMP = $(SHELL) ../lib/javacomp.sh
# (read-po-abstract.c <--> po-hash-gen.y <--> po-gram-gen.y <--> po-lex.c) -> message.c -> str-list.c.
COMMON_SOURCE = message.c \
read-po-abstract.c po-lex.c po-gram-gen.y po-hash-gen.y po-charset.c \
-open-po.c dir-list.c str-list.c
+read-properties.c open-po.c dir-list.c str-list.c
# xgettext and msgfmt deal with format strings.
FORMAT_SOURCE = format.c format-invalid.h \
@@ -96,9 +97,9 @@ format-php.c
# libgettextsrc contains all code that is needed by at least two programs.
libgettextsrc_la_SOURCES = \
-$(COMMON_SOURCE) read-po.c write-po.c msgl-ascii.c msgl-iconv.c msgl-equal.c \
-msgl-cat.c msgl-english.c file-list.c msgl-charset.c po-time.c plural.c \
-plural-table.c $(FORMAT_SOURCE)
+$(COMMON_SOURCE) read-po.c write-properties.c write-po.c msgl-ascii.c \
+msgl-iconv.c msgl-equal.c msgl-cat.c msgl-english.c file-list.c \
+msgl-charset.c po-time.c plural.c plural-table.c $(FORMAT_SOURCE)
# libgettextpo contains the public API for PO files.
libgettextpo_la_SOURCES = gettext-po.c
diff --git a/gettext-tools/src/Makefile.msvc b/gettext-tools/src/Makefile.msvc
index a824f10f5..ee93260b5 100644
--- a/gettext-tools/src/Makefile.msvc
+++ b/gettext-tools/src/Makefile.msvc
@@ -109,10 +109,12 @@ OBJECTS = \
po-gram-gen.obj \
po-hash-gen.obj \
po-charset.obj \
+ read-properties.obj \
open-po.obj \
dir-list.obj \
str-list.obj \
read-po.obj \
+ write-properties.obj \
write-po.obj \
msgl-ascii.obj \
msgl-iconv.obj \
@@ -178,6 +180,9 @@ po-hash-gen.obj : po-hash-gen.c
po-charset.obj : po-charset.c
$(CC) $(INCLUDES) $(CFLAGS) $(PICFLAGS) -c po-charset.c
+read-properties.obj : read-properties.c
+ $(CC) $(INCLUDES) $(CFLAGS) $(PICFLAGS) -c read-properties.c
+
open-po.obj : open-po.c
$(CC) $(INCLUDES) $(CFLAGS) $(PICFLAGS) -c open-po.c
@@ -190,6 +195,9 @@ str-list.obj : str-list.c
read-po.obj : read-po.c
$(CC) $(INCLUDES) $(CFLAGS) $(PICFLAGS) -c read-po.c
+write-properties.obj : write-properties.c
+ $(CC) $(INCLUDES) $(CFLAGS) $(PICFLAGS) -c write-properties.c
+
write-po.obj : write-po.c
$(CC) $(INCLUDES) $(CFLAGS) $(PICFLAGS) -c write-po.c
diff --git a/gettext-tools/src/Makefile.vms b/gettext-tools/src/Makefile.vms
index 481c3d384..6c297c3a9 100644
--- a/gettext-tools/src/Makefile.vms
+++ b/gettext-tools/src/Makefile.vms
@@ -57,10 +57,12 @@ OBJECTS = \
po-gram-gen.obj, \
po-hash-gen.obj, \
po-charset.obj, \
+ read-properties.obj, \
open-po.obj, \
dir-list.obj, \
str-list.obj, \
read-po.obj, \
+ write-properties.obj, \
write-po.obj, \
msgl-ascii.obj, \
msgl-iconv.obj, \
@@ -124,6 +126,9 @@ po-hash-gen.obj : po-hash-gen.c
po-charset.obj : po-charset.c
$(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) po-charset.c
+read-properties.obj : read-properties.c
+ $(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) read-properties.c
+
open-po.obj : open-po.c
$(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) open-po.c
@@ -136,6 +141,9 @@ str-list.obj : str-list.c
read-po.obj : read-po.c
$(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) read-po.c
+write-properties.obj : write-properties.c
+ $(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) write-properties.c
+
write-po.obj : write-po.c
$(CC) $(INCLUDES) $(CFLAGS) /define=($(DEFS)) write-po.c
diff --git a/gettext-tools/src/message.c b/gettext-tools/src/message.c
index 2b9bc575d..6306bc18c 100644
--- a/gettext-tools/src/message.c
+++ b/gettext-tools/src/message.c
@@ -524,6 +524,7 @@ msgdomain_list_alloc (bool use_hashtable)
(msgdomain_ty **) xmalloc (mdlp->nitems_max * sizeof (msgdomain_ty *));
mdlp->item[0] = msgdomain_alloc (MESSAGE_DOMAIN_DEFAULT, use_hashtable);
mdlp->use_hashtable = use_hashtable;
+ mdlp->encoding = NULL;
return mdlp;
}
diff --git a/gettext-tools/src/message.h b/gettext-tools/src/message.h
index fe506d789..393ede215 100644
--- a/gettext-tools/src/message.h
+++ b/gettext-tools/src/message.h
@@ -1,5 +1,5 @@
/* GNU gettext - internationalization aids
- Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.
+ Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
This file was written by Peter Miller <millerp@canb.auug.org.au>
@@ -235,6 +235,7 @@ struct msgdomain_list_ty
size_t nitems;
size_t nitems_max;
bool use_hashtable;
+ const char *encoding; /* canonicalized encoding or NULL if unknown */
};
extern msgdomain_list_ty *
diff --git a/gettext-tools/src/msgattrib.c b/gettext-tools/src/msgattrib.c
index 9b8dab65f..a394d6fd0 100644
--- a/gettext-tools/src/msgattrib.c
+++ b/gettext-tools/src/msgattrib.c
@@ -89,6 +89,8 @@ static const struct option long_options[] =
{ "only-fuzzy", no_argument, NULL, CHAR_MAX + 4 },
{ "only-obsolete", no_argument, NULL, CHAR_MAX + 6 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "set-fuzzy", no_argument, NULL, CHAR_MAX + 7 },
{ "set-obsolete", no_argument, NULL, CHAR_MAX + 9 },
{ "sort-by-file", no_argument, NULL, 'F' },
@@ -150,7 +152,7 @@ main (int argc, char **argv)
only_file = NULL;
ignore_file = NULL;
- while ((optchar = getopt_long (argc, argv, "D:eEFhino:sVw:", long_options,
+ while ((optchar = getopt_long (argc, argv, "D:eEFhino:pPsVw:", long_options,
NULL)) != EOF)
switch (optchar)
{
@@ -189,6 +191,14 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 's':
sort_by_msgid = true;
break;
@@ -412,6 +422,11 @@ Attribute manipulation:\n"));
--obsolete synonym for --only-obsolete --clear-obsolete\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-e, --no-escape do not use C escapes in output (default)\n"));
@@ -428,6 +443,8 @@ Output details:\n"));
printf (_("\
--strict write out strict Uniforum conforming .po file\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msgcat.c b/gettext-tools/src/msgcat.c
index 4a07bf6a9..a4d3e5b5e 100644
--- a/gettext-tools/src/msgcat.c
+++ b/gettext-tools/src/msgcat.c
@@ -64,6 +64,8 @@ static const struct option long_options[] =
{ "no-location", no_argument, &line_comment, 0 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 2 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
{ "strict", no_argument, NULL, 'S' },
@@ -97,6 +99,7 @@ main (int argc, char **argv)
const char *files_from;
string_list_ty *file_list;
msgdomain_list_ty *result;
+ input_syntax_ty output_syntax = syntax_po;
bool sort_by_msgid = false;
bool sort_by_filepos = false;
@@ -122,7 +125,7 @@ main (int argc, char **argv)
less_than = INT_MAX;
use_first = false;
- while ((optchar = getopt_long (argc, argv, "<:>:D:eEf:Fhino:st:uVw:",
+ while ((optchar = getopt_long (argc, argv, "<:>:D:eEf:Fhino:pPst:uVw:",
long_options, NULL)) != EOF)
switch (optchar)
{
@@ -185,6 +188,15 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ output_syntax = syntax_properties;
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 's':
sort_by_msgid = true;
break;
@@ -271,7 +283,10 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
string_list_append_unique (file_list, argv[cnt]);
/* Read input files, then filter, convert and merge messages. */
- result = catenate_msgdomain_list (file_list, to_code);
+ result = catenate_msgdomain_list (file_list,
+ output_syntax != syntax_properties
+ ? to_code
+ : "UTF-8");
string_list_free (file_list);
@@ -349,6 +364,11 @@ Message selection:\n"));
that only unique messages be printed\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input files are in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-t, --to-code=NAME encoding for output\n"));
@@ -370,6 +390,8 @@ Output details:\n"));
printf (_("\
--strict write out strict Uniforum conforming .po file\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msgcmp.c b/gettext-tools/src/msgcmp.c
index 6f627a36a..c26f0f780 100644
--- a/gettext-tools/src/msgcmp.c
+++ b/gettext-tools/src/msgcmp.c
@@ -52,6 +52,7 @@ static const struct option long_options[] =
{ "directory", required_argument, NULL, 'D' },
{ "help", no_argument, NULL, 'h' },
{ "multi-domain", no_argument, NULL, 'm' },
+ { "properties-input", no_argument, NULL, 'P' },
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
};
@@ -89,7 +90,7 @@ main (int argc, char *argv[])
do_help = false;
do_version = false;
- while ((optchar = getopt_long (argc, argv, "D:hmV", long_options, NULL))
+ while ((optchar = getopt_long (argc, argv, "D:hmPV", long_options, NULL))
!= EOF)
switch (optchar)
{
@@ -108,6 +109,10 @@ main (int argc, char *argv[])
multi_domain_mode = true;
break;
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 'V':
do_version = true;
break;
@@ -194,6 +199,11 @@ Operation modifiers:\n"));
-m, --multi-domain apply ref.pot to each of the domains in def.po\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input files are in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Informative output:\n"));
printf (_("\
-h, --help display this help and exit\n"));
diff --git a/gettext-tools/src/msgcomm.c b/gettext-tools/src/msgcomm.c
index 0b8219337..329540994 100644
--- a/gettext-tools/src/msgcomm.c
+++ b/gettext-tools/src/msgcomm.c
@@ -68,6 +68,8 @@ static const struct option long_options[] =
{ "omit-header", no_argument, NULL, CHAR_MAX + 1 },
{ "output", required_argument, NULL, 'o' }, /* for backward compatibility */
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
{ "strict", no_argument, NULL, 'S' },
@@ -121,7 +123,7 @@ main (int argc, char *argv[])
less_than = -1;
use_first = false;
- while ((optchar = getopt_long (argc, argv, "<:>:D:eEf:Fhino:st:uVw:",
+ while ((optchar = getopt_long (argc, argv, "<:>:D:eEf:Fhino:pPst:uVw:",
long_options, NULL)) != EOF)
switch (optchar)
{
@@ -184,6 +186,14 @@ main (int argc, char *argv[])
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 's':
sort_by_msgid = true;
break;
@@ -360,6 +370,11 @@ Message selection:\n"));
that only unique messages be printed\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input files are in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-e, --no-escape do not use C escapes in output (default)\n"));
@@ -376,6 +391,8 @@ Output details:\n"));
printf (_("\
--strict write out strict Uniforum conforming .po file\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msgconv.c b/gettext-tools/src/msgconv.c
index 41a0b8ae0..1929e8cec 100644
--- a/gettext-tools/src/msgconv.c
+++ b/gettext-tools/src/msgconv.c
@@ -62,6 +62,8 @@ static const struct option long_options[] =
{ "no-location", no_argument, &line_comment, 0 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 1 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
{ "strict", no_argument, NULL, 'S' },
@@ -89,6 +91,7 @@ main (int argc, char **argv)
char *output_file;
const char *input_file;
msgdomain_list_ty *result;
+ input_syntax_ty output_syntax = syntax_po;
bool sort_by_filepos = false;
bool sort_by_msgid = false;
@@ -111,7 +114,8 @@ main (int argc, char **argv)
output_file = NULL;
input_file = NULL;
- while ((opt = getopt_long (argc, argv, "D:eEFhio:st:Vw:", long_options, NULL))
+ while ((opt = getopt_long (argc, argv, "D:eEFhio:pPst:Vw:", long_options,
+ NULL))
!= EOF)
switch (opt)
{
@@ -146,6 +150,15 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ output_syntax = syntax_properties;
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 's':
sort_by_msgid = true;
break;
@@ -223,9 +236,12 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
if (to_code == NULL)
to_code = locale_charset ();
- /* Read input file and convert. */
- result = iconv_msgdomain_list (read_po_file (input_file), to_code,
- input_file);
+ /* Read input file. */
+ result = read_po_file (input_file);
+
+ /* Convert if and only if the output syntax supports different encodings. */
+ if (output_syntax != syntax_properties)
+ result = iconv_msgdomain_list (result, to_code, input_file);
/* Sort the results. */
if (sort_by_filepos)
@@ -285,6 +301,11 @@ Conversion target:\n"));
The default encoding is the current locale's encoding.\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-e, --no-escape do not use C escapes in output (default)\n"));
@@ -301,6 +322,8 @@ Output details:\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msgen.c b/gettext-tools/src/msgen.c
index 8e5a0174b..960a81211 100644
--- a/gettext-tools/src/msgen.c
+++ b/gettext-tools/src/msgen.c
@@ -58,6 +58,8 @@ static const struct option long_options[] =
{ "no-location", no_argument, &line_comment, 0 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 1 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
{ "strict", no_argument, NULL, 'S' },
@@ -104,7 +106,7 @@ main (int argc, char **argv)
do_version = false;
output_file = NULL;
- while ((opt = getopt_long (argc, argv, "D:eEFhio:sVw:", long_options, NULL))
+ while ((opt = getopt_long (argc, argv, "D:eEFhio:pPsVw:", long_options, NULL))
!= EOF)
switch (opt)
{
@@ -139,6 +141,14 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 's':
sort_by_msgid = true;
break;
@@ -267,6 +277,11 @@ The results are written to standard output if no output file is specified\n\
or if it is -.\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-e, --no-escape do not use C escapes in output (default)\n"));
@@ -283,6 +298,8 @@ Output details:\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msgexec.c b/gettext-tools/src/msgexec.c
index e6e24c67d..8e98aa4fc 100644
--- a/gettext-tools/src/msgexec.c
+++ b/gettext-tools/src/msgexec.c
@@ -76,6 +76,7 @@ static const struct option long_options[] =
{ "directory", required_argument, NULL, 'D' },
{ "help", no_argument, NULL, 'h' },
{ "input", required_argument, NULL, 'i' },
+ { "properties-input", no_argument, NULL, 'P' },
{ "version", no_argument, NULL, 'V' },
{ NULL, 0, NULL, 0 }
};
@@ -120,7 +121,8 @@ main (int argc, char **argv)
/* The '+' in the options string causes option parsing to terminate when
the first non-option, i.e. the subprogram name, is encountered. */
- while ((opt = getopt_long (argc, argv, "+D:hi:V", long_options, NULL)) != EOF)
+ while ((opt = getopt_long (argc, argv, "+D:hi:PV", long_options, NULL))
+ != EOF)
switch (opt)
{
case '\0': /* Long option. */
@@ -143,6 +145,10 @@ main (int argc, char **argv)
input_file = optarg;
break;
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 'V':
do_version = true;
break;
@@ -250,6 +256,11 @@ Input file location:\n"));
If no input file is given or if it is -, standard input is read.\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Informative output:\n"));
printf (_("\
-h, --help display this help and exit\n"));
diff --git a/gettext-tools/src/msgfilter.c b/gettext-tools/src/msgfilter.c
index 9ed4097c1..aa6f1dc6a 100644
--- a/gettext-tools/src/msgfilter.c
+++ b/gettext-tools/src/msgfilter.c
@@ -107,6 +107,8 @@ static const struct option long_options[] =
{ "no-location", no_argument, &line_comment, 0 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 3 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
{ "strict", no_argument, NULL, 'S' },
@@ -159,7 +161,8 @@ main (int argc, char **argv)
/* The '+' in the options string causes option parsing to terminate when
the first non-option, i.e. the subprogram name, is encountered. */
- while ((opt = getopt_long (argc, argv, "+D:EFhi:o:sVw:", long_options, NULL))
+ while ((opt = getopt_long (argc, argv, "+D:EFhi:o:pPsVw:", long_options,
+ NULL))
!= EOF)
switch (opt)
{
@@ -195,6 +198,14 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 's':
sort_by_msgid = true;
break;
@@ -384,6 +395,11 @@ Useful FILTER-OPTIONs when the FILTER is 'sed':\n"));
-n, --quiet, --silent suppress automatic printing of pattern space\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
--no-escape do not use C escapes in output (default)\n"));
@@ -402,6 +418,8 @@ Output details:\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msgfmt.c b/gettext-tools/src/msgfmt.c
index 7a1fbe20b..265331e98 100644
--- a/gettext-tools/src/msgfmt.c
+++ b/gettext-tools/src/msgfmt.c
@@ -52,6 +52,7 @@
#include "message.h"
#include "open-po.h"
#include "read-po.h"
+#include "po-charset.h"
#define _(str) gettext (str)
@@ -160,6 +161,7 @@ static const struct option long_options[] =
{ "locale", required_argument, NULL, 'l' },
{ "no-hash", no_argument, NULL, CHAR_MAX + 6 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
{ "resource", required_argument, NULL, 'r' },
{ "statistics", no_argument, &do_statistics, 1 },
{ "strict", no_argument, NULL, 'S' },
@@ -191,6 +193,7 @@ main (int argc, char *argv[])
bool do_help = false;
bool do_version = false;
bool strict_uniforum = false;
+ const char *canon_encoding;
struct msg_domain *domain;
/* Set default value for global variables. */
@@ -211,7 +214,7 @@ main (int argc, char *argv[])
bindtextdomain (PACKAGE, relocate (LOCALEDIR));
textdomain (PACKAGE);
- while ((opt = getopt_long (argc, argv, "a:cCd:D:fhjl:o:r:vV", long_options,
+ while ((opt = getopt_long (argc, argv, "a:cCd:D:fhjl:o:Pr:vV", long_options,
NULL))
!= EOF)
switch (opt)
@@ -258,6 +261,9 @@ main (int argc, char *argv[])
case 'o':
output_file_name = optarg;
break;
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
case 'r':
java_resource_name = optarg;
break;
@@ -417,6 +423,9 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
++optind;
}
+ /* We know a priori that properties_parse() converts strings to UTF-8. */
+ canon_encoding = (input_syntax == syntax_properties ? po_charset_utf8 : NULL);
+
/* Remove obsolete messages. They were only needed for duplicate
checking. */
for (domain = domain_list; domain != NULL; domain = domain->next)
@@ -432,14 +441,14 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
{
if (java_mode)
{
- if (msgdomain_write_java (domain->mlp, java_resource_name,
- java_locale_name, java_class_directory,
- assume_java2))
+ if (msgdomain_write_java (domain->mlp, canon_encoding,
+ java_resource_name, java_locale_name,
+ java_class_directory, assume_java2))
exit_status = EXIT_FAILURE;
}
else if (tcl_mode)
{
- if (msgdomain_write_tcl (domain->mlp,
+ if (msgdomain_write_tcl (domain->mlp, canon_encoding,
tcl_locale_name, tcl_base_directory))
exit_status = EXIT_FAILURE;
}
@@ -554,6 +563,11 @@ The -l and -d options are mandatory. The .msg file is written in the\n\
specified directory.\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input files are in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Input file interpretation:\n"));
printf (_("\
-c, --check perform all the checks implied by\n\
@@ -1402,7 +1416,7 @@ msgfmt_add_message (default_po_reader_ty *this,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
/* Check whether already a domain is specified. If not, use default
domain. */
@@ -1417,7 +1431,7 @@ msgfmt_add_message (default_po_reader_ty *this,
/* Invoke superclass method. */
default_add_message (this, msgid, msgid_pos, msgid_plural,
- msgstr, msgstr_len, msgstr_pos, obsolete);
+ msgstr, msgstr_len, msgstr_pos, force_fuzzy, obsolete);
}
@@ -1558,7 +1572,8 @@ read_po_file_msgfmt (char *filename)
pop->mlp = current_domain->mlp;
}
po_lex_pass_obsolete_entries (true);
- po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, filename);
+ po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, filename,
+ input_syntax);
po_reader_free ((abstract_po_reader_ty *) pop);
if (fp != stdin)
diff --git a/gettext-tools/src/msggrep.c b/gettext-tools/src/msggrep.c
index b4181debc..fba6e7414 100644
--- a/gettext-tools/src/msggrep.c
+++ b/gettext-tools/src/msggrep.c
@@ -97,6 +97,8 @@ static const struct option long_options[] =
{ "no-location", no_argument, &line_comment, 0 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 6 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "regexp", required_argument, NULL, 'e' },
{ "sort-by-file", no_argument, NULL, CHAR_MAX + 4 },
{ "sort-output", no_argument, NULL, CHAR_MAX + 5 },
@@ -159,7 +161,7 @@ main (int argc, char **argv)
grep_args[1] = string_list_alloc ();
grep_args[2] = string_list_alloc ();
- while ((opt = getopt_long (argc, argv, "CD:e:Ef:FhiKM:N:o:TVw:",
+ while ((opt = getopt_long (argc, argv, "CD:e:Ef:FhiKM:N:o:pPTVw:",
long_options, NULL))
!= EOF)
switch (opt)
@@ -227,6 +229,14 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 'S':
message_print_style_uniforum ();
break;
@@ -468,6 +478,11 @@ expressions if -E is given, or fixed strings if -F is given.\n\
"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
--no-escape do not use C escapes in output (default)\n"));
@@ -484,6 +499,8 @@ Output details:\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msginit.c b/gettext-tools/src/msginit.c
index 6abb690f7..2205dddc6 100644
--- a/gettext-tools/src/msginit.c
+++ b/gettext-tools/src/msginit.c
@@ -124,6 +124,8 @@ static const struct option long_options[] =
{ "no-translator", no_argument, NULL, CHAR_MAX + 1 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 2 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "version", no_argument, NULL, 'V' },
{ "width", required_argument, NULL, 'w' },
{ NULL, 0, NULL, 0 }
@@ -172,7 +174,7 @@ main (int argc, char **argv)
input_file = NULL;
locale = NULL;
- while ((opt = getopt_long (argc, argv, "hi:l:o:Vw:", long_options, NULL))
+ while ((opt = getopt_long (argc, argv, "hi:l:o:pPVw:", long_options, NULL))
!= EOF)
switch (opt)
{
@@ -200,6 +202,14 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 'V':
do_version = true;
break;
@@ -356,12 +366,19 @@ If no output file is given, it depends on the --locale option or the user's\n\
locale setting. If it is -, the results are written to standard output.\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-l, --locale=LL_CC set target locale\n"));
printf (_("\
--no-translator assume the PO file is automatically generated\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msgl-cat.c b/gettext-tools/src/msgl-cat.c
index 1074479a7..bfb83a411 100644
--- a/gettext-tools/src/msgl-cat.c
+++ b/gettext-tools/src/msgl-cat.c
@@ -191,6 +191,8 @@ two different charsets \"%s\" and \"%s\" in input file"),
{
if (is_ascii_message_list (mlp))
canon_from_code = po_charset_ascii;
+ else if (mdlp->encoding != NULL)
+ canon_from_code = mdlp->encoding;
else
{
if (k == 0)
@@ -352,6 +354,22 @@ domain \"%s\" in input file `%s' doesn't contain a header entry with a charset s
message_list_remove_if_not (mlp, is_message_selected);
}
+ /* Determine the common known a-priori encoding, if any. */
+ if (nfiles > 0)
+ {
+ bool all_same_encoding = true;
+
+ for (n = 1; n < nfiles; n++)
+ if (mdlps[n]->encoding != mdlps[0]->encoding)
+ {
+ all_same_encoding = false;
+ break;
+ }
+
+ if (all_same_encoding)
+ total_mdlp->encoding = mdlps[0]->encoding;
+ }
+
/* Determine the target encoding for the remaining messages. */
if (to_code != NULL)
{
@@ -421,7 +439,7 @@ Input files contain messages in different encodings, %s and %s among others.\n\
Converting the output to UTF-8.\n\
To select a different output encoding, use the --to-code option.\n\
"), first, second));
- canon_to_code = po_charset_canonicalize ("UTF-8");
+ canon_to_code = po_charset_utf8;
}
else if (first != NULL && with_ASCII && all_ASCII_compatible)
{
diff --git a/gettext-tools/src/msgl-iconv.c b/gettext-tools/src/msgl-iconv.c
index 21faaf48a..1bebd6157 100644
--- a/gettext-tools/src/msgl-iconv.c
+++ b/gettext-tools/src/msgl-iconv.c
@@ -391,8 +391,9 @@ iconv_msgdomain_list (msgdomain_list_ty *mdlp,
to_code);
for (k = 0; k < mdlp->nitems; k++)
- iconv_message_list (mdlp->item[k]->messages, NULL, canon_to_code,
+ iconv_message_list (mdlp->item[k]->messages, mdlp->encoding, canon_to_code,
from_filename);
+ mdlp->encoding = canon_to_code;
return mdlp;
}
diff --git a/gettext-tools/src/msgmerge.c b/gettext-tools/src/msgmerge.c
index 96a4bd9f0..009b50a05 100644
--- a/gettext-tools/src/msgmerge.c
+++ b/gettext-tools/src/msgmerge.c
@@ -94,6 +94,8 @@ static const struct option long_options[] =
{ "no-location", no_argument, &line_comment, 0 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 4 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "quiet", no_argument, NULL, 'q' },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
@@ -161,8 +163,8 @@ main (int argc, char **argv)
do_version = false;
output_file = NULL;
- while ((opt
- = getopt_long (argc, argv, "C:D:eEFhimo:qsUvVw:", long_options, NULL))
+ while ((opt = getopt_long (argc, argv, "C:D:eEFhimo:pPqsUvVw:", long_options,
+ NULL))
!= EOF)
switch (opt)
{
@@ -209,6 +211,14 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 'q':
quiet = true;
break;
@@ -323,6 +333,10 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
error (EXIT_FAILURE, 0, _("%s and %s are mutually exclusive"),
"--sort-output", "--sort-by-file");
+ /* In update mode, --properties-input implies --properties-output. */
+ if (update_mode && input_syntax == syntax_properties)
+ message_print_syntax_properties ();
+
/* Merge the two files. */
result = merge (argv[optind], argv[optind + 1], &def);
@@ -460,6 +474,11 @@ Operation modifiers:\n"));
-N, --no-fuzzy-matching do not use fuzzy matching\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input files are in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-e, --no-escape do not use C escapes in output (default)\n"));
@@ -476,6 +495,8 @@ Output details:\n"));
printf (_("\
--strict strict Uniforum output style\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
@@ -1163,6 +1184,10 @@ merge (const char *fn1, const char *fn2, msgdomain_list_ty **defp)
}
}
+ /* Determine the known a-priori encoding, if any. */
+ if (def->encoding == ref->encoding)
+ result->encoding = def->encoding;
+
/* Report some statistics. */
if (verbosity_level > 0)
fprintf (stderr, _("%s\
diff --git a/gettext-tools/src/msgunfmt.c b/gettext-tools/src/msgunfmt.c
index 66176b5f3..e3126e4c6 100644
--- a/gettext-tools/src/msgunfmt.c
+++ b/gettext-tools/src/msgunfmt.c
@@ -71,6 +71,7 @@ static const struct option long_options[] =
{ "no-escape", no_argument, NULL, 'e' },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 2 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "resource", required_argument, NULL, 'r' },
{ "sort-output", no_argument, NULL, 's' },
{ "strict", no_argument, NULL, 'S' },
@@ -113,7 +114,7 @@ main (int argc, char **argv)
bindtextdomain (PACKAGE, relocate (LOCALEDIR));
textdomain (PACKAGE);
- while ((optchar = getopt_long (argc, argv, "d:eEhijl:o:r:svVw:",
+ while ((optchar = getopt_long (argc, argv, "d:eEhijl:o:pr:svVw:",
long_options, NULL))
!= EOF)
switch (optchar)
@@ -155,6 +156,10 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
case 'r':
java_resource_name = optarg;
break;
@@ -383,6 +388,8 @@ Output details:\n"));
printf (_("\
--strict write strict uniforum style\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/msguniq.c b/gettext-tools/src/msguniq.c
index 31a2ba424..522253432 100644
--- a/gettext-tools/src/msguniq.c
+++ b/gettext-tools/src/msguniq.c
@@ -62,6 +62,8 @@ static const struct option long_options[] =
{ "no-location", no_argument, &line_comment, 0 },
{ "no-wrap", no_argument, NULL, CHAR_MAX + 2 },
{ "output-file", required_argument, NULL, 'o' },
+ { "properties-input", no_argument, NULL, 'P' },
+ { "properties-output", no_argument, NULL, 'p' },
{ "repeated", no_argument, NULL, 'd' },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
@@ -118,7 +120,7 @@ main (int argc, char **argv)
less_than = INT_MAX;
use_first = false;
- while ((optchar = getopt_long (argc, argv, "dD:eEFhino:st:uVw:",
+ while ((optchar = getopt_long (argc, argv, "dD:eEFhino:pPst:uVw:",
long_options, NULL)) != EOF)
switch (optchar)
{
@@ -162,6 +164,14 @@ main (int argc, char **argv)
output_file = optarg;
break;
+ case 'p':
+ message_print_syntax_properties ();
+ break;
+
+ case 'P':
+ input_syntax = syntax_properties;
+ break;
+
case 's':
sort_by_msgid = true;
break;
@@ -320,6 +330,11 @@ Message selection:\n"));
-u, --unique print only unique messages, discard duplicates\n"));
printf ("\n");
printf (_("\
+Input file syntax:\n"));
+ printf (_("\
+ -P, --properties-input input file is in Java .properties syntax\n"));
+ printf ("\n");
+ printf (_("\
Output details:\n"));
printf (_("\
-t, --to-code=NAME encoding for output\n"));
@@ -341,6 +356,8 @@ Output details:\n"));
printf (_("\
--strict write out strict Uniforum conforming .po file\n"));
printf (_("\
+ -p, --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
diff --git a/gettext-tools/src/po-gram-gen.y b/gettext-tools/src/po-gram-gen.y
index 355ffba67..e8386bb11 100644
--- a/gettext-tools/src/po-gram-gen.y
+++ b/gettext-tools/src/po-gram-gen.y
@@ -25,12 +25,14 @@
/* Specification. */
#include "po-gram.h"
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "str-list.h"
#include "po-lex.h"
+#include "po-charset.h"
#include "error.h"
#include "xmalloc.h"
#include "gettext.h"
@@ -91,6 +93,20 @@ static long plural_counter;
if ((value1).obsolete != (value2).obsolete) \
po_gram_error_at_line (&(value2).pos, _("inconsistent use of #~"));
+static inline void
+do_callback_message (char *msgid, lex_pos_ty *msgid_pos, char *msgid_plural,
+ char *msgstr, size_t msgstr_len, lex_pos_ty *msgstr_pos,
+ bool obsolete)
+{
+ /* Test for header entry. Ignore fuzziness of the header entry. */
+ if (msgid[0] == '\0' && !obsolete)
+ po_lex_charset_set (msgstr, gram_pos.file_name);
+
+ po_callback_message (msgid, msgid_pos, msgid_plural,
+ msgstr, msgstr_len, msgstr_pos,
+ false, obsolete);
+}
+
%}
%token COMMENT
@@ -148,7 +164,7 @@ message
check_obsolete ($1, $3);
check_obsolete ($1, $4);
if (!$1.obsolete || pass_obsolete_entries)
- po_callback_message (string2, &$1.pos, NULL,
+ do_callback_message (string2, &$1.pos, NULL,
string4, strlen (string4) + 1, &$3.pos,
$1.obsolete);
else
@@ -165,7 +181,7 @@ message
check_obsolete ($1, $3);
check_obsolete ($1, $4);
if (!$1.obsolete || pass_obsolete_entries)
- po_callback_message (string2, &$1.pos, $3.string,
+ do_callback_message (string2, &$1.pos, $3.string,
$4.rhs.msgstr, $4.rhs.msgstr_len, &$4.pos,
$1.obsolete);
else
diff --git a/gettext-tools/src/po-lex.c b/gettext-tools/src/po-lex.c
index d3aaf324c..d5be021b3 100644
--- a/gettext-tools/src/po-lex.c
+++ b/gettext-tools/src/po-lex.c
@@ -618,18 +618,11 @@ lex_start (FILE *fp, const char *real_filename, const char *logical_filename)
void
lex_end ()
{
- if (error_message_count > 0)
- error (EXIT_FAILURE, 0,
- ngettext ("found %d fatal error", "found %d fatal errors",
- error_message_count),
- error_message_count);
-
mbf->fp = NULL;
gram_pos.file_name = NULL;
gram_pos.line_number = 0;
gram_pos_column = 0;
signal_eilseq = false;
- error_message_count = 0;
po_lex_obsolete = false;
po_lex_charset_close ();
}
diff --git a/gettext-tools/src/read-po-abstract.c b/gettext-tools/src/read-po-abstract.c
index 4805fd75f..bc562eae2 100644
--- a/gettext-tools/src/read-po-abstract.c
+++ b/gettext-tools/src/read-po-abstract.c
@@ -28,10 +28,11 @@
#include <stdlib.h>
#include <string.h>
-#include "po-charset.h"
#include "po-gram.h"
#include "po-hash.h"
+#include "read-properties.h"
#include "xmalloc.h"
+#include "gettext.h"
/* Local variables. */
static abstract_po_reader_ty *callback_arg;
@@ -95,11 +96,12 @@ call_directive_message (abstract_po_reader_ty *pop,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
if (pop->methods->directive_message)
pop->methods->directive_message (pop, msgid, msgid_pos, msgid_plural,
- msgstr, msgstr_len, msgstr_pos, obsolete);
+ msgstr, msgstr_len, msgstr_pos,
+ force_fuzzy, obsolete);
}
static inline void
@@ -135,7 +137,7 @@ call_comment_special (abstract_po_reader_ty *pop, const char *s)
/* Exported functions. */
-void
+static inline void
po_scan_start (abstract_po_reader_ty *pop)
{
/* The parse will call the po_callback_... functions (see below)
@@ -147,7 +149,7 @@ po_scan_start (abstract_po_reader_ty *pop)
call_parse_brief (pop);
}
-void
+static inline void
po_scan_end (abstract_po_reader_ty *pop)
{
call_parse_debrief (pop);
@@ -157,14 +159,34 @@ po_scan_end (abstract_po_reader_ty *pop)
void
po_scan (abstract_po_reader_ty *pop, FILE *fp,
- const char *real_filename, const char *logical_filename)
+ const char *real_filename, const char *logical_filename,
+ input_syntax_ty syntax)
{
/* Parse the stream's content. */
- lex_start (fp, real_filename, logical_filename);
- po_scan_start (pop);
- po_gram_parse ();
- po_scan_end (pop);
- lex_end ();
+ switch (syntax)
+ {
+ case syntax_po:
+ lex_start (fp, real_filename, logical_filename);
+ po_scan_start (pop);
+ po_gram_parse ();
+ po_scan_end (pop);
+ lex_end ();
+ break;
+ case syntax_properties:
+ po_scan_start (pop);
+ properties_parse (pop, fp, real_filename, logical_filename);
+ po_scan_end (pop);
+ break;
+ default:
+ abort ();
+ }
+
+ if (error_message_count > 0)
+ error (EXIT_FAILURE, 0,
+ ngettext ("found %d fatal error", "found %d fatal errors",
+ error_message_count),
+ error_message_count);
+ error_message_count = 0;
}
@@ -188,16 +210,12 @@ po_callback_domain (char *name)
void
po_callback_message (char *msgid, lex_pos_ty *msgid_pos, char *msgid_plural,
char *msgstr, size_t msgstr_len, lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
/* assert(callback_arg); */
-
- /* Test for header entry. Ignore fuzziness of the header entry. */
- if (msgid[0] == '\0' && !obsolete)
- po_lex_charset_set (msgstr, gram_pos.file_name);
-
call_directive_message (callback_arg, msgid, msgid_pos, msgid_plural,
- msgstr, msgstr_len, msgstr_pos, obsolete);
+ msgstr, msgstr_len, msgstr_pos,
+ force_fuzzy, obsolete);
}
diff --git a/gettext-tools/src/read-po-abstract.h b/gettext-tools/src/read-po-abstract.h
index 87590a672..4140fc873 100644
--- a/gettext-tools/src/read-po-abstract.h
+++ b/gettext-tools/src/read-po-abstract.h
@@ -73,7 +73,7 @@ struct abstract_po_reader_class_ty
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete);
+ bool force_fuzzy, bool obsolete);
/* What to do with a plain-vanilla comment - the expectation is that
they will be accumulated, and added to the next message
@@ -123,19 +123,20 @@ struct abstract_po_reader_ty
extern abstract_po_reader_ty *
po_reader_alloc (abstract_po_reader_class_ty *method_table);
-/* Prepare for use of abstract_po_reader_class_ty methods. */
-extern void
- po_scan_start (abstract_po_reader_ty *pop);
-
-/* Terminate the use of abstract_po_reader_class_ty methods. */
-extern void
- po_scan_end (abstract_po_reader_ty *pop);
+/* Kinds of PO file input syntaxes. */
+enum input_syntax_ty
+{
+ syntax_po,
+ syntax_properties
+};
+typedef enum input_syntax_ty input_syntax_ty;
/* Read a PO file from a stream, and dispatch to the various
abstract_po_reader_class_ty methods. */
extern void
po_scan (abstract_po_reader_ty *pop, FILE *fp,
- const char *real_filename, const char *logical_filename);
+ const char *real_filename, const char *logical_filename,
+ input_syntax_ty syntax);
/* Call the destructor and deallocate a abstract_po_reader_ty (or derived
class) instance. */
@@ -150,7 +151,7 @@ extern void po_callback_message (char *msgid, lex_pos_ty *msgid_pos,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete);
+ bool force_fuzzy, bool obsolete);
extern void po_callback_comment (const char *s);
extern void po_callback_comment_dot (const char *s);
extern void po_callback_comment_filepos (const char *s, size_t line);
diff --git a/gettext-tools/src/read-po.c b/gettext-tools/src/read-po.c
index e4aec2089..a31c55ad8 100644
--- a/gettext-tools/src/read-po.c
+++ b/gettext-tools/src/read-po.c
@@ -28,6 +28,7 @@
#include <string.h>
#include "open-po.h"
+#include "po-charset.h"
#include "xmalloc.h"
#include "gettext.h"
@@ -51,14 +52,15 @@ static inline void
call_add_message (struct default_po_reader_ty *this,
char *msgid, lex_pos_ty *msgid_pos, char *msgid_plural,
char *msgstr, size_t msgstr_len, lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
default_po_reader_class_ty *methods =
(default_po_reader_class_ty *) this->methods;
if (methods->add_message)
methods->add_message (this, msgid, msgid_pos, msgid_plural,
- msgstr, msgstr_len, msgstr_pos, obsolete);
+ msgstr, msgstr_len, msgstr_pos,
+ force_fuzzy, obsolete);
}
static inline void
@@ -230,12 +232,12 @@ default_directive_message (abstract_po_reader_ty *that,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
default_po_reader_ty *this = (default_po_reader_ty *) that;
call_add_message (this, msgid, msgid_pos, msgid_plural,
- msgstr, msgstr_len, msgstr_pos, obsolete);
+ msgstr, msgstr_len, msgstr_pos, force_fuzzy, obsolete);
/* Prepare for next message. */
default_reset_comment_state (this);
@@ -327,7 +329,7 @@ default_add_message (default_po_reader_ty *this,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
message_ty *mp;
@@ -373,6 +375,8 @@ default_add_message (default_po_reader_ty *this,
mp = message_alloc (msgid, msgid_plural, msgstr, msgstr_len, msgstr_pos);
mp->obsolete = obsolete;
default_copy_comment_state (this, mp);
+ if (force_fuzzy)
+ mp->is_fuzzy = true;
call_frob_new_message (this, mp, msgid_pos, msgstr_pos);
@@ -428,6 +432,9 @@ int line_comment = 1;
appropriately. Defaults to false. */
bool allow_duplicates = false;
+/* Expected syntax of the input files. */
+input_syntax_ty input_syntax = syntax_po;
+
msgdomain_list_ty *
read_po (FILE *fp, const char *real_filename, const char *logical_filename)
@@ -443,8 +450,12 @@ read_po (FILE *fp, const char *real_filename, const char *logical_filename)
pop->allow_duplicates_if_same_msgstr = false;
pop->mdlp = msgdomain_list_alloc (!pop->allow_duplicates);
pop->mlp = msgdomain_list_sublist (pop->mdlp, pop->domain, true);
+ if (input_syntax == syntax_properties)
+ /* We know a priori that properties_parse() converts strings to UTF-8. */
+ pop->mdlp->encoding = po_charset_utf8;
po_lex_pass_obsolete_entries (true);
- po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, logical_filename);
+ po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, logical_filename,
+ input_syntax);
mdlp = pop->mdlp;
po_reader_free ((abstract_po_reader_ty *) pop);
return mdlp;
diff --git a/gettext-tools/src/read-po.h b/gettext-tools/src/read-po.h
index f2f6807f7..ce5c3e366 100644
--- a/gettext-tools/src/read-po.h
+++ b/gettext-tools/src/read-po.h
@@ -47,7 +47,7 @@ struct default_po_reader_class_ty
void (*add_message) (struct default_po_reader_ty *pop,
char *msgid, lex_pos_ty *msgid_pos, char *msgid_plural,
char *msgstr, size_t msgstr_len, lex_pos_ty *msgstr_pos,
- bool obsolete);
+ bool force_fuzzy, bool obsolete);
/* How to modify a new message before adding it to the list. */
void (*frob_new_message) (struct default_po_reader_ty *pop, message_ty *mp,
@@ -116,7 +116,7 @@ extern void default_directive_message (abstract_po_reader_ty *that,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete);
+ bool force_fuzzy, bool obsolete);
extern void default_comment (abstract_po_reader_ty *that, const char *s);
extern void default_comment_dot (abstract_po_reader_ty *that, const char *s);
extern void default_comment_filepos (abstract_po_reader_ty *that,
@@ -130,7 +130,7 @@ extern void default_add_message (default_po_reader_ty *this,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete);
+ bool force_fuzzy, bool obsolete);
/* Allocate a fresh default_po_reader_ty (or derived class) instance and
call its constructor. */
@@ -147,6 +147,9 @@ extern int line_comment;
appropriately. Defaults to false. */
extern bool allow_duplicates;
+/* Expected syntax of the input files. */
+extern input_syntax_ty input_syntax;
+
/* Read the input file from a stream. Returns a list of messages. */
extern msgdomain_list_ty *read_po (FILE *fp, const char *real_filename,
const char *logical_filename);
diff --git a/gettext-tools/src/read-properties.c b/gettext-tools/src/read-properties.c
new file mode 100644
index 000000000..2faa3001b
--- /dev/null
+++ b/gettext-tools/src/read-properties.c
@@ -0,0 +1,543 @@
+/* Reading Java .properties files.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "read-properties.h"
+
+#include <assert.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "error.h"
+#include "progname.h"
+#include "message.h"
+#include "read-po-abstract.h"
+#include "xmalloc.h"
+#include "exit.h"
+#include "msgl-ascii.h"
+#include "utf16-ucs4.h"
+#include "ucs4-utf8.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+/* The format of the Java .properties files is documented in the JDK
+ documentation for class java.util.Properties. In the case of .properties
+ files for PropertyResourceBundle, each non-comment line contains a
+ key/value pair in the form "key = value" or "key : value" or "key value",
+ where the key is the msgid and the value is the msgstr. Messages with
+ plurals are not supported in this format. */
+
+/* Handling of comments: We copy all comments from the .properties file to
+ the PO file. This is not really needed; it's a service for translators
+ who don't like PO files and prefer to maintain the .properties file. */
+
+/* Real filename, used in error messages about the input file. */
+static const char *real_file_name;
+
+/* File name and line number. */
+extern lex_pos_ty gram_pos;
+
+/* The input file stream. */
+static FILE *fp;
+
+
+/* Phase 1: Read an ISO-8859-1 character.
+ Max. 1 pushback character. */
+
+static int
+phase1_getc ()
+{
+ int c;
+
+ c = getc (fp);
+
+ if (c == EOF)
+ {
+ if (ferror (fp))
+ error (EXIT_FAILURE, errno, _("error while reading \"%s\""),
+ real_file_name);
+ return EOF;
+ }
+
+ return c;
+}
+
+static inline void
+phase1_ungetc (int c)
+{
+ if (c != EOF)
+ ungetc (c, fp);
+}
+
+
+/* Phase 2: Read an ISO-8859-1 character, treating CR/LF like a single LF.
+ Max. 2 pushback characters. */
+
+static unsigned char phase2_pushback[2];
+static int phase2_pushback_length;
+
+static int
+phase2_getc ()
+{
+ int c;
+
+ if (phase2_pushback_length)
+ c = phase2_pushback[--phase2_pushback_length];
+ else
+ {
+ c = phase1_getc ();
+
+ if (c == '\r')
+ {
+ int c2 = phase1_getc ();
+ if (c2 == '\n')
+ c = c2;
+ else
+ phase1_ungetc (c2);
+ }
+ }
+
+ if (c == '\n')
+ gram_pos.line_number++;
+
+ return c;
+}
+
+static void
+phase2_ungetc (int c)
+{
+ if (c == '\n')
+ --gram_pos.line_number;
+ if (c != EOF)
+ phase2_pushback[phase2_pushback_length++] = c;
+}
+
+
+/* Phase 3: Read an ISO-8859-1 character, treating CR/LF like a single LF,
+ with handling of continuation lines.
+ Max. 1 pushback character. */
+
+static int
+phase3_getc ()
+{
+ int c = phase2_getc ();
+
+ for (;;)
+ {
+ if (c != '\\')
+ return c;
+
+ c = phase2_getc ();
+ if (c != '\n')
+ {
+ phase2_ungetc (c);
+ return '\\';
+ }
+
+ /* Skip the backslash-newline and all whitespace that follows it. */
+ do
+ c = phase2_getc ();
+ while (c == ' ' || c == '\t' || c == '\r' || c == '\f');
+ }
+}
+
+static inline void
+phase3_ungetc (int c)
+{
+ phase2_ungetc (c);
+}
+
+
+/* Phase 4: Read an UTF-16 codepoint, treating CR/LF like a single LF,
+ with handling of continuation lines and of \uxxxx sequences. */
+
+static int
+phase4_getuc ()
+{
+ int c = phase3_getc ();
+
+ if (c == EOF)
+ return -1;
+ if (c == '\\')
+ {
+ int c2 = phase3_getc ();
+
+ if (c2 == 't')
+ return '\t';
+ if (c2 == 'n')
+ return '\n';
+ if (c2 == 'r')
+ return '\r';
+ if (c2 == 'f')
+ return '\f';
+ if (c2 == 'u')
+ {
+ unsigned int n = 0;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ int c1 = phase3_getc ();
+
+ if (c1 >= '0' && c1 <= '9')
+ n = (n << 4) + (c1 - '0');
+ else if (c1 >= 'A' && c1 <= 'F')
+ n = (n << 4) + (c1 - 'A' + 10);
+ else if (c1 >= 'a' && c1 <= 'f')
+ n = (n << 4) + (c1 - 'a' + 10);
+ else
+ {
+ phase3_ungetc (c1);
+ error_with_progname = false;
+ error (0, 0, _("%s:%d: warning: invalid \\uxxxx syntax for Unicode character"),
+ real_file_name, gram_pos.line_number);
+ error_with_progname = true;
+ return 'u';
+ }
+ }
+ return n;
+ }
+
+ return c2;
+ }
+ else
+ return c;
+}
+
+
+/* Converts a string from ISO-8859-1 encoding to UTF-8 encoding. */
+static char *
+conv_from_iso_8859_1 (char *string)
+{
+ if (is_ascii_string (string))
+ return string;
+ else
+ {
+ size_t length = strlen (string);
+ /* Each ISO-8859-1 character needs 2 bytes at worst. */
+ unsigned char *utf8_string = (unsigned char *) xmalloc (2 * length + 1);
+ unsigned char *q = utf8_string;
+ const char *str = string;
+ const char *str_limit = str + length;
+
+ while (str < str_limit)
+ {
+ unsigned int uc = (unsigned char) *str++;
+ int n = u8_uctomb (q, uc, 6);
+ assert (n > 0);
+ q += n;
+ }
+ *q = '\0';
+ assert (q - utf8_string <= 2 * length);
+
+ return (char *) utf8_string;
+ }
+}
+
+
+/* Converts a string from JAVA encoding (with \uxxxx sequences) to UTF-8
+ encoding. May destructively modify the argument string. */
+static char *
+conv_from_java (char *string)
+{
+ /* This conversion can only shrink the string, never increase its size.
+ So there is no need to xmalloc the result freshly. */
+ const char *p = string;
+ char *q = string;
+
+ while (*p != '\0')
+ {
+ if (p[0] == '\\' && p[1] == 'u')
+ {
+ unsigned int n = 0;
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ int c1 = (unsigned char) p[2 + i];
+
+ if (c1 >= '0' && c1 <= '9')
+ n = (n << 4) + (c1 - '0');
+ else if (c1 >= 'A' && c1 <= 'F')
+ n = (n << 4) + (c1 - 'A' + 10);
+ else if (c1 >= 'a' && c1 <= 'f')
+ n = (n << 4) + (c1 - 'a' + 10);
+ else
+ goto just_one_byte;
+ }
+
+ if (i == 4)
+ {
+ unsigned int uc;
+
+ if (n >= 0xd800 && n < 0xdc00)
+ {
+ if (p[6] == '\\' && p[7] == 'u')
+ {
+ unsigned int m = 0;
+
+ for (i = 0; i < 4; i++)
+ {
+ int c1 = (unsigned char) p[8 + i];
+
+ if (c1 >= '0' && c1 <= '9')
+ m = (m << 4) + (c1 - '0');
+ else if (c1 >= 'A' && c1 <= 'F')
+ m = (m << 4) + (c1 - 'A' + 10);
+ else if (c1 >= 'a' && c1 <= 'f')
+ m = (m << 4) + (c1 - 'a' + 10);
+ else
+ goto just_one_byte;
+ }
+
+ if (i == 4 && (m >= 0xdc00 && m < 0xe000))
+ {
+ /* Combine two UTF-16 words to a character. */
+ uc = 0x10000 + ((n - 0xd800) << 10) + (m - 0xdc00);
+ p += 12;
+ }
+ else
+ goto just_one_byte;
+ }
+ else
+ goto just_one_byte;
+ }
+ else
+ {
+ uc = n;
+ p += 6;
+ }
+
+ q += u8_uctomb (q, uc, 6);
+ continue;
+ }
+ }
+ just_one_byte:
+ *q++ = *p++;
+ }
+ *q = '\0';
+ return string;
+}
+
+
+/* Reads a key or value string.
+ Returns the string in UTF-8 encoding, or NULL if the end of the logical
+ line is reached.
+ Parsing ends:
+ - when returning NULL, after the end of the logical line,
+ - otherwise, if in_key is true, after the whitespace and possibly the
+ separator that follows after the string,
+ - otherwise, if in_key is false, after the end of the logical line. */
+
+static char *
+read_escaped_string (bool in_key)
+{
+ static unsigned short *buffer;
+ static size_t bufmax;
+ static size_t buflen;
+ int c;
+
+ /* Skip whitespace before the string. */
+ do
+ c = phase3_getc ();
+ while (c == ' ' || c == '\t' || c == '\r' || c == '\f');
+
+ if (c == EOF || c == '\n')
+ /* Empty string. */
+ return NULL;
+
+ /* Start accumulating the string. We store the string in UTF-16 before
+ converting it to UTF-8. Why not converting every character directly to
+ UTF-8? Because a string can contain surrogates like \uD800\uDF00, and
+ we must combine them to a single UTF-8 character. */
+ buflen = 0;
+ for (;;)
+ {
+ if (in_key && (c == '=' || c == ':'
+ || c == ' ' || c == '\t' || c == '\r' || c == '\f'))
+ {
+ /* Skip whitespace after the string. */
+ while (c == ' ' || c == '\t' || c == '\r' || c == '\f')
+ c = phase3_getc ();
+ /* Skip '=' or ':' separator. */
+ if (!(c == '=' || c == ':'))
+ phase3_ungetc (c);
+ break;
+ }
+
+ phase3_ungetc (c);
+
+ /* Read the next UTF-16 codepoint. */
+ c = phase4_getuc ();
+ if (c < 0)
+ break;
+ /* Append it to the buffer. */
+ if (buflen >= bufmax)
+ {
+ bufmax += 100;
+ buffer = xrealloc (buffer, bufmax * sizeof (unsigned short));
+ }
+ buffer[buflen++] = c;
+
+ c = phase3_getc ();
+ if (c == EOF || c == '\n')
+ {
+ if (in_key)
+ phase3_ungetc (c);
+ break;
+ }
+ }
+
+ /* Now convert from UTF-16 to UTF-8. */
+ {
+ size_t pos;
+ unsigned char *utf8_string;
+ unsigned char *q;
+
+ /* Each UTF-16 word needs 3 bytes at worst. */
+ utf8_string = (unsigned char *) xmalloc (3 * buflen + 1);
+ for (pos = 0, q = utf8_string; pos < buflen; )
+ {
+ unsigned int uc;
+ int n;
+
+ pos += u16_mbtouc (&uc, buffer + pos, buflen - pos);
+ n = u8_uctomb (q, uc, 6);
+ assert (n > 0);
+ q += n;
+ }
+ *q = '\0';
+ assert (q - utf8_string <= 3 * buflen);
+
+ return (char *) utf8_string;
+ }
+}
+
+
+/* Read a .properties file from a stream, and dispatch to the various
+ abstract_po_reader_class_ty methods. */
+void
+properties_parse (abstract_po_reader_ty *this, FILE *file,
+ const char *real_filename, const char *logical_filename)
+{
+ fp = file;
+ real_file_name = real_filename;
+ gram_pos.file_name = xstrdup (real_file_name);
+ gram_pos.line_number = 1;
+
+ for (;;)
+ {
+ int c;
+ bool comment;
+ bool hidden;
+
+ c = phase2_getc ();
+
+ if (c == EOF)
+ break;
+
+ comment = false;
+ hidden = false;
+ if (c == '#')
+ comment = true;
+ else if (c == '!')
+ {
+ /* For compatibility with write-properties.c, we treat '!' not
+ followed by space as a fuzzy or untranslated message. */
+ int c2 = phase2_getc ();
+ if (c2 == ' ' || c2 == '\n' || c2 == EOF)
+ comment = true;
+ else
+ hidden = true;
+ phase2_ungetc (c2);
+ }
+ else
+ phase2_ungetc (c);
+
+ if (comment)
+ {
+ /* A comment line. */
+ static char *buffer;
+ static size_t bufmax;
+ static size_t buflen;
+
+ buflen = 0;
+ for (;;)
+ {
+ c = phase2_getc ();
+
+ if (buflen >= bufmax)
+ {
+ bufmax += 100;
+ buffer = xrealloc (buffer, bufmax);
+ }
+
+ if (c == EOF || c == '\n')
+ break;
+
+ buffer[buflen++] = c;
+ }
+ buffer[buflen] = '\0';
+
+ po_callback_comment (conv_from_java (conv_from_iso_8859_1 (buffer)));
+ }
+ else
+ {
+ /* A key/value pair. */
+ char *msgid;
+ lex_pos_ty msgid_pos;
+
+ msgid_pos = gram_pos;
+ msgid = read_escaped_string (true);
+ if (msgid == NULL)
+ /* Skip blank line. */
+ ;
+ else
+ {
+ char *msgstr;
+ lex_pos_ty msgstr_pos;
+ bool force_fuzzy;
+
+ msgstr_pos = gram_pos;
+ msgstr = read_escaped_string (false);
+ if (msgstr == NULL)
+ msgstr = xstrdup ("");
+
+ /* Be sure to make the message fuzzy if it was commented out
+ and if it is not already header/fuzzy/untranslated. */
+ force_fuzzy = (hidden && msgid[0] != '\0' && msgstr[0] != '\0');
+
+ po_callback_message (msgid, &msgid_pos, NULL,
+ msgstr, strlen (msgstr) + 1, &msgstr_pos,
+ force_fuzzy, false);
+ }
+ }
+ }
+
+ fp = NULL;
+ real_file_name = NULL;
+ gram_pos.line_number = 0;
+}
diff --git a/gettext-tools/src/read-properties.h b/gettext-tools/src/read-properties.h
new file mode 100644
index 000000000..00fa0fb1e
--- /dev/null
+++ b/gettext-tools/src/read-properties.h
@@ -0,0 +1,30 @@
+/* Reading Java .properties files.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _READ_PROPERTIES_H
+#define _READ_PROPERTIES_H
+
+#include "read-po-abstract.h"
+
+/* Read a .properties file from a stream, and dispatch to the various
+ abstract_po_reader_class_ty methods. */
+extern void properties_parse (abstract_po_reader_ty *pop, FILE *fp,
+ const char *real_filename,
+ const char *logical_filename);
+
+#endif /* _READ_PROPERTIES_H */
diff --git a/gettext-tools/src/write-java.c b/gettext-tools/src/write-java.c
index 0958e9066..da8c76d04 100644
--- a/gettext-tools/src/write-java.c
+++ b/gettext-tools/src/write-java.c
@@ -1018,7 +1018,7 @@ unblock ()
int
-msgdomain_write_java (message_list_ty *mlp,
+msgdomain_write_java (message_list_ty *mlp, const char *canon_encoding,
const char *resource_name, const char *locale_name,
const char *directory,
bool assume_java2)
@@ -1040,7 +1040,7 @@ msgdomain_write_java (message_list_ty *mlp,
retval = 1;
/* Convert the messages to Unicode. */
- iconv_message_list (mlp, NULL, po_charset_canonicalize ("UTF-8"), NULL);
+ iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
cleanup_list.tmpdir = NULL;
cleanup_list.subdir_count = 0;
diff --git a/gettext-tools/src/write-java.h b/gettext-tools/src/write-java.h
index 37e1947b7..8348956c7 100644
--- a/gettext-tools/src/write-java.h
+++ b/gettext-tools/src/write-java.h
@@ -1,5 +1,5 @@
/* Writing Java ResourceBundles.
- Copyright (C) 2001-2002 Free Software Foundation, Inc.
+ Copyright (C) 2001-2003 Free Software Foundation, Inc.
Written by Bruno Haible <haible@clisp.cons.org>, 2001.
This program is free software; you can redistribute it and/or modify
@@ -30,6 +30,7 @@
Return 0 if ok, nonzero on error. */
extern int
msgdomain_write_java (message_list_ty *mlp,
+ const char *canon_encoding,
const char *resource_name,
const char *locale_name,
const char *directory,
diff --git a/gettext-tools/src/write-po.c b/gettext-tools/src/write-po.c
index 862bc2964..434d19020 100644
--- a/gettext-tools/src/write-po.c
+++ b/gettext-tools/src/write-po.c
@@ -39,9 +39,11 @@
#include "po-charset.h"
#include "linebreak.h"
#include "msgl-ascii.h"
+#include "write-properties.h"
#include "xmalloc.h"
#include "strstr.h"
#include "exit.h"
+#include "progname.h"
#include "error.h"
#include "xerror.h"
#include "gettext.h"
@@ -373,6 +375,16 @@ message_print_style_escape (bool flag)
}
+/* Whether to output a file in Java .properties syntax. */
+static bool use_syntax_properties = false;
+
+void
+message_print_syntax_properties ()
+{
+ use_syntax_properties = true;
+}
+
+
/* ================ msgdomain_list_print() and subroutines. ================ */
@@ -917,52 +929,12 @@ different from yours. Consider using a pure ASCII msgid instead.\n\
}
-void
-msgdomain_list_print (msgdomain_list_ty *mdlp, const char *filename,
- bool force, bool debug)
+static void
+msgdomain_list_print_po (msgdomain_list_ty *mdlp, FILE *fp, bool debug)
{
- FILE *fp;
size_t j, k;
bool blank_line;
- /* We will not write anything if, for every domain, we have no message
- or only the header entry. */
- if (!force)
- {
- bool found_nonempty = false;
-
- for (k = 0; k < mdlp->nitems; k++)
- {
- message_list_ty *mlp = mdlp->item[k]->messages;
-
- if (!(mlp->nitems == 0
- || (mlp->nitems == 1 && mlp->item[0]->msgid[0] == '\0')))
- {
- found_nonempty = true;
- break;
- }
- }
-
- if (!found_nonempty)
- return;
- }
-
- /* Open the output file. */
- if (filename != NULL && strcmp (filename, "-") != 0
- && strcmp (filename, "/dev/stdout") != 0)
- {
- fp = fopen (filename, "w");
- if (fp == NULL)
- error (EXIT_FAILURE, errno, _("cannot create output file \"%s\""),
- filename);
- }
- else
- {
- fp = stdout;
- /* xgettext:no-c-format */
- filename = _("standard output");
- }
-
/* Write out the messages for each domain. */
blank_line = false;
for (k = 0; k < mdlp->nitems; k++)
@@ -1031,6 +1003,92 @@ msgdomain_list_print (msgdomain_list_ty *mdlp, const char *filename,
blank_line = true;
}
}
+}
+
+
+void
+msgdomain_list_print (msgdomain_list_ty *mdlp, const char *filename,
+ bool force, bool debug)
+{
+ FILE *fp;
+
+ /* We will not write anything if, for every domain, we have no message
+ or only the header entry. */
+ if (!force)
+ {
+ bool found_nonempty = false;
+ size_t k;
+
+ for (k = 0; k < mdlp->nitems; k++)
+ {
+ message_list_ty *mlp = mdlp->item[k]->messages;
+
+ if (!(mlp->nitems == 0
+ || (mlp->nitems == 1 && mlp->item[0]->msgid[0] == '\0')))
+ {
+ found_nonempty = true;
+ break;
+ }
+ }
+
+ if (!found_nonempty)
+ return;
+ }
+
+ /* Check whether the output format can accomodate all messages. */
+ if (use_syntax_properties)
+ {
+ if (mdlp->nitems > 1)
+ error (EXIT_FAILURE, 0, _("Cannot output multiple translation domains into a single file with Java .properties syntax. Try using PO file syntax instead."));
+ if (mdlp->nitems == 1)
+ {
+ message_list_ty *mlp = mdlp->item[0]->messages;
+ const lex_pos_ty *has_plural;
+ size_t j;
+
+ has_plural = NULL;
+ for (j = 0; j < mlp->nitems; j++)
+ {
+ message_ty *mp = mlp->item[j];
+
+ if (mp->msgid_plural != NULL)
+ {
+ has_plural = &mp->pos;
+ break;
+ }
+ }
+
+ if (has_plural != NULL)
+ {
+ error_with_progname = false;
+ error_at_line (EXIT_FAILURE, 0,
+ has_plural->file_name, has_plural->line_number,
+ _("message catalog has plural form translations, but the output format does not support them. Try generating a Java class using \"msgfmt --java\", instead of a properties file."));
+ error_with_progname = true;
+ }
+ }
+ }
+
+ /* Open the output file. */
+ if (filename != NULL && strcmp (filename, "-") != 0
+ && strcmp (filename, "/dev/stdout") != 0)
+ {
+ fp = fopen (filename, "w");
+ if (fp == NULL)
+ error (EXIT_FAILURE, errno, _("cannot create output file \"%s\""),
+ filename);
+ }
+ else
+ {
+ fp = stdout;
+ /* xgettext:no-c-format */
+ filename = _("standard output");
+ }
+
+ if (use_syntax_properties)
+ msgdomain_list_print_properties (mdlp, fp, page_width, debug);
+ else
+ msgdomain_list_print_po (mdlp, fp, debug);
/* Make sure nothing went wrong. */
if (fflush (fp) || ferror (fp))
diff --git a/gettext-tools/src/write-po.h b/gettext-tools/src/write-po.h
index 261a7840d..a1a81ef4b 100644
--- a/gettext-tools/src/write-po.h
+++ b/gettext-tools/src/write-po.h
@@ -48,6 +48,8 @@ extern void
message_print_style_uniforum (void);
extern void
message_print_style_escape (bool flag);
+extern void
+ message_print_syntax_properties (void);
/* Output MDLP into a PO file with the given FILENAME, according to the
parameters set by the functions above. */
diff --git a/gettext-tools/src/write-properties.c b/gettext-tools/src/write-properties.c
new file mode 100644
index 000000000..791a5c094
--- /dev/null
+++ b/gettext-tools/src/write-properties.c
@@ -0,0 +1,291 @@
+/* Writing Java .properties files.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Specification. */
+#include "write-properties.h"
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "error.h"
+#include "message.h"
+#include "msgl-ascii.h"
+#include "msgl-iconv.h"
+#include "po-charset.h"
+#include "utf8-ucs4.h"
+#include "write-po.h"
+#include "xmalloc.h"
+#include "exit.h"
+#include "gettext.h"
+
+#define _(str) gettext (str)
+
+/* The format of the Java .properties files is documented in the JDK
+ documentation for class java.util.Properties. In the case of .properties
+ files for PropertyResourceBundle, for each message, the msgid becomes the
+ key (left-hand side) and the msgstr becomes the value (right-hand side)
+ of a "key=value" line. Messages with plurals are not supported in this
+ format. */
+
+/* Handling of comments: We copy all comments from the PO file to the
+ .properties file. This is not really needed; it's a service for translators
+ who don't like PO files and prefer to maintain the .properties file. */
+
+/* Converts a string to JAVA encoding (with \uxxxx sequences for non-ASCII
+ characters). */
+static const char *
+conv_to_java (const char *string)
+{
+ /* We cannot use iconv to "JAVA" because not all iconv() implementations
+ know about the "JAVA" encoding. */
+ static const char hexdigit[] = "0123456789abcdef";
+ size_t length;
+ char *result;
+
+ if (is_ascii_string (string))
+ return string;
+
+ length = 0;
+ {
+ const char *str = string;
+ const char *str_limit = str + strlen (str);
+
+ while (str < str_limit)
+ {
+ unsigned int uc;
+ str += u8_mbtouc (&uc, (const unsigned char *) str, str_limit - str);
+ length += (uc <= 0x007f ? 1 : uc < 0x10000 ? 6 : 12);
+ }
+ }
+
+ result = (char *) xmalloc (length + 1);
+
+ {
+ char *newstr = result;
+ const char *str = string;
+ const char *str_limit = str + strlen (str);
+
+ while (str < str_limit)
+ {
+ unsigned int uc;
+ str += u8_mbtouc (&uc, (const unsigned char *) str, str_limit - str);
+ if (uc <= 0x007f)
+ /* ASCII characters can be output literally.
+ We could treat non-ASCII ISO-8859-1 characters (0x0080..0x00FF)
+ the same way, but there is no point in doing this; Sun's
+ nativetoascii doesn't do it either. */
+ *newstr++ = uc;
+ else if (uc < 0x10000)
+ {
+ /* Single UCS-2 'char' */
+ sprintf (newstr, "\\u%c%c%c%c",
+ hexdigit[(uc >> 12) & 0x0f], hexdigit[(uc >> 8) & 0x0f],
+ hexdigit[(uc >> 4) & 0x0f], hexdigit[uc & 0x0f]);
+ newstr += 6;
+ }
+ else
+ {
+ /* UTF-16 surrogate: two 'char's. */
+ unsigned int uc1 = 0xd800 + ((uc - 0x10000) >> 10);
+ unsigned int uc2 = 0xdc00 + ((uc - 0x10000) & 0x3ff);
+ sprintf (newstr, "\\u%c%c%c%c",
+ hexdigit[(uc1 >> 12) & 0x0f], hexdigit[(uc1 >> 8) & 0x0f],
+ hexdigit[(uc1 >> 4) & 0x0f], hexdigit[uc1 & 0x0f]);
+ newstr += 6;
+ sprintf (newstr, "\\u%c%c%c%c",
+ hexdigit[(uc2 >> 12) & 0x0f], hexdigit[(uc2 >> 8) & 0x0f],
+ hexdigit[(uc2 >> 4) & 0x0f], hexdigit[uc2 & 0x0f]);
+ newstr += 6;
+ }
+ }
+ *newstr = '\0';
+ }
+
+ return result;
+}
+
+/* Writes a key or value to the file, without newline. */
+static void
+write_escaped_string (FILE *fp, const char *str, bool in_key)
+{
+ static const char hexdigit[] = "0123456789abcdef";
+ const char *str_limit = str + strlen (str);
+ bool first = true;
+
+ while (str < str_limit)
+ {
+ unsigned int uc;
+ str += u8_mbtouc (&uc, (const unsigned char *) str, str_limit - str);
+ /* Whitespace must be escaped. */
+ if (uc == 0x0020 && (first || in_key))
+ {
+ putc ('\\', fp);
+ putc (' ', fp);
+ }
+ else if (uc == 0x0009)
+ {
+ putc ('\\', fp);
+ putc ('t', fp);
+ }
+ else if (uc == 0x000a)
+ {
+ putc ('\\', fp);
+ putc ('n', fp);
+ }
+ else if (uc == 0x000d)
+ {
+ putc ('\\', fp);
+ putc ('r', fp);
+ }
+ else if (uc == 0x000c)
+ {
+ putc ('\\', fp);
+ putc ('f', fp);
+ }
+ else if (/* Backslash must be escaped. */
+ uc == '\\'
+ /* Possible comment introducers must be escaped. */
+ || uc == '#' || uc == '!'
+ /* Key terminators must be escaped. */
+ || uc == '=' || uc == ':')
+ {
+ putc ('\\', fp);
+ putc (uc, fp);
+ }
+ else if (uc >= 0x0020 && uc <= 0x007e)
+ {
+ /* ASCII characters can be output literally.
+ We could treat non-ASCII ISO-8859-1 characters (0x0080..0x00FF)
+ the same way, but there is no point in doing this; Sun's
+ nativetoascii doesn't do it either. */
+ putc (uc, fp);
+ }
+ else if (uc < 0x10000)
+ {
+ /* Single UCS-2 'char' */
+ fprintf (fp, "\\u%c%c%c%c",
+ hexdigit[(uc >> 12) & 0x0f], hexdigit[(uc >> 8) & 0x0f],
+ hexdigit[(uc >> 4) & 0x0f], hexdigit[uc & 0x0f]);
+ }
+ else
+ {
+ /* UTF-16 surrogate: two 'char's. */
+ unsigned int uc1 = 0xd800 + ((uc - 0x10000) >> 10);
+ unsigned int uc2 = 0xdc00 + ((uc - 0x10000) & 0x3ff);
+ fprintf (fp, "\\u%c%c%c%c",
+ hexdigit[(uc1 >> 12) & 0x0f], hexdigit[(uc1 >> 8) & 0x0f],
+ hexdigit[(uc1 >> 4) & 0x0f], hexdigit[uc1 & 0x0f]);
+ fprintf (fp, "\\u%c%c%c%c",
+ hexdigit[(uc2 >> 12) & 0x0f], hexdigit[(uc2 >> 8) & 0x0f],
+ hexdigit[(uc2 >> 4) & 0x0f], hexdigit[uc2 & 0x0f]);
+ }
+ first = false;
+ }
+}
+
+/* Writes a message to the file. */
+static void
+write_message (FILE *fp, const message_ty *mp, size_t page_width, bool debug)
+{
+ /* Print translator comment if available. */
+ message_print_comment (mp, fp);
+
+ /* Print xgettext extracted comments. */
+ message_print_comment_dot (mp, fp);
+
+ /* Print the file position comments. */
+ message_print_comment_filepos (mp, fp, false, page_width);
+
+ /* Print flag information in special comment. */
+ message_print_comment_flags (mp, fp, debug);
+
+ /* Put a comment mark if the message is the header or untranslated or
+ fuzzy. */
+ if (mp->msgid[0] == '\0'
+ || mp->msgstr[0] == '\0'
+ || (mp->is_fuzzy && mp->msgid[0] != '\0'))
+ putc ('!', fp);
+
+ /* Now write the untranslated string and the translated string. */
+ write_escaped_string (fp, mp->msgid, true);
+ putc ('=', fp);
+ write_escaped_string (fp, mp->msgstr, false);
+
+ putc ('\n', fp);
+}
+
+/* Writes an entire message list to the file. */
+static void
+write_properties (FILE *fp, message_list_ty *mlp, const char *canon_encoding,
+ size_t page_width, bool debug)
+{
+ bool blank_line;
+ size_t j, i;
+
+ /* Convert the messages to Unicode. */
+ iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
+ for (j = 0; j < mlp->nitems; ++j)
+ {
+ message_ty *mp = mlp->item[j];
+
+ if (mp->comment != NULL)
+ for (i = 0; i < mp->comment->nitems; ++i)
+ mp->comment->item[i] = conv_to_java (mp->comment->item[i]);
+ if (mp->comment_dot != NULL)
+ for (i = 0; i < mp->comment_dot->nitems; ++i)
+ mp->comment_dot->item[i] = conv_to_java (mp->comment_dot->item[i]);
+ }
+
+ /* Loop through the messages. */
+ blank_line = false;
+ for (j = 0; j < mlp->nitems; ++j)
+ {
+ const message_ty *mp = mlp->item[j];
+
+ if (mp->msgid_plural == NULL && !mp->obsolete)
+ {
+ if (blank_line)
+ putc ('\n', fp);
+
+ write_message (fp, mp, page_width, debug);
+
+ blank_line = true;
+ }
+ }
+}
+
+/* Output the contents of a PO file in Java .properties syntax. */
+void
+msgdomain_list_print_properties (msgdomain_list_ty *mdlp, FILE *fp,
+ size_t page_width, bool debug)
+{
+ message_list_ty *mlp;
+
+ if (mdlp->nitems == 1)
+ mlp = mdlp->item[0]->messages;
+ else
+ mlp = message_list_alloc (false);
+ write_properties (fp, mlp, mdlp->encoding, page_width, debug);
+}
diff --git a/gettext-tools/src/write-properties.h b/gettext-tools/src/write-properties.h
new file mode 100644
index 000000000..d25be0d7a
--- /dev/null
+++ b/gettext-tools/src/write-properties.h
@@ -0,0 +1,33 @@
+/* Writing Java .properties files.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _WRITE_PROPERTIES_H
+#define _WRITE_PROPERTIES_H
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stddef.h>
+
+#include "message.h"
+
+/* Output the contents of a PO file in Java .properties syntax. */
+extern void
+ msgdomain_list_print_properties (msgdomain_list_ty *mdlp, FILE *fp,
+ size_t page_width, bool debug);
+
+#endif /* _WRITE_PROPERTIES_H */
diff --git a/gettext-tools/src/write-tcl.c b/gettext-tools/src/write-tcl.c
index fed43f5a0..b99a10372 100644
--- a/gettext-tools/src/write-tcl.c
+++ b/gettext-tools/src/write-tcl.c
@@ -133,7 +133,7 @@ write_msg (FILE *output_file, message_list_ty *mlp, const char *locale_name)
}
int
-msgdomain_write_tcl (message_list_ty *mlp,
+msgdomain_write_tcl (message_list_ty *mlp, const char *canon_encoding,
const char *locale_name,
const char *directory)
{
@@ -161,7 +161,7 @@ but the Tcl message catalog format doesn't support plural handling\n")));
}
/* Convert the messages to Unicode. */
- iconv_message_list (mlp, NULL, po_charset_canonicalize ("UTF-8"), NULL);
+ iconv_message_list (mlp, canon_encoding, po_charset_utf8, NULL);
/* Now create the file. */
{
diff --git a/gettext-tools/src/write-tcl.h b/gettext-tools/src/write-tcl.h
index 2b135db67..8ebcafb5b 100644
--- a/gettext-tools/src/write-tcl.h
+++ b/gettext-tools/src/write-tcl.h
@@ -1,5 +1,5 @@
/* Writing tcl/msgcat .msg files.
- Copyright (C) 2002 Free Software Foundation, Inc.
+ Copyright (C) 2002-2003 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2002.
This program is free software; you can redistribute it and/or modify
@@ -26,7 +26,7 @@
the base directory.
Return 0 if ok, nonzero on error. */
extern int
- msgdomain_write_tcl (message_list_ty *mlp,
+ msgdomain_write_tcl (message_list_ty *mlp, const char *canon_encoding,
const char *locale_name,
const char *directory);
diff --git a/gettext-tools/src/x-po.c b/gettext-tools/src/x-po.c
index f513daa38..6cc89c78b 100644
--- a/gettext-tools/src/x-po.c
+++ b/gettext-tools/src/x-po.c
@@ -1,4 +1,4 @@
-/* xgettext PO backend.
+/* xgettext PO and JavaProperties backends.
Copyright (C) 1995-1998, 2000-2003 Free Software Foundation, Inc.
This file was written by Peter Miller <millerp@canb.auug.org.au>
@@ -47,7 +47,7 @@ extract_add_message (default_po_reader_ty *this,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
/* See whether we shall exclude this message. */
if (exclude != NULL && message_list_search (exclude, msgid) != NULL)
@@ -67,7 +67,7 @@ extract_add_message (default_po_reader_ty *this,
/* Invoke superclass method. */
default_add_message (this, msgid, msgid_pos, msgid_plural,
- msgstr, msgstr_len, msgstr_pos, obsolete);
+ msgstr, msgstr_len, msgstr_pos, force_fuzzy, obsolete);
}
@@ -98,10 +98,11 @@ static default_po_reader_class_ty extract_methods =
};
-void
-extract_po (FILE *fp,
- const char *real_filename, const char *logical_filename,
- msgdomain_list_ty *mdlp)
+static void
+extract (FILE *fp,
+ const char *real_filename, const char *logical_filename,
+ input_syntax_ty syntax,
+ msgdomain_list_ty *mdlp)
{
default_po_reader_ty *pop;
@@ -113,6 +114,25 @@ extract_po (FILE *fp,
pop->allow_duplicates_if_same_msgstr = true;
pop->mdlp = NULL;
pop->mlp = mdlp->item[0]->messages;
- po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, logical_filename);
+ po_scan ((abstract_po_reader_ty *) pop, fp, real_filename, logical_filename,
+ syntax);
po_reader_free ((abstract_po_reader_ty *) pop);
}
+
+
+void
+extract_po (FILE *fp,
+ const char *real_filename, const char *logical_filename,
+ msgdomain_list_ty *mdlp)
+{
+ extract (fp, real_filename, logical_filename, syntax_po, mdlp);
+}
+
+
+void
+extract_properties (FILE *fp,
+ const char *real_filename, const char *logical_filename,
+ msgdomain_list_ty *mdlp)
+{
+ extract (fp, real_filename, logical_filename, syntax_properties, mdlp);
+}
diff --git a/gettext-tools/src/x-properties.h b/gettext-tools/src/x-properties.h
new file mode 100644
index 000000000..e9e5f1e91
--- /dev/null
+++ b/gettext-tools/src/x-properties.h
@@ -0,0 +1,29 @@
+/* xgettext JavaProperties backend.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Written by Bruno Haible <bruno@clisp.org>, 2003.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+
+#define EXTENSIONS_PROPERTIES \
+ { "properties", "JavaProperties" }, \
+
+#define SCANNERS_PROPERTIES \
+ { "JavaProperties", extract_properties, NULL }, \
+
+/* Scan a JavaProperties file and add its translatable strings to mdlp. */
+extern void extract_properties (FILE *fp, const char *real_filename,
+ const char *logical_filename,
+ msgdomain_list_ty *mdlp);
diff --git a/gettext-tools/src/xgettext.c b/gettext-tools/src/xgettext.c
index b89e6a61f..ae113e2f7 100644
--- a/gettext-tools/src/xgettext.c
+++ b/gettext-tools/src/xgettext.c
@@ -70,6 +70,7 @@
#include "x-librep.h"
#include "x-smalltalk.h"
#include "x-java.h"
+#include "x-properties.h"
#include "x-awk.h"
#include "x-ycp.h"
#include "x-tcl.h"
@@ -169,6 +170,7 @@ static const struct option long_options[] =
{ "omit-header", no_argument, &xgettext_omit_header, 1 },
{ "output", required_argument, NULL, 'o' },
{ "output-dir", required_argument, NULL, 'p' },
+ { "properties-output", no_argument, NULL, CHAR_MAX + 6 },
{ "sort-by-file", no_argument, NULL, 'F' },
{ "sort-output", no_argument, NULL, 's' },
{ "strict", no_argument, NULL, 'S' },
@@ -393,6 +395,9 @@ main (int argc, char *argv[])
case CHAR_MAX + 5: /* --msgid-bugs-address */
msgid_bugs_address = optarg;
break;
+ case CHAR_MAX + 6: /* --properties-output */
+ message_print_syntax_properties ();
+ break;
default:
usage (EXIT_FAILURE);
/* NOTREACHED */
@@ -644,8 +649,8 @@ Choice of input file language:\n"));
printf (_("\
-L, --language=NAME recognise the specified language\n\
(C, C++, ObjectiveC, PO, Python, Lisp,\n\
- EmacsLisp, librep, Smalltalk, Java, awk, YCP,\n\
- Tcl, PHP, RST, Glade)\n"));
+ EmacsLisp, librep, Smalltalk, Java,\n\
+ JavaProperties, awk, YCP, Tcl, PHP, RST, Glade)\n"));
printf (_("\
-C, --c++ shorthand for --language=C++\n"));
printf (_("\
@@ -698,6 +703,8 @@ Output details:\n"));
printf (_("\
--strict write out strict Uniforum conforming .po file\n"));
printf (_("\
+ --properties-output write out a Java .properties file\n"));
+ printf (_("\
-w, --width=NUMBER set output page width\n"));
printf (_("\
--no-wrap do not break long message lines, longer than\n\
@@ -749,7 +756,7 @@ exclude_directive_message (abstract_po_reader_ty *pop,
char *msgid_plural,
char *msgstr, size_t msgstr_len,
lex_pos_ty *msgstr_pos,
- bool obsolete)
+ bool force_fuzzy, bool obsolete)
{
message_ty *mp;
@@ -802,7 +809,7 @@ read_exclusion_file (char *filename)
abstract_po_reader_ty *pop;
pop = po_reader_alloc (&exclude_methods);
- po_scan (pop, fp, real_filename, filename);
+ po_scan (pop, fp, real_filename, filename, input_syntax);
po_reader_free (pop);
if (fp != stdin)
@@ -1442,6 +1449,7 @@ language_to_extractor (const char *name)
SCANNERS_LIBREP
SCANNERS_SMALLTALK
SCANNERS_JAVA
+ SCANNERS_PROPERTIES
SCANNERS_AWK
SCANNERS_YCP
SCANNERS_TCL
@@ -1489,6 +1497,7 @@ extension_to_language (const char *extension)
EXTENSIONS_LIBREP
EXTENSIONS_SMALLTALK
EXTENSIONS_JAVA
+ EXTENSIONS_PROPERTIES
EXTENSIONS_AWK
EXTENSIONS_YCP
EXTENSIONS_TCL
diff --git a/gettext-tools/src/xgettext.h b/gettext-tools/src/xgettext.h
index 97408b87e..a37c54429 100644
--- a/gettext-tools/src/xgettext.h
+++ b/gettext-tools/src/xgettext.h
@@ -29,8 +29,8 @@
#include "message.h"
#include "pos.h"
-/* Borrowed from read-po.h. */
-extern int line_comment;
+/* Declare 'line_comment' and 'input_syntax'. */
+#include "read-po.h"
/* If true, omit the header entry.
If false, keep the header entry present in the input. */
diff --git a/gettext-tools/tests/ChangeLog b/gettext-tools/tests/ChangeLog
index 87f0ddda3..40e41ea2f 100644
--- a/gettext-tools/tests/ChangeLog
+++ b/gettext-tools/tests/ChangeLog
@@ -1,3 +1,25 @@
+2003-04-26 Bruno Haible <bruno@clisp.org>
+
+ * msgattrib-15: New file.
+ * msgcat-11: New file.
+ * msgcat-12: New file.
+ * msgcmp-3: New file.
+ * msgcomm-24: New file.
+ * msgconv-4: New file.
+ * msgen-2: New file.
+ * msgexec-3: New file.
+ * msgfilter-3: New file.
+ * msgfmt-13: New file.
+ * msggrep-6: New file.
+ * msgmerge-23: New file.
+ * msgmerge-24: New file.
+ * msgunfmt-4: New file.
+ * msguniq-4: New file.
+ * xgettext-24: New file.
+ * msguniq-a.inp: New file.
+ * Makefile.am (TESTS): Add the new tests.
+ (EXTRA_DIST): Add msguniq-a.inp.
+
2003-04-14 Bruno Haible <bruno@clisp.org>
* Makefile.am (CHECKER): New variable.
diff --git a/gettext-tools/tests/Makefile.am b/gettext-tools/tests/Makefile.am
index 17aaf6f62..01887a20b 100644
--- a/gettext-tools/tests/Makefile.am
+++ b/gettext-tools/tests/Makefile.am
@@ -23,32 +23,33 @@ EXTRA_DIST =
TESTS = gettext-1 gettext-2 \
msgattrib-1 msgattrib-2 msgattrib-3 msgattrib-4 msgattrib-5 \
msgattrib-6 msgattrib-7 msgattrib-8 msgattrib-9 msgattrib-10 \
- msgattrib-11 msgattrib-12 msgattrib-13 msgattrib-14 \
+ msgattrib-11 msgattrib-12 msgattrib-13 msgattrib-14 msgattrib-15 \
msgcat-1 msgcat-2 msgcat-3 msgcat-4 msgcat-5 msgcat-6 msgcat-7 \
- msgcat-8 msgcat-9 msgcat-10 \
- msgcmp-1 msgcmp-2 \
+ msgcat-8 msgcat-9 msgcat-10 msgcat-11 msgcat-12 \
+ msgcmp-1 msgcmp-2 msgcmp-3 \
msgcomm-1 msgcomm-2 msgcomm-3 msgcomm-4 msgcomm-5 msgcomm-6 msgcomm-7 \
msgcomm-8 msgcomm-9 msgcomm-10 msgcomm-11 msgcomm-12 msgcomm-13 \
msgcomm-14 msgcomm-15 msgcomm-16 msgcomm-17 msgcomm-18 msgcomm-19 \
- msgcomm-20 msgcomm-21 msgcomm-22 msgcomm-23 \
- msgconv-1 msgconv-2 msgconv-3 \
- msgen-1 \
- msgexec-1 msgexec-2 \
- msgfilter-1 msgfilter-2 \
+ msgcomm-20 msgcomm-21 msgcomm-22 msgcomm-23 msgcomm-24 \
+ msgconv-1 msgconv-2 msgconv-3 msgconv-4 \
+ msgen-1 msgen-2 \
+ msgexec-1 msgexec-2 msgexec-3 \
+ msgfilter-1 msgfilter-2 msgfilter-3 \
msgfmt-1 msgfmt-2 msgfmt-3 msgfmt-4 msgfmt-5 msgfmt-6 msgfmt-7 \
- msgfmt-8 msgfmt-9 msgfmt-10 msgfmt-11 msgfmt-12 \
- msggrep-1 msggrep-2 msggrep-3 msggrep-4 msggrep-5 \
+ msgfmt-8 msgfmt-9 msgfmt-10 msgfmt-11 msgfmt-12 msgfmt-13 \
+ msggrep-1 msggrep-2 msggrep-3 msggrep-4 msggrep-5 msggrep-6 \
msgmerge-1 msgmerge-2 msgmerge-3 msgmerge-4 msgmerge-5 msgmerge-6 \
msgmerge-7 msgmerge-8 msgmerge-9 msgmerge-10 msgmerge-11 msgmerge-12 \
msgmerge-13 msgmerge-14 msgmerge-15 msgmerge-16 msgmerge-17 \
msgmerge-18 msgmerge-19 msgmerge-20 msgmerge-21 msgmerge-22 \
- msgunfmt-1 msgunfmt-2 msgunfmt-3 \
- msguniq-1 msguniq-2 msguniq-3 \
+ msgmerge-23 msgmerge-24 \
+ msgunfmt-1 msgunfmt-2 msgunfmt-3 msgunfmt-4 \
+ msguniq-1 msguniq-2 msguniq-3 msguniq-4 \
xgettext-1 xgettext-2 xgettext-3 xgettext-4 xgettext-5 xgettext-6 \
xgettext-7 xgettext-8 xgettext-9 xgettext-10 xgettext-11 xgettext-12 \
xgettext-13 xgettext-14 xgettext-15 xgettext-16 xgettext-17 \
xgettext-18 xgettext-19 xgettext-20 xgettext-21 xgettext-22 \
- xgettext-23 \
+ xgettext-23 xgettext-24 \
format-awk-1 format-awk-2 \
format-c-1 format-c-2 format-c-3 format-c-4 \
format-elisp-1 format-elisp-2 \
@@ -67,8 +68,8 @@ TESTS = gettext-1 gettext-2 \
lang-rst
EXTRA_DIST += $(TESTS) \
- test.mo xg-test1.ok.po mex-test2.ok msguniq-a.in msguniq-a.out \
- ChangeLog.0
+ test.mo xg-test1.ok.po mex-test2.ok msguniq-a.in msguniq-a.inp \
+ msguniq-a.out ChangeLog.0
XGETTEXT = ../src/xgettext
diff --git a/gettext-tools/tests/msgattrib-15 b/gettext-tools/tests/msgattrib-15
new file mode 100755
index 000000000..5e6e843d6
--- /dev/null
+++ b/gettext-tools/tests/msgattrib-15
@@ -0,0 +1,60 @@
+#! /bin/sh
+
+# Test --translated option with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles ma-test15.properties"
+cat <<\EOF > ma-test15.properties
+# HEADER.
+#
+!=Project-Id-Version\: Bonnie Tyler\n
+
+#: married-men:4
+#, fuzzy
+!The\ world\ is\ full\ of\ married\ men=So viele verheiratete M\u00e4nner
+
+#: married-men:5
+with\ wives\ who\ never\ understand=und ihre Frauen verstehen sie nicht
+
+#: married-men:6
+!They're\ looking\ for\ someone\ to\ share=
+
+# schwer zu \u00fcbersetzen...
+#: married-men:7
+!the\ excitement\ of\ a\ love\ affair=
+
+#: married-men:8
+!Just\ as\ soon\ as\ they\ find\ you=
+
+#: married-men:9
+!They\ warn\ you\ and\ darn\ you=
+EOF
+
+tmpfiles="$tmpfiles ma-test15.out"
+: ${MSGATTRIB=msgattrib}
+${MSGATTRIB} --translated --properties-input --properties-output ma-test15.properties -o ma-test15.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles ma-test15.ok"
+cat <<\EOF > ma-test15.ok
+# HEADER.
+#
+!=Project-Id-Version\: Bonnie Tyler\n
+
+#: married-men:4
+#, fuzzy
+!The\ world\ is\ full\ of\ married\ men=So viele verheiratete M\u00e4nner
+
+#: married-men:5
+with\ wives\ who\ never\ understand=und ihre Frauen verstehen sie nicht
+EOF
+
+: ${DIFF=diff}
+${DIFF} ma-test15.ok ma-test15.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgcat-11 b/gettext-tools/tests/msgcat-11
new file mode 100755
index 000000000..8c12b3018
--- /dev/null
+++ b/gettext-tools/tests/msgcat-11
@@ -0,0 +1,42 @@
+#! /bin/sh
+
+# Test --use-first option with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mcat-test11.in1 mcat-test11.in2"
+cat <<\EOF > mcat-test11.in1
+#. Help text (HTML-like) START
+#: clients/inst_ask_config.ycp:119
+Congratulations\!=Gl\u00fcckwunsch\!
+EOF
+
+cat <<\EOF > mcat-test11.in2
+#. Help text (HTML-like) START
+#: clients/inst_ask_config.ycp:119
+Congratulations\!=Herzlichen Gl\u00fcckwunsch\!
+EOF
+
+tmpfiles="$tmpfiles mcat-test11.out"
+rm -f mcat-test11.out
+
+: ${MSGCAT=msgcat}
+${MSGCAT} --use-first --more-than=0 --properties-input --properties-output \
+ mcat-test11.in1 mcat-test11.in2 -o mcat-test11.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mcat-test11.ok"
+cat << \EOF > mcat-test11.ok
+#. Help text (HTML-like) START
+#: clients/inst_ask_config.ycp:119
+Congratulations\!=Gl\u00fcckwunsch\!
+EOF
+
+: ${DIFF=diff}
+${DIFF} mcat-test11.ok mcat-test11.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgcat-12 b/gettext-tools/tests/msgcat-12
new file mode 100755
index 000000000..2c2997540
--- /dev/null
+++ b/gettext-tools/tests/msgcat-12
@@ -0,0 +1,27 @@
+#! /bin/sh
+
+# Test conversion from UTF-8 to BIG5 is a NOP with Java .properties syntax.
+# Test that encoding names are case insensitive.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mcat-test12.properties"
+cat <<\EOF > mcat-test12.properties
+#: src/msgcmp.c:155 src/msgmerge.c:273
+exactly\ 2\ input\ files\ required=\u6b64\u529f\u80fd\u9700\u8981\u6070\u597d\u6307\u5b9a\u5169\u500b\u8f38\u5165\u6a94
+EOF
+
+tmpfiles="$tmpfiles mcat-test12.out"
+: ${MSGCAT=msgcat}
+${MSGCAT} --properties-input --properties-output -t Big5 mcat-test12.properties -o mcat-test12.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+: ${DIFF=diff}
+# Redirect stdout, so as not to fill the user's screen with non-ASCII bytes.
+${DIFF} mcat-test12.properties mcat-test12.out >/dev/null
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgcmp-3 b/gettext-tools/tests/msgcmp-3
new file mode 100755
index 000000000..00dfedb73
--- /dev/null
+++ b/gettext-tools/tests/msgcmp-3
@@ -0,0 +1,41 @@
+#! /bin/sh
+
+# Test a failing comparison with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mc-test3.in1 mc-test3.in2"
+cat <<EOF > mc-test3.in1
+one=first
+two=second
+three=third
+four=fourth
+EOF
+
+cat <<EOF > mc-test3.in2
+!thre=
+!one=
+!two=
+EOF
+
+tmpfiles="$tmpfiles mc-test3.out"
+: ${MSGCMP=msgcmp}
+LC_MESSAGES=C LC_ALL= \
+${MSGCMP} --properties-input mc-test3.in1 mc-test3.in2 2>&1 | grep -v '^==' > mc-test3.out
+
+tmpfiles="$tmpfiles mc-test3.ok"
+cat <<EOF > mc-test3.ok
+mc-test3.in2:1: this message is used but not defined...
+mc-test3.in1:3: ...but this definition is similar
+mc-test3.in1:4: warning: this message is not used
+msgcmp: found 1 fatal error
+EOF
+
+: ${DIFF=diff}
+${DIFF} mc-test3.ok mc-test3.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgcomm-24 b/gettext-tools/tests/msgcomm-24
new file mode 100755
index 000000000..c7c6a4309
--- /dev/null
+++ b/gettext-tools/tests/msgcomm-24
@@ -0,0 +1,39 @@
+#! /bin/sh
+
+# Test --more-than=0 option with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mcomm-test24.in1 mcomm-test24.in2"
+cat <<EOF > mcomm-test24.in1
+#: first.c:123
+1=1x
+EOF
+
+cat <<EOF > mcomm-test24.in2
+#: hunt.c:759
+2=2x
+EOF
+
+tmpfiles="$tmpfiles mcomm-test24.out"
+: ${MSGCOMM=msgcomm}
+${MSGCOMM} --more-than=0 --properties-input --properties-output -o mcomm-test24.out mcomm-test24.in1 mcomm-test24.in2
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mcomm-test24.ok"
+cat << EOF > mcomm-test24.ok
+#: first.c:123
+1=1x
+
+#: hunt.c:759
+2=2x
+EOF
+
+: ${DIFF=diff}
+${DIFF} mcomm-test24.ok mcomm-test24.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgconv-4 b/gettext-tools/tests/msgconv-4
new file mode 100755
index 000000000..29b82a9f7
--- /dev/null
+++ b/gettext-tools/tests/msgconv-4
@@ -0,0 +1,27 @@
+#! /bin/sh
+
+# Test conversion from UTF-8 to BIG5 is a NOP with Java .properties syntax.
+# Test that encoding names are case insensitive.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mco-test4.properties"
+cat <<\EOF > mco-test4.properties
+#: src/msgcmp.c:155 src/msgmerge.c:273
+exactly\ 2\ input\ files\ required=\u6b64\u529f\u80fd\u9700\u8981\u6070\u597d\u6307\u5b9a\u5169\u500b\u8f38\u5165\u6a94
+EOF
+
+tmpfiles="$tmpfiles mco-test4.out"
+: ${MSGCONV=msgconv}
+${MSGCONV} --properties-input --properties-output -t Big5 mco-test4.properties -o mco-test4.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+: ${DIFF=diff}
+# Redirect stdout, so as not to fill the user's screen with non-ASCII bytes.
+${DIFF} mco-test4.properties mco-test4.out >/dev/null
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgen-2 b/gettext-tools/tests/msgen-2
new file mode 100755
index 000000000..634940f8d
--- /dev/null
+++ b/gettext-tools/tests/msgen-2
@@ -0,0 +1,37 @@
+#! /bin/sh
+
+# Test general operation with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles men-test2.properties"
+cat <<\EOF > men-test2.properties
+!height\ must\ be\ positive=
+
+color\ cannot\ be\ transparent=colour cannot be transparent
+
+width\ must\ be\ positive=
+EOF
+
+tmpfiles="$tmpfiles men-test2.out"
+: ${MSGEN=msgen}
+${MSGEN} --properties-input --properties-output men-test2.properties -o men-test2.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles men-test2.ok"
+cat <<\EOF > men-test2.ok
+height\ must\ be\ positive=height must be positive
+
+color\ cannot\ be\ transparent=colour cannot be transparent
+
+width\ must\ be\ positive=width must be positive
+EOF
+
+: ${DIFF=diff}
+${DIFF} men-test2.ok men-test2.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgexec-3 b/gettext-tools/tests/msgexec-3
new file mode 100755
index 000000000..0f46b89ba
--- /dev/null
+++ b/gettext-tools/tests/msgexec-3
@@ -0,0 +1,93 @@
+#! /bin/sh
+
+# Test of an external command with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mex-test3.properties"
+cat <<\EOF > mex-test3.properties
+# HEADER.
+#
+!=Project-Id-Version\: Bonnie Tyler\n
+
+#: married-men:4
+#, fuzzy
+!The\ world\ is\ full\ of\ married\ men=So viele verheiratete M\u00e4nner
+
+#: married-men:5
+with\ wives\ who\ never\ understand=und ihre Frauen verstehen sie nicht
+
+#: married-men:6
+!They're\ looking\ for\ someone\ to\ share=
+
+# schwer zu \u00fcbersetzen...
+#: married-men:7
+!the\ excitement\ of\ a\ love\ affair=
+
+#: married-men:8
+!Just\ as\ soon\ as\ they\ find\ you=
+
+#: married-men:9
+!They\ warn\ you\ and\ darn\ you=
+EOF
+
+tmpfiles="$tmpfiles mex-test3.sh"
+cat <<\EOF > mex-test3.sh
+#! /bin/sh
+echo "========================= $MSGEXEC_LOCATION ========================="
+cat <<MEOF
+$MSGEXEC_MSGID
+---
+MEOF
+cat
+echo
+exit 0
+EOF
+chmod a+x mex-test3.sh
+
+tmpfiles="$tmpfiles mex-test3.out"
+: ${MSGEXEC=msgexec}
+${MSGEXEC} --properties-input -i mex-test3.properties ./mex-test3.sh > mex-test3.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mex-test3.ok"
+cat <<\EOF > mex-test3.ok
+========================= mex-test3.properties:3 =========================
+
+---
+Project-Id-Version: Bonnie Tyler
+
+========================= mex-test3.properties:7 =========================
+The world is full of married men
+---
+So viele verheiratete Männer
+========================= mex-test3.properties:10 =========================
+with wives who never understand
+---
+und ihre Frauen verstehen sie nicht
+========================= mex-test3.properties:13 =========================
+They're looking for someone to share
+---
+
+========================= mex-test3.properties:17 =========================
+the excitement of a love affair
+---
+
+========================= mex-test3.properties:20 =========================
+Just as soon as they find you
+---
+
+========================= mex-test3.properties:23 =========================
+They warn you and darn you
+---
+
+EOF
+
+: ${DIFF=diff}
+${DIFF} mex-test3.ok mex-test3.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgfilter-3 b/gettext-tools/tests/msgfilter-3
new file mode 100755
index 000000000..e0c47feab
--- /dev/null
+++ b/gettext-tools/tests/msgfilter-3
@@ -0,0 +1,97 @@
+#! /bin/sh
+
+# Test general filter execution with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+# Some fold programs (like SunOS4 and FreeBSD) don't have an option to wrap at
+# spaces.
+echo abc | fold -b -s -w 20 >/dev/null 2>&1 || { rm -fr $tmpfiles; exit 77; }
+
+# Some fold programs (like HP-UX) insert a newline at the end, if the last
+# line was not terminated with a newline and the -s option was given.
+foldoutputcount=`echo $ac_n "abc$ac_c" | fold -b -s -w 20 | wc -c`
+foldoutputcount=`echo "$foldoutputcount" | sed -e 's/[ ]//g'`
+test "$foldoutputcount" = 3 || { rm -fr $tmpfiles; exit 77; }
+
+tmpfiles="$tmpfiles mfi-test3.properties"
+cat <<\EOF > mfi-test3.properties
+# HEADER.
+#
+!=Project-Id-Version\: Bonnie Tyler\n
+
+#: married-men:4
+#, fuzzy
+!The\ world\ is\ full\ of\ married\ men=So viele verheiratete M\u00e4nner
+
+#: married-men:5
+with\ wives\ who\ never\ understand=und ihre Frauen verstehen sie nicht
+
+#: married-men:6
+!They're\ looking\ for\ someone\ to\ share=
+
+# schwer zu \u00fcbersetzen...
+#: married-men:7
+!the\ excitement\ of\ a\ love\ affair=
+
+#: married-men:8
+!Just\ as\ soon\ as\ they\ find\ you=
+
+#: married-men:9
+!They\ warn\ you\ and\ darn\ you=
+EOF
+
+tmpfiles="$tmpfiles mfi-test3.out"
+: ${MSGFILTER=msgfilter}
+LC_ALL=C \
+${MSGFILTER} --properties-input --properties-output -i mfi-test3.properties -o mfi-test3.out fold -b -s -w 20
+result=$?
+test $result = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mfi-test3.ok"
+cat <<\EOF > mfi-test3.ok
+# HEADER.
+#
+!=Project-Id-Version\: \nBonnie Tyler\n
+
+#: married-men:4
+#, fuzzy
+!The\ world\ is\ full\ of\ married\ men=So viele \nverheiratete M\u00e4nner
+
+#: married-men:5
+with\ wives\ who\ never\ understand=und ihre Frauen \nverstehen sie nicht
+
+#: married-men:6
+!They're\ looking\ for\ someone\ to\ share=
+
+# schwer zu \u00fcbersetzen...
+#: married-men:7
+!the\ excitement\ of\ a\ love\ affair=
+
+#: married-men:8
+!Just\ as\ soon\ as\ they\ find\ you=
+
+#: married-men:9
+!They\ warn\ you\ and\ darn\ you=
+EOF
+
+: ${DIFF=diff}
+${DIFF} mfi-test3.ok mfi-test3.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgfmt-13 b/gettext-tools/tests/msgfmt-13
new file mode 100755
index 000000000..e7a52f4fa
--- /dev/null
+++ b/gettext-tools/tests/msgfmt-13
@@ -0,0 +1,61 @@
+#! /bin/sh
+
+# Test basic functioning with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles LC_MESSAGES"
+test -d LC_MESSAGES || mkdir LC_MESSAGES
+
+tmpfiles="$tmpfiles module1.properties module2.properties"
+cat <<\EOF > module1.properties
+SYS_(C)\n=MSGFMT(3) portable message object file compiler\nCopyright (C) 1995 Free Software Foundation\nReport bugs to <bug-gnu-utils@gnu.org>\n
+msg\ 1=msg 1 translation
+help\ 2\ %d=help 2 translation
+error\ 3=error 3 translation
+EOF
+
+cat <<\EOF > module2.properties
+# ---
+mesg\ 4=mesg 4 translation
+error\ 3=alternate error 3 translation
+error\ 5=error 5 translation
+window\ 6=window 6 translation
+EOF
+
+# Without use of msgcat, expect a "duplicate message definition" error.
+: ${MSGFMT=msgfmt}
+if ${MSGFMT} --properties-input module1.properties module2.properties -o LC_MESSAGES/gen.mo 2> /dev/null; then
+ rm -fr $tmpfiles
+ exit 1
+fi
+
+# With msgcat, it should work.
+tmpfiles="$tmpfiles modules.properties"
+: ${MSGCAT=msgcat} ${MSGFMT=msgfmt}
+${MSGCAT} --properties-input --properties-output --use-first module1.properties module2.properties -o modules.properties
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+${MSGFMT} --properties-input modules.properties -o LC_MESSAGES/gen.mo
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mf-test1.out"
+: ${GETTEXT=gettext}
+TEXTDOMAINDIR=.. LANGUAGE=tests \
+${GETTEXT} --env LC_ALL=en gen 'SYS_(C)
+' > mf-test1.out
+
+tmpfiles="$tmpfiles gtmf-test1.ok"
+cat <<EOF > gtmf-test1.ok
+MSGFMT(3) portable message object file compiler
+Copyright (C) 1995 Free Software Foundation
+Report bugs to <bug-gnu-utils@gnu.org>
+EOF
+
+: ${DIFF=diff}
+${DIFF} gtmf-test1.ok mf-test1.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msggrep-6 b/gettext-tools/tests/msggrep-6
new file mode 100755
index 000000000..a7597261e
--- /dev/null
+++ b/gettext-tools/tests/msggrep-6
@@ -0,0 +1,155 @@
+#! /bin/sh
+
+# Test --msgid and --msgstr options with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mg-test6.properties"
+cat <<\EOF > mg-test6.properties
+#: argmatch.c:141
+#, c-format
+invalid\ argument\ `%s'\ for\ `%s'=ung\u00fcltiges Argument \u00bb%s\u00ab f\u00fcr \u00bb%s\u00ab
+
+#: argmatch.c:142
+#, c-format
+ambiguous\ argument\ `%s'\ for\ `%s'=mehrdeutiges Argument \u00bb%s\u00ab f\u00fcr \u00bb%s\u00ab
+
+#: argmatch.c:162
+Valid\ arguments\ are\:=G\u00fcltige Argumente sind\:
+
+#: copy-file.c:60
+#, c-format
+error\ while\ opening\ "%s"\ for\ reading=\u00d6ffnen der Datei \u00bb%s\u00ab zum Lesen fehlgeschlagen
+
+#: copy-file.c:67
+#, c-format
+cannot\ open\ backup\ file\ "%s"\ for\ writing=\u00d6ffnen der Sicherungsdatei \u00bb%s\u00ab zum Schreiben fehlgeschlagen
+
+#: copy-file.c:80
+#, c-format
+error\ reading\ "%s"=Fehler beim Lesen von \u00bb%s\u00ab
+
+#: copy-file.c:86 copy-file.c:90
+#, c-format
+error\ writing\ "%s"=Fehler beim Schreiben von \u00bb%s\u00ab
+
+#: copy-file.c:92
+#, c-format
+error\ after\ reading\ "%s"=Fehler nach dem Lesen von \u00bb%s\u00ab
+
+#: error.c:115
+Unknown\ system\ error=Unbekannter Systemfehler
+
+#: execute.c:170 execute.c:205 pipe-bidi.c:156 pipe-bidi.c:191 pipe-in.c:169
+#: pipe-in.c:205 pipe-out.c:169 pipe-out.c:205 wait-process.c:136
+#, c-format
+%s\ subprocess\ failed=Subprozess %s fehlgeschlagen
+
+#: getopt.c:691
+#, c-format
+%s\:\ option\ `%s'\ is\ ambiguous\n=%s\: Option \u00bb%s\u00ab ist mehrdeutig\n
+
+#: getopt.c:716
+#, c-format
+%s\:\ option\ `--%s'\ doesn't\ allow\ an\ argument\n=%s\: Option \u00bb--%s\u00ab erwartet kein Argument\n
+
+#: getopt.c:721
+#, c-format
+%s\:\ option\ `%c%s'\ doesn't\ allow\ an\ argument\n=%s\: Option \u00bb%c%s\u00ab erwartet kein Argument\n
+
+#: getopt.c:739 getopt.c:912
+#, c-format
+%s\:\ option\ `%s'\ requires\ an\ argument\n=%s\: Option \u00bb%s\u00ab erwartet ein Argument\n
+
+#: getopt.c:768
+#, c-format
+%s\:\ unrecognized\ option\ `--%s'\n=%s\: unbekannte Option \u00bb--%s\u00ab\n
+
+#: getopt.c:772
+#, c-format
+%s\:\ unrecognized\ option\ `%c%s'\n=%s\: unbekannte Option \u00bb%c%s\u00ab\n
+
+#: getopt.c:798
+#, c-format
+%s\:\ illegal\ option\ --\ %c\n=%s\: unzul\u00e4ssige Option -- %c\n
+
+#: getopt.c:801
+#, c-format
+%s\:\ invalid\ option\ --\ %c\n=%s\: ung\u00fcltige Option -- %c\n
+
+#: getopt.c:831 getopt.c:961
+#, c-format
+%s\:\ option\ requires\ an\ argument\ --\ %c\n=%s\: Option erwartet ein Argument -- %c\n
+
+#: getopt.c:878
+#, c-format
+%s\:\ option\ `-W\ %s'\ is\ ambiguous\n=%s\: Option \u00bb-W %s\u00ab ist mehrdeutig\n
+
+#: getopt.c:896
+#, c-format
+%s\:\ option\ `-W\ %s'\ doesn't\ allow\ an\ argument\n=%s\: Option \u00bb-W %s\u00ab erwartet kein Argument\n
+
+#: javacomp.c:465
+Java\ compiler\ not\ found,\ try\ installing\ gcj\ or\ set\ $JAVAC=Java-Compiler nicht gefunden; bitte \u00bbgcj\u00ab installieren oder $JAVAC setzen
+
+#: javaexec.c:404
+Java\ virtual\ machine\ not\ found,\ try\ installing\ gij\ or\ set\ $JAVA=Virtuelle Java-Maschine nicht gefunden; bitte \u00bbgcj\u00ab installieren oder\n$JAVA setzen
+
+#: obstack.c:474 xerror.c:75 xmalloc.c:56
+memory\ exhausted=virtueller Speicher ersch\u00f6pft
+
+#: pipe-bidi.c:119 pipe-bidi.c:121 pipe-in.c:136 pipe-out.c:136
+cannot\ create\ pipe=Es ist nicht m\u00f6glich, eine Pipe zu erzeugen
+
+#: wait-process.c:117
+#, c-format
+%s\ subprocess=Subprozess %s
+
+#: wait-process.c:129
+#, c-format
+%s\ subprocess\ got\ fatal\ signal=Subprozess %s hat ein fatales Signal erhalten
+
+# A pattern specified for the msgid only must not be matched with the msgstr.
+GSG-9=Antiterror-Einheit
+EOF
+
+tmpfiles="$tmpfiles mg-test6.out"
+: ${MSGGREP=msggrep}
+LC_MESSAGES=C LC_ALL= \
+${MSGGREP} --properties-input --properties-output -K -e error -T -e Speicher mg-test6.properties -o mg-test6.out
+result=$?
+test $result = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mg-test6.ok"
+cat <<\EOF > mg-test6.ok
+#: copy-file.c:60
+#, c-format
+error\ while\ opening\ "%s"\ for\ reading=\u00d6ffnen der Datei \u00bb%s\u00ab zum Lesen fehlgeschlagen
+
+#: copy-file.c:80
+#, c-format
+error\ reading\ "%s"=Fehler beim Lesen von \u00bb%s\u00ab
+
+#: copy-file.c:86 copy-file.c:90
+#, c-format
+error\ writing\ "%s"=Fehler beim Schreiben von \u00bb%s\u00ab
+
+#: copy-file.c:92
+#, c-format
+error\ after\ reading\ "%s"=Fehler nach dem Lesen von \u00bb%s\u00ab
+
+#: error.c:115
+Unknown\ system\ error=Unbekannter Systemfehler
+
+#: obstack.c:474 xerror.c:75 xmalloc.c:56
+memory\ exhausted=virtueller Speicher ersch\u00f6pft
+EOF
+
+: ${DIFF=diff}
+${DIFF} mg-test6.ok mg-test6.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgmerge-23 b/gettext-tools/tests/msgmerge-23
new file mode 100755
index 000000000..27304e96a
--- /dev/null
+++ b/gettext-tools/tests/msgmerge-23
@@ -0,0 +1,60 @@
+#! /bin/sh
+
+# Test handling of obsolete/untranslated messages with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test23.in1 mm-test23.in2"
+cat <<EOF > mm-test23.in1
+#
+# def.po
+#
+#: file:100
+not\ existing=but with translation
+
+#: file2:101
+!not\ existing\ without\ translation=
+
+#: file3:102
+still\ existing=translation
+
+#
+# trailing comments should be removed
+EOF
+
+cat <<EOF > mm-test23.in2
+#
+# ref.po
+#
+#: file3:102
+still\ existing=here is normally no comment
+
+#: file4:10
+!untranslated=
+
+#
+# trailing comments should be removed, even here
+EOF
+
+tmpfiles="$tmpfiles mm-test23.out"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q --properties-input --properties-output mm-test23.in1 mm-test23.in2 -o mm-test23.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mm-test23.ok"
+cat << EOF > mm-test23.ok
+#: file3:102
+still\ existing=translation
+
+#: file4:10
+!untranslated=
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test23.ok mm-test23.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgmerge-24 b/gettext-tools/tests/msgmerge-24
new file mode 100755
index 000000000..9344d794b
--- /dev/null
+++ b/gettext-tools/tests/msgmerge-24
@@ -0,0 +1,40 @@
+#! /bin/sh
+
+# Test --update: location changed, and xgettext comment added. Both changes
+# must be reflected in the resulting PO file. With Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mm-test24.po"
+cat <<\EOF > mm-test24.po
+#: cogarithmetic.cc:12
+white=wei\u00df
+EOF
+
+tmpfiles="$tmpfiles mm-test24.pot"
+cat <<EOF > mm-test24.pot
+#. location changed
+#: cogarithmetic.cc:33
+!white=
+EOF
+
+tmpfiles="$tmpfiles mm-test24.po~"
+: ${MSGMERGE=msgmerge}
+${MSGMERGE} -q --properties-input --update mm-test24.po mm-test24.pot
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mm-test24.ok"
+cat <<\EOF > mm-test24.ok
+#. location changed
+#: cogarithmetic.cc:33
+white=wei\u00df
+EOF
+
+: ${DIFF=diff}
+${DIFF} mm-test24.ok mm-test24.po
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msgunfmt-4 b/gettext-tools/tests/msgunfmt-4
new file mode 100755
index 000000000..1f87de803
--- /dev/null
+++ b/gettext-tools/tests/msgunfmt-4
@@ -0,0 +1,43 @@
+#! /bin/sh
+
+# Test of general operation with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles mu-test4.in"
+cat <<EOF > mu-test4.in
+eight=eighth
+
+five=fifth
+
+four=fourth
+
+one=first
+
+seven=seventh
+
+six=sixth
+
+three=third
+
+two=second
+EOF
+
+tmpfiles="$tmpfiles mu-test4.mo"
+: ${MSGFMT=msgfmt}
+${MSGFMT} --properties-input mu-test4.in -o mu-test4.mo
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles mu-test4.out"
+: ${MSGUNFMT=msgunfmt}
+${MSGUNFMT} --properties-output mu-test4.mo -o mu-test4.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+: ${DIFF=diff}
+${DIFF} mu-test4.in mu-test4.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msguniq-4 b/gettext-tools/tests/msguniq-4
new file mode 100755
index 000000000..352e8cf09
--- /dev/null
+++ b/gettext-tools/tests/msguniq-4
@@ -0,0 +1,24 @@
+#! /bin/sh
+
+# Test general operation with Java .properties syntax.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles msguniq-4.out"
+: ${MSGUNIQ-msguniq}
+${MSGUNIQ} --properties-input --properties-output -w 1000 ${top_srcdir}/tests/msguniq-a.inp -o msguniq-4.out
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles msguniq-4.ok"
+: ${MSGCAT-msgcat}
+${MSGCAT} --properties-output -w 1000 ${top_srcdir}/tests/msguniq-a.out -o msguniq-4.ok
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+: ${DIFF=diff}
+${DIFF} msguniq-4.ok msguniq-4.out
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result
diff --git a/gettext-tools/tests/msguniq-a.inp b/gettext-tools/tests/msguniq-a.inp
new file mode 100644
index 000000000..211119712
--- /dev/null
+++ b/gettext-tools/tests/msguniq-a.inp
@@ -0,0 +1,4286 @@
+# Template messages for CLISP
+# Copyright (C) 1992-2001 Bruno Haible, Michael Stoll, Marcus Daniels
+# Bruno Haible <haible@clisp.cons.org>, 2001.
+#
+!=Project-Id-Version\: clisp 2.25.1\nPOT-Creation-Date\: 2001-07-21 21\:09\:38 CEST\nPO-Revision-Date\: 2001-07-21 21\:09\:38 CEST\nLast-Translator\: Automatically generated <bruno@linuix>\nLanguage-Team\: Template <xx@li.org>\nMIME-Version\: 1.0\nContent-Type\: text/plain; charset\=UTF-8\nContent-Transfer-Encoding\: 8bit\n
+
+#: constobj.d:376
+!Please\ choose\:=
+
+#: constobj.d:380
+!Please\ choose\ one\ of\ ~\:{~A~\:^,\ ~}\ .=
+
+#: constobj.d:383
+!symbol\ ~A\ from\ \#<PACKAGE\ ~A>\ will\ become\ a\ shadowing\ symbol=
+
+#: constobj.d:385
+!You\ may\ choose\ the\ symbol\ in\ favour\ of\ which\ to\ resolve\ the\ conflict.=
+
+#: constobj.d:387
+!uninterning\ ~S\ from\ ~S\ uncovers\ a\ name\ conflict.=
+
+#: constobj.d:389 constobj.d:403
+!You\ may\ choose\ how\ to\ proceed.=
+
+#: constobj.d:391
+!importing\ ~S\ into\ ~S\ produces\ a\ name\ conflict\ with\ ~S.=
+
+#: constobj.d:393
+!importing\ ~S\ into\ ~S\ produces\ a\ name\ conflict\ with\ ~S\ and\ other\ symbols.=
+
+#: constobj.d:395
+!(("I"\ "import\ it\ and\ unintern\ the\ other\ symbol"\ T)\ ("N"\ "do\ not\ import\ it,\ leave\ undone"\ NIL))=
+
+#: constobj.d:398
+!(("I"\ "import\ it,\ unintern\ one\ other\ symbol\ and\ shadow\ the\ other\ symbols"\ T)\ ("N"\ "do\ not\ import\ it,\ leave\ undone"\ NIL))=
+
+#: constobj.d:401
+!(("I"\ "import\ it\ and\ shadow\ the\ other\ symbol"\ T)\ ("N"\ "do\ nothing"\ NIL))=
+
+#: constobj.d:405
+!symbol\ ~S\ should\ be\ imported\ into\ ~S\ before\ being\ exported.=
+
+#: constobj.d:407
+!(("I"\ "import\ the\ symbol\ first"\ T)\ ("N"\ "do\ nothing,\ don't\ export\ the\ symbol"\ NIL))=
+
+#: constobj.d:410
+!You\ may\ choose\ in\ favour\ of\ which\ symbol\ to\ resolve\ the\ conflict.=
+
+#: constobj.d:412
+!exporting\ ~S\ from\ ~S\ produces\ a\ name\ conflict\ with\ ~S\ from\ ~S.=
+
+#: constobj.d:414
+!Which\ symbol\ should\ be\ accessible\ in\ ~S\ ?=
+
+#: constobj.d:418
+!the\ symbol\ to\ export,\ =
+
+#: constobj.d:420
+!the\ old\ symbol,\ =
+
+#: constobj.d:422
+!You\ may\ choose\ for\ every\ conflict\ in\ favour\ of\ which\ symbol\ to\ resolve\ it.=
+
+#: constobj.d:424
+!~S\ name\ conflicts\ while\ executing\ USE-PACKAGE\ of\ ~S\ into\ package\ ~S.=
+
+#: constobj.d:426
+!which\ symbol\ with\ name\ ~S\ should\ be\ accessible\ in\ ~S\ ?=
+
+#: constobj.d:428
+!You\ can\ input\ another\ name.=
+
+#: constobj.d:430
+!You\ can\ input\ another\ nickname.=
+
+#: constobj.d:432
+!a\ package\ with\ name\ ~S\ already\ exists.=
+
+#: constobj.d:434
+!Please\ input\ new\ package\ name\:=
+
+#: constobj.d:436
+!Please\ input\ new\ package\ nickname\:=
+
+#: constobj.d:438
+!Ignore.=
+
+#: constobj.d:440
+!~S\:\ There\ is\ no\ package\ with\ name\ ~S.=
+
+#: constobj.d:442
+!~*Nevertheless\ delete\ ~S.=
+
+#: constobj.d:444
+!~S\:\ ~S\ is\ used\ by\ ~{~S~^,\ ~}.=
+
+#: constobj.d:472
+!ANSI\ C\ program=
+
+#: constobj.d:476
+!GNU\ C++\ =
+
+#: constobj.d:479
+!GNU\ C\ =
+
+#: constobj.d:486
+!C++\ compiler=
+
+#: constobj.d:489
+!C\ compiler=
+
+#: constobj.d:494
+!ENGLISH=
+
+#: constobj.d:510
+!Continue\ execution=
+
+#: constobj.d:512
+!~S\:\ User\ break=
+
+#: constobj.d:662
+!The\ value\ of\ ~S\ was\ not\ a\ pathname.\ ~\:*~S\ is\ being\ reset.=
+
+#: constobj.d:667
+!Creating\ directory\:\ =
+
+#: constobj.d:824
+!The\ variable\ ~S\ had\ an\ illegal\ value.\n~S\ has\ been\ reset\ to\ ~S.=
+
+#: constobj.d:826
+!Floating\ point\ operation\ combines\ numbers\ of\ different\ precision.\nSee\ ANSI\ CL\ 12.1.4.4\ and\ the\ CLISP\ impnotes\ for\ details.\nThe\ result's\ actual\ precision\ is\ controlled\ by\n~S.\nTo\ shut\ off\ this\ warning,\ set\ ~S\ to\ ~S.=
+
+#: constobj.d:841
+!Bye.=
+
+#: constobj.d:843
+!Press\ a\ key\ to\ terminate...=
+
+#: constobj.d:848
+!\n\ \ Next\ environment\:\ =
+
+#: constobj.d:850
+!\nAPPLY\ frame\ with\ breakpoint\ for\ call\ =
+
+#: constobj.d:852
+!\nAPPLY\ frame\ for\ call\ =
+
+#: constobj.d:854
+!\nEVAL\ frame\ with\ breakpoint\ for\ form\ =
+
+#: constobj.d:856
+!\nEVAL\ frame\ for\ form\ =
+
+#: constobj.d:858
+!\nframe\ binding\ variables\ (~\ \=\ dynamically)\:=
+
+#: constobj.d:861
+!\nCALLBACK\ frame=
+
+#: constobj.d:864
+!\nframe\ binding\ variables\ =
+
+#: constobj.d:866
+!\nframe\ binding\ functions\ =
+
+#: constobj.d:868
+!\ binds\ (~\ \=\ dynamically)\:=
+
+#: constobj.d:871
+!\nblock\ frame\ =
+
+#: constobj.d:873
+!\nnested\ block\ frame\ =
+
+#: constobj.d:875
+!\ for\ =
+
+#: constobj.d:877
+!\ncompiled\ block\ frame\ for\ =
+
+#: constobj.d:879
+!\ntagbody\ frame\ =
+
+#: constobj.d:881
+!\nnested\ tagbody\ frame\ =
+
+#: constobj.d:883
+!\ for=
+
+#: constobj.d:886
+!\ncompiled\ tagbody\ frame\ for\ =
+
+#: constobj.d:888
+!\ncatch\ frame\ for\ tag\ =
+
+#: constobj.d:890
+!\nhandler\ frame\ for\ conditions=
+
+#: constobj.d:892
+!\nunwind-protect\ frame=
+
+#: constobj.d:894
+!\n\ndriver\ frame=
+
+#: constobj.d:896
+!\nframe\ binding\ environments=
+
+#: spvw.d:595
+!could\ not\ make\ symbol\ value\ per-thread=
+
+#: spvw.d:659
+!\n***\ -\ Program\ stack\ overflow.\ RESET=
+
+#: spvw.d:664
+!\n***\ -\ Lisp\ stack\ overflow.\ RESET=
+
+#: spvw.d:801
+!internal\ error\:\ statement\ in\ file\ ~,\ line\ ~\ has\ been\ reached\!\!\nPlease\ send\ the\ authors\ of\ the\ program\ a\ description\ how\ you\ produced\ this\ error\!=
+
+#: spvw.d:863
+!Unknown\ signature\ of\ an\ FSUBR\n=
+
+#: spvw.d:972
+!Unknown\ signature\ of\ a\ SUBR\n=
+
+#: spvw.d:1614
+!module\ `%s'\ requires\ package\ %s.\n=
+
+#: spvw.d:1655
+!GNU\ CLISP\ (http\://clisp.cons.org/)\ is\ an\ ANSI\ Common\ Lisp.\nUsage\:\ \ =
+
+#: spvw.d:1658
+!\ [options]\ [lispfile\ [argument\ ...]]\n\ When\ `lispfile'\ is\ given,\ it\ is\ loaded\ and\ `*ARGS*'\ is\ set\n\ to\ the\ list\ of\ argument\ strings.\ Otherwise,\ an\ interactive\n\ read-eval-print\ loop\ is\ entered.\n=
+
+#: spvw.d:1662
+!Informative\ output\:\n=
+
+#: spvw.d:1663
+!\ -h,\ --help\ \ -\ print\ this\ help\ and\ exit\n=
+
+#: spvw.d:1664
+!\ --version\ \ \ -\ print\ the\ version\ information\n=
+
+#: spvw.d:1665
+!\ --license\ \ \ -\ print\ the\ licensing\ information\n=
+
+#: spvw.d:1666
+!Memory\ image\ selection\:\n=
+
+#: spvw.d:1667
+!\ -B\ lisplibdir\ -\ set\ the\ installation\ directory\n=
+
+#: spvw.d:1669
+!\ -K\ linkingset\ -\ use\ this\ executable\ and\ memory\ image\n=
+
+#: spvw.d:1671
+!\ -M\ memfile\ \ -\ use\ this\ memory\ image\n=
+
+#: spvw.d:1672
+!\ -m\ size\ \ \ \ \ -\ memory\ size\ (size\ \=\ xxxxxxxB\ or\ xxxxKB\ or\ xMB)\n=
+
+#: spvw.d:1674
+!\ -s\ size\ \ \ \ \ -\ stack\ size\ (size\ \=\ xxxxxxxB\ or\ xxxxKB\ or\ xMB)\n=
+
+#: spvw.d:1677
+!\ -t\ tmpdir\ \ \ -\ temporary\ directory\ for\ memmap\n=
+
+#: spvw.d:1679
+!Internationalization\:\n=
+
+#: spvw.d:1680
+!\ -L\ language\ -\ set\ user\ language\n=
+
+#: spvw.d:1681
+!\ -N\ nlsdir\ \ \ -\ NLS\ catalog\ directory\n=
+
+#: spvw.d:1682
+!\ -Edomain\ encoding\ -\ set\ encoding\n=
+
+#: spvw.d:1683
+!Interoperability\:\n=
+
+#: spvw.d:1684
+!\ -q,\ --quiet,\ --silent\ -\ do\ not\ print\ the\ banner\n=
+
+#: spvw.d:1685
+!\ -w\ \ \ \ \ \ \ \ \ \ -\ wait\ for\ keypress\ after\ program\ termination\n=
+
+#: spvw.d:1686
+!\ -I\ \ \ \ \ \ \ \ \ \ -\ be\ ILISP-friendly\n=
+
+#: spvw.d:1687
+!Startup\ actions\:\n=
+
+#: spvw.d:1688
+!\ -a\ \ \ \ \ \ \ \ \ \ -\ more\ ANSI\ CL\ compliance\n=
+
+#: spvw.d:1689
+!\ -p\ package\ \ -\ start\ in\ the\ package\n=
+
+#: spvw.d:1690
+!\ -C\ \ \ \ \ \ \ \ \ \ -\ set\ *LOAD-COMPILING*\ to\ T\n=
+
+#: spvw.d:1691
+!\ -norc\ \ \ \ \ \ \ -\ do\ not\ load\ the\ user\ ~/.clisprc\ file\n=
+
+#: spvw.d:1692
+!\ -i\ file\ \ \ \ \ -\ load\ initfile\ (can\ be\ repeated)\n=
+
+#: spvw.d:1693
+!Actions\:\n=
+
+#: spvw.d:1694
+!\ -c\ [-l]\ lispfile\ [-o\ outputfile]\ -\ compile\ LISPFILE\n=
+
+#: spvw.d:1695
+!\ -x\ expression\ -\ execute\ the\ expression,\ then\ exit\n=
+
+#: spvw.d:1696
+!\ lispfile\ [argument\ ...]\ -\ load\ lispfile,\ then\ exit\n=
+
+#: spvw.d:1697
+!Default\ action\ is\ an\ interactive\ read-eval-print\ loop.\n=
+
+#: spvw.d:1755
+!\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Amiga\ version\:\ Joerg\ Hoehle\n=
+
+#: spvw.d:1759
+!\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ RISCOS\ port\:\ Peter\ Burwood,\ Bruno\ Haible\n=
+
+#: spvw.d:1970
+!Syntax\ for\ %s\:\ nnnnnnn\ or\ nnnnKB\ or\ nMB\n=
+
+#: spvw.d:1974
+!%s\ out\ of\ range\n=
+
+#: spvw.d:1986
+!memory\ size=
+
+#: spvw.d:1996
+!stack\ size=
+
+#: spvw.d:2317
+!Return\ value\ of\ malloc()\ \=\ %x\ is\ not\ compatible\ with\ type\ code\ distribution.\n=
+
+#: spvw.d:2324
+!Only\ %d\ bytes\ available.\n=
+
+#: spvw.d:2558
+!Couldn't\ determine\ the\ end\ of\ the\ SP\ stack\!\n=
+
+#: spvw.d:2779
+!\nWARNING\:\ No\ initialisation\ file\ specified.\n=
+
+#: spvw.d:2783 spvw.d:2798
+!Please\ try\:\ =
+
+#: spvw.d:2797
+!\nWARNING\:\ No\ installation\ directory\ specified.\n=
+
+#: spvw.d:3002
+!Not\ enough\ memory\ for\ Lisp.\n=
+
+#: spvw_alloca.d:49
+!\n***\ -\ Virtual\ memory\ exhausted.\ RESET=
+
+#: spvw_alloca.d:51
+!\n***\ -\ Memory\ exhausted.\ RESET=
+
+#: spvw_mmap.d:67 spvw_mmap.d:219 spvw_mmap.d:396 spvw_multimap.d:174
+!Cannot\ map\ memory\ to\ address\ 0x%x\ .=
+
+#: spvw_mmap.d:188
+!Cannot\ reserve\ address\ range\ at\ 0x%x\ .=
+
+#: spvw_mmap.d:199
+!Cannot\ reserve\ address\ range\ 0x%x-0x%x\ .=
+
+#: spvw_mmap.d:252
+!CreateFileMapping()\ failed.=
+
+#: spvw_mmap.d:259
+!MapViewOfFileEx(addr\=0x%x,off\=0x%x)\ failed.=
+
+#: spvw_mmap.d:266
+!MapViewOfFileEx()\ returned\ 0x%x\ instead\ of\ 0x%x.\n=
+
+#: spvw_mmap.d:283
+!VirtualFree()\ failed.=
+
+#: spvw_mmap.d:299
+!VirtualProtect()\ failed.=
+
+#: spvw_mmap.d:371 spvw_multimap.d:115
+!Cannot\ open\ /dev/zero\ .=
+
+#: spvw_multimap.d:144
+!msync(0x%x,0x%x,MS_INVALIDATE)\ fails.=
+
+#: spvw_multimap.d:209
+!Cannot\ open\ %s\ .=
+
+#: spvw_multimap.d:220
+!Cannot\ delete\ %s\ .=
+
+#: spvw_multimap.d:235
+!**\ WARNING\:\ **\ Too\ few\ free\ disk\ space\ for\ %s\ .\n=
+
+#: spvw_multimap.d:238
+!Please\ restart\ LISP\ with\ fewer\ memory\ (option\ -m).\n=
+
+#: spvw_multimap.d:246
+!Cannot\ make\ %s\ long\ enough.=
+
+#: spvw_multimap.d:265
+!Cannot\ fill\ %s\ .=
+
+#: spvw_multimap.d:282
+!Cannot\ close\ %s\ .=
+
+#: spvw_multimap.d:317
+!Cannot\ close\ /dev/zero\ .=
+
+#: spvw_multimap.d:353
+!Recompile\ your\ operating\ system\ with\ SYSV\ IPC\ support.\n=
+
+#: spvw_multimap.d:367
+!Cannot\ allocate\ private\ shared\ memory\ segment.=
+
+#: spvw_multimap.d:389
+!Cannot\ map\ shared\ memory\ to\ address\ 0x%x.=
+
+#: spvw_multimap.d:412
+!Cannot\ fill\ shared\ memory.=
+
+#: spvw_multimap.d:418
+!Could\ not\ fill\ shared\ memory.=
+
+#: spvw_multimap.d:433
+!Cannot\ remove\ shared\ memory\ segment.=
+
+#: spvw_fault.d:482
+!mprotect()\ fails.=
+
+#: spvw_sigsegv.d:31
+!\nSIGSEGV\ cannot\ be\ cured.\ Fault\ address\ \=\ 0x%x.\n=
+
+#: spvw_sigsegv.d:73
+!Apollo\ 13\ scenario\:\ Stack\ overflow\ handling\ failed.\ On\ the\ next\ stack\ overflow\ we\ will\ crash\!\!\!\n=
+
+#: spvw_sigint.d:76 spvw_sigint.d:157
+!Ctrl-C\:\ User\ break=
+
+#: spvw_garcol.d:2020
+!munmap()\ fails.=
+
+#: spvw_allocate.d:34
+!No\ more\ room\ for\ LISP\ objects=
+
+#: spvw_allocate.d:54
+!\n***\ -\ No\ more\ room\ for\ LISP\ objects\:\ RESET=
+
+#: spvw_allocate.d:272 spvw_allocate.d:337 spvw_allocate.d:418
+!Trying\ to\ make\ room\ through\ a\ GC...\n=
+
+#: spvw_memfile.d:235
+!disk\ full=
+
+#: spvw_memfile.d:763
+!operating\ system\ error\ during\ load\ of\ initialisation\ file\ `%s'\n=
+
+#: spvw_memfile.d:1235
+!Cannot\ map\ the\ initialisation\ file\ into\ memory.=
+
+#: spvw_memfile.d:1514
+!operating\ system\ error\ during\ load\ of\ initialisation\ file\n=
+
+#: spvw_memfile.d:1520
+!initialisation\ file\ was\ not\ created\ by\ this\ version\ of\ LISP\n=
+
+#: spvw_memfile.d:1524
+!not\ enough\ memory\ for\ initialisation\n=
+
+#: eval.d:553
+!~\:\ ~\ is\ a\ constant,\ cannot\ be\ bound\ dynamically=
+
+#: eval.d:1518 control.d:2517
+!Too\ many\ documentation\ strings\ in\ ~=
+
+#: eval.d:1730
+!FUNCTION\:\ lambda-list\ for\ ~\ is\ missing=
+
+#: eval.d:1740
+!FUNCTION\:\ lambda-list\ for\ ~\ should\ be\ a\ list,\ not\ ~=
+
+#: eval.d:1853
+!FUNCTION\:\ illegal\ declaration\ ~=
+
+#: eval.d:1864
+!FUNCTION\:\ ~\ is\ not\ a\ symbol,\ cannot\ be\ declared\ SPECIAL=
+
+#: eval.d:1947
+!FUNCTION\:\ too\ long\ variable\ specification\ after\ &OPTIONAL\:\ ~=
+
+#: eval.d:1988
+!FUNCTION\:\ &REST\ var\ must\ be\ followed\ by\ &KEY\ or\ &AUX\ or\ end\ of\ list\:\ ~=
+
+#: eval.d:1993
+!FUNCTION\:\ &REST\ must\ be\ followed\ by\ a\ variable\:\ ~=
+
+#: eval.d:2044
+!FUNCTION\:\ ~\ in\ ~\ is\ not\ a\ symbol=
+
+#: eval.d:2100
+!FUNCTION\:\ incorrect\ variable\ specification\ after\ &KEY\:\ ~=
+
+#: eval.d:2107
+!FUNCTION\:\ &ALLOW-OTHER-KEYS\ must\ be\ followed\ by\ &AUX\ or\ end\ of\ list\:\ ~=
+
+#: eval.d:2142
+!FUNCTION\:\ too\ long\ variable\ specification\ after\ &AUX\:\ ~=
+
+#: eval.d:2165
+!FUNCTION\:\ badly\ placed\ lambda-list\ keyword\ ~\:\ ~=
+
+#: eval.d:2170
+!FUNCTION\:\ ~\ is\ not\ a\ symbol,\ may\ not\ be\ used\ as\ a\ variable=
+
+#: eval.d:2175
+!FUNCTION\:\ ~\ is\ a\ constant,\ may\ not\ be\ used\ as\ a\ variable=
+
+#: eval.d:2182
+!FUNCTION\:\ too\ many\ parameters\ in\ the\ lambda-list\ ~=
+
+#: eval.d:2189
+!FUNCTION\:\ a\ dot\ in\ a\ lambda-list\ is\ allowed\ only\ for\ macros,\ not\ here\:\ ~=
+
+#: eval.d:2269
+!~\:\ ~\ is\ a\ special\ operator,\ not\ a\ function=
+
+#: eval.d:2286 symbol.d:31
+!~\:\ ~\ is\ a\ macro,\ not\ a\ function=
+
+#: eval.d:2303
+!~\:\ the\ function\ ~\ is\ undefined=
+
+#: eval.d:2350 sequence.d:1244 error.d:953
+!~\:\ ~\ is\ not\ a\ function=
+
+#: eval.d:2411
+!EVAL/APPLY\:\ keyword\ arguments\ for\ ~\ should\ occur\ pairwise=
+
+#: eval.d:2424 eval.d:2741
+!EVAL/APPLY\:\ too\ many\ arguments\ given\ to\ ~=
+
+#: eval.d:2439
+!EVAL/APPLY\:\ ~\ is\ not\ a\ symbol=
+
+#: eval.d:2465
+!EVAL/APPLY\:\ keyword\ ~\ is\ illegal\ for\ ~.\ The\ possible\ keywords\ are\ ~=
+
+#: eval.d:2659
+!EVAL/APPLY\:\ too\ few\ arguments\ given\ to\ ~=
+
+#: eval.d:3153
+!EVAL\:\ variable\ ~\ has\ no\ value=
+
+#: eval.d:3253 eval.d:4282 eval.d:5214 control.d:109
+!~\:\ ~\ is\ not\ a\ function\ name=
+
+#: eval.d:3332
+!EVAL\:\ too\ few\ parameters\ for\ special-form\ ~\:\ ~=
+
+#: eval.d:3346
+!EVAL\:\ too\ many\ parameters\ for\ special-form\ ~\:\ ~=
+
+#: eval.d:3359
+!EVAL\:\ dotted\ parameter\ list\ for\ special\ form\ ~\:\ ~=
+
+#: eval.d:3426
+!EVAL\:\ too\ few\ arguments\ given\ to\ ~\:\ ~=
+
+#: eval.d:3439
+!EVAL\:\ too\ many\ arguments\ given\ to\ ~\:\ ~=
+
+#: eval.d:3452
+!EVAL\:\ argument\ list\ given\ to\ ~\ is\ dotted\:\ ~=
+
+#: eval.d:4295
+!APPLY\:\ argument\ list\ given\ to\ ~\ is\ dotted=
+
+#: eval.d:4307
+!APPLY\:\ too\ many\ arguments\ given\ to\ ~=
+
+#: eval.d:4319
+!APPLY\:\ too\ few\ arguments\ given\ to\ ~=
+
+#: eval.d:6782 eval.d:6798
+!symbol\ ~\ has\ no\ value=
+
+#: eval.d:6813
+!assignment\ to\ constant\ symbol\ ~\ is\ impossible=
+
+#: eval.d:7439 control.d:2415
+!~\:\ too\ many\ arguments\ given\ to\ ~=
+
+#: eval.d:7617 eval.d:7654
+!(~\ ~)\:\ the\ tagbody\ of\ the\ tags\ ~\ has\ already\ been\ left=
+
+#: eval.d:7718 control.d:2108
+!~\:\ there\ is\ no\ CATCHer\ for\ tag\ ~=
+
+#: eval.d:7743
+!STACK\ corrupted=
+
+#: eval.d:8127
+!~\:\ ~\ is\ not\ a\ correct\ index\ into\ ~=
+
+#: eval.d:8739
+!undefined\ bytecode\ in\ ~\ at\ byte\ ~=
+
+#: eval.d:8749
+!too\ many\ return\ values=
+
+#: eval.d:8756
+!Corrupted\ STACK\ in\ ~\ at\ byte\ ~=
+
+#: control.d:63
+!~\:\ function\ name\ ~\ should\ be\ a\ symbol=
+
+#: control.d:91
+!~\:\ undefined\ function\ ~=
+
+#: control.d:129
+!~\:\ ~\ has\ no\ dynamic\ value=
+
+#: control.d:175 symbol.d:23
+!~\:\ ~\ has\ no\ global\ function\ definition=
+
+#: control.d:261
+!~\:\ the\ value\ of\ the\ constant\ ~\ may\ not\ be\ altered=
+
+#: control.d:289
+!~\ called\ with\ odd\ number\ of\ arguments\:\ ~=
+
+#: control.d:299
+!dotted\ list\ given\ to\ ~\ \:\ ~=
+
+#: control.d:399
+!~\:\ the\ value\ of\ the\ constant\ ~\ must\ not\ be\ removed=
+
+#: control.d:424
+!~\:\ the\ special\ operator\ definition\ of\ ~\ must\ not\ be\ removed=
+
+#: control.d:506
+!~\:\ doc-strings\ are\ not\ allowed\ here\:\ ~=
+
+#: control.d:579
+!~\:\ ~\ is\ not\ a\ symbol,\ but\ was\ declared\ SPECIAL=
+
+#: control.d:622 control.d:893
+!~\:\ illegal\ variable\ specification\ ~=
+
+#: control.d:661
+!~\:\ symbol\ ~\ is\ declared\ special\ and\ must\ not\ be\ declared\ a\ macro=
+
+#: control.d:668
+!~\:\ symbol\ ~\ must\ not\ be\ declared\ SPECIAL\ and\ a\ macro\ at\ the\ same\ time=
+
+#: control.d:677 control.d:906
+!~\:\ ~\ is\ a\ constant,\ cannot\ be\ bound=
+
+#: control.d:697
+!~\:\ too\ many\ variables\ and/or\ declarations=
+
+#: control.d:981
+!~\:\ ~\ is\ not\ a\ function\ specification=
+
+#: control.d:1146
+!~\:\ ~\ is\ not\ a\ macro\ specification=
+
+#: control.d:1154
+!~\:\ macro\ name\ ~\ should\ be\ a\ symbol=
+
+#: control.d:1192
+!~\:\ ~\ is\ not\ a\ function\ and\ macro\ specification=
+
+#: control.d:1200
+!~\:\ function\ and\ macro\ name\ ~\ should\ be\ a\ symbol=
+
+#: control.d:1327
+!~\:\ clause\ ~\ should\ be\ a\ list=
+
+#: control.d:1360
+!~\:\ missing\ key\ list\:\ ~=
+
+#: control.d:1370
+!~\:\ the\ ~\ clause\ must\ be\ the\ last\ one=
+
+#: control.d:1434
+!~\:\ the\ block\ named\ ~\ has\ already\ been\ left=
+
+#: control.d:1473
+!~\:\ no\ block\ named\ ~\ is\ currently\ visible=
+
+#: control.d:1722
+!~\:\ ~\ is\ neither\ tag\ nor\ form=
+
+#: control.d:1768
+!~\:\ illegal\ tag\ ~=
+
+#: control.d:1807
+!~\:\ tagbody\ for\ tag\ ~\ has\ already\ been\ left=
+
+#: control.d:1822
+!~\:\ no\ tag\ named\ ~\ is\ currently\ visible=
+
+#: control.d:1841
+!~\:\ too\ many\ values=
+
+#: control.d:1886
+!~\:\ too\ many\ arguments\ to\ ~=
+
+#: control.d:2149
+!Argument\ ~\ is\ not\ a\ macroexpansion\ environment=
+
+#: control.d:2211
+!declarations\ ~\ are\ not\ allowed\ here=
+
+#: control.d:2233
+!~\:\ ~\ evaluated\ to\ the\ values\ ~,\ not\ of\ type\ ~=
+
+#: control.d:2249
+!~\:\ bad\ declaration\ ~=
+
+#: control.d:2362
+!~\:\ ~\ may\ not\ be\ used\ as\ an\ environment=
+
+#: control.d:2510
+!no\ doc-strings\ allowed\ here\:\ ~=
+
+#: control.d:2575
+!keyword\ argument\ list\ ~\ has\ an\ odd\ length=
+
+#: control.d:2611
+!illegal\ keyword/value\ pair\ ~,\ ~\ in\ argument\ list.\ The\ allowed\ keywords\ are\ ~=
+
+#: encoding.d:47
+!Character\ \#\\u$$$$\ cannot\ be\ represented\ in\ the\ character\ set\ ~=
+
+#: encoding.d:226
+!character\ \#x$$$$$$$$\ in\ ~\ conversion,\ not\ a\ Unicode-16,\ sorry=
+
+#: encoding.d:420
+!invalid\ byte\ \#x$$\ in\ ~\ conversion,\ not\ a\ Unicode-16=
+
+#: encoding.d:438
+!invalid\ byte\ sequence\ \#x$$\ \#x$$\ in\ ~\ conversion=
+
+#: encoding.d:459
+!invalid\ byte\ sequence\ \#x$$\ \#x$$\ \#x$$\ in\ ~\ conversion=
+
+#: encoding.d:1064
+!invalid\ byte\ \#x$$\ in\ ~\ conversion=
+
+#: encoding.d:1446
+!~\:\ illegal\ \:CHARSET\ argument\ ~=
+
+#: encoding.d:1459
+!~\:\ illegal\ \:LINE-TERMINATOR\ argument\ ~=
+
+#: encoding.d:1471
+!~\:\ illegal\ \:INPUT-ERROR-ACTION\ argument\ ~=
+
+#: encoding.d:1483
+!~\:\ illegal\ \:OUTPUT-ERROR-ACTION\ argument\ ~=
+
+#: encoding.d:1532
+!~\:\ argument\ ~\ is\ not\ a\ character\ set=
+
+#: encoding.d:2195
+!~\:\ ~\ is\ not\ a\ 1\:1\ encoding=
+
+#: pathname.d:1209 pathname.d:1260
+!~\:\ host\ should\ be\ NIL\ or\ a\ string,\ not\ ~=
+
+#: pathname.d:1231 pathname.d:1280
+!~\:\ illegal\ hostname\ ~=
+
+#: pathname.d:1302
+!~\:\ host\ should\ be\ NIL,\ not\ ~=
+
+#: pathname.d:1421
+!~\:\ argument\ should\ be\ a\ string,\ symbol,\ file\ stream\ or\ pathname,\ not\ ~=
+
+#: pathname.d:1464
+!~\:\ filename\ for\ ~\ is\ unknown=
+
+#: pathname.d:1884
+!~(~\ ~\ ~)\:\ a\ logical\ pathname\ must\ contain\ host=
+
+#: pathname.d:2028 pathname.d:2392
+!~\:\ there\ is\ no\ environment\ variable\ ~=
+
+#: pathname.d:2335
+!~\:\ there\ is\ no\ user\ named\ ~=
+
+#: pathname.d:2642
+!~\:\ syntax\ error\ in\ filename\ ~\ at\ position\ ~=
+
+#: pathname.d:2659 pathname.d:2674
+!~\:\ hosts\ ~\ and\ ~\ of\ ~\ should\ coincide=
+
+#: pathname.d:2916
+!~\:\ argument\ ~\ is\ not\ a\ logical\ pathname,\ string,\ stream\ or\ symbol=
+
+#: pathname.d:2972
+!~\:\ endless\ loop\ while\ resolving\ ~=
+
+#: pathname.d:2994
+!~\:\ unknown\ logical\ host\ ~\ in\ ~=
+
+#: pathname.d:3006
+!~\:\ No\ replacement\ rule\ for\ ~\ is\ known.=
+
+#: pathname.d:3400
+!~\:\ \:VERSION-argument\ should\ be\ NIL\ or\ a\ positive\ fixnum\ or\ \:WILD\ or\ \:NEWEST,\ not\ ~=
+
+#: pathname.d:3427
+!~\:\ \:VERSION-argument\ should\ be\ NIL\ or\ \:WILD\ or\ \:NEWEST,\ not\ ~=
+
+#: pathname.d:4270
+!~\:\ on\ host\ ~,\ device\ ~\ is\ invalid,\ should\ be\ NIL=
+
+#: pathname.d:4520
+!~\:\ illegal\ ~\ argument\ ~=
+
+#: pathname.d:4866
+!wildcards\ are\ not\ allowed\ here\:\ ~=
+
+#: pathname.d:4903
+!~\:\ argument\ ~\ should\ be\ ~,\ ~,\ ~,\ ~,\ ~,\ ~\ or\ ~=
+
+#: pathname.d:6075
+!~\:\ replacement\ pieces\ ~\ do\ not\ fit\ into\ ~=
+
+#: pathname.d:6168
+!~\:\ ~\ is\ not\ a\ specialization\ of\ ~=
+
+#: pathname.d:6219
+!(~\ ~\ ~\ ~)\ is\ ambiguous\:\ ~=
+
+#: pathname.d:6245
+!nonexistent\ directory\:\ ~=
+
+#: pathname.d:6261
+!~\:\ File\ ~\ already\ exists=
+
+#: pathname.d:6539 pathname.d:7395
+!no\ directory\ ~\ above\ ~=
+
+#: pathname.d:6547
+!"..\\\\"\ after\ "...\\\\"\ is\ invalid\:\ ~=
+
+#: pathname.d:6752
+!Couldn't\ access\ current\ directory=
+
+#: pathname.d:6902
+!~\:\ ~\ names\ a\ file,\ not\ a\ directory=
+
+#: pathname.d:6950 pathname.d:7147 pathname.d:7514
+!~\:\ ~\ names\ a\ directory,\ not\ a\ file=
+
+#: pathname.d:6996
+!UNIX\ error\ while\ GETWD\:\ ~=
+
+#: pathname.d:7005
+!UNIX\ GETWD\ returned\ ~=
+
+#: pathname.d:7107
+!UNIX\ REALPATH\ returned\ ~=
+
+#: pathname.d:7329
+!~\:\ If\ a\ device\ is\ specified,\ the\ directory\ must\ begin\ with\ ~\:\ ~=
+
+#: pathname.d:7721
+!no\ file\ name\ given\:\ ~=
+
+#: pathname.d:7735
+!not\ a\ directory\:\ ~=
+
+#: pathname.d:7804
+!~\:\ file\ ~\ does\ not\ exist=
+
+#: pathname.d:7833
+!~\:\ pathname\ with\ type\ but\ without\ name\ makes\ no\ sense\:\ ~=
+
+#: pathname.d:8064
+!cannot\ delete\ file\ ~\ since\ there\ is\ file\ stream\ open\ to\ it=
+
+#: pathname.d:8126
+!cannot\ rename\ file\ ~\ since\ there\ is\ file\ stream\ open\ to\ it=
+
+#: pathname.d:8720
+!file\ ~\ does\ not\ exist=
+
+#: pathname.d:8726
+!a\ file\ named\ ~\ already\ exists=
+
+#: pathname.d:8788
+!~\:\ illegal\ \:DIRECTION\ argument\ ~=
+
+#: pathname.d:8817
+!~\:\ illegal\ \:IF-EXISTS\ argument\ ~=
+
+#: pathname.d:8837
+!~\:\ illegal\ \:IF-DOES-NOT-EXIST\ argument\ ~=
+
+#: pathname.d:10035
+!~\:\ cannot\ change\ default\ directory\ on\ remote\ host\:\ ~=
+
+#: pathname.d:10081
+!root\ directory\ not\ allowed\ here\:\ ~=
+
+#: pathname.d:10753 pathname.d:10800 pathname.d:10860
+!~\:\ the\ command\ should\ be\ a\ string,\ not\ ~=
+
+#: pathname.d:11119
+!~\:\ library\ directory\ is\ not\ known,\ use\ a\ command\ line\ option\ to\ specify\ it=
+
+#: stream.d:223 stream.d:16250
+!~\ on\ ~\ is\ illegal=
+
+#: stream.d:509 stream.d:720
+!Return\ value\ ~\ of\ call\ to\ ~\ should\ be\ an\ integer\ between\ ~\ and\ ~.=
+
+#: stream.d:619
+!~\:\ the\ last\ character\ read\ from\ ~\ was\ not\ ~=
+
+#: stream.d:627
+!~\ from\ ~\ without\ ~\ before\ it=
+
+#: stream.d:897
+!~\:\ cannot\ output\ to\ ~=
+
+#: stream.d:913
+!~\ is\ not\ a\ character,\ cannot\ be\ output\ onto\ ~=
+
+#: stream.d:929
+!~\ is\ not\ an\ integer,\ cannot\ be\ output\ onto\ ~=
+
+#: stream.d:944
+!integer\ ~\ is\ out\ of\ range,\ cannot\ be\ output\ onto\ ~=
+
+#: stream.d:997
+!~\:\ argument\ ~\ should\ be\ an\ input\ stream=
+
+#: stream.d:1015
+!~\:\ argument\ ~\ should\ be\ an\ output\ stream=
+
+#: stream.d:1354
+!~\:\ argument\ should\ be\ a\ symbol,\ not\ ~=
+
+#: stream.d:2397 stream.d:2890
+!~\ is\ beyond\ the\ end\ because\ the\ string\ ~\ has\ been\ adjusted=
+
+#: stream.d:2528
+!~\:\ ~\ is\ not\ a\ string\ input\ stream=
+
+#: stream.d:2621 charstrg.d:3322
+!~\:\ ~\ argument\ must\ be\ a\ subtype\ of\ ~,\ not\ ~=
+
+#: stream.d:2658
+!~\:\ ~\ is\ not\ a\ string\ output\ stream=
+
+#: stream.d:2700
+!~\:\ argument\ ~\ should\ be\ a\ string\ with\ fill\ pointer=
+
+#: stream.d:3002
+!~\:\ ~\ is\ not\ a\ buffered\ input\ stream=
+
+#: stream.d:3329
+!~\:\ stream\ must\ be\ a\ generic-stream,\ not\ ~=
+
+#: stream.d:3421
+!~\:\ illegal\ \:BUFFERED\ argument\ ~=
+
+#: stream.d:3537 stream.d:18402
+!~\:\ illegal\ \:ELEMENT-TYPE\ argument\ ~=
+
+#: stream.d:3611
+!~\:\ illegal\ \:EXTERNAL-FORMAT\ argument\ ~=
+
+#: stream.d:4052
+!~\:\ Ctrl-C\:\ User\ break=
+
+#: stream.d:4104
+!unknown\ character\ set\ ~=
+
+#: stream.d:6397
+!Unbuffered\ streams\ need\ an\ ~\ with\ a\ bit\ size\ being\ a\ multiple\ of\ 8,\ not\ ~=
+
+#: stream.d:6789
+!Closed\ ~\ because\ disk\ is\ full.=
+
+#: stream.d:6977
+!cannot\ position\ ~\ beyond\ EOF=
+
+#: stream.d:8604
+!~\:\ argument\ ~\ ~\ was\ specified,\ but\ ~\ is\ not\ a\ regular\ file.=
+
+#: stream.d:8639
+!~\:\ arguments\ ~\ ~\ and\ ~\ ~\ were\ specified,\ but\ ~\ is\ not\ a\ regular\ file.=
+
+#: stream.d:8701
+!file\ ~\ is\ not\ an\ integer\ file=
+
+#: stream.d:10276 stream.d:17796
+!Return\ value\ ~\ of\ call\ to\ ~\ is\ not\ a\ ~.=
+
+#: stream.d:10299
+!Return\ value\ ~\ of\ call\ to\ ~\ contains\ ~\ which\ is\ not\ a\ ~.=
+
+#: stream.d:10618
+!character\ ~\ contains\ bits,\ cannot\ be\ output\ onto\ ~=
+
+#: stream.d:11357
+!RAW\ mode\ not\ supported\ on\ ~=
+
+#: stream.d:11789
+!~\:\ argument\ ~\ should\ be\ a\ window\ stream=
+
+#: stream.d:12444
+!cannot\ output\ to\ standard\ output=
+
+#: stream.d:13840
+!environment\ has\ no\ TERM\ variable=
+
+#: stream.d:13845
+!terminal\ type\ ~\ unknown\ to\ termcap=
+
+#: stream.d:13870
+!insufficient\ terminal\:\ hardcopy\ terminal=
+
+#: stream.d:13874
+!insufficient\ terminal\:\ overstrikes,\ cannot\ clear\ output=
+
+#: stream.d:13878
+!insufficient\ terminal\:\ cannot\ scroll=
+
+#: stream.d:13883
+!insufficient\ terminal\:\ cannot\ clear\ screen=
+
+#: stream.d:13887
+!insufficient\ terminal\:\ cannot\ position\ cursor\ randomly=
+
+#: stream.d:14399
+!~\:\ package\ SCREEN\ is\ not\ implemented=
+
+#: stream.d:15928
+!host\ should\ be\ string,\ not\ ~=
+
+#: stream.d:15936
+!display\ should\ be\ a\ nonnegative\ fixnum,\ not\ ~=
+
+#: stream.d:16004
+!~\:\ stream\ must\ be\ a\ socket-stream,\ not\ ~=
+
+#: stream.d:16017
+!~\:\ argument\ ~\ should\ be\ a\ vector\ of\ type\ (ARRAY\ (UNSIGNED-BYTE\ 8)\ (*))=
+
+#: stream.d:16041 stream.d:18444 stream.d:18518 stream.d:18736 stream.d:18816
+#: io.d:1042
+!~\:\ input\ stream\ ~\ has\ reached\ its\ end=
+
+#: stream.d:16243
+!~\:\ ~\ is\ not\ a\ SOCKET-SERVER=
+
+#: stream.d:16309
+!~\:\ argument\ ~\ is\ neither\ an\ open\ SOCKET-STREAM\ nor\ a\ positive\ FIXNUM=
+
+#: stream.d:16503
+!~\:\ argument\ ~\ is\ not\ an\ open\ SOCKET-STREAM=
+
+#: stream.d:16516
+!~\:\ argument\ ~\ is\ not\ a\ SOCKET-STREAM=
+
+#: stream.d:16562
+!~\:\ list\ ~\ is\ too\ long\ (~\ maximum)=
+
+#: stream.d:16834
+!The\ value\ of\ ~\ is\ not\ a\ stream\:\ ~=
+
+#: stream.d:16838
+!The\ value\ of\ ~\ is\ not\ an\ appropriate\ stream\:\ ~=
+
+#: stream.d:16852
+!The\ value\ of\ ~\ was\ not\ a\ stream\:\ ~.\ It\ has\ been\ changed\ to\ ~.=
+
+#: stream.d:16871
+!readline\ library\:\ out\ of\ memory.=
+
+#: stream.d:17175
+!~\:\ The\ ~\ of\ ~\ cannot\ be\ changed\ from\ ~\ to\ ~.=
+
+#: stream.d:18342
+!Return\ value\ ~\ of\ call\ to\ ~\ is\ not\ a\ fixnum\ >\=\ 0\ or\ NIL.=
+
+#: stream.d:18361
+!~\ needs\ an\ ~\ with\ a\ bit\ size\ being\ a\ multiple\ of\ 8,\ not\ ~=
+
+#: stream.d:18423
+!~\:\ illegal\ endianness\ argument\ ~=
+
+#: stream.d:19059 stream.d:19071
+!~\ is\ not\ a\ ~,\ cannot\ be\ output\ onto\ ~=
+
+#: stream.d:19158
+!~\:\ argument\ ~\ is\ not\ an\ open\ file\ stream=
+
+#: stream.d:19192
+!~\:\ position\ argument\ should\ be\ ~\ or\ ~\ or\ a\ nonnegative\ integer,\ not\ ~=
+
+#: socket.d:1010
+!~\:\ ~=
+
+#: io.d:484
+!The\ value\ of\ ~\ was\ not\ a\ readtable.\ It\ has\ been\ reset.=
+
+#: io.d:570
+!~\:\ argument\ ~\ is\ not\ a\ readtable=
+
+#: io.d:773
+!~\:\ ~\ is\ a\ dispatch\ macro\ character=
+
+#: io.d:838
+!~\:\ ~\ is\ not\ a\ dispatch\ macro\ character=
+
+#: io.d:867
+!~\:\ digit\ $\ not\ allowed\ as\ sub-char=
+
+#: io.d:917
+!~\:\ new\ value\ ~\ should\ be\ ~,\ ~,\ ~\ or\ ~.=
+
+#: io.d:954
+!The\ value\ of\ ~\ should\ be\ an\ integer\ between\ 2\ and\ 36,\ not\ ~.\nIt\ has\ been\ reset\ to\ 10.=
+
+#: io.d:1005
+!~\ from\ ~\:\ character\ read\ should\ be\ a\ character\:\ ~=
+
+#: io.d:1059
+!~\:\ input\ stream\ ~\ ends\ within\ an\ object.\ Last\ opening\ parenthesis\ probably\ in\ line\ ~.=
+
+#: io.d:1065
+!~\:\ input\ stream\ ~\ ends\ within\ an\ object=
+
+#: io.d:1374
+!~\ from\ ~\:\ illegal\ character\ ~=
+
+#: io.d:1387
+!~\:\ input\ stream\ ~\ ends\ within\ a\ token\ after\ single\ escape\ character=
+
+#: io.d:1435
+!~\:\ input\ stream\ ~\ ends\ within\ a\ token\ after\ multiple\ escape\ character=
+
+#: io.d:2017
+!~\ from\ ~\:\ ~\ has\ no\ macro\ character\ definition=
+
+#: io.d:2031
+!~\ from\ ~\:\ macro\ character\ definition\ for\ ~\ may\ not\ return\ ~\ values,\ only\ one\ value.=
+
+#: io.d:2055
+!~\:\ input\ stream\ ~\ ends\ within\ read\ macro\ beginning\ to\ ~=
+
+#: io.d:2089
+!~\ from\ ~\:\ After\ ~\ is\ ~\ an\ undefined\ dispatch\ macro\ character=
+
+#: io.d:2103
+!~\ from\ ~\:\ dispatch\ macro\ character\ definition\ for\ ~\ after\ ~\ may\ not\ return\ ~\ values,\ only\ one\ value.=
+
+#: io.d:2179
+!~\ from\ ~\:\ a\ token\ consisting\ only\ of\ dots\ cannot\ be\ meaningfully\ read\ in=
+
+#: io.d:2284
+!~\ from\ ~\:\ too\ many\ colons\ in\ token\ ~=
+
+#: io.d:2334
+!~\ from\ ~\:\ there\ is\ no\ package\ with\ name\ ~=
+
+#: io.d:2363
+!~\ from\ ~\:\ ~\ has\ no\ external\ symbol\ with\ name\ ~=
+
+#: io.d:2411
+!~\ from\ ~\:\ token\ "."\ not\ allowed\ here=
+
+#: io.d:2465 io.d:6624
+!~\:\ the\ value\ of\ ~\ has\ been\ arbitrarily\ altered=
+
+#: io.d:2481
+!~\:\ no\ entry\ for\ ~\ from\ ~\ in\ ~\ \=\ ~=
+
+#: io.d:2692
+!~\ from\ ~\:\ illegal\ end\ of\ dotted\ list=
+
+#: io.d:2768
+!~\ from\ ~\:\ an\ object\ cannot\ start\ with\ ~=
+
+#: io.d:2859
+!~\:\ input\ stream\ ~\ ends\ within\ a\ string=
+
+#: io.d:2925
+!~\ from\ ~\:\ no\ number\ allowed\ between\ \#\ and\ $=
+
+#: io.d:3024
+!~\:\ input\ stream\ ~\ ends\ within\ a\ comment\ \#$\ ...\ $\#=
+
+#: io.d:3106
+!~\ from\ ~\:\ font\ number\ ~\ for\ character\ is\ too\ large,\ should\ be\ \=\ 0=
+
+#: io.d:3139
+!~\ from\ ~\:\ there\ is\ no\ character\ bit\ with\ name\ ~=
+
+#: io.d:3206
+!~\ from\ ~\:\ there\ is\ no\ character\ with\ name\ ~=
+
+#: io.d:3269
+!~\ from\ ~\:\ token\ ~\ after\ \#$\ is\ not\ a\ rational\ number\ in\ base\ ~=
+
+#: io.d:3348
+!~\ from\ ~\:\ the\ number\ base\ must\ be\ given\ between\ \#\ and\ R=
+
+#: io.d:3363
+!~\ from\ ~\:\ The\ base\ ~\ given\ between\ \#\ and\ R\ should\ lie\ between\ 2\ and\ 36=
+
+#: io.d:3411
+!~\ from\ ~\:\ bad\ syntax\ for\ complex\ number\:\ \#C~=
+
+#: io.d:3446
+!~\ from\ ~\:\ token\ expected\ after\ \#\:=
+
+#: io.d:3475
+!~\ from\ ~\:\ token\ ~\ after\ \#\:\ should\ contain\ no\ colon=
+
+#: io.d:3528
+!~\ from\ ~\:\ only\ zeroes\ and\ ones\ are\ allowed\ after\ \#*=
+
+#: io.d:3557
+!~\ from\ ~\:\ bit\ vector\ is\ longer\ than\ the\ explicitly\ given\ length\ ~=
+
+#: io.d:3566
+!~\ from\ ~\:\ must\ specify\ element\ of\ bit\ vector\ of\ length\ ~=
+
+#: io.d:3646
+!~\ from\ ~\:\ vector\ is\ longer\ than\ the\ explicitly\ given\ length\ ~=
+
+#: io.d:3655
+!~\ from\ ~\:\ must\ specify\ element\ of\ vector\ of\ length\ ~=
+
+#: io.d:3740
+!~\ from\ ~\:\ bad\ syntax\ for\ array\:\ \#A~=
+
+#: io.d:3806
+!~\ from\ ~\:\ ~\ \=\ ~\ doesn't\ allow\ the\ evaluation\ of\ ~=
+
+#: io.d:3933
+!~\ from\ ~\:\ a\ number\ must\ be\ given\ between\ \#\ and\ $=
+
+#: io.d:3945
+!~\ from\ ~\:\ label\ \#~?\ too\ large=
+
+#: io.d:3967
+!~\ from\ ~\:\ the\ value\ of\ ~\ has\ been\ altered\ arbitrarily,\ it\ is\ not\ an\ alist\:\ ~=
+
+#: io.d:3987
+!~\ from\ ~\:\ label\ \#~\=\ may\ not\ be\ defined\ twice=
+
+#: io.d:4014
+!~\ from\ ~\:\ \#~\=\ \#~\#\ is\ illegal=
+
+#: io.d:4042
+!~\ from\ ~\:\ undefined\ label\ \#~\#=
+
+#: io.d:4059
+!~\ from\ ~\:\ objects\ printed\ as\ \#<...>\ cannot\ be\ read\ back\ in=
+
+#: io.d:4077
+!~\ from\ ~\:\ objects\ printed\ as\ \#\ in\ view\ of\ ~\ cannot\ be\ read\ back\ in=
+
+#: io.d:4159
+!~\ from\ ~\:\ illegal\ feature\ ~=
+
+#: io.d:4295
+!~\ from\ ~\:\ \#S\ must\ be\ followed\ by\ the\ type\ and\ the\ contents\ of\ the\ structure,\ not\ ~=
+
+#: io.d:4308
+!~\ from\ ~\:\ the\ type\ of\ a\ structure\ should\ be\ a\ symbol,\ not\ ~=
+
+#: io.d:4322
+!~\ from\ ~\:\ bad\ HASH-TABLE=
+
+#: io.d:4349
+!~\ from\ ~\:\ bad\ ~=
+
+#: io.d:4381
+!~\ from\ ~\:\ no\ structure\ of\ type\ ~\ has\ been\ defined=
+
+#: io.d:4392
+!~\ from\ ~\:\ bad\ ~\ for\ ~=
+
+#: io.d:4404
+!~\ from\ ~\:\ structures\ of\ type\ ~\ cannot\ be\ read\ in,\ missing\ constructor\ function=
+
+#: io.d:4426
+!~\ from\ ~\:\ a\ structure\ ~\ may\ not\ contain\ a\ component\ "."=
+
+#: io.d:4438
+!~\ from\ ~\:\ ~\ is\ not\ a\ symbol,\ not\ a\ slot\ name\ of\ structure\ ~=
+
+#: io.d:4448
+!~\ from\ ~\:\ missing\ value\ of\ slot\ ~\ in\ structure\ ~=
+
+#: io.d:4470
+!~\ from\ ~\:\ too\ many\ slots\ for\ structure\ ~=
+
+#: io.d:4517
+!~\ from\ ~\:\ illegal\ syntax\ of\ closure\ code\ vector\ after\ \#~Y=
+
+#: io.d:4572
+!~\ from\ ~\:\ object\ \#Y~\ has\ not\ the\ syntax\ of\ a\ compiled\ closure=
+
+#: io.d:4718
+!~\ from\ ~\:\ bad\ syntax\ for\ pathname\:\ \#P~=
+
+#: io.d:4937 io.d:10468
+!~\:\ ~\ is\ not\ a\ character=
+
+#: io.d:4983
+!~\:\ peek\ type\ should\ be\ NIL\ or\ T\ or\ a\ character,\ not\ ~=
+
+#: io.d:5144
+!~\:\ ~\ argument\ should\ be\ an\ integer\ between\ 2\ and\ 36,\ not\ ~=
+
+#: io.d:5245
+!~\:\ string\ ~\ does\ not\ have\ integer\ syntax=
+
+#: io.d:5417
+!~\:\ Despite\ of\ ~,\ ~\ cannot\ be\ printed\ readably.=
+
+#: io.d:5443
+!~\:\ the\ value\ ~\ of\ ~\ is\ neither\ ~\ nor\ ~\ nor\ ~.\nIt\ is\ reset\ to\ ~.=
+
+#: io.d:5886
+!~\:\ must\ be\ a\ positive\ integer\ or\ NIL,\ not\ ~=
+
+#: io.d:6847
+!~\:\ not\ enough\ stack\ space\ for\ carrying\ out\ circularity\ analysis=
+
+#: io.d:8571
+!~\:\ bad\ ~=
+
+#: io.d:8696 record.d:243
+!~\:\ ~\ is\ not\ a\ structure=
+
+#: io.d:9713
+!~\:\ an\ unknown\ record\ type\ has\ been\ generated\!=
+
+#: array.d:228
+!index\ too\ large=
+
+#: array.d:237
+!An\ array\ has\ been\ shortened\ by\ adjusting\ it\ while\ another\ array\ was\ displaced\ to\ it.=
+
+#: array.d:329
+!~\:\ ~\ is\ not\ an\ array=
+
+#: array.d:364 foreign.d:2282
+!~\:\ got\ ~\ subscripts,\ but\ ~\ has\ rank\ ~=
+
+#: array.d:382 foreign.d:2299
+!~\:\ subscripts\ ~\ for\ ~\ are\ not\ of\ type\ `(INTEGER\ 0\ (,ARRAY-DIMENSION-LIMIT))=
+
+#: array.d:411 foreign.d:2310
+!~\:\ subscripts\ ~\ for\ ~\ are\ out\ of\ range=
+
+#: array.d:474
+!~\:\ index\ ~\ for\ ~\ is\ not\ of\ type\ `(INTEGER\ 0\ (,ARRAY-DIMENSION-LIMIT))=
+
+#: array.d:495
+!~\:\ index\ ~\ for\ ~\ is\ out\ of\ range=
+
+#: array.d:598
+!~\:\ ~\ does\ not\ fit\ into\ ~,\ bad\ type=
+
+#: array.d:917
+!~\:\ ~\ is\ not\ an\ nonnegative\ integer\ less\ than\ the\ rank\ of\ ~=
+
+#: array.d:1128
+!~\:\ ~\ is\ not\ an\ array\ of\ bits=
+
+#: array.d:1993
+!~\:\ The\ arguments\ ~\ and\ ~\ should\ be\ arrays\ of\ bits\ with\ the\ same\ dimensions=
+
+#: array.d:2004
+!~\:\ The\ arguments\ ~,\ ~\ and\ ~\ should\ be\ arrays\ of\ bits\ with\ the\ same\ dimensions=
+
+#: array.d:3994
+!~\:\ vector\ ~\ has\ no\ fill\ pointer=
+
+#: array.d:4044
+!~\:\ ~\ has\ length\ zero=
+
+#: array.d:4072
+!~\ works\ only\ on\ adjustable\ arrays,\ not\ on\ ~=
+
+#: array.d:4090
+!~\:\ extension\ ~\ should\ be\ a\ positive\ fixnum=
+
+#: array.d:4114
+!~\:\ extending\ the\ vector\ by\ ~\ elements\ makes\ it\ too\ long=
+
+#: array.d:4186
+!~\:\ cannot\ push\ ~\ into\ array\ ~\ (bad\ type)=
+
+#: array.d:4485
+!~\:\ dimension\ ~\ is\ not\ of\ type\ `(INTEGER\ 0\ (,ARRAY-DIMENSION-LIMIT))=
+
+#: array.d:4528
+!~\:\ dimensions\ ~\ produce\ too\ large\ total-size=
+
+#: array.d:4570
+!~\:\ ambiguous,\ more\ than\ one\ initialisation\ specified=
+
+#: array.d:4582
+!~\:\ ~\ must\ not\ be\ specified\ without\ ~=
+
+#: array.d:4629
+!~\:\ the\ initial-element\ ~\ is\ not\ of\ type\ ~=
+
+#: array.d:4720
+!~\:\ ~\ is\ of\ incorrect\ length=
+
+#: array.d:4751
+!~\:\ ~-argument\ ~\ is\ not\ an\ array=
+
+#: array.d:4794
+!~\:\ ~-argument\ ~\ does\ not\ have\ element\ type\ ~=
+
+#: array.d:4811
+!~\:\ ~-argument\ ~\ is\ not\ of\ type\ `(INTEGER\ 0\ (,ARRAY-TOTAL-SIZE-LIMIT))=
+
+#: array.d:4823
+!~\:\ array-total-size\ +\ displaced-offset\ (\=\ ~)\ exceeds\ total\ size\ ~\ of\ ~-argument=
+
+#: array.d:4849
+!~\:\ fill-pointer\ ~\ should\ be\ a\ nonnegative\ fixnum=
+
+#: array.d:4858
+!~\:\ fill-pointer\ argument\ ~\ is\ larger\ than\ the\ length\ ~=
+
+#: array.d:4928
+!~\:\ attempted\ rank\ ~\ is\ too\ large=
+
+#: array.d:4942
+!~\:\ ~\ may\ not\ be\ specified\ for\ an\ array\ of\ rank\ ~=
+
+#: array.d:5141
+!~\:\ array\ ~\ is\ not\ adjustable=
+
+#: array.d:5164
+!~\:\ rank\ ~\ of\ array\ ~\ cannot\ be\ altered\:\ ~=
+
+#: array.d:5180
+!~\:\ array\ ~\ does\ not\ have\ element-type\ ~=
+
+#: array.d:5234
+!~\:\ cannot\ displace\ array\ ~\ to\ itself=
+
+#: array.d:5258
+!~\:\ array\ ~\ has\ no\ fill-pointer=
+
+#: array.d:5273
+!~\:\ the\ fill-pointer\ of\ array\ ~\ is\ ~,\ greater\ than\ ~=
+
+#: array.d:5424
+!Illegal\ START\ index\ ~\ for\ ~=
+
+#: array.d:5460
+!Illegal\ END\ index\ ~\ for\ ~=
+
+#: array.d:5474
+!~\:\ invalid\ bit-vector\ length\ ~=
+
+#: hashtabl.d:1148
+!Hash\ table\ size\ ~\ too\ large=
+
+#: hashtabl.d:1194
+!internal\ error\ occured\ while\ resizing\ ~=
+
+#: hashtabl.d:1305
+!~\:\ illegal\ \:TEST\ argument\ ~=
+
+#: hashtabl.d:1322
+!~\:\ \:SIZE\ argument\ should\ be\ a\ fixnum\ >\=0,\ not\ ~=
+
+#: hashtabl.d:1345
+!~\:\ \:REHASH-SIZE\ argument\ should\ be\ a\ float\ >\ 1,\ not\ ~=
+
+#: hashtabl.d:1390
+!~\:\ \:REHASH-THRESHOLD\ argument\ should\ be\ a\ float\ between\ 0\ and\ 1,\ not\ ~=
+
+#: hashtabl.d:1465
+!~\:\ internal\ error\ while\ building\ ~=
+
+#: hashtabl.d:1509
+!~\:\ argument\ ~\ is\ not\ a\ hash-table=
+
+#: list.d:642
+!~\:\ ~\ is\ not\ a\ nonnegative\ fixnum\ and\ therefore\ not\ a\ valid\ index=
+
+#: list.d:738
+!~\:\ ~\ is\ not\ a\ nonnegative\ integer\ and\ therefore\ not\ a\ valid\ argument=
+
+#: list.d:865
+!~\:\ ~\ is\ not\ a\ nonnegative\ fixnum\ and\ therefore\ not\ a\ valid\ list\ length=
+
+#: list.d:1174
+!~\:\ ~\ is\ not\ a\ pair=
+
+#: list.d:1921
+!~\:\ lists\ ~\ and\ ~\ are\ not\ of\ same\ length=
+
+#: list.d:2140
+!~\:\ index\ ~\ too\ large\ for\ ~=
+
+#: list.d:2202
+!~\:\ start\ index\ ~\ too\ large\ for\ ~=
+
+#: list.d:2247
+!~\:\ end\ index\ ~\ too\ large\ for\ ~=
+
+#: package.d:386
+!symbol\ ~\ cannot\ be\ deleted\ from\ symbol\ table=
+
+#: package.d:808
+!~\ inconsistent\:\ symbol\ ~\ is\ a\ shadowing\ symbol\ but\ not\ present=
+
+#: package.d:1259
+!UNEXPORT\ in\ ~\ is\ illegal=
+
+#: package.d:1278
+!UNEXPORT\ works\ only\ on\ accessible\ symbols,\ not\ on\ ~\ in\ ~=
+
+#: package.d:1924
+!The\ value\ of\ *PACKAGE*\ was\ not\ a\ package.\ Old\ value\ ~.\ New\ value\ ~.=
+
+#: package.d:1946
+!Package\ ~\ has\ been\ deleted.=
+
+#: package.d:1957
+!There\ is\ no\ package\ with\ name\ ~=
+
+#: package.d:1967
+!~\:\ argument\ should\ be\ a\ package\ or\ a\ package\ name,\ not\ ~=
+
+#: package.d:1979
+!~\:\ argument\ should\ be\ a\ string,\ not\ ~=
+
+#: package.d:2002
+!~\:\ argument\ ~\ should\ be\ a\ string\ or\ a\ symbol=
+
+#: package.d:2112
+!~\:\ there\ is\ already\ a\ package\ named\ ~=
+
+#: package.d:2248 predtype.d:1981
+!~\:\ argument\ ~\ is\ not\ a\ symbol=
+
+#: package.d:2302
+!~\:\ argument\ should\ be\ a\ symbol\ or\ a\ list\ of\ symbols,\ not\ ~=
+
+#: package.d:2537
+!Cannot\ change\ the\ case\ sensitiveness\ of\ ~.=
+
+#: record.d:35
+!~\:\ ~\ is\ not\ a\ valid\ index\ into\ ~=
+
+#: record.d:47
+!~\:\ ~\ is\ not\ a\ record=
+
+#: record.d:113
+!~\:\ length\ ~\ is\ illegal,\ should\ be\ of\ type\ (INTEGER\ (0)\ (65536))=
+
+#: record.d:151
+!~\:\ ~\ is\ not\ a\ structure\ of\ type\ ~=
+
+#: record.d:203
+!~\:\ Slot\ ~\ of\ ~\ has\ no\ value=
+
+#: record.d:313
+!~\:\ ~\ is\ not\ a\ closure=
+
+#: record.d:327
+!~\:\ This\ is\ not\ a\ compiled\ closure\:\ ~=
+
+#: record.d:401
+!~\ is\ not\ a\ valid\ code-vector\ byte=
+
+#: record.d:418
+!~\:\ invalid\ code-vector\ ~=
+
+#: record.d:428
+!~\:\ function\ ~\ is\ too\ big\:\ ~=
+
+#: record.d:459 record.d:502
+!~\:\ This\ is\ not\ a\ generic\ function\:\ ~=
+
+#: record.d:469
+!~\:\ This\ is\ not\ a\ prototype\ of\ a\ generic\ function\:\ ~=
+
+#: record.d:619
+!~\:\ ~\ is\ not\ a\ Macro=
+
+#: record.d:670 record.d:684
+!~\:\ ~\ is\ not\ a\ FunctionMacro=
+
+#: record.d:726
+!~\:\ ~\ is\ not\ a\ weak\ pointer=
+
+#: record.d:794
+!~\:\ ~\ is\ not\ a\ class=
+
+#: record.d:827
+!ALLOCATE-INSTANCE\:\ keyword\ argument\ list\ ~\ has\ an\ odd\ length=
+
+#: record.d:1035
+!~\:\ illegal\ keyword/value\ pair\ ~,\ ~\ in\ argument\ list.\nThe\ allowed\ keywords\ are\ ~=
+
+#: record.d:1071
+!SHARED-INITIALIZE\:\ keyword\ argument\ list\ ~\ has\ an\ odd\ length=
+
+#: record.d:1198
+!REINITIALIZE-INSTANCE\:\ keyword\ argument\ list\ ~\ has\ an\ odd\ length=
+
+#: record.d:1305
+!INITIALIZE-INSTANCE\:\ keyword\ argument\ list\ ~\ has\ an\ odd\ length=
+
+#: record.d:1443
+!MAKE-INSTANCE\:\ keyword\ argument\ list\ ~\ has\ an\ odd\ length=
+
+#: record.d:1509
+!~\ method\ for\ ~\ returned\ ~=
+
+#: sequence.d:219
+!There\ are\ no\ sequences\ of\ type\ ~=
+
+#: sequence.d:285
+!~\ is\ not\ a\ sequence=
+
+#: sequence.d:302
+!sequence\ type\ forces\ length\ ~,\ but\ result\ has\ length\ ~=
+
+#: sequence.d:318
+!~\:\ ~\ should\ be\ an\ integer\ >\=0,\ not\ ~=
+
+#: sequence.d:369 sequence.d:400
+!~\:\ ~\ \=\ ~\ should\ not\ be\ greater\ than\ ~\ \=\ ~=
+
+#: sequence.d:550
+!~\:\ the\ index\ should\ be\ a\ fixnum\ >\=0,\ not\ ~=
+
+#: sequence.d:567
+!~\ ~\:\ the\ index\ should\ be\ a\ fixnum\ >\=0,\ not\ ~=
+
+#: sequence.d:706
+!~\:\ ~\ is\ not\ a\ sequence=
+
+#: sequence.d:829 sequence.d:1127
+!~\:\ bad\ length\ ~=
+
+#: sequence.d:930
+!~\:\ size\ should\ be\ an\ integer\ >\=0,\ not\ ~=
+
+#: sequence.d:938
+!~\:\ \:update\ must\ not\ be\ specified\ without\ \:initial-element=
+
+#: sequence.d:1978
+!~\:\ Must\ not\ specify\ both\ arguments\ to\ \:TEST\ and\ \:TEST-NOT=
+
+#: sequence.d:2107
+!~\:\ sequence\ ~\ is\ too\ long=
+
+#: sequence.d:2569
+!too\ long\ sequence\ ~=
+
+#: charstrg.d:946 charstrg.d:1028 charstrg.d:1060 charstrg.d:1107
+!This\ is\ not\ a\ string\:\ ~=
+
+#: charstrg.d:1760
+!~\:\ the\ radix\ must\ be\ an\ integer\ between\ 2\ and\ 36,\ not\ ~=
+
+#: charstrg.d:2134
+!~\:\ the\ code\ argument\ should\ be\ an\ integer,\ not\ ~=
+
+#: charstrg.d:2156
+!~\:\ cannot\ coerce\ ~\ to\ a\ character=
+
+#: charstrg.d:2197
+!~\:\ the\ weight\ argument\ should\ be\ an\ integer,\ not\ ~=
+
+#: charstrg.d:2239
+!~\:\ argument\ should\ be\ an\ integer,\ not\ ~=
+
+#: charstrg.d:2266
+!~\:\ index\ should\ be\ an\ integer,\ not\ ~=
+
+#: charstrg.d:2271
+!~\:\ ~-index\ should\ be\ an\ integer,\ not\ ~=
+
+#: charstrg.d:2288
+!~\:\ index\ should\ be\ NIL\ or\ an\ integer,\ not\ ~=
+
+#: charstrg.d:2293
+!~\:\ ~-index\ should\ be\ NIL\ or\ an\ integer,\ not\ ~=
+
+#: charstrg.d:2310
+!~\:\ index\ should\ not\ be\ negative\:\ ~=
+
+#: charstrg.d:2315
+!~\:\ ~-index\ should\ not\ be\ negative\:\ ~=
+
+#: charstrg.d:2339
+!~\:\ index\ ~\ should\ not\ be\ greater\ than\ the\ length\ of\ the\ string=
+
+#: charstrg.d:2344
+!~\:\ ~-index\ ~\ should\ not\ be\ greater\ than\ the\ length\ of\ the\ string=
+
+#: charstrg.d:2368
+!~\:\ index\ ~\ should\ be\ less\ than\ the\ length\ of\ the\ string=
+
+#: charstrg.d:2373
+!~\:\ ~-index\ ~\ should\ be\ less\ than\ the\ length\ of\ the\ string=
+
+#: charstrg.d:2478
+!~\:\ argument\ should\ be\ a\ character,\ not\ ~=
+
+#: charstrg.d:2549 charstrg.d:2646 charstrg.d:3651
+!~\:\ \:start-index\ ~\ must\ not\ be\ greater\ than\ \:end-index\ ~=
+
+#: charstrg.d:2604
+!~\:\ argument\ ~\ should\ be\ a\ string,\ a\ symbol\ or\ a\ character=
+
+#: charstrg.d:2704
+!~\:\ \:start1-index\ ~\ must\ not\ be\ greater\ than\ \:end1-index\ ~=
+
+#: charstrg.d:2728
+!~\:\ \:start2-index\ ~\ must\ not\ be\ greater\ than\ \:end2-index\ ~=
+
+#: charstrg.d:3306
+!~\:\ the\ string\ length\ ~\ should\ be\ nonnegative\ fixnum=
+
+#: charstrg.d:3338
+!~\:\ \:initial-element\ ~\ should\ be\ of\ type\ character=
+
+#: debug.d:718
+!~\:\ bad\ frame\ climbing\ mode\ ~=
+
+#: debug.d:738
+!~\:\ ~\ is\ not\ a\ stack\ pointer=
+
+#: debug.d:930
+!~\:\ ~\ is\ not\ a\ pointer\ to\ an\ EVAL/APPLY\ frame=
+
+#: debug.d:1203
+!~\:\ environment\ is\ not\ an\ alist=
+
+#: debug.d:1292
+!~\:\ unknown\ frame\ type=
+
+#: error.d:49
+!Unprintable\ error\ message=
+
+#: error.d:669
+!~\:\ User\ break=
+
+#: error.d:730
+!~\:\ ~\ is\ not\ a\ list=
+
+#: error.d:746
+!~\:\ A\ true\ list\ must\ not\ end\ with\ ~=
+
+#: error.d:764
+!~\:\ ~\ is\ not\ a\ symbol=
+
+#: error.d:795
+!~\:\ ~\ is\ not\ a\ simple-vector=
+
+#: error.d:811
+!~\:\ ~\ is\ not\ a\ vector=
+
+#: error.d:827
+!~\:\ argument\ ~\ should\ be\ a\ nonnegative\ fixnum=
+
+#: error.d:843
+!~\:\ argument\ ~\ is\ not\ a\ character=
+
+#: error.d:858
+!~\:\ argument\ ~\ is\ not\ a\ string=
+
+#: error.d:873
+!~\:\ argument\ ~\ is\ not\ a\ simple\ string=
+
+#: error.d:887
+!Attempt\ to\ modify\ a\ read-only\ string\:\ ~=
+
+#: error.d:903
+!~\:\ argument\ ~\ is\ neither\ a\ string\ nor\ an\ integer=
+
+#: error.d:919
+!~\:\ argument\ ~\ should\ be\ a\ stream=
+
+#: error.d:937
+!~\:\ argument\ ~\ should\ be\ a\ stream\ of\ type\ ~=
+
+#: error.d:969
+!~\:\ argument\ ~\ is\ not\ a\ function.\nTo\ get\ a\ function\ in\ the\ current\ environment,\ write\ (FUNCTION\ ...).\nTo\ get\ a\ function\ in\ the\ global\ environment,\ write\ (COERCE\ '...\ 'FUNCTION).=
+
+#: error.d:985 error.d:1003
+!~\:\ ~\ is\ not\ an\ 8-bit\ number=
+
+#: error.d:1019 error.d:1035
+!~\:\ ~\ is\ not\ a\ 16-bit\ number=
+
+#: error.d:1051 error.d:1067
+!~\:\ ~\ is\ not\ an\ 32-bit\ number=
+
+#: error.d:1083 error.d:1099
+!~\:\ ~\ is\ not\ an\ 64-bit\ number=
+
+#: error.d:1119
+!~\:\ ~\ is\ not\ an\ `unsigned\ int'\ number=
+
+#: error.d:1139
+!~\:\ ~\ is\ not\ an\ `int'\ number=
+
+#: error.d:1159
+!~\:\ ~\ is\ not\ a\ `unsigned\ long'\ number=
+
+#: error.d:1179
+!~\:\ ~\ is\ not\ a\ `long'\ number=
+
+#: error.d:1195
+!~\:\ ~\ is\ not\ a\ single-float=
+
+#: error.d:1211
+!~\:\ ~\ is\ not\ a\ double-float=
+
+#: erramiga.d:11
+!Amiga\ OS\ error\ =
+
+#: erramiga.d:40
+!not\ enough\ memory\ available=
+
+#: erramiga.d:43
+!process\ table\ full=
+
+#: erramiga.d:53
+!bad\ template=
+
+#: erramiga.d:55
+!bad\ number=
+
+#: erramiga.d:57
+!required\ argument\ missing=
+
+#: erramiga.d:59
+!value\ after\ keyword\ missing=
+
+#: erramiga.d:61
+!wrong\ number\ of\ arguments=
+
+#: erramiga.d:63
+!unmatched\ quotes=
+
+#: erramiga.d:65
+!argument\ line\ invalid\ or\ too\ long=
+
+#: erramiga.d:67
+!file\ is\ not\ executable=
+
+#: erramiga.d:69
+!invalid\ resident\ library=
+
+#: erramiga.d:78
+!object\ is\ in\ use=
+
+#: erramiga.d:80
+!object\ already\ exists=
+
+#: erramiga.d:82
+!directory\ not\ found=
+
+#: erramiga.d:84
+!object\ not\ found=
+
+#: erramiga.d:86
+!invalid\ window\ description=
+
+#: erramiga.d:88
+!object\ too\ large=
+
+#: erramiga.d:91
+!packet\ request\ type\ unknown=
+
+#: erramiga.d:93
+!object\ name\ invalid=
+
+#: erramiga.d:95
+!invalid\ object\ lock=
+
+#: erramiga.d:97
+!object\ is\ not\ of\ required\ type=
+
+#: erramiga.d:99
+!disk\ not\ validated=
+
+#: erramiga.d:101
+!disk\ is\ write-protected=
+
+#: erramiga.d:103
+!rename\ across\ devices\ attempted=
+
+#: erramiga.d:105
+!directory\ not\ empty=
+
+#: erramiga.d:107
+!too\ many\ levels=
+
+#: erramiga.d:109
+!device\ (or\ volume)\ is\ not\ mounted=
+
+#: erramiga.d:111
+!seek\ failure=
+
+#: erramiga.d:113
+!comment\ is\ too\ long=
+
+#: erramiga.d:115
+!disk\ is\ full=
+
+#: erramiga.d:117
+!object\ is\ protected\ from\ deletion=
+
+#: erramiga.d:119
+!file\ is\ write\ protected=
+
+#: erramiga.d:121
+!file\ is\ read\ protected=
+
+#: erramiga.d:123
+!not\ a\ valid\ DOS\ disk=
+
+#: erramiga.d:125
+!no\ disk\ in\ drive=
+
+#: erramiga.d:132
+!no\ more\ entries\ in\ directory=
+
+#: erramiga.d:134
+!object\ is\ soft\ link=
+
+#: erramiga.d:136
+!object\ is\ linked=
+
+#: erramiga.d:138
+!bad\ loadfile\ hunk=
+
+#: erramiga.d:140
+!function\ not\ implemented=
+
+#: erramiga.d:145
+!record\ not\ locked=
+
+#: erramiga.d:147
+!record\ lock\ collision=
+
+#: erramiga.d:149
+!record\ lock\ timeout=
+
+#: erramiga.d:151
+!record\ unlock\ error=
+
+#: erramiga.d:158
+!buffer\ overflow=
+
+#: erramiga.d:160
+!break=
+
+#: erramiga.d:162
+!file\ not\ executable=
+
+#: erramiga.d:170
+!Ok,\ No\ error=
+
+#: errunix.d:57
+!Operation\ not\ permitted=
+
+#: errunix.d:63
+!No\ such\ file\ or\ directory=
+
+#: errunix.d:69
+!No\ such\ process=
+
+#: errunix.d:75
+!Interrupted\ system\ call=
+
+#: errunix.d:81
+!I/O\ error=
+
+#: errunix.d:87
+!No\ such\ device\ or\ address=
+
+#: errunix.d:93
+!Arg\ list\ too\ long=
+
+#: errunix.d:99
+!Exec\ format\ error=
+
+#: errunix.d:105
+!Bad\ file\ number=
+
+#: errunix.d:111
+!No\ child\ processes=
+
+#: errunix.d:117
+!No\ more\ processes=
+
+#: errunix.d:123
+!Not\ enough\ memory=
+
+#: errunix.d:129
+!Permission\ denied=
+
+#: errunix.d:135
+!Bad\ address=
+
+#: errunix.d:141
+!Block\ device\ required=
+
+#: errunix.d:147
+!Device\ busy=
+
+#: errunix.d:153
+!File\ exists=
+
+#: errunix.d:159
+!Cross-device\ link=
+
+#: errunix.d:165
+!No\ such\ device=
+
+#: errunix.d:171
+!Not\ a\ directory=
+
+#: errunix.d:177
+!Is\ a\ directory=
+
+#: errunix.d:183
+!Invalid\ argument=
+
+#: errunix.d:189
+!File\ table\ overflow=
+
+#: errunix.d:195
+!Too\ many\ open\ files=
+
+#: errunix.d:201
+!Inappropriate\ ioctl\ for\ device=
+
+#: errunix.d:207
+!Text\ file\ busy=
+
+#: errunix.d:213
+!File\ too\ large=
+
+#: errunix.d:219
+!No\ space\ left\ on\ device=
+
+#: errunix.d:225
+!Illegal\ seek=
+
+#: errunix.d:231
+!Read-only\ file\ system=
+
+#: errunix.d:237
+!Too\ many\ links=
+
+#: errunix.d:243
+!Broken\ pipe,\ child\ process\ terminated\ or\ socket\ closed=
+
+#: errunix.d:253
+!Argument\ out\ of\ domain=
+
+#: errunix.d:259
+!Result\ too\ large=
+
+#: errunix.d:266
+!Invalid\ multibyte\ or\ wide\ character=
+
+#: errunix.d:273
+!Operation\ would\ block=
+
+#: errunix.d:279
+!Operation\ now\ in\ progress=
+
+#: errunix.d:285
+!Operation\ already\ in\ progress=
+
+#: errunix.d:292
+!Too\ many\ levels\ of\ symbolic\ links=
+
+#: errunix.d:298
+!File\ name\ too\ long=
+
+#: errunix.d:304
+!Directory\ not\ empty=
+
+#: errunix.d:311
+!Stale\ NFS\ file\ handle=
+
+#: errunix.d:317
+!Too\ many\ levels\ of\ remote\ in\ path=
+
+#: errunix.d:324
+!Socket\ operation\ on\ non-socket=
+
+#: errunix.d:330
+!Destination\ address\ required=
+
+#: errunix.d:336
+!Message\ too\ long=
+
+#: errunix.d:342
+!Protocol\ wrong\ type\ for\ socket=
+
+#: errunix.d:348
+!Option\ not\ supported\ by\ protocol=
+
+#: errunix.d:354
+!Protocol\ not\ supported=
+
+#: errunix.d:360
+!Socket\ type\ not\ supported=
+
+#: errunix.d:366
+!Operation\ not\ supported\ on\ socket=
+
+#: errunix.d:372
+!Protocol\ family\ not\ supported=
+
+#: errunix.d:378
+!Address\ family\ not\ supported\ by\ protocol\ family=
+
+#: errunix.d:384
+!Address\ already\ in\ use=
+
+#: errunix.d:390
+!Can't\ assign\ requested\ address=
+
+#: errunix.d:396
+!Network\ is\ down=
+
+#: errunix.d:402
+!Network\ is\ unreachable=
+
+#: errunix.d:408
+!Network\ dropped\ connection\ on\ reset=
+
+#: errunix.d:414
+!Software\ caused\ connection\ abort=
+
+#: errunix.d:420
+!Connection\ reset\ by\ peer=
+
+#: errunix.d:426
+!No\ buffer\ space\ available=
+
+#: errunix.d:432
+!Socket\ is\ already\ connected=
+
+#: errunix.d:438
+!Socket\ is\ not\ connected=
+
+#: errunix.d:444
+!Can't\ send\ after\ socket\ shutdown=
+
+#: errunix.d:450
+!Too\ many\ references\:\ can't\ splice=
+
+#: errunix.d:456
+!Connection\ timed\ out=
+
+#: errunix.d:462
+!Connection\ refused=
+
+#: errunix.d:467
+!Remote\ peer\ released\ connection=
+
+#: errunix.d:472
+!Host\ is\ down=
+
+#: errunix.d:478
+!Host\ is\ unreachable=
+
+#: errunix.d:483
+!Networking\ error=
+
+#: errunix.d:489
+!Too\ many\ processes=
+
+#: errunix.d:495
+!Too\ many\ users=
+
+#: errunix.d:501
+!Disk\ quota\ exceeded=
+
+#: errunix.d:508
+!Not\ a\ stream\ device=
+
+#: errunix.d:514
+!Timer\ expired=
+
+#: errunix.d:520
+!Out\ of\ stream\ resources=
+
+#: errunix.d:526
+!No\ message\ of\ desired\ type=
+
+#: errunix.d:532
+!Not\ a\ data\ message=
+
+#: errunix.d:539
+!Identifier\ removed=
+
+#: errunix.d:546
+!Resource\ deadlock\ would\ occur=
+
+#: errunix.d:552
+!No\ record\ locks\ available=
+
+#: errunix.d:559
+!Machine\ is\ not\ on\ the\ network=
+
+#: errunix.d:565 errunix.d:571
+!Object\ is\ remote=
+
+#: errunix.d:577
+!Link\ has\ been\ severed=
+
+#: errunix.d:583
+!Advertise\ error=
+
+#: errunix.d:589
+!Srmount\ error=
+
+#: errunix.d:595
+!Communication\ error\ on\ send=
+
+#: errunix.d:601
+!Protocol\ error=
+
+#: errunix.d:607
+!Multihop\ attempted=
+
+#: errunix.d:619
+!Remote\ address\ changed=
+
+#: errunix.d:626
+!Function\ not\ implemented=
+
+#: errunix.d:633
+!Not\ supported\ under\ MS-DOS=
+
+#: errunix.d:664
+!UNIX\ error\ =
+
+#: errunix.d:666
+!UNIX\ library\ error\ =
+
+#: errwin32.d:3880
+!Win32\ error\ =
+
+#: errwin32.d:3929
+!Winsock\ error\ =
+
+#: misc.d:108
+!This\ file\ was\ produced\ by\ another\ lisp\ version,\ must\ be\ recompiled.=
+
+#: misc.d:325
+!~\:\ type\ of\ attribute\ ~\ is\ unsupported=
+
+#: predtype.d:1736 predtype.d:1940
+!~\:\ unidentifiable\ type\!\!\!=
+
+#: predtype.d:1947
+!~\:\ type\ ~\ does\ not\ correspond\ to\ a\ class=
+
+#: predtype.d:1990
+!~\:\ ~\ does\ not\ name\ a\ class=
+
+#: predtype.d:2301
+!~\:\ bad\ type\ specification\ ~=
+
+#: predtype.d:2309
+!~\:\ ~\ cannot\ be\ coerced\ to\ type\ ~=
+
+#: symbol.d:48
+!~\:\ the\ property\ list\ of\ ~\ has\ an\ odd\ length=
+
+#: symbol.d:104
+!SETF\ SYMBOL-FUNCTION\:\ ~\ is\ not\ a\ function=
+
+#: symbol.d:129
+!~\:\ ~\ is\ not\ a\ system\ function=
+
+#: symbol.d:188 symbol.d:229
+!~\:\ the\ property\ list\ ~\ has\ an\ odd\ length=
+
+#: symbol.d:419 intlog.d:592
+!~\:\ index\ ~\ is\ negative=
+
+#: symbol.d:430
+!~\:\ invalid\ argument\ ~=
+
+#: symbol.d:444
+!The\ value\ of\ *GENSYM-COUNTER*\ was\ not\ a\ nonnegative\ integer.\ Old\ value\ ~.\ New\ value\ ~.=
+
+#: lisparit.d:359
+!argument\ to\ ~\ should\ be\ a\ number\:\ ~=
+
+#: lisparit.d:375
+!argument\ to\ ~\ should\ be\ a\ real\ number\:\ ~=
+
+#: lisparit.d:391
+!argument\ to\ ~\ should\ be\ a\ floating\ point\ number\:\ ~=
+
+#: lisparit.d:407
+!argument\ to\ ~\ should\ be\ a\ rational\ number\:\ ~=
+
+#: lisparit.d:423
+!argument\ to\ ~\ should\ be\ an\ integer\:\ ~=
+
+#: lisparit.d:439
+!~\:\ argument\ should\ be\ a\ positive\ fixnum,\ not\ ~=
+
+#: lisparit.d:1846
+!~\:\ argument\ should\ be\ a\ random-state,\ not\ ~=
+
+#: lisparit.d:1861
+!~\:\ the\ value\ of\ ~\ should\ be\ a\ random-state,\ not\ ~=
+
+#: lisparit.d:1885
+!~\:\ argument\ should\ be\ positive\ and\ an\ integer\ or\ float,\ not\ ~=
+
+#: lisparit.d:1970
+!~\ \:\ argument\ should\ be\ a\ fixnum\ >\=0,\ not\ ~=
+
+#: aridecl.d:338
+!division\ by\ zero=
+
+#: aridecl.d:348
+!floating\ point\ overflow=
+
+#: aridecl.d:358
+!floating\ point\ underflow=
+
+#: intelem.d:211 intelem.d:309
+!not\ a\ 32-bit\ integer\:\ ~=
+
+#: intelem.d:399 intelem.d:545
+!not\ a\ 64-bit\ integer\:\ ~=
+
+#: intelem.d:1443
+!bignum\ overflow=
+
+#: intlog.d:469
+!~\:\ ~\ is\ not\ a\ valid\ boolean\ operation=
+
+#: intlog.d:725
+!~\:\ too\ large\ shift\ amount\ ~=
+
+#: intbyte.d:16
+!The\ arguments\ to\ BYTE\ must\ be\ fixnums\ >\=0\:\ ~,\ ~=
+
+#: intbyte.d:40
+!~\ is\ not\ a\ BYTE\ specifier=
+
+#: intmal.d:8
+!overflow\ during\ multiplication\ of\ large\ numbers=
+
+#: intdiv.d:373
+!quotient\ ~\ /\ ~\ is\ not\ an\ integer=
+
+#: intsqrt.d:426
+!~\ applied\ to\ negative\ number\ ~=
+
+#: lfloat.d:8
+!long\ float\ too\ long=
+
+#: flo_konv.d:465
+!floating\ point\ NaN\ occurred=
+
+#: rexx.d:34
+!Communication\ with\ ARexx\ isn't\ possible.=
+
+#: rexx.d:116
+!~\ must\ be\ a\ string\ for\ commands\ or\ a\ vector\ of\ strings\ for\ a\ function=
+
+#: rexx.d:125
+!~\:\ an\ ARexx\ function\ must\ have\ 0\ to\ ~\ arguments\:\ ~=
+
+#: rexx.d:139
+!~\:\ must\ be\ a\ string\ for\ ARexx\:\ ~=
+
+#: rexx.d:161
+!Only\ NIL,\ T\ and\ strings\ are\ accepted\ for\ ~\ \:\ ~=
+
+#: rexx.d:474
+!~\:\ Not\ a\ Fixnum\:\ ~=
+
+#: rexx.d:484
+!~\:\ Not\ an\ incoming\ Rexx\ message\:\ ~=
+
+#: affi.d:85
+!~\:\ Unsupported\ call\ mechanism\:\ ~=
+
+#: affi.d:96
+!~\:\ Bad\ function\ prototype\:\ ~=
+
+#: affi.d:107
+!~\:\ Wrong\ number\ of\ arguments\ for\ prototype\ ~=
+
+#: affi.d:121
+!~\:\ Bad\ argument\ for\ prototype\ ~\:\ ~=
+
+#: affi.d:132
+!~\:\ Bad\ argument\:\ ~=
+
+#: affi.d:153
+!~\:\ ~\ is\ not\ a\ valid\ address=
+
+#: foreign.d:27
+!~\ comes\ from\ a\ previous\ Lisp\ session\ and\ is\ invalid=
+
+#: foreign.d:100
+!A\ foreign\ variable\ ~\ already\ exists=
+
+#: foreign.d:140
+!A\ foreign\ function\ ~\ already\ exists=
+
+#: foreign.d:182
+!illegal\ foreign\ data\ type\ ~=
+
+#: foreign.d:196
+!~\ cannot\ be\ converted\ to\ the\ foreign\ type\ ~=
+
+#: foreign.d:209
+!64\ bit\ integers\ are\ not\ supported\ on\ this\ platform\ and\ with\ this\ C\ compiler\:\ ~=
+
+#: foreign.d:353 foreign.d:519
+!~\ cannot\ be\ converted\ to\ a\ foreign\ function\ with\ another\ calling\ convention.=
+
+#: foreign.d:564
+!No\ more\ room\ for\ foreign\ language\ interface=
+
+#: foreign.d:573
+!\:MALLOC-FREE\ is\ not\ available\ under\ AMIGAOS.=
+
+#: foreign.d:1101 foreign.d:1162 foreign.d:1317 foreign.d:1363
+!element\ type\ has\ size\ 0\:\ ~=
+
+#: foreign.d:2113
+!~\:\ argument\ is\ not\ a\ foreign\ variable\:\ ~=
+
+#: foreign.d:2123
+!~\:\ foreign\ variable\ with\ unknown\ type,\ missing\ DEF-C-VAR\:\ ~=
+
+#: foreign.d:2137
+!A\ foreign\ variable\ ~\ does\ not\ exist=
+
+#: foreign.d:2149
+!~\:\ foreign\ variable\ ~\ does\ not\ have\ the\ required\ size\ or\ alignment=
+
+#: foreign.d:2163
+!~\:\ type\ specifications\ for\ foreign\ variable\ ~\ conflict\:\ ~\ and\ ~=
+
+#: foreign.d:2212
+!~\:\ foreign\ variable\ ~\ may\ not\ be\ modified=
+
+#: foreign.d:2272
+!~\:\ foreign\ variable\ ~\ of\ type\ ~\ is\ not\ an\ array=
+
+#: foreign.d:2358
+!~\:\ foreign\ variable\ ~\ of\ type\ ~\ is\ not\ a\ pointer=
+
+#: foreign.d:2462
+!~\:\ foreign\ variable\ ~\ of\ type\ ~\ is\ not\ a\ struct\ or\ union=
+
+#: foreign.d:2471
+!~\:\ foreign\ variable\ ~\ of\ type\ ~\ has\ no\ component\ with\ name\ ~=
+
+#: foreign.d:2541 foreign.d:3634
+!~\:\ foreign\ variable\ ~\ does\ not\ have\ the\ required\ alignment=
+
+#: foreign.d:2557
+!~\:\ argument\ is\ not\ a\ foreign\ function\:\ ~=
+
+#: foreign.d:2568
+!~\:\ foreign\ function\ with\ unknown\ calling\ convention,\ missing\ DEF-CALL-OUT\:\ ~=
+
+#: foreign.d:2586 foreign.d:3660
+!~\:\ illegal\ foreign\ function\ type\ ~=
+
+#: foreign.d:2594
+!~\:\ A\ foreign\ function\ ~\ does\ not\ exist=
+
+#: foreign.d:2601
+!~\:\ calling\ conventions\ for\ foreign\ function\ ~\ conflict=
+
+#: foreign.d:2884
+!~\:\ Too\ few\ arguments\ (~\ instead\ of\ at\ least\ ~)\ to\ ~=
+
+#: foreign.d:2896
+!~\:\ \:OUT\ argument\ is\ not\ a\ pointer\:\ ~=
+
+#: foreign.d:2941
+!~\:\ Too\ many\ arguments\ (~\ instead\ of\ ~)\ to\ ~=
+
+#: foreign.d:3510
+!~\:\ Cannot\ open\ library\ ~=
+
+#: foreign.d:3608
+!~\:\ ~\ is\ not\ a\ library=
+
+#: amigaaux.d:212
+!This\ version\ of\ CLISP\ runs\ only\ in\ low\ address\ memory.\n=
+
+#: init.lisp:347
+!~S\ is\ a\ special\ form\ and\ may\ not\ be\ redefined.=
+
+#: init.lisp:353 clos.lisp:205
+!The\ old\ definition\ will\ be\ lost=
+
+#: init.lisp:354
+!Redefining\ the\ COMMON\ LISP\ ~A\ ~S=
+
+#: init.lisp:371
+!DEFUN/DEFMACRO\:\ redefining\ ~S;\ it\ was\ traced\!=
+
+#: init.lisp:391
+!~S\ is\ impossible\ in\ compiled\ code=
+
+#: init.lisp:478
+!~S\ is\ an\ invalid\ function\ environment=
+
+#: init.lisp:525
+!~S\ is\ an\ invalid\ variable\ environment=
+
+#: init.lisp:592
+!~S\:\ ~S\ is\ illegal\ since\ ~S\ is\ a\ local\ macro=
+
+#: init.lisp:596
+!~S\:\ invalid\ function\ environment\ ~S=
+
+#: init.lisp:602
+!~S\:\ ~S\ is\ invalid\ since\ ~S\ is\ not\ a\ symbol=
+
+#: init.lisp:776
+!code\ after\ MACROLET\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: init.lisp:792
+!illegal\ syntax\ in\ MACROLET\:\ ~S=
+
+#: init.lisp:813
+!code\ after\ SYMBOL-MACROLET\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: init.lisp:822 compiler.lisp:7388
+!~S\:\ symbol\ ~S\ must\ not\ be\ declared\ SPECIAL\ and\ a\ macro\ at\ the\ same\ time=
+
+#: init.lisp:837 compiler.lisp:7383
+!~S\:\ symbol\ ~S\ is\ declared\ special\ and\ must\ not\ be\ declared\ a\ macro=
+
+#: init.lisp:844
+!illegal\ syntax\ in\ SYMBOL-MACROLET\:\ ~S=
+
+#: init.lisp:883
+!bad\ function\ environment\ occurred\ in\ ~S\:\ ~S=
+
+#: init.lisp:892
+!~S\:\ invalid\ form\ ~S=
+
+#: init.lisp:903
+!code\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: init.lisp:946
+!~S\:\ ~S\ should\ be\ a\ lambda\ expression=
+
+#: init.lisp:987
+!lambda\ list\ must\ not\ end\ with\ the\ atom\ ~S=
+
+#: init.lisp:1019 init.lisp:1036
+!~S\:\ variable\ list\ ends\ with\ the\ atom\ ~S=
+
+#: init.lisp:1149
+!FLET/LABELS\:\ code\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: init.lisp:1158
+!illegal\ syntax\ in\ FLET/LABELS\:\ ~S=
+
+#: init.lisp:1179
+!FUNCTION-MACRO-LET\:\ code\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: init.lisp:1193
+!illegal\ syntax\ in\ FUNCTION-MACRO-LET\:\ ~S=
+
+#: init.lisp:1350
+!Loading\ file\ =
+
+#: init.lisp:1352
+!\ ...=
+
+#: init.lisp:1378
+!Loading\ of\ file\ =
+
+#: init.lisp:1380
+!\ is\ finished.=
+
+#: init.lisp:1387
+!A\ file\ with\ name\ ~A\ does\ not\ exist=
+
+#: init.lisp:1401
+!~S\:\ missing\ function\ name\ and/or\ parameter\ list=
+
+#: init.lisp:1409
+!~S\:\ ~S\ is\ not\ a\ symbol.=
+
+#: init.lisp:1414
+!~S\:\ special\ operator\ ~S\ cannot\ be\ redefined.=
+
+#: init.lisp:1459 macros1.lisp:145
+!exit\ clause\ in\ ~S\ must\ be\ a\ list=
+
+#: init.lisp:1610
+!~S\:\ cannot\ define\ a\ function\ from\ that\:\ ~S=
+
+#: init.lisp:1615 clos.lisp:2996 clos.lisp:3053
+!~S\:\ the\ name\ of\ a\ function\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: init.lisp:1620
+!~S\:\ function\ ~S\ is\ missing\ a\ lambda\ list=
+
+#: init.lisp:1843 condition.lisp:1475 reploop.lisp:414
+!If\ you\ continue\ (by\ typing\ 'continue')\:\ =
+
+#: backquote.lisp:39
+!~S\:\ comma\ is\ illegal\ outside\ of\ backquote=
+
+#: backquote.lisp:44
+!~S\:\ more\ commas\ out\ than\ backquotes\ in,\ is\ illegal=
+
+#: backquote.lisp:205
+!The\ syntax\ ,@form\ is\ valid\ only\ in\ lists=
+
+#: backquote.lisp:210
+!The\ syntax\ ,.form\ is\ valid\ only\ in\ lists=
+
+#: defmacro.lisp:44
+!Both\ will\ be\ ignored.=
+
+#: defmacro.lisp:45
+!Invalid\ keyword-value-pair\:\ ~S\ ~S=
+
+#: defmacro.lisp:54
+!The\ macro\ ~S\ may\ not\ be\ called\ with\ ~S\ arguments\:\ ~S=
+
+#: defmacro.lisp:125 defmacro.lisp:150 defmacro.lisp:301
+!The\ rest\ of\ the\ lambda\ list\ will\ be\ ignored.=
+
+#: defmacro.lisp:126
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ a\ dot\ after\ &AUX.=
+
+#: defmacro.lisp:132
+!in\ macro\ ~S\:\ ~S\ may\ not\ be\ used\ as\ &AUX\ variable.=
+
+#: defmacro.lisp:151
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ a\ dot\ after\ &KEY.=
+
+#: defmacro.lisp:160 defmacro.lisp:178 defmacro.lisp:380 defmacro.lisp:396
+#: defmacro.lisp:401
+!It\ will\ be\ ignored.=
+
+#: defmacro.lisp:161
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ a\ badly\ placed\ ~S.=
+
+#: defmacro.lisp:179
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ the\ invalid\ element\ ~S=
+
+#: defmacro.lisp:209
+!~0*It\ will\ be\ ignored.=
+
+#: defmacro.lisp:210
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ an\ invalid\ keyword\ specification\ ~S=
+
+#: defmacro.lisp:281
+!The\ lambda\ list\ of\ macro\ ~S\ is\ missing\ a\ variable\ after\ &REST/&BODY.=
+
+#: defmacro.lisp:292
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ an\ illegal\ variable\ after\ &REST/&BODY\:\ ~S=
+
+#: defmacro.lisp:302
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ a\ misplaced\ dot.=
+
+#: defmacro.lisp:307
+!They\ will\ be\ ignored.=
+
+#: defmacro.lisp:308
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ superfluous\ elements\:\ ~S=
+
+#: defmacro.lisp:361
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ an\ illegal\ &REST\ variable\:\ ~S=
+
+#: defmacro.lisp:375
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ an\ invalid\ &WHOLE\:\ ~S=
+
+#: defmacro.lisp:381
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ a\ superfluous\ ~S.=
+
+#: defmacro.lisp:397
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ ~S\ before\ &KEY.=
+
+#: defmacro.lisp:402
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ ~S\ which\ is\ illegal\ here.=
+
+#: defmacro.lisp:421
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ an\ invalid\ element\ ~S=
+
+#: defmacro.lisp:435
+!The\ lambda\ list\ of\ macro\ ~S\ contains\ an\ invalid\ supplied-variable\ ~S=
+
+#: defmacro.lisp:497
+!In\ the\ lambda\ list\ of\ macro\ ~S,\ &ENVIRONMENT\ must\ be\ followed\ by\ a\ non-NIL\ symbol\:\ ~S=
+
+#: defmacro.lisp:519
+!Cannot\ define\ a\ macro\ from\ that\:\ ~S=
+
+#: defmacro.lisp:524
+!The\ name\ of\ a\ macro\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: defmacro.lisp:529
+!Macro\ ~S\ is\ missing\ a\ lambda\ list.=
+
+#: macros1.lisp:20 macros1.lisp:43
+!~S\:\ non-symbol\ ~S\ can't\ be\ a\ variable=
+
+#: macros1.lisp:25 macros1.lisp:48
+!~S\:\ the\ constant\ ~S\ must\ not\ be\ redefined\ to\ be\ a\ variable=
+
+#: macros1.lisp:62
+!~S\:\ non-symbol\ ~S\ can't\ be\ a\ defined\ constant=
+
+#: macros1.lisp:95
+!~S\ redefines\ the\ constant\ ~S.\ Its\ old\ value\ was\ ~S.=
+
+#: macros1.lisp:150
+!Invalid\ syntax\ in\ ~S\ form\:\ ~S.=
+
+#: macros1.lisp:265 places.lisp:697
+!~S\ called\ with\ an\ odd\ number\ of\ arguments\:\ ~S=
+
+#: macros1.lisp:307
+!~S\:\ missing\ key\ list=
+
+#: macros1.lisp:314
+!~S\:\ the\ ~S\ clause\ must\ be\ the\ last\ one=
+
+#: macros1.lisp:365 macros1.lisp:435
+!Not\ a\ list\ of\ COND\ clauses\:\ ~S=
+
+#: macros1.lisp:370 macros1.lisp:440
+!The\ atom\ ~S\ must\ not\ be\ used\ as\ a\ COND\ clause.=
+
+#: macros1.lisp:405
+!COND\ code\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: macros1.lisp:411 compiler.lisp:7439
+!COND\ clause\ without\ test\:\ ~S=
+
+#: macros2.lisp:40
+!Language\ ~S\ is\ not\ defined=
+
+#: macros2.lisp:50
+!Language\ ~S\ inherits\ from\ ~S=
+
+#: macros2.lisp:100
+!~S\:\ Language\ ~S\ is\ not\ defined=
+
+#: macros2.lisp:123
+!~S\ ~S\:\ no\ value\ for\ default\ language\ ~S=
+
+#: macros2.lisp:138
+!Invalid\ clause\ in\ ~S\:\ ~S=
+
+#: macros2.lisp:157
+!~A~%The\ value\ is\:\ ~S=
+
+#: macros2.lisp:161
+!The\ value\ of\ ~S\ should\ be\ ~\:[of\ type\ ~S~;~\:*~A~].=
+
+#: macros2.lisp:165
+!You\ may\ input\ a\ new\ value.=
+
+#: macros2.lisp:168
+!~%New\ ~S\:\ =
+
+#: macros2.lisp:189
+!Retry=
+
+#: macros2.lisp:192
+!You\ may\ input\ new\ values.=
+
+#: macros2.lisp:196
+!~S\ must\ evaluate\ to\ a\ non-NIL\ value.=
+
+#: macros2.lisp:232
+!The\ value\ of\ ~S\ must\ be\ of\ one\ of\ the\ types\ ~{~S~^,\ ~}=
+
+#: macros2.lisp:237
+!The\ value\ of\ ~S\ must\ be\ one\ of\ ~{~S~^,\ ~}=
+
+#: macros2.lisp:253 condition.lisp:1303
+!~S\ used\ as\ a\ key\ in\ ~S,\ it\ would\ be\ better\ to\ use\ parentheses.=
+
+#: macros2.lisp:338
+!type\ name\ should\ be\ a\ symbol,\ not\ ~S=
+
+#: macros2.lisp:343
+!~S\ is\ a\ built-in\ type\ and\ may\ not\ be\ redefined.=
+
+#: macros2.lisp:376
+!The\ deftype\ expander\ for\ ~S\ may\ not\ be\ called\ with\ ~S\ arguments.=
+
+#: macros2.lisp:384
+!~S\:\ the\ name\ of\ a\ symbol\ macro\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: macros2.lisp:399
+!~S\:\ the\ symbol\ ~S\ names\ a\ global\ variable=
+
+#: defs1.lisp:98
+!missing\ symbol\ types\ (~S/~S/~S)\ in\ ~S=
+
+#: defs1.lisp:105
+!~S\:\ flag\ must\ be\ one\ of\ the\ symbols\ ~S,\ ~S,\ ~S,\ not\ ~S=
+
+#: defs1.lisp:418
+!~S\:\ ~S\ does\ not\ name\ a\ logical\ host=
+
+#: defs1.lisp:456
+!No\ translations\ for\ logical\ host\ ~S\ found=
+
+#: defs1.lisp:542
+!~S\:\ argument\ ~S\ should\ be\ a\ nonnegative\ number=
+
+#: defs1.lisp:704
+!incorrect\ date\:\ ~S.~S.~S,\ ~Sh~Sm~Ss,\ time\ zone\ ~S=
+
+#: defs1.lisp:773
+!special\ operator=
+
+#: defs1.lisp:776
+!function=
+
+#: defs1.lisp:778
+!macro=
+
+#: places.lisp:24
+!The\ function\ (~S\ ~S)\ is\ hidden\ by\ a\ SETF\ expander.=
+
+#: places.lisp:85
+!The\ argument\ ~S\ to\ ~S\ should\ be\ a\ keyword.=
+
+#: places.lisp:140
+!Argument\ ~S\ is\ not\ a\ SETF\ place.=
+
+#: places.lisp:153
+!SETF\ place\ ~S\ produces\ more\ than\ one\ store\ variable.=
+
+#: places.lisp:177 places.lisp:185
+!~S\:\ first\ argument\ ~S\ is\ illegal,\ not\ a\ symbol=
+
+#: places.lisp:221
+!The\ name\ of\ the\ access\ function\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: places.lisp:254
+!The\ SETF\ expander\ for\ ~S\ may\ not\ be\ called\ with\ ~S\ arguments.=
+
+#: places.lisp:291
+!Too\ many\ arguments\ to\ DEFSETF\:\ ~S=
+
+#: places.lisp:295
+!The\ doc\ string\ to\ DEFSETF\ must\ be\ a\ string\:\ ~S=
+
+#: places.lisp:305
+!Missing\ store\ variable\ in\ DEFSETF.=
+
+#: places.lisp:346
+!Illegal\ syntax\ in\ DEFSETF\ for\ ~S=
+
+#: places.lisp:359
+!(SETF\ (NTH\ ...)\ ...)\ \:\ index\ ~S\ is\ too\ large\ for\ ~S=
+
+#: places.lisp:459
+!PSETF\ called\ with\ an\ odd\ number\ of\ arguments\:\ ~S=
+
+#: places.lisp:505
+!REMF\:\ property\ list\ with\ an\ odd\ length=
+
+#: places.lisp:555
+!In\ the\ definition\ of\ ~S\:\ &REST\ variable\ ~S\ should\ be\ a\ symbol.=
+
+#: places.lisp:561
+!Only\ one\ variable\ is\ allowed\ after\ &REST,\ not\ ~S=
+
+#: places.lisp:566
+!Illegal\ in\ a\ DEFINE-MODIFY-MACRO\ lambda\ list\:\ ~S=
+
+#: places.lisp:574
+!lambda\ list\ may\ only\ contain\ symbols\ and\ lists,\ not\ ~S=
+
+#: places.lisp:691
+!Illegal\ SETF\ place\:\ ~S=
+
+#: places.lisp:710
+!SHIFTF\ called\ with\ too\ few\ arguments\:\ ~S=
+
+#: places.lisp:750
+!(SETF\ (GETF\ ...)\ ...)\ \:\ property\ list\ with\ an\ odd\ length=
+
+#: places.lisp:785
+!first\ argument\ ~S\ is\ illegal,\ not\ a\ symbol=
+
+#: places.lisp:896
+!SETF\ APPLY\ is\ only\ defined\ for\ functions\ of\ the\ form\ \#'symbol.=
+
+#: places.lisp:902
+!APPLY\ on\ ~S\ is\ not\ a\ SETF\ place.=
+
+#: places.lisp:957
+!SETF\ FUNCALL\ is\ only\ defined\ for\ functions\ of\ the\ form\ \#'symbol.=
+
+#: places.lisp:1004
+!SETF\ place\ ~S\ expects\ different\ numbers\ of\ values\ in\ the\ true\ and\ branches\ (~D\ vs.\ ~D\ values).=
+
+#: floatprint.lisp:341
+!argument\ is\ not\ a\ float\:\ ~S=
+
+#: type.lisp:30
+!~S\:\ invalid\ type\ specification\ ~S=
+
+#: type.lisp:61 compiler.lisp:8580
+!~S\:\ argument\ to\ SATISFIES\ must\ be\ a\ symbol\:\ ~S=
+
+#: type.lisp:331 type.lisp:340 type.lisp:350 type.lisp:360
+!~S\:\ argument\ to\ ~S\ must\ be\ *,\ ~S\ or\ a\ list\ of\ ~S\:\ ~S=
+
+#: type.lisp:447
+!~S\:\ argument\ to\ MOD\ must\ be\ an\ integer\:\ ~S=
+
+#: type.lisp:455
+!~S\:\ argument\ to\ SIGNED-BYTE\ must\ be\ an\ integer\ or\ *\ \:\ ~S=
+
+#: type.lisp:465
+!~S\:\ argument\ to\ UNSIGNED-BYTE\ must\ be\ an\ integer\ or\ *\ \:\ ~S=
+
+#: type.lisp:639
+!Invalid\ type\ specifier\ ~S=
+
+#: defstruct.lisp:63 foreign1.lisp:423
+!~S\:\ this\ is\ not\ a\ symbol\:\ ~S=
+
+#: defstruct.lisp:425
+!~S\:\ invalid\ syntax\ for\ name\ and\ options\:\ ~S=
+
+#: defstruct.lisp:449
+!~S\ ~S\:\ argument\ list\ should\ be\ a\ list\:\ ~S=
+
+#: defstruct.lisp:472
+!~S\ ~S\:\ At\ most\ one\ \:INCLUDE\ argument\ may\ be\ specified\:\ ~S=
+
+#: defstruct.lisp:480
+!~S\:\ Use\ of\ ~S\ implicitly\ applies\ FUNCTION.~@\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Therefore\ using\ ~S\ instead\ of\ ~S.=
+
+#: defstruct.lisp:493 condition.lisp:106
+!~S\ ~S\:\ unknown\ option\ ~S=
+
+#: defstruct.lisp:497 clos.lisp:3131 condition.lisp:112
+!~S\ ~S\:\ invalid\ syntax\ in\ ~S\ option\:\ ~S=
+
+#: defstruct.lisp:501 clos.lisp:3066 condition.lisp:116
+!~S\ ~S\:\ not\ a\ ~S\ option\:\ ~S=
+
+#: defstruct.lisp:525
+!~S\ ~S\:\ There\ is\ no\ \:PREDICATE\ on\ unnamed\ structures.=
+
+#: defstruct.lisp:551
+!~S\ ~S\:\ invalid\ \:TYPE\ option\ ~S=
+
+#: defstruct.lisp:557
+!~S\ ~S\:\ The\ \:INITIAL-OFFSET\ must\ be\ a\ nonnegative\ integer,\ not\ ~S=
+
+#: defstruct.lisp:563
+!~S\ ~S\:\ \:INITIAL-OFFSET\ must\ not\ be\ specified\ without\ \:TYPE\ \:\ ~S=
+
+#: defstruct.lisp:581
+!~S\ ~S\:\ included\ structure\ ~S\ has\ not\ been\ defined.=
+
+#: defstruct.lisp:593
+!~S\ ~S\:\ included\ structure\ ~S\ must\ be\ of\ the\ same\ type\ ~S.=
+
+#: defstruct.lisp:618
+!~S\ ~S\:\ included\ structure\ ~S\ has\ no\ component\ with\ name\ ~S.=
+
+#: defstruct.lisp:647
+!~S\ ~S\:\ The\ READ-ONLY\ slot\ ~S\ of\ the\ included\ structure\ ~S\ must\ remain\ READ-ONLY\ in\ ~S.=
+
+#: defstruct.lisp:657
+!~S\ ~S\:\ The\ type\ ~S\ of\ slot\ ~S\ should\ be\ a\ subtype\ of\ the\ type\ defined\ for\ the\ included\ strucure\ ~S,\ namely\ ~S.=
+
+#: defstruct.lisp:663 defstruct.lisp:761
+!~S\ ~S\:\ ~S\ is\ not\ a\ slot\ option.=
+
+#: defstruct.lisp:695
+!~S\ ~S\:\ structure\ of\ type\ ~S\ can't\ hold\ the\ name.=
+
+#: defstruct.lisp:747
+!~S\ ~S\:\ There\ may\ be\ only\ one\ slot\ with\ the\ name\ ~S.=
+
+#: format.lisp:70
+!The\ control\ string\ terminates\ within\ a\ directive.=
+
+#: format.lisp:137
+!~A\ must\ introduce\ a\ number.=
+
+#: format.lisp:147
+!The\ control\ string\ terminates\ in\ the\ middle\ of\ a\ parameter.=
+
+#: format.lisp:227
+!Non-existent\ directive=
+
+#: format.lisp:235
+!Closing\ '/'\ is\ missing=
+
+#: format.lisp:248
+!There\ is\ no\ package\ with\ name\ ~S=
+
+#: format.lisp:263
+!The\ closing\ directive\ '~A'\ does\ not\ have\ a\ corresponding\ opening\ one.=
+
+#: format.lisp:268
+!The\ closing\ directive\ '~A'\ does\ not\ match\ the\ corresponding\ opening\ one.\ It\ should\ read\ '~A'.=
+
+#: format.lisp:277 format.lisp:1641 format.lisp:2445
+!The\ ~~;\ directive\ is\ not\ allowed\ at\ this\ point.=
+
+#: format.lisp:287
+!The\ ~~newline\ directive\ cannot\ take\ both\ modifiers.=
+
+#: format.lisp:308
+!An\ opening\ directive\ is\ never\ closed;\ expecting\ '~A'.=
+
+#: format.lisp:333
+!~%Current\ point\ in\ control\ string\:=
+
+#: format.lisp:383
+!The\ destination\ string\ ~S\ should\ have\ a\ fill\ pointer.=
+
+#: format.lisp:390
+!The\ destination\ argument\ ~S\ is\ invalid\ (not\ NIL\ or\ T\ or\ a\ stream\ or\ a\ string).=
+
+#: format.lisp:419
+!~S\:\ The\ control-string\ must\ be\ a\ string,\ not\ ~S=
+
+#: format.lisp:430
+!There\ are\ not\ enough\ arguments\ left\ for\ this\ directive.=
+
+#: format.lisp:528
+!The\ ~~\:@R\ directive\ requires\ an\ integer\ in\ the\ range\ 1\ -\ 4999,\ not\ ~S=
+
+#: format.lisp:547
+!The\ ~~@R\ directive\ requires\ an\ integer\ in\ the\ range\ 1\ -\ 3999,\ not\ ~S=
+
+#: format.lisp:611
+!The\ argument\ for\ the\ ~~R\ directive\ is\ too\ large.=
+
+#: format.lisp:1331
+!The\ ~~R\ and\ ~~\:R\ directives\ require\ an\ integer\ argument,\ not\ ~S=
+
+#: format.lisp:1353
+!The\ ~~C\ directive\ requires\ a\ character\ argument,\ not\ ~S=
+
+#: format.lisp:1579
+!The\ control\ string\ argument\ for\ the\ ~~?\ directive\ is\ invalid\:\ ~S=
+
+#: format.lisp:1584
+!The\ argument\ list\ argument\ for\ the\ ~~?\ directive\ is\ invalid\:\ ~S=
+
+#: format.lisp:1646
+!The\ ~~[\ parameter\ must\ be\ an\ integer,\ not\ ~S=
+
+#: format.lisp:1665
+!The\ ~~[\ directive\ cannot\ take\ both\ modifiers.=
+
+#: format.lisp:1691
+!The\ ~~{\ directive\ requires\ a\ list\ argument,\ not\ ~S=
+
+#: format.lisp:2179
+!Too\ many\ arguments\ for\ this\ directive=
+
+#: format.lisp:2718
+!The\ control-string\ must\ be\ a\ string,\ not\ ~S=
+
+#: trace.lisp:85 trace.lisp:253
+!~S\:\ function\ name\ should\ be\ a\ symbol,\ not\ ~S=
+
+#: trace.lisp:95
+!~S\:\ undefined\ function\ ~S=
+
+#: trace.lisp:101
+!~S\:\ cannot\ trace\ special\ operator\ ~S=
+
+#: trace.lisp:112
+!~&;;\ Tracing\ ~\:[function~;macro~]\ ~S.=
+
+#: trace.lisp:266
+!~S\:\ ~S\ was\ traced\ and\ has\ been\ redefined\!=
+
+#: compiler.lisp:226
+!~1{~5@*~D/~4@*~D/~3@*~D\ ~2@*~2,'0D.~1@*~2,'0D.~0@*~2,'0D~\:}=
+
+#: compiler.lisp:387
+!Bad\ length\ of\ closure\ vector\:\ ~S=
+
+#: compiler.lisp:1783
+!Compiler\ bug\!\!\ Occurred\ in\ ~A~@[\ at\ ~A~].=
+
+#: compiler.lisp:2488
+!Bad\ declaration\ syntax\:\ ~S~%Will\ be\ ignored.=
+
+#: compiler.lisp:2508
+!Non-symbol\ ~S\ may\ not\ be\ declared\ SPECIAL.=
+
+#: compiler.lisp:2515
+!Non-symbol\ ~S\ may\ not\ be\ declared\ IGNORE.=
+
+#: compiler.lisp:2522
+!Non-symbol\ ~S\ may\ not\ be\ declared\ IGNORABLE.=
+
+#: compiler.lisp:2529
+!Non-symbol\ ~S\ may\ not\ be\ declared\ READ-ONLY.=
+
+#: compiler.lisp:2534
+!Unknown\ declaration\ ~S.~%The\ whole\ declaration\ will\ be\ ignored.=
+
+#: compiler.lisp:2924
+!\ in\ line\ ~D=
+
+#: compiler.lisp:2925
+!\ in\ lines\ ~D..~D=
+
+#: compiler.lisp:2937
+!~%WARNING~@[\ in\ function\ ~S~]~A\ \:~%=
+
+#: compiler.lisp:2969
+!~%ERROR~@[\ in\ function\ ~S~]~A\ \:~%~?=
+
+#: compiler.lisp:3110
+!Code\ contains\ dotted\ list\ ~S=
+
+#: compiler.lisp:3114
+!Form\ too\ short,\ too\ few\ arguments\:\ ~S=
+
+#: compiler.lisp:3119
+!Form\ too\ long,\ too\ many\ arguments\:\ ~S=
+
+#: compiler.lisp:3301
+!Not\ the\ name\ of\ a\ function\:\ ~S=
+
+#: compiler.lisp:3382 compiler.lisp:3458
+!~S\ is\ neither\ declared\ nor\ bound,~@\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ it\ will\ be\ treated\ as\ if\ it\ were\ declared\ SPECIAL.=
+
+#: compiler.lisp:3475
+!The\ constant\ ~S\ may\ not\ be\ assigned\ to.~@\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ The\ assignment\ will\ be\ ignored.=
+
+#: compiler.lisp:3614
+!argument\ list\ to\ function\ ~S\ is\ dotted\:\ ~S=
+
+#: compiler.lisp:3620
+!~S\ called\ with\ ~S~\:[~;\ or\ more~]\ arguments,\ but\ it\ requires\ ~\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ~\:[~\:[from\ ~S\ to\ ~S~;~S~]~;at\ least\ ~*~S~]\ arguments.=
+
+#: compiler.lisp:3633
+!keyword\ arguments\ to\ function\ ~S\ should\ occur\ pairwise\:\ ~S=
+
+#: compiler.lisp:3644
+!keyword\ ~S\ is\ not\ allowed\ for\ function\ ~S.~\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ~%The\ only\ allowed\ keyword~\:[s\ are\ ~{~S~\#[~;\ and\ ~S~\:;,\ ~]~}~;\ is\ ~{~S~}~].=
+
+#: compiler.lisp:3656
+!argument\ ~S\ to\ function\ ~S\ is\ not\ a\ symbol=
+
+#: compiler.lisp:4325
+!~S\ called\ with\ ~S\ arguments,\ but\ it\ requires\ ~\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ~\:[~\:[from\ ~S\ to\ ~S~;~S~]~;at\ least\ ~*~S~]\ arguments.=
+
+#: compiler.lisp:4505
+!Illegal\ syntax\ in\ LET/LET*\:\ ~S=
+
+#: compiler.lisp:4542
+!Lambda\ list\ marker\ ~S\ not\ allowed\ here.=
+
+#: compiler.lisp:4548
+!Missing\ &REST\ parameter\ in\ lambda\ list\ ~S=
+
+#: compiler.lisp:4554
+!Lambda\ list\ element\ ~S\ is\ superfluous.=
+
+#: compiler.lisp:4729
+!Lambda\ lists\ with\ dots\ are\ only\ allowed\ in\ macros,\ not\ here\:\ ~S=
+
+#: compiler.lisp:4745
+!Illegal\ lambda\ list\ element\ ~S=
+
+#: compiler.lisp:4841
+!Binding\ variable\ ~S\ can\ cause\ side\ effects\ despite\ of\ IGNORE\ declaration~%since\ it\ is\ declared\ SPECIAL.=
+
+#: compiler.lisp:4845
+!variable\ ~S\ is\ used\ despite\ of\ IGNORE\ declaration.=
+
+#: compiler.lisp:4856
+!variable\ ~S\ is\ not\ used.~%Misspelled\ or\ missing\ IGNORE\ declaration?=
+
+#: compiler.lisp:4862
+!The\ variable\ ~S\ is\ assigned\ to,\ despite\ of\ READ-ONLY\ declaration.=
+
+#: compiler.lisp:4908 compiler.lisp:5044
+!Constant\ ~S\ cannot\ be\ bound.=
+
+#: compiler.lisp:5806
+!Misplaced\ declaration\:\ ~S=
+
+#: compiler.lisp:6018
+!Odd\ number\ of\ arguments\ to\ SETQ\:\ ~S=
+
+#: compiler.lisp:6055 compiler.lisp:6092 compiler.lisp:6190
+!Cannot\ assign\ to\ non-symbol\ ~S.=
+
+#: compiler.lisp:6067
+!Odd\ number\ of\ arguments\ to\ PSETQ\:\ ~S=
+
+#: compiler.lisp:6328
+!Only\ symbols\ may\ be\ used\ as\ variables,\ not\ ~S=
+
+#: compiler.lisp:6433
+!Illegal\ syntax\ in\ COMPILER-LET\:\ ~S=
+
+#: compiler.lisp:6441
+!Block\ name\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: compiler.lisp:6490
+!RETURN-FROM\ block\ ~S\ is\ impossible\ from\ here.=
+
+#: compiler.lisp:6556
+!Only\ numbers\ and\ symbols\ are\ valid\ tags,\ not\ ~S=
+
+#: compiler.lisp:6634
+!Tag\ must\ be\ a\ symbol\ or\ a\ number,\ not\ ~S=
+
+#: compiler.lisp:6639
+!GO\ to\ tag\ ~S\ is\ impossible\ from\ here.=
+
+#: compiler.lisp:6730
+!~S\ is\ not\ a\ function.\ It\ is\ a\ locally\ defined\ macro.=
+
+#: compiler.lisp:6749
+!Only\ symbols\ and\ lambda\ expressions\ are\ function\ names,\ not\ ~S=
+
+#: compiler.lisp:6804
+!Illegal\ function\ definition\ syntax\ in\ ~S\:\ ~S=
+
+#: compiler.lisp:7377
+!Illegal\ syntax\ in\ SYMBOL-MACROLET\:\ ~S=
+
+#: compiler.lisp:7418
+!EVAL-WHEN\ situation\ must\ be\ EVAL\ or\ LOAD\ or\ COMPILE,\ but\ not\ ~S=
+
+#: compiler.lisp:7461
+!CASE\ clause\ without\ objects\:\ ~S=
+
+#: compiler.lisp:7471
+!~S\:\ the\ ~S\ clause\ must\ be\ the\ last\ one\:\ ~S=
+
+#: compiler.lisp:7481
+!Duplicate\ ~S\ label\ ~S\ \:\ ~S=
+
+#: compiler.lisp:7743
+!Too\ many\ arguments\ to\ ~S=
+
+#: compiler.lisp:7758
+!Too\ few\ arguments\ to\ ~S=
+
+#: compiler.lisp:8649
+!The\ ~S\ destination\ is\ invalid\ (not\ NIL\ or\ T\ or\ a\ stream\ or\ a\ string\ with\ fill-pointer)\:\ ~S=
+
+#: compiler.lisp:12137
+!Name\ of\ function\ to\ be\ compiled\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: compiler.lisp:12148
+!~S\:\ redefining\ ~S;\ it\ was\ traced\!=
+
+#: compiler.lisp:12156 compiler.lisp:12189
+!~S\ is\ already\ compiled.=
+
+#: compiler.lisp:12177 compiler.lisp:12819
+!Undefined\ function\ ~S=
+
+#: compiler.lisp:12198
+!Not\ a\ lambda\ expression\ nor\ a\ function\:\ ~S=
+
+#: compiler.lisp:12384
+!~%There\ were\ errors\ in\ the\ following\ functions\:~%~{~<~%~\:;\ ~S~>~^~}=
+
+#: compiler.lisp:12389
+!~%The\ following\ functions\ were\ used\ but\ not\ defined\:~%~{~<~%~\:;\ ~S~>~^~}=
+
+#: compiler.lisp:12396
+!~%The\ following\ special\ variables\ were\ not\ defined\:~%~{~<~%~\:;\ ~S~>~^~}=
+
+#: compiler.lisp:12399
+!~%The\ following\ special\ variables\ were\ defined\ too\ late\:~%~{~<~%~\:;\ ~S~>~^~}=
+
+#: compiler.lisp:12402
+!~%The\ following\ functions\ were\ used\ but\ are\ deprecated\:~%~{~<~%~\:;\ ~S~>~^~}=
+
+#: compiler.lisp:12529
+!~&Listing\ of\ compilation\ of\ file\ ~A~%on\ ~@?\ by\ ~A,\ version\ ~A=
+
+#: compiler.lisp:12561
+!~%Compiling\ file\ ~A\ ...=
+
+#: compiler.lisp:12611
+!~&~%Compilation\ of\ file\ ~A\ is\ finished.=
+
+#: compiler.lisp:12613
+!~%~D\ error~\:P,\ ~D\ warning~\:P=
+
+#: compiler.lisp:12663
+!~%~%Disassembly\ of\ function\ ~S=
+
+#: compiler.lisp:12674
+!~%~S\ required\ arguments=
+
+#: compiler.lisp:12677
+!~%~S\ optional\ arguments=
+
+#: compiler.lisp:12680
+!~%~\:[No\ rest\ parameter~;Rest\ parameter~]=
+
+#: compiler.lisp:12685
+!~%~S\ keyword\ parameter~\:P\:\ ~{~S~^,\ ~}.=
+
+#: compiler.lisp:12689
+!~%Other\ keywords\ are\ allowed.=
+
+#: compiler.lisp:12691
+!~%No\ keyword\ parameters=
+
+#: compiler.lisp:12708
+!Disassembly\ of\ function\ =
+
+#: compiler.lisp:12726
+!\ required\ arguments=
+
+#: compiler.lisp:12731
+!\ optional\ arguments=
+
+#: compiler.lisp:12736
+!Rest\ parameter=
+
+#: compiler.lisp:12739
+!No\ rest\ parameter=
+
+#: compiler.lisp:12746
+!\ keyword\ parameter~P\:\ =
+
+#: compiler.lisp:12756
+!Other\ keywords\ are\ allowed.=
+
+#: compiler.lisp:12761
+!No\ keyword\ parameters=
+
+#: compiler.lisp:12842
+!Cannot\ disassemble\ ~S=
+
+#: defs2.lisp:63
+!~S\:\ ~S\ is\ not\ a\ function=
+
+#: defs2.lisp:77
+!~S\:\ package\ name\ ~S\ should\ be\ a\ string\ or\ a\ symbol=
+
+#: defs2.lisp:84
+!~S\ ~A\:\ symbol\ name\ ~S\ should\ be\ a\ string\ or\ a\ symbol=
+
+#: defs2.lisp:104
+!~S\ ~A\:\ the\ symbol\ ~A\ must\ not\ be\ specified\ more\ than\ once=
+
+#: defs2.lisp:116 defs2.lisp:124
+!~S\ ~A\:\ the\ ~S\ option\ must\ not\ be\ given\ more\ than\ once=
+
+#: defs2.lisp:182
+!~S\ ~A\:\ unknown\ option\ ~S=
+
+#: defs2.lisp:186
+!~S\ ~A\:\ invalid\ syntax\ in\ ~S\ option\:\ ~S=
+
+#: defs2.lisp:190
+!~S\ ~A\:\ not\ a\ ~S\ option\:\ ~S=
+
+#: defs2.lisp:246
+!This\ symbol\ will\ be\ created.=
+
+#: defs2.lisp:247
+!~S\ ~A\:\ There\ is\ no\ symbol\ ~A\:\:~A\ .=
+
+#: defs2.lisp:321
+!The\ object\ to\ be\ destructured\ should\ be\ a\ list\ with\ ~\:[at\ least\ ~*~S~;~\:[from\ ~S\ to\ ~S~;~S~]~]\ elements,\ not\ ~4@*~S.=
+
+#: defs2.lisp:390
+!~S\:\ macro\ name\ should\ be\ a\ symbol,\ not\ ~S=
+
+#: defs2.lisp:425
+!~S\:\ input\ stream\ ~S\ ends\ within\ read\ macro\ beginning\ to\ ~S=
+
+#: defs2.lisp:431
+!~S\ from\ ~S\:\ character\ read\ should\ be\ a\ character\:\ ~S=
+
+#: defs2.lisp:452
+!~S\ from\ ~S\:\ After\ ~S\ is\ ~S\ an\ undefined\ dispatch\ macro\ character=
+
+#: defs2.lisp:518 defs2.lisp:533
+!~S\:\ ~S\ of\ ~S\ is\ ambiguous.\ Please\ use\ ~S\ or\ ~S.=
+
+#: loop.lisp:47
+!~S\:\ syntax\ error\ after\ ~A\ in\ ~S=
+
+#: loop.lisp:254
+!~S\:\ missing\ variable.=
+
+#: loop.lisp:264
+!~S\:\ After\ ~S,\ ~S\ is\ interpreted\ as\ a\ type\ specification=
+
+#: loop.lisp:520
+!~S\:\ ~A\ clauses\ should\ occur\ before\ the\ loop's\ main\ body=
+
+#: loop.lisp:660
+!~S\:\ After\ ~S\ a\ plural\ loop\ keyword\ is\ required,\ not\ ~A=
+
+#: loop.lisp:665
+!~S\:\ After\ ~S\ a\ singular\ loop\ keyword\ is\ required,\ not\ ~A=
+
+#: loop.lisp:807
+!~S\:\ questionable\ iteration\ direction\ after\ ~A=
+
+#: loop.lisp:816
+!~S\:\ specifying\ ~A\ requires\ FROM\ or\ DOWNFROM=
+
+#: loop.lisp:874
+!~S\:\ illegal\ syntax\ near\ ~S\ in\ ~S=
+
+#: loop.lisp:879
+!~S\:\ ambiguous\ result\ of\ loop\ ~S=
+
+#: loop.lisp:1012
+!~S\ is\ possible\ only\ from\ within\ ~S=
+
+#: loop.lisp:1015
+!Use\ of\ ~S\ in\ FINALLY\ clauses\ is\ deprecated\ because\ it\ can\ lead\ to\ infinite\ loops.=
+
+#: loop.lisp:1018
+!~S\ is\ not\ possible\ here=
+
+#: clos.lisp:167 clos.lisp:188
+!~S\:\ argument\ ~S\ is\ not\ a\ symbol=
+
+#: clos.lisp:174
+!~S\:\ ~S\ does\ not\ name\ a\ class=
+
+#: clos.lisp:194
+!~S\:\ ~S\ is\ not\ a\ class=
+
+#: clos.lisp:201
+!~S\:\ cannot\ redefine\ built-in\ class\ ~S=
+
+#: clos.lisp:206
+!~S\:\ Redefining\ the\ COMMON\ LISP\ class\ ~S=
+
+#: clos.lisp:361
+!instance\ ~S\ of\ class\ ~S\ has\ no\ slots\ (wrong\ metaclass)=
+
+#: clos.lisp:382 clos.lisp:427
+!~S\:\ not\ a\ list\ of\ slots\:\ ~S=
+
+#: clos.lisp:390
+!~S\:\ invalid\ slot\ and\ variable\ specification\ ~S=
+
+#: clos.lisp:396 clos.lisp:438
+!~S\:\ variable\ ~S\ should\ be\ a\ symbol=
+
+#: clos.lisp:402
+!~S\:\ slot\ name\ ~S\ should\ be\ a\ symbol=
+
+#: clos.lisp:433
+!~S\:\ invalid\ slot\ and\ accessor\ specification\ ~S=
+
+#: clos.lisp:443
+!~S\:\ accessor\ name\ ~S\ should\ be\ a\ symbol=
+
+#: clos.lisp:534
+!~S\:\ class\ name\ ~S\ should\ be\ a\ symbol=
+
+#: clos.lisp:541
+!~S\ ~S\:\ expecting\ list\ of\ superclasses\ instead\ of\ ~S=
+
+#: clos.lisp:547
+!~S\ ~S\:\ superclass\ name\ ~S\ should\ be\ a\ symbol=
+
+#: clos.lisp:559
+!~S\ ~S\:\ expecting\ list\ of\ slot\ specifications\ instead\ of\ ~S=
+
+#: clos.lisp:569
+!~S\ ~S\:\ slot\ name\ ~S\ should\ be\ a\ symbol=
+
+#: clos.lisp:574
+!~S\ ~S\:\ There\ may\ be\ only\ one\ direct\ slot\ with\ the\ name\ ~S.=
+
+#: clos.lisp:589
+!~S\ ~S\:\ slot\ options\ for\ slot\ ~S\ don't\ come\ in\ pairs=
+
+#: clos.lisp:600
+!~S\ ~S,\ slot\ option\ for\ slot\ ~S\:\ ~S\ is\ not\ a\ function\ name=
+
+#: clos.lisp:610 clos.lisp:632
+!~S\ ~S,\ slot\ option\ for\ slot\ ~S\:\ ~S\ is\ not\ a\ symbol=
+
+#: clos.lisp:620 clos.lisp:640 clos.lisp:649 clos.lisp:657
+!~S\ ~S,\ slot\ option\ ~S\ for\ slot\ ~S\ may\ only\ be\ given\ once=
+
+#: clos.lisp:626
+!~S\ ~S,\ slot\ option\ for\ slot\ ~S\ must\ have\ the\ value\ ~S\ or\ ~S,\ not\ ~S=
+
+#: clos.lisp:662
+!~S\ ~S,\ slot\ option\ for\ slot\ ~S\:\ ~S\ is\ not\ a\ string=
+
+#: clos.lisp:669
+!~S\ ~S,\ slot\ option\ for\ slot\ ~S\:\ ~S\ is\ not\ a\ valid\ slot\ option=
+
+#: clos.lisp:720
+!~S\ ~S,\ option\ ~S\ may\ only\ be\ given\ once=
+
+#: clos.lisp:729 clos.lisp:756
+!~S\ ~S,\ option\ ~S\:\ ~S\ is\ not\ a\ symbol=
+
+#: clos.lisp:740
+!~S\ ~S\:\ option\ ~S\ should\ be\ written\ ~S=
+
+#: clos.lisp:745
+!~S\ ~S,\ option\ ~S\:\ arguments\ don't\ come\ in\ pairs=
+
+#: clos.lisp:761
+!~S\ ~S,\ option\ ~S\:\ ~S\ may\ only\ be\ given\ once=
+
+#: clos.lisp:781
+!~S\ ~S,\ option\ ~S\:\ ~S\ is\ not\ a\ string=
+
+#: clos.lisp:790
+!~S\ ~S\:\ invalid\ option\ ~S=
+
+#: clos.lisp:897
+!~S\:\ Class\ ~S\ is\ being\ redefined,\ instances\ are\ obsolete=
+
+#: clos.lisp:984
+!~S\ ~S\:\ superclass\ ~S\ should\ belong\ to\ class\ STANDARD-CLASS=
+
+#: clos.lisp:1154
+!~S\ ~S\:\ inconsistent\ precedence\ graph,\ cycle\ ~S=
+
+#: clos.lisp:1193
+!(class-precedence-list\ ~S)\ and\ (class-precedence-list\ ~S)\ are\ inconsistent=
+
+#: clos.lisp:1350
+!~S\:\ superclass\ ~S\ should\ belong\ to\ class\ BUILT-IN-CLASS=
+
+#: clos.lisp:1392
+!~S\:\ metaclass\ STRUCTURE-CLASS\ forbids\ more\ than\ one\ direct\ superclass=
+
+#: clos.lisp:1398
+!~S\:\ superclass\ ~S\ should\ belong\ to\ class\ STRUCTURE-CLASS=
+
+#: clos.lisp:1438
+!~S\:\ metaclass\ STRUCTURE-CLASS\ does\ not\ support\ shared\ slots=
+
+#: clos.lisp:1711
+!~S\ ~S\:\ missing\ lambda\ list=
+
+#: clos.lisp:1723
+!STANDARD\ method\ combination\ doesn't\ allow\ the\ method\ qualifiers\ to\ be\ ~S=
+
+#: clos.lisp:1906 clos.lisp:1912
+!~S\ ~S\:\ ~S\ is\ invalid\ within\ ~S\ methods=
+
+#: clos.lisp:2168
+!Too\ few\ arguments\ to\ ~S\:\ ~S=
+
+#: clos.lisp:2297
+!The\ generic\ function\ ~S\ is\ being\ modified,\ but\ has\ already\ been\ called.=
+
+#: clos.lisp:2856
+!~S\ in\ ~S\:\ the\ new\ arguments\ ~S\ have\ a\ different\ effective\ method\ than\ the\ old\ arguments\ ~S=
+
+#: clos.lisp:2881
+!~S\ has\ ~S,\ but\ ~S\ has\ ~S\ required\ parameters=
+
+#: clos.lisp:2886
+!~S\ has\ ~S,\ but\ ~S\ has\ ~S\ optional\ parameters=
+
+#: clos.lisp:2891 clos.lisp:2896
+!~S\ has\ &REST\ or\ &KEY,\ but\ ~S\ hasn't.=
+
+#: clos.lisp:2908
+!~S\ doesn't\ accept\ the\ keywords\ ~S\ of\ ~S=
+
+#: clos.lisp:2938
+!Replacing\ method\ ~S\ in\ ~S=
+
+#: clos.lisp:2956
+!Removing\ method\ ~S\ in\ ~S=
+
+#: clos.lisp:2984
+!~S\ has\ no\ method\ with\ qualifiers\ ~\:S\ and\ specializers\ ~S=
+
+#: clos.lisp:3013 clos.lisp:3320
+!~S\ doesn't\ name\ a\ generic\ function=
+
+#: clos.lisp:3075
+!~S\ ~S\:\ Only\ ~S\ declarations\ are\ permitted\:\ ~S=
+
+#: clos.lisp:3084
+!~S\ ~S\:\ ~S\ may\ only\ be\ specified\ once.=
+
+#: clos.lisp:3092
+!~S\ ~S\:\ A\ string\ must\ be\ specified\ after\ ~S\ \:\ ~S=
+
+#: clos.lisp:3097
+!~S\ ~S\:\ Only\ one\ ~S\ string\ is\ allowed=
+
+#: clos.lisp:3105
+!~S\ ~S\:\ The\ only\ valid\ method\ combination\ is\ ~S\ \:\ ~S=
+
+#: clos.lisp:3113
+!~S\ ~S\:\ The\ only\ valid\ generic\ function\ class\ name\ is\ ~S\ \:\ ~S=
+
+#: clos.lisp:3121
+!~S\ ~S\:\ The\ only\ valid\ method\ class\ name\ is\ ~S\ \:\ ~S=
+
+#: clos.lisp:3140
+!~S\ ~S\:\ ~S\ is\ not\ one\ of\ the\ required\ parameters\:\ ~S=
+
+#: clos.lisp:3152
+!~S\ ~S\:\ some\ variable\ occurs\ twice\ in\ ~S=
+
+#: clos.lisp:3157
+!~S\ ~S\:\ ~S\ is\ missing\ some\ required\ parameter=
+
+#: clos.lisp:3186
+!~S\ ~S\:\ No\ initializations\ are\ allowed\ in\ a\ generic\ function\ lambda-list\:\ ~S=
+
+#: clos.lisp:3192
+!~S\ ~S\:\ variable\ name\ ~S\ should\ be\ a\ symbol=
+
+#: clos.lisp:3197
+!~S\ ~S\:\ duplicate\ variable\ name\ ~S=
+
+#: clos.lisp:3248
+!~S\ ~S\:\ invalid\ lambda\ list\ portion\:\ ~S=
+
+#: clos.lisp:3301
+!Removing\ all\ methods\ of\ ~S=
+
+#: clos.lisp:3309
+!Modifying\ the\ parameter\ profile\ of\ ~S=
+
+#: clos.lisp:3365
+!~S\:\ ~S\ is\ not\ a\ generic\ function\ specification=
+
+#: clos.lisp:3428
+!~S\:\ The\ name\ of\ a\ class\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: clos.lisp:3433
+!~S\:\ The\ name\ of\ the\ built-in\ class\ ~S\ cannot\ be\ modified=
+
+#: clos.lisp:3476 clos.lisp:3480
+!~S\:\ When\ calling\ ~S\ with\ arguments\ ~S,\ no\ method\ is\ applicable.=
+
+#: clos.lisp:3498 clos.lisp:3502
+!~S\:\ When\ calling\ ~S\ with\ arguments\ ~S,\ no\ primary\ method\ is\ applicable.=
+
+#: clos.lisp:3512
+!~S\:\ When\ calling\ ~S\ with\ arguments\ ~S,\ there\ is\ no\ next\ method\ after\ ~S,\ and\ ~S\ was\ called.=
+
+#: clos.lisp:3563
+!~S\:\ The\ class\ ~S\ has\ no\ slot\ named\ ~S=
+
+#: clos.lisp:3573
+!~S\:\ The\ slot\ ~S\ of\ ~S\ has\ no\ value=
+
+#: clos.lisp:4082
+!~S\ method\ for\ ~S\ returned\ ~S=
+
+#: condition.lisp:80
+!~S\:\ the\ name\ of\ a\ condition\ must\ be\ a\ symbol,\ not\ ~S=
+
+#: condition.lisp:85
+!~S\:\ the\ parent-type\ list\ must\ be\ a\ list\ of\ symbols,\ not\ ~S=
+
+#: condition.lisp:90
+!~S\:\ the\ slot\ description\ list\ must\ be\ a\ list,\ not\ ~S=
+
+#: condition.lisp:145
+!~S\:\ type\ ~S\ is\ not\ a\ subtype\ of\ ~S=
+
+#: condition.lisp:161
+!~S\ ~S\:\ superfluous\ arguments\ ~S=
+
+#: condition.lisp:178
+!~S\:\ the\ condition\ argument\ must\ be\ a\ string,\ a\ symbol\ or\ a\ condition,\ not\ ~S=
+
+#: condition.lisp:579
+!~S\:\ illegal\ syntax\ of\ clause\ ~S=
+
+#: condition.lisp:586
+!~S\:\ only\ one\ ~S\ clause\ is\ allowed\:\ ~S=
+
+#: condition.lisp:594
+!~S\:\ too\ many\ variables\ ~S\ in\ clause\ ~S=
+
+#: condition.lisp:807
+!~S\:\ ~S\ is\ not\ a\ valid\ restart\ name\ here.\ Use\ ~S\ instead.=
+
+#: condition.lisp:828
+!~S\:\ invalid\ restart\ name\ ~S=
+
+#: condition.lisp:835
+!~S\:\ No\ restart\ named\ ~S\ is\ visible.=
+
+#: condition.lisp:893 condition.lisp:952
+!~S\:\ not\ a\ list\:\ ~S=
+
+#: condition.lisp:902 condition.lisp:961
+!~S\:\ invalid\ restart\ specification\ ~S=
+
+#: condition.lisp:913 condition.lisp:999
+!~S\:\ unnamed\ restarts\ require\ ~S\ to\ be\ specified\:\ ~S=
+
+#: condition.lisp:984
+!~S\:\ missing\ lambda\ list\ in\ restart\ specification\ ~S=
+
+#: condition.lisp:1007
+!~S\:\ restart\ cannot\ be\ invoked\ interactively\ because\ it\ is\ missing\ a\ ~S\ option\:\ ~S=
+
+#: condition.lisp:1206
+!~%New\ ~S\ [value\ ~D\ of\ ~D]\:\ =
+
+#: condition.lisp:1425 condition.lisp:1541
+!Return\ from\ ~S\ loop=
+
+#: condition.lisp:1509 condition.lisp:1532
+!WARNING\:=
+
+#: condition.lisp:1521
+!~S\:\ This\ is\ more\ serious\ than\ a\ warning\:\ ~A=
+
+#: xcharin.lisp:36
+!~\:\ argument\ ~S\ is\ not\ a\ character=
+
+#: xcharin.lisp:57
+!~S\:\ the\ font\ argument\ should\ be\ an\ integer,\ not\ ~S=
+
+#: xcharin.lisp:66
+!~S\:\ the\ bits\ argument\ should\ be\ an\ integer,\ not\ ~S=
+
+#: xcharin.lisp:88
+!~S\:\ the\ only\ bit\ names\ are\ ~S,\ ~S,\ ~S,\ ~S,\ not\ ~S=
+
+#: screen.lisp:227
+!Got\ bad\ response\ from\ ~S\:\ ~S=
+
+#: amigasock.lisp:30
+!~S\:\ ~S\ is\ not\ a\ SOCKET-SERVER=
+
+#: beossock.lisp:77 beossock.lisp:87
+!service\ does\ not\ exist\:\ ~A/~A=
+
+#: runprog.lisp:162
+!~S\:\ File\ ~S\ already\ exists=
+
+#: query.lisp:12
+!\ (y/n)\ =
+
+#: query.lisp:23
+!Please\ answer\ with\ y\ or\ n\ \:\ =
+
+#: query.lisp:33
+!\ (yes/no)\ =
+
+#: query.lisp:43
+!Please\ answer\ with\ yes\ or\ no\ \:\ =
+
+#: reploop.lisp:60
+![*package*\ invalid]=
+
+#: reploop.lisp:193
+!Values\:\ =
+
+#: reploop.lisp:210
+!\nHelp\ (abbreviated\ \:h)\ \=\ this\ list\nUse\ the\ usual\ editing\ capabilities.\n(quit)\ or\ (exit)\ leaves\ CLISP.=
+
+#: reploop.lisp:220
+!\nCommands\ may\ be\ abbreviated\ as\ shown\ in\ the\ second\ column.\nCOMMAND\ \ \ \ \ \ \ \ ABBR\ \ \ \ \ \ \ \ \ \ \ \ \ DESCRIPTION\nHelp\ \ \ \ \ \ \ \ \ \ \ \:h\ (or\ ?)\ \ \ \ \ \ \ \ this\ command\ list\nError\ \ \ \ \ \ \ \ \ \ \:e\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Print\ the\ recent\ Error\ Message\nAbort\ \ \ \ \ \ \ \ \ \ \:a\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ abort\ to\ the\ next\ recent\ input\ loop\nUnwind\ \ \ \ \ \ \ \ \ \:uw\ \ \ \ \ \ \ \ \ \ \ \ \ \ abort\ to\ the\ next\ recent\ input\ loop\nMode-1\ \ \ \ \ \ \ \ \ \:m1\ \ \ \ \ \ \ \ \ \ \ \ \ \ inspect\ all\ the\ stack\ elements\nMode-2\ \ \ \ \ \ \ \ \ \:m2\ \ \ \ \ \ \ \ \ \ \ \ \ \ inspect\ all\ the\ frames\nMode-3\ \ \ \ \ \ \ \ \ \:m3\ \ \ \ \ \ \ \ \ \ \ \ \ \ inspect\ only\ lexical\ frames\nMode-4\ \ \ \ \ \ \ \ \ \:m4\ \ \ \ \ \ \ \ \ \ \ \ \ \ inspect\ only\ EVAL\ and\ APPLY\ frames\ (default)\nMode-5\ \ \ \ \ \ \ \ \ \:m5\ \ \ \ \ \ \ \ \ \ \ \ \ \ inspect\ only\ APPLY\ frames\nWhere\ \ \ \ \ \ \ \ \ \ \:w\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ inspect\ this\ frame\nUp\ \ \ \ \ \ \ \ \ \ \ \ \ \:u\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ go\ up\ one\ frame,\ inspect\ it\nTop\ \ \ \ \ \ \ \ \ \ \ \ \:t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ go\ to\ top\ frame,\ inspect\ it\nDown\ \ \ \ \ \ \ \ \ \ \ \:d\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ go\ down\ one\ frame,\ inspect\ it\nBottom\ \ \ \ \ \ \ \ \ \:b\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ go\ to\ bottom\ (most\ recent)\ frame,\ inspect\ it\nBacktrace-1\ \ \ \ \:bt1\ \ \ \ \ \ \ \ \ \ \ \ \ list\ all\ stack\ elements\nBacktrace-2\ \ \ \ \:bt2\ \ \ \ \ \ \ \ \ \ \ \ \ list\ all\ frames\nBacktrace-3\ \ \ \ \:bt3\ \ \ \ \ \ \ \ \ \ \ \ \ list\ all\ lexical\ frames\nBacktrace-4\ \ \ \ \:bt4\ \ \ \ \ \ \ \ \ \ \ \ \ list\ all\ EVAL\ and\ APPLY\ frames\nBacktrace-5\ \ \ \ \:bt5\ \ \ \ \ \ \ \ \ \ \ \ \ list\ all\ APPLY\ frames\nBacktrace\ \ \ \ \ \ \:bt\ \ \ \ \ \ \ \ \ \ \ \ \ \ list\ stack\ in\ current\ mode\nBacktrace-l\ \ \ \ \:bl\ \ \ \ \ \ \ \ \ \ \ \ \ \ list\ stack\ in\ current\ mode.\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Limit\ of\ frames\ to\ print\ will\ be\ prompted\ for.\nFrame-limit\ \ \ \ \:fl\ \ \ \ \ \ \ \ \ \ \ \ \ \ set\ the\ frame-limit.\ This\ many\ frames\ will\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ be\ printed\ in\ a\ backtrace\ at\ most.\nBreak+\ \ \ \ \ \ \ \ \ \:br+\ \ \ \ \ \ \ \ \ \ \ \ \ set\ breakpoint\ in\ EVAL\ frame\nBreak-\ \ \ \ \ \ \ \ \ \:br-\ \ \ \ \ \ \ \ \ \ \ \ \ disable\ breakpoint\ in\ EVAL\ frame\nRedo\ \ \ \ \ \ \ \ \ \ \ \:rd\ \ \ \ \ \ \ \ \ \ \ \ \ \ re-evaluate\ form\ in\ EVAL\ frame\nReturn\ \ \ \ \ \ \ \ \ \:rt\ \ \ \ \ \ \ \ \ \ \ \ \ \ leave\ EVAL\ frame,\ prescribing\ the\ return\ values=
+
+#: reploop.lisp:310
+!\nContinue\ \ \ \ \ \ \ \:c\ \ \ \ \ \ \ continue\ evaluation=
+
+#: reploop.lisp:317
+!\nContinue\ \ \ \ \ \ \ \:c\ \ \ \ \ \ \ continue\ evaluation\nStep\ \ \ \ \ \ \ \ \ \ \ \:s\ \ \ \ \ \ \ step\ into\ form\:\ evaluate\ this\ form\ in\ single\ step\ mode\nNext\ \ \ \ \ \ \ \ \ \ \ \:n\ \ \ \ \ \ \ step\ over\ form\:\ evaluate\ this\ form\ at\ once\nOver\ \ \ \ \ \ \ \ \ \ \ \:o\ \ \ \ \ \ \ step\ over\ this\ level\:\ evaluate\ at\ once\ up\ to\ the\ next\ return\nContinue\ \ \ \ \ \ \ \:c\ \ \ \ \ \ switch\ off\ single\ step\ mode,\ continue\ evaluation\n--\ Step-until\ \:su,\ Next-until\ \:nu,\ Over-until\ \:ou,\ Continue-until\ \:cu\ --\n\ \ \ \ \ \ \ \ \ \ \ same\ as\ above,\ specify\ a\ condition\ when\ to\ stop=
+
+#: reploop.lisp:398
+!Unprintable\ error\ message.=
+
+#: reploop.lisp:409
+!You\ can\ continue\ (by\ typing\ 'continue').=
+
+#: reploop.lisp:425
+!The\ following\ restarts\ are\ available,\ too\:=
+
+#: reploop.lisp:426
+!The\ following\ restarts\ are\ available\:=
+
+#: reploop.lisp:523 reploop.lisp:562
+!step\ =
+
+#: reploop.lisp:527
+!no\ values=
+
+#: reploop.lisp:528
+!value\:\ =
+
+#: reploop.lisp:531
+!\ values\:\ =
+
+#: reploop.lisp:597
+!condition\ when\ to\ stop\:\ =
+
+#: dribble.lisp:19
+!Already\ dribbling\ to\ ~S=
+
+#: dribble.lisp:105
+!Currently\ not\ dribbling.=
+
+#: describe.lisp:44
+!constant=
+
+#: describe.lisp:46
+!symbol-macro=
+
+#: describe.lisp:47
+!variable=
+
+#: describe.lisp:54
+!type=
+
+#: describe.lisp:60
+!class=
+
+#: describe.lisp:146
+!~%Slots\:=
+
+#: describe.lisp:153
+!unbound=
+
+#: describe.lisp:156
+!~%No\ slots.=
+
+#: describe.lisp:163
+!a\ foreign\ pointer=
+
+#: describe.lisp:166
+!a\ foreign\ address=
+
+#: describe.lisp:169
+!a\ foreign\ variable\ of\ foreign\ type\ ~S.=
+
+#: describe.lisp:173
+!a\ foreign\ function\ taking\ foreign\ types\ ~\:S\ and\ returning\ foreign\ type\ ~S.=
+
+#: describe.lisp:177
+!a\ byte\ specifier,\ denoting\ the\ ~S\ bits\ starting\ at\ bit\ position\ ~S\ of\ an\ integer.=
+
+#: describe.lisp:180
+!a\ special\ form\ handler.=
+
+#: describe.lisp:182
+!a\ load-time\ evaluation\ promise.=
+
+#: describe.lisp:184
+!a\ symbol\ macro\ handler.=
+
+#: describe.lisp:186
+!a\ macro\ expander.=
+
+#: describe.lisp:188
+!a\ function\ with\ alternative\ macro\ expander.=
+
+#: describe.lisp:190
+!an\ encoding.=
+
+#: describe.lisp:195
+!a\ GC-invisible\ pointer\ to\ ~S.=
+
+#: describe.lisp:198
+!a\ GC-invisible\ pointer\ to\ a\ now\ defunct\ object.=
+
+#: describe.lisp:200
+!a\ label\ used\ for\ resolving\ \#~D\#\ references\ during\ READ.=
+
+#: describe.lisp:204
+!a\ pointer\ into\ the\ stack.\ It\ points\ to\:=
+
+#: describe.lisp:207
+!a\ special-purpose\ object.=
+
+#: describe.lisp:209
+!a\ machine\ address.=
+
+#: describe.lisp:211
+!an\ instance\ of\ the\ CLOS\ class\ ~S.=
+
+#: describe.lisp:215
+!a\ structure\ of\ type\ ~S.=
+
+#: describe.lisp:219
+!~%As\ such,\ it\ is\ also\ a\ structure\ of\ type\ ~{~S~^,\ ~}.=
+
+#: describe.lisp:227
+!a\ dotted\ list\ of\ length\ ~S.=
+
+#: describe.lisp:229
+!a\ cons.=
+
+#: describe.lisp:232
+!a\ list\ of\ length\ ~S.=
+
+#: describe.lisp:234
+!a\ cyclic\ list.=
+
+#: describe.lisp:236
+!the\ empty\ list,\ =
+
+#: describe.lisp:239
+!the\ symbol\ ~S,\ =
+
+#: describe.lisp:243
+!lies\ in\ ~S=
+
+#: describe.lisp:246
+!is\ uninterned=
+
+#: describe.lisp:260
+!,\ is\ accessible\ in\ the\ package~\:[~;s~]\ ~{~A~^,\ ~}=
+
+#: describe.lisp:265
+!,\ is\ a\ keyword=
+
+#: describe.lisp:268
+!,\ a\ constant=
+
+#: describe.lisp:270
+!,\ a\ variable\ declared\ SPECIAL=
+
+#: describe.lisp:271
+!,\ a\ variable=
+
+#: describe.lisp:273
+!\ (macro\:\ ~s)=
+
+#: describe.lisp:276
+!,\ value\:\ ~s=
+
+#: describe.lisp:279
+!,\ names\ =
+
+#: describe.lisp:281
+!a\ special\ operator=
+
+#: describe.lisp:283
+!\ with\ macro\ definition=
+
+#: describe.lisp:285
+!a~\:[~;\ deprecated~]\ function=
+
+#: describe.lisp:288
+!a\ macro=
+
+#: describe.lisp:293
+!,\ names\ a\ type=
+
+#: describe.lisp:297
+!,\ names\ a\ class=
+
+#: describe.lisp:303
+!,\ has\ the\ propert~@P\ ~{~S~^,\ ~}=
+
+#: describe.lisp:306 describe.lisp:340 describe.lisp:363 describe.lisp:382
+#: describe.lisp:425
+!.=
+
+#: describe.lisp:310
+!~%Documentation\ as\ a\ ~a\:~%~a=
+
+#: describe.lisp:312 describe.lisp:451
+!~%For\ more\ information,\ evaluate\ ~{~S~^\ or\ ~}.=
+
+#: describe.lisp:316
+!an\ integer,\ uses\ ~S\ bit~\:p,\ is\ represented\ as\ a\ ~(~A~).=
+
+#: describe.lisp:319
+!a\ rational,\ not\ integral\ number.=
+
+#: describe.lisp:321
+!a\ float\ with\ ~S\ bits\ of\ mantissa\ (~(~A~)).=
+
+#: describe.lisp:324
+!a\ complex\ number\ =
+
+#: describe.lisp:329
+!at\ the\ origin=
+
+#: describe.lisp:330
+!on\ the\ ~\:[posi~;nega~]tive\ real\ axis=
+
+#: describe.lisp:333
+!on\ the\ ~\:[posi~;nega~]tive\ imaginary\ axis=
+
+#: describe.lisp:335
+!in\ the\ ~\:[~\:[first~;fourth~]~;~\:[second~;third~]~]\ quadrant=
+
+#: describe.lisp:337
+!\ of\ the\ Gaussian\ number\ plane.=
+
+#: describe.lisp:339
+!a\ character=
+
+#: describe.lisp:344
+!~%Unicode\ name\:\ ~A=
+
+#: describe.lisp:345
+!~%It\ is\ not\ defined\ by\ the\ Unicode\ standard.=
+
+#: describe.lisp:346
+!~%It\ is\ a\ ~\:[non-~;~]printable\ character.=
+
+#: describe.lisp:349
+!~%Its\ use\ is\ non-portable.=
+
+#: describe.lisp:351
+!a~\:[~\:[\ closed\ ~;n\ output-~]~;~\:[n\ input-~;n\ input/output-~]~]stream.=
+
+#: describe.lisp:357
+!the\ package\ named\ ~A=
+
+#: describe.lisp:361
+!.\ It\ has\ the\ nicknames\ ~{~A~^,\ ~}=
+
+#: describe.lisp:366
+!~%It\ =
+
+#: describe.lisp:368
+!imports\ the\ external\ symbols\ of\ the\ package~\:[~;s~]\ ~{~A~^,\ ~}\ and\ =
+
+#: describe.lisp:373
+!exports\ ~\:[no\ symbols~;the\ symbols~\:*~{~<~%~\:;\ ~S~>~^~}~%~]=
+
+#: describe.lisp:375
+!exports\ ~[no\ symbols~\:;~\:*~\:d\ symbols~]=
+
+#: describe.lisp:378
+!\ to\ the\ package~\:[~;s~]\ ~{~A~^,\ ~}=
+
+#: describe.lisp:381
+!,\ but\ no\ package\ uses\ these\ exports=
+
+#: describe.lisp:383
+!a\ deleted\ package.=
+
+#: describe.lisp:385
+!a\ hash\ table\ with\ ~S\ entr~\:@P.=
+
+#: describe.lisp:388
+!~\:[a~;the\ Common\ Lisp~]\ readtable.=
+
+#: describe.lisp:391
+!a\ ~\:[~;portable\ ~]pathname~\:[.~;~\:*,\ with\ the\ following\ components\:~{~A~}~]=
+
+#: describe.lisp:406
+!a\ random-state.=
+
+#: describe.lisp:410
+!a~\:[~;\ simple~]\ ~A\ dimensional\ array=
+
+#: describe.lisp:413
+!\ (vector)=
+
+#: describe.lisp:415
+!\ of\ ~(~A~)s=
+
+#: describe.lisp:418
+!,\ adjustable=
+
+#: describe.lisp:420
+!,\ of\ size\ ~{~S~^\ x\ ~}=
+
+#: describe.lisp:423
+!\ and\ current\ length\ (fill-pointer)\ ~S=
+
+#: describe.lisp:430
+!a\ foreign\ function.=
+
+#: describe.lisp:436
+!a\ built-in\ system\ function.=
+
+#: describe.lisp:444
+!a~\:[n\ interpret~;\ compil~]ed\ function.=
+
+#: describe.lisp:460
+!~%argument\ list\:\ ~\:S=
+
+#: describe.lisp:463
+!~%documentation\:\ ~A=
+
+#: describe.lisp:468
+!~&~%~A\ [see\ above]=
+
+#: describe.lisp:471
+!~&~%~A\ is\ =
+
+#: describe.lisp:535
+!~S\:\ ~S\ is\ not\ a\ function.=
+
+#: describe.lisp:564
+!~%Argument\ list\:\ =
+
+#: room.lisp:17
+!~S\:\ argument\ must\ be\ ~S,\ ~S\ or\ ~S,\ not\ ~S=
+
+#: room.lisp:51 room.lisp:215
+!Total=
+
+#: room.lisp:59
+!~%Bytes\ permanently\ allocated\:\ \ \ ~9D~%Bytes\ currently\ in\ use\:\ \ \ \ \ \ \ \ ~9D~%Bytes\ available\ until\ next\ GC\:\ ~9D~%=
+
+#: edit.lisp:30
+!No\ external\ editor\ installed.=
+
+#: edit.lisp:102
+!~S\ cannot\ be\ edited.=
+
+#: edit.lisp:121
+!~S\:\ source\ code\ for\ ~S\ not\ available.=
+
+#: macros3.lisp:13
+!The\ form\ ~S\ yielded\ ~\:[no\ values~;~\:*~{~S~^\ ;\ ~}~]\ ,~@\n\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ that's\ not\ of\ type\ ~S.=
+
+#: macros3.lisp:64
+!LETF*\ code\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: macros3.lisp:83
+!illegal\ syntax\ in\ LETF*\ binding\:\ ~S=
+
+#: macros3.lisp:227
+!LETF\ code\ contains\ a\ dotted\ list,\ ending\ with\ ~S=
+
+#: macros3.lisp:246
+!illegal\ syntax\ in\ LETF\ binding\:\ ~S=
+
+#: foreign1.lisp:86
+!Cannot\ map\ string\ ~S\ to\ C\ since\ it\ contains\ a\ character\ ~S=
+
+#: foreign1.lisp:128
+!Incomplete\ FFI\ type\ ~S\ is\ not\ allowed\ here.=
+
+#: foreign1.lisp:134
+!FFI\ type\ should\ be\ a\ symbol,\ not\ ~S=
+
+#: foreign1.lisp:138
+!Invalid\ FFI\ type\:\ ~S=
+
+#: foreign1.lisp:155 foreign1.lisp:220
+!Invalid\ ~S\ component\:\ ~S=
+
+#: foreign1.lisp:329
+!Invalid\ option\ in\ ~S\:\ ~S=
+
+#: foreign1.lisp:333
+!Only\ one\ ~S\ option\ is\ allowed\:\ ~S=
+
+#: foreign1.lisp:350
+!Invalid\ parameter\ specification\ in\ ~S\:\ ~S=
+
+#: foreign1.lisp:411
+!The\ name\ must\ be\ a\ string,\ not\ ~S=
+
+#: foreign1.lisp:416
+!The\ name\ ~S\ is\ not\ a\ valid\ C\ identifier=
+
+#: foreign1.lisp:671
+!illegal\ foreign\ data\ type\ ~S=
+
+#: foreign1.lisp:801
+!~S\:\ ~S\ option\ missing\ in\ ~S=
+
+#: foreign1.lisp:996
+!~S\:\ \:OUT\ argument\ is\ not\ a\ pointer\:\ ~S=
+
+#: foreign1.lisp:1060
+!~S\ is\ only\ allowed\ after\ ~S\:\ ~S=
+
+#: affi1.lisp:41
+!Basename\ ~S\ not\ a\ keyword\ or\ libraryname\ ~S\ not\ a\ string=
+
+#: affi1.lisp:48
+!Library\ redefinition\:\ old\ ~S,\ new\ ~S=
+
+#: affi1.lisp:58
+!Unknown\ library\:\ ~S=
+
+#: affi1.lisp:85
+!Library\ ~S\ is\ not\ open=
+
+#: affi1.lisp:147
+!Unknown\ function\ of\ library\ ~S\:\ ~S=
+
+#: affi1.lisp:173
+!Offset\ must\ be\ a\ fixnum\:\ ~S=
+
+#: affi1.lisp:184
+!~&;;\ redefining\ foreign\ library\ function\ ~S~%;;\ \ from\ ~S\ to\ ~S~%=
+
+#: affi1.lisp:203
+!Unknown\ register\:\ ~S=
+
+#: affi1.lisp:215
+!Invalid\ parameter\ specification\ ~S\ in\ function\ ~S=
+
+#: affi1.lisp:227
+!Unknown\ library\ function\:\ ~S=
+
+#: affi1.lisp:244
+!Bad\ number\ of\ arguments\ for\ ~S\:\ ~S=
+
+#: rexx1.lisp:146
+!No\ waiting\ for\ ~S\ possible.=
+
+#: defs3.lisp:231
+!~S\:\ argument\ ~S\ should\ be\ a\ string\ or\ a\ symbol=
diff --git a/gettext-tools/tests/xgettext-24 b/gettext-tools/tests/xgettext-24
new file mode 100755
index 000000000..eb82a66e5
--- /dev/null
+++ b/gettext-tools/tests/xgettext-24
@@ -0,0 +1,82 @@
+#! /bin/sh
+
+# Test C, C++, JavaProperties extractors.
+
+tmpfiles=""
+trap 'rm -fr $tmpfiles' 1 2 3 15
+
+tmpfiles="$tmpfiles xg-test24.in.properties xg-test24.c xg-test24.cc"
+cat <<EOF > xg-test24.in.properties
+#: file1.c:199
+#, fuzzy
+!extract\ me=some text to get fuzzy copied to result
+
+#: file2.cc:200
+!what\ about\ me=
+
+#: file3.c:10
+#, c-format, fuzzy
+!hello=Again some text for fuzzy
+EOF
+
+cat <<EOF > xg-test24.c
+#include <libintl.h>
+#include <stdio.h>
+int
+main (int argc, char *argv[])
+{
+ printf (dcgettext ("hello", "Hello, world."));
+ return 0;
+}
+EOF
+
+cat <<EOF > xg-test24.cc
+#include <iostream.h>
+#include <libintl.h>
+#include <locale.h>
+int
+main (int argc, char *argv[])
+{
+ cout << dcgettext ("hello", "Hello world!", LC_MESSAGES) << endl;
+ return 0;
+}
+EOF
+
+tmpfiles="$tmpfiles xg-test24.po"
+: ${XGETTEXT=xgettext}
+${XGETTEXT} --omit-header -n xg-test24.in.properties \
+ xg-test24.c xg-test24.cc -d xg-test24
+test $? = 0 || { rm -fr $tmpfiles; exit 1; }
+
+tmpfiles="$tmpfiles xg-test24.ok"
+cat <<EOF > xg-test24.ok
+#: file1.c:199
+#, fuzzy
+msgid "extract me"
+msgstr "some text to get fuzzy copied to result"
+
+#: file2.cc:200
+msgid "what about me"
+msgstr ""
+
+#: file3.c:10
+#, fuzzy, c-format
+msgid "hello"
+msgstr "Again some text for fuzzy"
+
+#: xg-test24.c:6
+msgid "Hello, world."
+msgstr ""
+
+#: xg-test24.cc:7
+msgid "Hello world!"
+msgstr ""
+EOF
+
+: ${DIFF=diff}
+${DIFF} xg-test24.ok xg-test24.po
+result=$?
+
+rm -fr $tmpfiles
+
+exit $result