]> granicus.if.org Git - recode/commitdiff
Version 3.4 v3.4
authorFrançois Pinard <pinard@iro.umontreal.ca>
Fri, 18 Jan 2008 19:51:12 +0000 (14:51 -0500)
committerFrançois Pinard <pinard@iro.umontreal.ca>
Fri, 18 Jan 2008 19:51:12 +0000 (14:51 -0500)
76 files changed:
BACKLOG [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
File-Latin1 [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
Makefile.os2 [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
README.DOS [new file with mode: 0644]
TAGS [new file with mode: 0644]
THANKS [new file with mode: 0644]
TODO [new file with mode: 0644]
acconfig.h [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
ansi2knr.1 [new file with mode: 0644]
ansi2knr.c [new file with mode: 0644]
applemac.c [new file with mode: 0644]
argmatch.c [new file with mode: 0644]
ascilat1.l [new file with mode: 0644]
atarist.c [new file with mode: 0644]
bangbang.c [new file with mode: 0644]
c-boxes.el [new file with mode: 0644]
cdcnos.c [new file with mode: 0644]
charname.c [new file with mode: 0644]
charname.h [new file with mode: 0644]
charname.pl [new file with mode: 0644]
charname.sed [new file with mode: 0644]
charset.c [new file with mode: 0644]
charset.pl [new file with mode: 0644]
charset.sed [new file with mode: 0644]
charset.texi [new file with mode: 0644]
charset1.c [new file with mode: 0644]
charset2.c [new file with mode: 0644]
checkit [new file with mode: 0755]
config.h.dos [new file with mode: 0644]
config.h.in [new file with mode: 0644]
config_h.os2 [new file with mode: 0644]
configdos [new file with mode: 0755]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
dosfn [new file with mode: 0755]
ebcdic.c [new file with mode: 0644]
error.c [new file with mode: 0644]
flat.c [new file with mode: 0644]
getopt.c [new file with mode: 0644]
getopt.h [new file with mode: 0644]
getopt1.c [new file with mode: 0644]
htmllat1.l [new file with mode: 0644]
ibmpc.c [new file with mode: 0644]
iconqnx.c [new file with mode: 0644]
initstep.h [new file with mode: 0644]
install-sh [new file with mode: 0755]
lat1asci.c [new file with mode: 0644]
lat1html.c [new file with mode: 0644]
lat1ltex.c [new file with mode: 0644]
lat1txte.c [new file with mode: 0644]
ltexlat1.l [new file with mode: 0644]
merged.c [new file with mode: 0644]
mergelex.awk [new file with mode: 0644]
mkinstalldirs [new file with mode: 0755]
next.c [new file with mode: 0644]
pathmax.h [new file with mode: 0644]
recode.c [new file with mode: 0644]
recode.h [new file with mode: 0644]
recode.info [new file with mode: 0644]
recode.texi [new file with mode: 0644]
rfc1345.txt [new file with mode: 0644]
stamp-h.in [new file with mode: 0644]
stamp-init [new file with mode: 0644]
stamp-vti [new file with mode: 0644]
texinfo.tex [new file with mode: 0644]
txtelat1.l [new file with mode: 0644]
version.texi [new file with mode: 0644]
xmalloc.c [new file with mode: 0644]
xstrdup.c [new file with mode: 0644]

diff --git a/BACKLOG b/BACKLOG
new file mode 100644 (file)
index 0000000..fedead1
--- /dev/null
+++ b/BACKLOG
@@ -0,0 +1,167 @@
+# Summary of pending email for GNU recode 3.4.
+# Last updated: Sunday, November 06, 1994.
+
+rmail/announce
+ 1. 31 Oct 94 <pinard> recode 3.3.2 en pretest
+ 2. 31 Oct 94 <pinard@IRO.UMontreal.CA> Prerelease: GNU recode 3.3.2
+
+rmail/charsets/backspace
+ 1. 11 Oct 94 <mike@vlsivie.tuwien.ac.at> Re: recode
+
+rmail/charsets/easy-french
+ 1. 18 Aug 94 <pinard@IRO.UMontreal.CA> Re: Japanese names
+
+rmail/charsets/ebcdic
+ 1. 31 Aug 90 <keld@login.dkuug.dk> [comp.unix.questions] Re: EBCDIC to ASCII c
+ 2. 02 Oct 90 <jeffb@blia.BLI.COM> Re: EBCDIC <--> ASCII conversion
+ 3. 03 Oct 90 <luke@modus.sublink.ORG> Re: EBCDIC <--> ASCII conversion
+ 4. 22 Oct 90 <exspes@gdr.bath.ac.uk> Re: EBCDIC <--> ASCII conversion
+ 5. 24 Oct 90 <meissner@osf.org> Re: EBCDIC <--> ASCII conversion
+ 6. 26 Oct 90 <ok@goanna.cs.rmit.oz.au> Re: EBCDIC <--> ASCII conversion
+ 7. 26 Oct 90 <henry@zoo.toronto.edu> Re: EBCDIC <--> ASCII conversion
+ 8. 27 Mar 91 <mcastle@mcs213c.cs.umr.edu> Re: COMPRESSING of binary data into 
+ 9. 06 Dec 93 <rocky@watson.ibm.com> ascii <-> ebcdic
+10. 06 Dec 93 <rocky@watson.ibm.com> ascii <-> ebcdic
+11. 11 Dec 93 <pinard> ascii <-> ebcdic
+12. 31 Dec 93 <mike@mo.math.nat.tu-bs.de> recode-3.3
+13. 25 Aug 94 <dorre@well.sf.ca.us> Re: Latin American/Spanish EBCDIC character
+14. 26 Aug 94 <EURMXK@vm.sas.com> Re: Latin American/Spanish EBCDIC character s
+15. 26 Aug 94 <x15@aixterm2.urz.uni-heidelberg.de> Re: Latin American/Spanish E
+16. 29 Aug 94 <ALB@immedia.ca> Latin American EBCDIC
+17. 30 Aug 94 <EURMXK@MVS.SAS.COM> Re: Latin American EBCDIC
+
+rmail/charsets/html
+ 1. 19 Mar 94 <lebel@iro.umontreal.ca> HTML... 
+ 2. 25 May 94 <Christian.Rolland@irisa.fr> recode new charset
+ 3. 25 May 94 <Christian.Rolland@irisa.fr> lat1ent.c
+ 4. 25 May 94 <Christian.Rolland@irisa.fr> entlat1.l
+ 5. 25 May 94 <pinard@IRO.UMontreal.CA> Re: recode new charset
+ 6. 26 May 94 <Christian.Rolland@irisa.fr> Re: recode new charset
+ 7. 26 May 94 <pinard@IRO.UMontreal.CA> Re: recode new charset
+ 8. 26 May 94 <Christian.Rolland@irisa.fr> Re: recode new charset
+ 9. 08 Sep 94 <lebel@IRO.UMontreal.CA> Annonce: texi2html-1.20
+10. 28 Mar 94 <news@usage.csd.unsw.OZ.AU> Re: manpage to HTML converter/gateway
+11. 15 Jul 94 <cameron@cse.unsw.edu.au> Re: Using perl to parse HTML - help!
+12. 16 Jul 94 <gl8f@fermi.clas.Virginia.EDU> Re: Using perl to parse HTML - hel
+13. 28 Aug 94 <iwj10@cus.cam.ac.uk> HTML FAQ now available / Forgery recently p
+
+rmail/charsets/latex
+ 1. 30 Oct 92 <pierre.darmon%acc1bbs@ssr.com> Re: How to make the "degree" symb
+ 2. 02 Nov 92 <DL24794@UAFSYSB.UARK.EDU> degree symbol
+ 3. 18 Nov 92 <iad@cogsci.ed.ac.uk> Re: \b \d and ISO 6937 Latin Diacriticals
+ 4. 09 Mar 93 <abraham@research.att.com> Latin 1 to LaTeX table
+ 5. 02 Dec 93 <pinard> recode
+ 6. 06 Dec 93 <volker@numsun1.mathematik.uni-halle.de> Re: recode
+ 7. 11 Dec 93 <pinard> GNU recode 3.2.9
+ 8. 12 Dec 93 <abraham@research.att.com> Re: GNU recode 3.2.9
+ 9. 03 Mar 93 <pflynn@curia.ucc.ie> Re: TeX to Latin 1 table
+10. 25 Jul 94 <davleeuwen%tm.tno.nl@Lightning.McRCIM.McGill.EDU> --diacritics, 
+
+rmail/charsets/morse
+ 1. 04 May 94 <pinard> Re: comment on morse and unmose
+
+rmail/charsets/rfc1345
+ 1. 20 Mar 94 <pinard> RFC 1345 out of recode
+ 2. 20 Mar 94 <keld@dkuug.dk> Re: RFC 1345 out of recode
+ 3. 01 Nov 94 <czyborra@cs.tu-berlin.de> Re: Prerelease: GNU recode 3.3.2
+ 4. 01 Nov 94 <czyborra@cs.tu-berlin.de> Re: Prerelease: GNU recode 3.3.2
+
+rmail/languages/esperanto
+ 1. 02 Aug 92 <jkp@cs.HUT.FI> MATERIAL: Esperanto in 7-bit ASCII
+ 2. 02 Aug 92 <jkp@cs.HUT.FI> [repost] MATERIAL: TOOLS Roman (including Esperan
+ 3. 10 Aug 92 <richwing@leland.Stanford.EDU> Re: MATERIAL: Esperanto in 7-bit A
+ 4. 28 Apr 93 <kingdon@cygnus.com> Changes to recode for Esperanto
+ 5. 06 Dec 93 <pinard> Changes to recode for Esperanto
+ 6. 16 Dec 93 <keld@dkuug.dk> Re: Esperanto, Latin-3 and 1620
+ 7. 23 Dec 93 <kingdon@cygnus.com> Changes to recode for Esperanto
+ 8. 13 Jan 94 <hansen@forwiss.uni-passau.de> Re: Suggestions for `recode'
+ 9. 13 Jan 94 <hansen@forwiss.uni-passau.de> Re: Suggestions for `recode'
+
+rmail/languages/german
+ 1. 09 Jan 94 <hansen@forwiss.uni-passau.de> Suggestions for `recode'
+ 2. 11 Jan 94 <pinard@iro.umontreal.ca> Suggestions for `recode'
+ 3. 12 Jan 94 <hansen@forwiss.uni-passau.de> Re: Suggestions for `recode'
+ 4. 12 Jan 94 <pinard@iro.umontreal.ca> shar: diac.tar.gz
+ 5. 12 Jan 94 <pinard@iro.umontreal.ca> Re: Suggestions for `recode'
+ 6. 09 Jan 94 <hansen@forwiss.uni-passau.de> Suggestions for `recode'
+ 7. 11 Jan 94 <pinard@IRO.UMontreal.CA> Suggestions for `recode'
+ 8. 12 Jan 94 <hansen@forwiss.uni-passau.de> Re: Suggestions for `recode'
+ 9. 12 Jan 94 <pinard@IRO.UMontreal.CA> Re: Suggestions for `recode'
+10. 28 Sep 94 <gator@cs.tu-berlin.de> new charset for recode
+11. 30 Sep 94 <pinard> Re: new charset for recode
+12. 01 Oct 94 <gator@cs.tu-berlin.de> Re: new charset for recode
+13. 19 Jul 94 <haible@ma2s2.mathematik.uni-karlsruhe.de> latex conversions in r
+14. 19 Jul 94 <pinard> Re: latex conversions in recode-3.3
+15. 19 Jul 94 <haible@ma2s2.mathematik.uni-karlsruhe.de> Re: latex conversions 
+16. 11 Feb 93 <unrza3@cd4680fs.rrze.uni-erlangen.de> Re: transcription iso-8859
+
+rmail/options/listing
+ 1. 21 Dec 93 <maechler@stat.math.ethz.ch> Re: Prerelease: GNU recode version 3
+ 2. 21 Dec 93 <pinard> Prerelease: GNU recode version 3.2.10
+
+rmail/options/performance
+ 1. 01 Jan 94 <eggert@twinsun.com> Re: io.c hash algorithm
+
+rmail/options/swabytes
+ 1. 20 May 94 <pinard> recode -w
+
+rmail/problems/documentation
+ 1. 13 Sep 94 <pinard> Option -k dans recode
+ 2. 29 Dec 93 <pinard> Release: GNU recode version 3.3
+ 3. 11 Mar 94 <pinard> recode
+ 4. 09 Mar 94 <pinard@iro.umontreal.ca> Re: recode
+ 5. 01 Nov 94 <maechler@stat.math.ethz.ch> Re: Prerelease: GNU recode 3.3.2
+
+rmail/problems/miscellaneous
+ 1. 09 Mar 94 <anquetil@iro.umontreal.ca> recode
+ 2. 02 Jun 94 <pinard%taarna.UUCP@IRO.UMontreal.CA> recode taarna
+
+rmail/problems/msdos
+ 1. 13 Apr 94 <Ulrich.Windl@rz.uni-regensburg.de> recode 3.3
+ 2. 13 Apr 94 <Ulrich.Windl@rz.uni-regensburg.de> recode 3.3
+
+rmail/problems/newlines
+ 1. 04 Feb 94 <lr@cs.uta.fi> recode
+ 2. 14 Dec 93 <pinard> GNU recode
+
+rmail/problems/warnings
+ 1. 18 Jan 94 <rpayette@edupac.qc.ca> (none)
+
+rmail/tools/_ch
+ 1. 15 Jan 91 <pinard> files pub
+ 2. 18 Oct 91 <pinard> files pub
+ 3. 19 Oct 91 <mcgill-vision!dkuug.dk!archive> Sent pub archive files at dkuug
+
+rmail/tools/_conv
+ 1. 04 Nov 91 <mcgill-vision!sisug.sisu.se!jonas> International character sets.
+ 2. 28 Mar 91 <keld@dkuug.dk> Installation and Configuration Guide
+
+rmail/tools/_elisp
+ 1. 23 Nov 92 <pinard> recode
+ 2. 23 Nov 92 <mcgill-vision!corto.inria.fr!shapiro> recode
+ 3. 11 Mar 93 <abraham@iesd.auc.dk> min-key.el: Keyboard Remapping and Characte
+ 4. 02 Jun 93 <abraham@research.att.com> Danish, Swedish, German, Russian, and 
+ 5. 22 Oct 93 <mike@vlsivie.tuwien.ac.at> Re: tex sequence to ISO latin convers
+ 6. 22 Oct 93 <mwarren@us.oracle.com> Re: Problem, solution idea and hack for i
+
+rmail/tools/_keld
+ 1. 14 Dec 93 <keld@dkuug.dk> Re: GNU recode
+ 2. 26 Dec 93 <keld@dkuug.dk> Re: NeXTSTEP charset
+ 3. 16 Dec 93 <keld@dkuug.dk> Re: GNU recode and work underlying RFC 1345
+
+rmail/tools/_kermit
+ 1. 18 Sep 91 <cmg@watsun.cc.columbia.edu> Character Set Files and Utilities
+
+rmail/tools/_ncr
+ 1. 15 Jul 94 <hurtta@dionysos.fmi.fi> Re: Latin-1 <-> NRC character set mappin
+ 2. 16 Jul 94 <keld@login.dkuug.dk> Re: Latin-1 <-> NRC character set mapping
+
+rmail/tools/_tcs
+ 1. 09 Feb 93 <andrew@research.att.com> (none)
+ 2. 14 Feb 93 <pinard> tcs, recode
+ 3. 20 Feb 93 <pinard> Legaleese
+ 4. 11 Dec 93 <pinard> GNU recode 3.2.9
+ 5. 12 Dec 93 <abraham@research.att.com> Re: GNU recode 3.2.9
+
+rmail/tools/_ucs
+ 1. 26 Aug 93 <hueni@iam.unibe.ch> Re: WANTED: recode extension to ROMAN8 (HP) 
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..a43ea21
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                          675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+       Appendix: How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..3d37961
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,1603 @@
+Sat Nov  5 15:56:48 1994  Francois Pinard  (pinard@icule)
+
+       * Version 3.4.
+
+       * Makefile.in (realclean): Also remove stamp-vti.
+
+       * recode.c (main): For now, inhibit -s with a warning, when -g.
+       This is only a temporary non-solution for a coredump problem.
+       Reported by David E. A. Wilson.
+
+       * recode.c (main): When diagnosing an irreversible recoding, do
+       not falsely say that the -f option was not specified.
+       (usage): Insist on the fact that -f is currently always selected.
+       Reported by David E. A. Wilson.
+
+Wed Nov  2 00:49:34 1994  Francois Pinard  (pinard@icule)
+
+       * configure.in: Check for const only after having found possible
+       ANSIfying compiler flags, this is of no use to check it before.
+
+Mon Oct 31 01:26:40 1994  Francois Pinard  (pinard@icule)
+
+       * unhexify.l: Deleted.  Not up to GNU standards for distribution.
+       * Makefile.in (BACKLOG): Goal deleted.  It was depending on files
+       which are not part of the distribution.
+       Reported by Jim Meyering.
+
+       * checkit: Force -f on most recode calls, to avoid diagnostics.
+
+       * Makefile.in: Clean up, following the one in GNU sharutils.  I
+       will not detail all the changes here.
+       * configure.in: Likewise.
+       * recode.c: Use PRODUCT and VERSION instead of version_string.
+       * acconfig.h: Document PRODUCT and VERSION.
+       * recode.h: Interface with dmalloc if WITH_DMALLOC.
+
+Sun Oct 30 16:52:37 1994  Francois Pinard  (pinard@icule)
+
+       * recode.h, recode.c: Use #if rather than #ifdef to test __STDC__.
+
+Tue Oct 11 00:26:30 1994  Francois Pinard  (pinard@icule)
+
+       * mergelex.awk: Declare yywrap only if not already a preprocessor
+       symbol, because some versions of Flex define it.
+       Reported by David van Leeuwen.
+
+Mon Oct 10 20:19:45 1994  Francois Pinard  (pinard@icule)
+
+       * lat1asci.c: Implement O and o with stroke, y with diaeresis, and
+       german sharp s (as s overstroken with double quote).
+       * ascilat1.l: Corresponding changes.
+       Reported by Michael Gschwind.
+
+       * lat1txte.c (init_latin1_texte): Ensure diaeresis_char will be
+       used in the computed translation table.  It was ignored.
+       * txtelat1.l: Ensure diaresis_char is recognized where it should.
+
+       * ascilat1.l: Remove all references to diaeresis_char, because
+       backspaced ASCII was never meant to be sensible to option -c.
+
+Sun Oct  9 08:34:37 1994  Francois Pinard  (pinard@icule)
+
+       * recode.h: Get rid of CONFIG_BROKETS.
+
+Tue Sep 13 12:55:30 1994  Francois Pinard  (pinard@icule)
+
+       * recode.c (usage): Use fputs instead of printf when possible.
+
+       * recode.c: Implement -k option for searching through recodings.
+       * charset.c (decode_known_pairs): New function.
+       (list_all_charsets): Accept a parameter and obey restrictions.
+       * recode.h: Declarations adjusted.
+       Reported by Ghislain Plamondon.
+
+       * acconfig.h: Document PROTOTYPES.  Strange enough: how did it
+       ever work without this?
+
+       * configure.in: Adjust for Autoconf 2.0.
+       * install-sh: New name for install.sh.
+       * Makefile.in: Put date in stamp files.
+       (DISTFILES): Adjust.
+
+Tue Sep  6 12:09:44 1994  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (TAGS): Remove -t from etags call.
+
+Fri Jul  8 00:15:14 1994  Francois Pinard  (pinard@icule)
+
+       * ansi2knr.1: New file, from elsewhere.
+       * Makefile.in (DISTFILES): Distribute it.
+
+Fri Jun  3 12:58:05 1994  Francois Pinard  (pinard@icule)
+
+       * recode.c (usage): Spell `Texinfo' with a capital.
+
+Wed Apr 13 13:40:46 1994  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (Makefile, etc.): Adapt for Autoconf 1.8.
+
+Sat Mar 19 05:52:45 1994  Francois Pinard  (pinard at icule)
+
+       * lat1asci.c (init_latin1_ascii): Do not allocate pool separately
+       from table, so they can be freed at once.
+       * lat1html.c (init_latin1_html): Idem.
+       * lat1ltex.c (init_latin1_latex): Idem.
+       * lat1txte.c (init_latin1_texte): Idem.
+
+       * recode.c (simplify_sequence): Despite not reversible, accept
+       producing RFC 1345 short mnemonics, outside any double step,
+       constructing a one-to-many table on the fly.  When exploring foreign
+       files, there might be no other easy choice.
+       * charset.c (init_table_for_rfc1345): New.
+       * recode.h: Declare it.
+       Reported by Roman Czyborra.
+
+Fri Mar 11 09:35:55 1994  Francois Pinard  (pinard at icule)
+
+       * lat1ltex.c: Recode 160 as `~', not as `\ '.
+       * ltexlat1.l: Recode `~' (instead of `\ ') to 160.
+       Reported by Nicolas Anquetil.
+
+       * ltexlat1.l: Ensure that recode does not match only part of the
+       identifier following `\'.  This was easily solved by adding a few
+       Flex rules at end and relying on the Flex longest match law.
+       For example, because Latin-1 misses the latin `oe' diphtong (!),
+       `\oe' was seen as the recodable `\o' followed by an isolated `e'.
+       Reported by Mac Pigman and Nicolas Anquetil.
+
+       * ltexlat1.l: Reformatted for a more uniform Flex quoting.
+
+       * recode.c (execute_popen_sequence): Ensure -d option is properly
+       transmitted to subprocesses.
+       Reported by David Kastrup.
+
+       * lat1html.c, htmllat1.l: New, for supporting HTML conversions.
+       * lat1ltex.c: Add a few static specifiers to tables.
+       * Makefile.in: Adjusted.
+       Reported by David Lebel.
+
+Mon Feb  7 11:42:07 1994  Francois Pinard  (pinard at icule)
+
+       * Makefile.in: Avoid $(CFLAGS) while linking.
+
+       * configdos: Link to locally installed configdos.
+       * dosfn: Replaced by a link to locally installed dosfn.
+       * dosfn.pl: Deleted, included in installed configdos and dosfn.
+       * configdos.pl: Deleted.
+       * Makefile.in: Call dosfn and configdos as programs, provide -tcc
+       to configdos.  Do not distribute prepared DOS files anymore in the
+       tar file.  Prepare the DOS makefile directly in distdos goal, also
+       put in distdos the preparation of libobjs.lst and objects.lst.
+
+Fri Feb  4 10:26:22 1994  Francois Pinard  (pinard at icule)
+
+       * recode.c (file_one_to_many): When an irreversibility is found,
+       run recoding to completion instead of interrupting it, then return
+       whether it is reversible or not, disregarding force_option.
+       * bangbang.c (file_banbang_latin1): Idem.
+       * cdcnos.c (file_cdcnos_ascii): Idem.
+       * flat.c (file_ascii_flat): Idem.
+       * ibmpc.c (file_latin1_ibmpc, file_ibmpc_latin1): Idem.
+       * iconqnx.c (file_ibmpc_iconqnx, file_iconqnx_ibmpc): Idem.
+       * recode.h: Do not declare force_option anymore.
+
+Tue Jan 18 20:03:52 1994  Francois Pinard  (pinard@icule)
+
+       * recode.c (declare_step): Rewrite the prototype differently if
+       not __STDC__, because ansi2knr does not clean prototypes in
+       functionnal arguments.
+       * txtelat1.l: Declaring texte_latin1_diaeresis, use _((void)).
+       Reported by Rejean Payette.
+
+Sat Jan 15 14:24:44 1994  Francois Pinard  (pinard@icule)
+
+       * recode.c (main): With absolutely no arguments, imply --help.
+       Reported by Kai Uwe Rommel.
+       
+Fri Jan 14 15:12:09 1994  Francois Pinard  (pinard@icule)
+
+       * recode.c (usage): Print the version string in --help.
+       Reported by Kai Uwe Rommel.
+
+       * recode.c: Ajust for easing OS/2 EMX port.
+       * Makefile.os2, config_h.os2: New files.
+       * Makefile.in: Distribute them.
+       Reported by Kai Uwe Rommel.
+
+       * recode.c (usage): Print a blank line after the first prototype.
+
+Thu Jan 13 21:24:42 1994  Francois Pinard  (pinard@icule)
+
+       * configdos.pl: Renaming GNUmakefile to makefile.gnu.
+
+       * recode.c (output_header_file): Use tabs instead of spaces before
+       generated comments.
+
+Sat Jan  8 20:11:57 1994  Francois Pinard  (pinard@icule)
+
+       * recode.c: Condense "file = action(); if (file == NULL) ..." into
+       "if (file = action(), file == NULL) ..." consistently.
+
+Fri Jan  7 10:54:08 1994  Francois Pinard  (pinard@icule)
+
+       * configure.in: Check AC_RETSIGTYPE.
+       * recode.c: Include <setjmp.h>, <signal.h>, define RETSIGTYPE.
+       (signal_handler, setup_signals): New.
+       (main): Call setup_signals.
+       (execute_pipe_sequence): Do not diagnose SIGPIPE as an unknown error.
+
+       * recode.c (main): Replace program_name by program_path.
+       Introduce program_name, receiving the basename of program_path.
+       (execute_popen_sequence): Use program_path instead of program_name.
+
+       * recode.c (dup2): New, for when HAVE_PIPE && !HAVE_DUP2.
+
+       * ebcdic.c: Connect to ASCII instead of to ASCII-BS.
+       * recode.c (register_all_modules): Alias to ASCII right away.
+
+       * recode.c (register_all_modules): Alias ASCII-BS to BS.
+       * cdcnos.c (module_cdcnos): Alias CDC-NOS to NOS.
+       * iconqnx.c (module_iconqnx): Alias Icon-QNX to QNX.
+       * lat1ltex.c (module_latin1_latex): Alias LaTeX to TeX.
+       * ltexlat1.l (module_latex_latin1): Alias LaTeX to TeX.
+
+Thu Jan  6 00:26:18 1994  Francois Pinard  (pinard@icule)
+
+       * Version 3.3.1, in the MSDOS world only.
+
+       * all: Everywhere, change charset names from latin1 to Latin-1,
+       latex to LaTeX and texte to Texte.  Change applemac to Apple-Mac,
+       ascii-bs to ASCII-BS, atarist to AtariST, bangbang to Bang-Bang,
+       cdcnos to CDC-NOS, ebcdic to EBCDIC, ebcdic-ccc to EBCDIC-CCC,
+       ebcdic-ibm to EBCDIC-IBM, ibmpc to IBM-PC and iconqnx to Icon-QNX.
+
+       * recode.c: For MSDOS, increase the stack length through _stklen.
+
+       * recode.c: Diagnose more precisely all errors involving errno,
+       while calling error.  In particular, include __FILE__:__LINE__.
+
+       * recode.c (main): Unless under MSDOS, use rec<PID>.tmp for the
+       file name of the temporary recoded file instead of recodeXX.TMP.
+
+       * recode.c: Rename optimize_sequence to simplify_sequence, and
+       optimizable_type to symplify_type.
+
+       * recode.c (execute_popen_sequence): Return 0 if the subprocess
+       fails, instead of exiting with a diagnostic.  Pass -f option to
+       subprocesses if selected.  Always pass -q to shut them down.
+       Construct the popen_command piecemeal instead of a big sprintf.
+       (main, usage): Implement option --quiet (-q, --silent).
+
+       * recode.c (execute_pass_sequence): Interrupt the current recoding
+       and return 0 if any step fails, if this happens, unlink a possibly
+       existing temporary file.
+
+       * recode.c (execute_pipe_sequence): Unconditionnaly close the
+       output file from the parent before waiting, instead of closing
+       it only if there was an output name.  Let the parent accumulate
+       the exit status of all children before returning its own.
+       * configure.in: Let HAVE_PIPE be defined.  This old bug ig gone!
+
+       * recode.c (perform_auto_check, perform_auto_check_one): Renamed
+       and split from function report_about_all_sequences.  Now accepts a
+       CHARSET argument for limiting the search.
+       (main): Allows an optional command line argument to --auto.
+       (usage): Adjusted accordingly.
+
+       * recode.c (main): Diagnose extraneous arguments to --list.
+       
+       * recode.c (compare_struct_item): New.
+       (init_recode_rfc1345): Partial rewrite for replacing the quadratic
+       pairing algorithm with a logarithmic-linear one, cleaning up a bit.
+
+Tue Jan  4 08:28:49 1994  Francois Pinard  (pinard@icule)
+
+       * txtelat1.l: Undo the 1990-03-15 change.  If there is still a bug
+       in this area, I will let it show its nose again...
+
+       * mergelex.awk: Remove the X_ prefix for start condition names.
+
+       * configure.in: Remove all about LEXLIB, flexlib and LIBOBJS,
+       since flex (version 2.4.6) generated scanners are self contained.
+       * flexlib.c: Deleted.
+       * Makefile.in: Adjusted.
+
+       * recode.c (optimizable_type): New, from optimize_sequence.
+       (optimize_sequence): Use it.
+
+       * charset.c (clean_charset_name): Set decoding_charset_flag just
+       before calling usage instead of early, do not care resetting it.
+
+       * next.c: Renamed from nextstep.c.  NeXTSTEP changed to NeXT.  Add
+       f2 as florin (166) and '" as hungarian umlaut (205).  Remove
+       USE_DOUBLE_STEP by making the code permanent, remove older code.
+       * charname.pl: Especially define f2 as florin.
+       * Makefile.in: Adjusted.
+       Reported by Keld J|rn Simonsen.
+
+       * alloca.c: Deleted, not used anymore.
+       * configure.in: Remove AC_ALLOCA test.
+       * Makefile.in: Remove alloca.* references.
+
+       * configure.in: Read DEFAULT_CHARSET from environment if set.
+       Reported by Andreas Schwab.
+
+Mon Jan  3 00:03:01 1994  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (.stamp-collect): Say when initstep.h altered.
+
+       * charset.pl: Now produce split charset1.c and charset2.c instead
+       of a single big charset.h.  This seems mandatory for MSDOS, even
+       with huge model.  Some Unix C compilers will crawl faster, too.
+       * Makefile.in: Adjusted.
+
+       * README.DOS: New file.
+       * configdos.pl: Much revised.  The script no longer have a
+       config.tcc input, now taking its information from Makefile.in.
+       * dosfn: New file, from elsewhere.
+       * dosfn.pl: New file, common between configdos.pl and dosfn.
+       * Makefile.in: Distribute configdos.pl again, together with
+       dosfn.pl and makefile.dos.  Adapt for MSDOS and configdos.pl.
+
+       * recode.c: Delete inactive code for selecting DEFAULT_CHARSET,
+       this being now done from configure or by already preset config.h.
+
+       * atarist.c: Rewritten for using a double step, instead of two
+       steps in and out latin1; the new code is triggered by defining
+       USE_DOUBLE_STEP, the old code will be kept for a little while.
+       Reported by Andreas Schwab.
+
+       * Makefile.in: Do not define LDFLAGS, use CFLAGS on link calls.
+       * configure.in: Remove LDEFS substitution, seemingly unused.
+       Reported by Richard Stallman.
+
+Sat Jan  1 09:11:45 1994  Francois Pinard  (pinard@icule)
+
+       * flat.c: Transmit '\t' as is, it was erroneously changed to '\n'.
+
+Fri Dec 31 00:26:10 1993  Francois Pinard  (pinard@icule)
+
+       Begin work for implementing --force.  To be completed later.
+       * recode.c (file_one_to_one): Return 1 instead of void.
+       (file_one_to_many): Return a value saying if the recoding was
+       successful or not, instead of void.
+       (execute_pass_sequence): Return 1 (unfinished).
+       (execute_popen_sequence): Return 1 (unfinished).
+       (execute_pipe_sequence): Return 1 (unfinished).
+       (execute_sequence): Return the status got from execute_*_sequence,
+       use it to alter "done" into "DENIED" when using -v.
+       (declare_step): Adjust file_recode parameter declaration.
+       (main):  Have --graphics imply --force.
+       * recode.h: Adjust declarations.  Declare error, force_option.
+       * bangbang.c (file_bangbang_latin1): Similarily.  Also, do not
+       recode "!!J" or "!!j" into '\n' unless -f.
+       * cdcnos.c (file_cdcnos_ascii): Similarily.  Also, do not recode
+       "^)" into '\n' unless -f.
+       * flat.c (file_ascii_flat): Similarily.
+       * ibmpc.c (file_latin1_ibmpc, file_ibmpc_latin): Similarily.
+       Also, do not recode isolated '\n' or '^Z' unless -f.
+       * iconqnx.c (file_ibmpc_iconqnx, file_iconqnx_ibmpc): Similarily.
+       Also, check for preventing the production of a few sequences which
+       would might be recoded back differently, unless -f.
+       * mergelex.awk: Similarily for generated file_<step_name>
+       routines.  Return the yylex result.  At <<EOF>>, return 1.
+
+       * charset.c (make_argmatch_array): Print a line of hash statistics
+       if HASH_STATS is defined.
+
+       I used to have 408 names in 343/997 buckets, the following patch
+       gave 408 names in 332/997 buckets.  Being worse, I commented it.
+       * charset.c (hash_string): Replace hash algorithm by GNU diff's.
+       * recode.h: Include <limits.h> and ensure CHAR_BIT is defined.
+       * configure.in: Test for <limits.h>.
+
+       * recode.c (optimize_sequence): Delete a remaining single step if
+       it happens to be the identity recoding.
+       (echo_sequence): Better diagnose the trivial recoding.
+       (file_one_to_one): Remove detection of special one_to_same case.
+       (report_about_all_sequences): Simplify detection of one_to_same.
+
+       * Makefile.in: Distribute .stamp-collect and initstep.h.  This
+       should alleviate problems caused by some sh/sed combinations,
+       still unstudied, which are unable to make initstep.h properly.
+       Reported by Michael L. Dowling.
+
+Thu Dec 30 23:10:41 1993  Francois Pinard  (pinard@icule)
+
+       * flat.c: Consider `~' as a diacritic character.
+       * File-Latin1: New file, intended to help testing/playing.
+       * Makefile.in: Distribute File-Latin1.
+       Reported by Martin Maechler.
+
+Wed Dec 29 23:51:35 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (merged.c): Split the pipe in parts, because
+       otherwise all status except the last of the pipe are lost for
+       make.  This is seemingly a feature of sh.
+       Reported by Vern Paxson.
+
+Sat Dec 25 06:20:37 1993  Francois Pinard  (pinard@icule)
+
+       * configure.in: Check for vprintf and strerror, for error.c.
+
+       * recode.c (usage): Indicate that --help and --version exit.
+
+Fri Dec 24 22:12:59 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Remove all as dependency for uninstall.
+
+       * Makefile.in: Split HEADERS, giving also LIBHDRS.  Use it.
+\f
+Thu Dec 23 20:02:03 1993  Francois Pinard  (pinard@icule)
+
+       * Version 3.3.
+
+Tue Dec 21 15:25:36 1993  Francois Pinard  (pinard@icule)
+
+       * *.c: Delete unused variables, add a few missing const's.
+
+       * nextstep.c: Rewritten for using a double step, instead of two
+       steps in and out latin1; the new code is triggered by defining
+       USE_DOUBLE_STEP, the old code will be kept for a little while.
+       This has two advantages: recode can obey various -l options for
+       NeXTSTEP, and I can remove the full style table from the
+       documentation.
+       Reported by Martin Maechler.
+
+       * Makefile.in (clean): Also delete unhexify.
+
+       * Makefile.in (tags): Include $(HEADERS).
+       (TAGS): Idem.  Also use -t on etags.
+
+Mon Dec 20 10:44:41 1993  Francois Pinard  (pinard@icule)
+
+       * charset.c (hash_string): Cast unsigned to int before modulo.
+       * recode.c (print_truncated_charset_name): Cast strlen result to
+       int before using it in an arithmetic comparison.
+
+       * recode.c (complete_pairs): When a conflict is found, diagnose
+       which charsets are involved.
+       Reported by Bastian Schlueter.
+
+       * nextstep.c: Add pair {182, 182} for paragraph sign.
+       Reported by Bastian Schlueter.
+
+       * recode.c (main):  Replace long names --files, --popen and --pipe
+       by common --sequence=METHOD.
+       (usage): Document this.
+
+       * recode.c (decode_before_after): Use backslash as escape.
+       (execute_popen_sequence): Clean up charset names before popen.
+       Reported by Keld J|rn Simonsen.
+
+Sun Dec 19 10:19:06 1993  Francois Pinard  (pinard@icule)
+
+       * charset.pl: Send diagnostics to stderr instead of charset.LOG.
+
+       * charset.pl: Discard &duplicate lines without discarding the
+       associated charset.
+
+       * charset.pl: Canonalize names the same way charset.c does, detect
+       duplicate names or aliases based on canonical names.  Do not
+       discard a charset merely for an alias name clash.
+
+       *charset.pl: Delay the generation of charset.texi, sort the
+       @item's by charset name and, within each, sort aliases.
+
+       * recode.h: Add a size field to the charset structure, declare a
+       size parameter to declare_double_step.
+       * charset.pl: Handle charsets having more than 2 characters per
+       symbol, transmit measured size into declare_double_step calls.
+       * recode.c (declare_double_step): Accept and save a size parameter.
+       * charset.c (code_to_symbol): New routine for handling size field.
+       (list_full_charset, list_concise_charset): Adapt to using it.
+
+Thu Dec 16 07:03:00 1993  Francois Pinard  (pinard@icule)
+
+       * charset.c: Add cleanup_charset_name, use it in find_charset,
+       declare_alias and decode_charset_name.  Rename compare_hash_name
+       to compare_struct_hash.
+       (list_all_charsets): Repeat the name even if it is not alias,
+       because it has been cleaned up.
+       Reported by Keld J|rn Simonsen.
+
+Tue Dec 14 11:45:53 1993  Francois Pinard  (pinard@icule)
+
+       * charset.pl: Generating charset.h instead of charset.c.
+       * charset.c: New.
+       * recode.c (prepare_charset_initialization): New.
+       (hash_string, find_charset, declare_alias, make_argmatch_array,
+       decode_charset_name, compare_hash_name, list_all_charsets,
+       list_full_charset, list_concise_charset): Moved into charset.c,
+       together with a few defines, struct hash and related declarations.
+       * Makefile.in: Adjusted.
+
+Mon Dec 13 12:55:24 1993  Francois Pinard  (pinard@icule)
+
+       * Renaming rfc1345.c into charset.c, rfc1345.pl into charset.pl,
+       rfc1345.sed into charset.sed and rfc1345.LOG into charset.LOG.
+       * Makefile.in, charset.pl: Adjusted.
+
+       * charname.c: New.
+       * charname.pl, charname.sed: New, for generating charname.h.
+       * Makefile.in: Adjusted.
+       * recode.h: Add declaration for charname_to_comment.
+       * recode.c: list_charsets renamed to list_all_charsets.
+       New functions list_full_charset and list_concise_charset, enum and
+       variable list_format.  Decode the list format, check for a charset
+       argument and switch to the proper listing function.
+
+       * acconfig.h: New, for holding DEFAULT_CHARSET.
+       * Makefile.in: Distribute it, have .stamp-h.in depend on it.
+       * configure.in: Substitute DEFAULT_CHARSET instead of DEFCHARSET.
+
+       * configure.in: Include $LEXLIB in $LIBS when $LEX is flex, so the
+       yy_flex_alloc test will not always fail, waiting for a version of
+       Autoconf which will do this itself.
+       * Makefile.in: Do not add @LEXLIB@ to LIBS anymore.
+       Reported by Andreas Schwab.
+
+       * checkit: Replace `+' by `*' in grep calls.
+       Reported by Andreas Schwab.
+
+       * recode.c (usage): Replace --include by --header in text.
+
+Sat Dec 11 08:39:58 1993  Francois Pinard  (pinard@icule)
+
+       * recode.c (list_charsets): Move all aliases of a charset after
+       the true charset name on its line, keeping lines sorted on the
+       true charset name and all alias in lexicographical order.  All
+       charset and aliases used to be sorted together, one per line. 
+       (compare_hash_names): Sort accordingly.
+       Reported by Martin Maechler.
+
+       * recode.c: Add make_argmatch_array and decode_charset_name.  Use
+       them, simplifying decode_before_after.  Process ignored_charset
+       even for the -a option.  Add print_truncated_charset_name and use
+       it to simplify report_about_all_sequences, not reporting an
+       unachievable recoding when ignored_charset is specified.
+
+       * recode.c (find_sequence): Ensure verbose is executed even if no
+       path has been found, instead of returning early.
+
+       * recode.c (optimize_sequence): Remove the compute_arrays
+       parameter, because report_about_all_sequences now studies the
+       produced arrays.  Callers changed.
+
+       * recode.c (optimize_sequence): While merging rfc1345 steps, also
+       merge qualities instead of assuming REVERSIBLE.
+       Reported by Rejean Payette.
+
+       * recode.h: Declare strict_mapping.
+       * recode.c (complete_pairs): Do not set quality, this is done
+       elsewhere in all cases.  But do preset the file recoding routine.
+       * applemac.c, atarist.c, nextstep.c: In declare_step calls, lower
+       the recoding quality to some *_TO_MANY whenever strict mapping is
+       in use, also specify NULL as the file recoding routine because
+       complete_pairs now initializes it.
+       * ibmpc.c: Idem.  But override file_recode after complete_pairs.
+
+       * ibmpc.c (file_latin1_ibmpc, file_ibmpc_latin1): Repeat the
+       algorithm, but using the one_to_many table when strict mapping.
+
+       * recode.c (declare_double_step): Create both single steps without
+       the help of declare_step, this spares four probes in the charset
+       table per call.
+
+Fri Dec 10 00:02:19 1993  Francois Pinard  (pinard@icule)
+
+       * recode.h: Add CHARSET and struct charset, use CHARSET *before
+       and after instead of int start_charset and goal_charset in STEP,
+       declare rfc1345 as CHARSET * instead of int, delete struct
+       double_link and rfc1345_link declaration and rather include the
+       DOUBLE_TABLE right in CHARSET, add a DOUBLE_TABLE parameter to
+       declare_double_step,
+       * recode.c: Make all necessary related changes.  Renaming of many
+       variables and cleanup, too numerous to report here.  Delete
+       name_from_value and ignored_array in favor of new CHARSET fields.
+
+       * recode.c: Change :rfc1345 to rfc1345.  Add `.' as an alias.
+       (report_about_all_sequences): Avoid rfc1345 instead of avoiding
+       names beginning with colon.
+
+       * applemac.c: Renamed (once again) from macintosh.c.  The codes
+       will be kept different until further study.  Comment out the
+       aliasing of applemac to macintosh.
+       * ibmpc.c: Comment out the aliasing of ibmpc to ibm437, because
+       making the codes equivalent requires further study.
+       * Makefile.in: Adjusted.
+
+       * recode.c: Implement --ignore (-x) option and ignored_array.
+       (find_charset): Progressively initialize ignored_array to zero.
+       (find_sequence): Ignore steps with an ignored start charset.
+       (decode_before_after): Process the ignored charset.
+
+       * recode.c (usage): Make the output little more legilable through
+       spacing.  Insist on -l, mention the Info documentation, propose a
+       few selected charsets.
+       Reported by Martin Maechler.
+
+       * recode.c: Rename make_include_mode into make_header_mode,
+       include_name into header_name, output_include_file into
+       output_header_file, turn --include option name into --header.
+
+       * recode.c: Add before_name and after_name, use them in
+       decode_before_after and in output_header_file.  This prevents
+       the spurious canonalization of alias charset names.
+
+       * recode.c: Implement --strict (-s) option.
+       (complete_pairs): Accept a step parameter and slip the generated
+       table in it instead of returning the table.  Adjust for --strict.
+       (init_recode_rfc1345): Adjust for complete_pairs.
+       * atarist.c, macintosh.c, nextstep.c: Idem.
+       * ibmpc.c: Idem.  Also rewrite code for --graphics (-g).
+
+       * recode.h: Declare ascii_graphics, diacritics_only and
+       diaeresis_char.
+       * ibmpc.c: Delete the ascii_graphics declaration.
+       * lat1ltex.c, ltexlat1.l: Delete the diacritics_only declaration.
+       * ascilat1.l, txtelat1.l: Delete the diaeresis_char declaration.
+       * mergelex.awk: Have it work when there is no %{ ... %} part.
+
+       * recode.c (report_about_all_sequences): Report charsets which are
+       dynamically discoverd to recode identically by "ONE to SAME".
+
+       * recode.c: Declare HASH_TABLE_SIZE, hash_string.  Rewrite
+       find_charset and declare_alias to use hashing.  Also adjust
+       list_charsets and decode_before_after.
+
+Thu Dec  9 18:39:41 1993  Francois Pinard  (pinard@icule)
+
+       * recode.c: Delete name_from_value function, replace with an
+       array of same name.  Delete field refer from struct charset,
+       initialize and use name_from_value instead.
+
+       * Makefile.in (clean): Remove *.a, for librec.a.
+       Reported by Pierre Gaumond.
+
+       * Makefile.in (clean): Move in *.o from mostlyclean.
+
+       * rfc1345.pl: Print progress on stderr, for entertaining me.
+       Document aliases in rfc1345.texi through English sentences.
+
+Wed Dec  8 00:15:51 1993  Francois Pinard  (pinard@icule)
+
+       * flexlib.c: New, for -lfl does not work everywhere.
+       * mergelex.awk: Produce a yywrap function in section 3.
+       * configure.in: Configure flexlib.o in LIBOBJS if necessary.
+       * Makefile.in: Adjusted accordingly.
+
+       * recode.c (name_from_value): Renamed from true_charset_name.
+       (find_charset): Add a "create" parameter, merge in new_charset.
+       (new_charset): Deleted.  All callers changed.
+
+       * recode.h: If not __STDC__, have _() return (), not empty.
+       Reported by Pierre Gaumond.
+
+       * Makefile.in (distclean): Remove config.h.
+
+       * bangbang.c, cdcnos.c: Use "while (x = y, x != z)" instead of
+       "while ((x = y) != z)".
+
+       * install.sh: Attach execute permission to this file.
+       Reported by Pierre Girard.
+
+       * lat1ltex.c: Produce {\i} instead of \i{}.  It's nicer.
+       Reported by Pierre Girard.
+
+       * recode.c: Declare argmatch.  Default charsets were not obeyed.
+       (decode_before_after): When DEFAULT_CHARSET is defined, use it
+       instead of the empty string when calling argmatch.
+       (find_charset): Do not check for empty strings anymore.
+
+Tue Dec  7 08:54:14 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (install): Add recode.info in dependencies.
+
+       * recode.c: Use USE_TMPNAM to bracket out old tmpnam code out and
+       USE_TMPFILE to allow in new tmpfile code.
+       (execute_pass_sequence):  Use tmpfile instead of tmpnam.
+       Reported by Bastian Schlueter (suggests that -i => -o on NeXT).
+       Reported by Ronald C.F. Antony.
+       Reported by Andreas Schwab.
+
+       * recode.c (output_include_file): Ensure a valid C identifier for
+       the table name.  RFC 1345 uses bizarre names in that respect.
+
+       * recode.c (main): While moving the new file over the original,
+       properly diagnose any failure.
+       Reported by David Lebel.
+
+       * recode.c: Add decoding_charset_flag.
+       (usage): Print `Try recode --list' instead of `Try recode --help'
+       whenever decoding_charset_flag is true.
+       (decode_before_after): First set, then reset decoding_charset_flag.
+
+       * recode.c (echo_sequence): Use a shorter print format, now that
+       we have real long charset names...
+
+       * recode.c: Revert to using a `struct charset' to handle names and
+       alias.  Turn charset_name into true_charset_name and charset_value
+       into find_charset.
+
+       * Makefile.in (LIBOBJS): Put more on the second line, because if
+       @LIBOBJS@ is substituted empty, some make's barf at last `\'.
+       (recode.dvi): TEXI2DVI was mispelled.
+       Reported by Martin Maechler.
+
+       * recode.c: Implement --list (-l) to alleviate Usage message.
+       (compare_charset_names, list_charsets): New.
+
+Mon Dec  6 12:13:32 1993  Francois Pinard  (pinard@icule)
+
+       * rfc1345.txt: New, from elsewhere.
+       * rfc1345.sed, rfc1345.pl: New.
+       * Makefile.in: Handle rfc1345.c, distribute all of these.
+       * recode.c (declare_double_step): New.
+       (optimize_sequence): Replace all double steps through :rfc1345 by
+       a single step which will properly initialize itself.  Diagnose any
+       remaining single step which uses :rfc1345 explicitely.
+       (register_all_modules): Make latin1 an alias for iso-8859-1-1987.
+       (report_about_all_sequences): Truncate the charset
+       names as needed, avoid considering charsets named `:*' alone.
+       (usage): Avoid printing `:*' steps as available.
+       * ascilat1.l, cdcnos.c, ebcdic.c, flat.c, lat1asci.c: Change name
+       of ascii charset to ascii-bs, keeping it separate from RFC 1345.
+       * ibmpc.c: Make ibmpc an alias for ibm437.
+       * Makefile.in (check): Adjusted for ascii-bs.
+
+       As a side result of all this, more charsets are supported.
+       Reported by Per ?: who wanted IBM codepages in recode.
+       Reported by Hermann Hueni: who wanted Roman8 in recode.
+
+       * Makefile: Merge C_STEPOBJS and L_STEPOBJS into STEPOBJS.
+
+       * recode.c: Make -h argument optionnal, it was mandatory.
+       * recode.c: Include the quality in -a and -v output, repeat -v
+       output after step optimization if this changed something.
+
+       * recode.h: Declare enum quality, QUALITY, quality_to_string and
+       merge_qualities.  From STEP, delete the multichar_input,
+       multichar_output, loosing and reversible fields.  Add one QUALITY
+       argument and two functionnal arguments to declare_step.
+       * all: Implement the preceeding changes.
+
+       * recode.h: Use the _((...)) device more systematically.
+       Declare xmalloc.
+
+Sun Dec  5 00:09:19 1993  Francois Pinard  (pinard@icule)
+
+       * ascilat1.l, bangbang.c, cdcnos.c, ibmpc.c, iconqnx.c,
+       lat1asci.c, lat1ltex.c, lat1txte.c, ltexlat1.l, macintosh.c,
+       txtelat1.l: Avoid using octal and hexadecimal, stick to using
+       decimal.  Define constants when this helps source readability. 
+       * flat.c: Replace octal masks with "<<" expressions.
+       * unhexify.l: New file.
+       * Makefile.in: Distribute it.
+       (detecthex, unhexify): New goals.
+
+       * atarist.c: New charset.
+       * Makefile.in: Adjusted.
+       * recode.c: Use "atarist" as DEFAULT_CODE if atarist is defined.
+       Reported by Andreas Schwab.
+
+       * nextstep.c: New charset.
+       * Makefile.in: Adjusted.
+       Reported by Bastian Schlueter.
+       Reported by Ronald C.F. Antony.
+
+       * flat.c: Do not declare cccascii nor cdcascii.  Delete
+       file_drop_8th_bit.
+
+       * recode.c (complete_pairs): Produce better diagnostics.
+       Allow for NULs in known pairs, even if currently unused.
+
+Sat Dec  4 14:00:39 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Use .stamp-h.in to solve Autoconf problems.
+       Distribute mkinstalldirs and install.sh.  Use mkinstalldirs.
+       * mkinstalldirs: New, from elsewhere.
+       * install.sh: New, from elsewhere.
+
+       * Makefile.in (recode.info): On $(MAKEINFO) call, use
+       "-I$(srcdir)" instead of "-o recode.info".
+
+       * ebcdic.c: Inclusion of GNU dd's "ibm" recoding, with two
+       modifications so the recoding becomes reversible.  Removal of
+       static inverse tables, dynamically recreate them instead.
+       Replacement of cccascii and cdcascii by ascii, use ebcdic-ccc
+       instead of ebcdic in the context of disappearing cccascii.
+       * recode.c (invert_table): New.
+       * recode.h: Declare it.
+
+       * recode.c: Replace CHARSET struct and charset_array by
+       charset_name_array and charset_value_array, then make all
+       necessary changes.  Use argmatch for charsets.
+       * argmatch.c: New, from elsewhere.
+       * $(C_STEPS), $(L_STEPS):  Remove all four letter aliases, except
+       "ltex" for "latex" and "txte" for "texte".
+       * recode.c (register_all_modules): Declare "lat1" as an alias for
+       "latin1".
+       * macintosh.c: Renamed from old applemac.c.  Declare "macintosh"
+       as the charset name and "applemac" as an alias.
+       * Makefile.in: Adjusted.
+       (check): Write charsets in full.
+       
+Fri Dec  3 01:08:44 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Add .stamp-collect for preventing initstep.h to be
+       uselessly touched, this was causing recode.c recompilations.
+
+       * recode.c: Implement output_include_file.
+
+       * recode.c: Extract file_mere_copy from execute_sequence, then
+       implement file_one_to_one, file_one_to_many, merge_steps and
+       optimize_sequence.
+       * recode.h: Declare these when not static.
+       * flat.c: Use file_mere_copy instead of NULL as file_recode.
+       * applemac.c, ebcdic.c: Use file_one_to_one.
+       * bangbang.c, cdcnos.c, lat1asci.c, lat1ltex.c, lat1txte.c: Use
+       file_one_to_many.
+
+       * recode.h: Rename STEP field recode_file to file_recode and make
+       it return void instead of int, add init_recode and one_to_one
+       fields, declare KNOWN_PAIR structure and complete_pairs function.
+       * recode.c, $(C_STEPS), $(L_STEPS), mergelex.awk: Adjust.
+       * recode.c (declare_step): Initialize new fields.
+       (find_sequence): Initialize planned steps when possible.
+       (complete_pairs): New, adapted from maketabl.c.
+       * applemac.c: Use initialization and include macilat1.mtb table.
+       * ibmpc.c: Use initialization and include ibmplat1.mtb table.
+       * macilat1.mtb, ibmplat1.mtb, maketabl.c: Deleted.
+       * Makefile.in: Adjusted.
+
+       * ltexlat1.l: Use {After} at more places, "accro\^\i tre" was not
+       recoded at all.
+
+Thu Dec  2 15:29:40 1993  Francois Pinard  (pinard@icule)
+
+       * recode.c, all $(C_STEPS), all $(L_STEPS): Include "recode.h"
+       instead of "config.h".
+       * recode.h: New.
+
+       * all $(C_STEPS): Delete "#define STEP <name>", because STEP will
+       be a describing structure from now on.  Add module_<name> function
+       for initializing STEPs.  Rename void STEP() to static int
+       recode_file(), add a first parameter for transmitting STEP.
+       * all $(L_STEPS): Delete "#define STEP <name>" and instead, use
+       "/* Step name: <name>.  */".
+       * mergelax.awk: Do the proper thing with /* Step name: <name>.  */
+       * steps.h: Deleted.  Information which was contained there has
+       been spread out in modules instead, for adding flexibility.
+       * recode.c: Initialize all modules by including "initstep.h".
+       * Makefile.in: Dependencies for recode.h and initstep.h.
+       (initstep.h): Make it by extracting module_* lines from sources.
+
+       * recode.c: Rename MAX_CONVERSION into MAX_SEQUENCE.  Introduce
+       MAX_CHARSETS, MAX_SINGLE_STEPS, charset structure and array,
+       single_step array and related counters, functions declare_step
+       and declare_alias.  Many other renaming of variables, too
+       numerous for here.  Adapt all of the code so this works.
+       * xmalloc.c, xstrdup.c: New, from elsewhere.
+
+       * bangbang.c: Merged from lat1bang.c and banglat1.c.
+       * cdcnos.c: Merged from ascicdcn.c and cdcnasci.c.
+       * ebcdic.c: Merged from cccaebcd.c, cdcaebcd.c, ebcdccca.c and
+       ebcdcdca.c.
+       * flat.c: Merged from asc8asc7.c and asciflat.c.
+       * ibmpc.c: Merged from lat1ibmp.c and ibmplat1.c.
+       * iconqnx.c: Merged from ibmpicon.c and iconibmp.c.
+       * Makefile.in: Adjusted.
+
+       The net effect of all these changes is that charsets or their
+       single step methods are now easily configurable out of recode by
+       merely deleting them from C_STEPOBJS or L_STEPS in Makefile.
+       Reported by Claude Goutier.
+
+Wed Dec  1 10:13:37 1993  Francois Pinard  (pinard@icule)
+
+       * ltexlat1.l: Ensure \'{e} is recognized as \'e.
+       Reported by Pierre Girard.
+
+       * txteasci.l: Deleted for easing maintainance, there was too much
+       common code with txtelat1.l, and also, the "texte" charset is
+       prone to loosing characters, when used as an intermediate.
+       Reported by Claude Goutier.
+
+       * ascitxte.l: Deleted likewise, almost same functionnality is
+       available through lat1txte.c.
+       * ltexasci.l: Deleted for easing maintainance, there was too much
+       common code with ltexlat1.l.
+       * asciltex.l: Deleted likewise, almost same functionnality is
+       available through lat1ltex.c.
+       * lat1asci.c: New, so "ascii" charset is connected to others.
+       * ascilat1.l: New, for same reason.
+       * Makefile.in: Adjusted.
+
+       * Makefile.in (check): Diagnose unachievable recodings.
+       * recode: Implement --auto-check (-a) option.
+       (report_about_all_sequences): New.
+       (find_sequence): When recoding is not possible, return with a
+       negative value in length_of_sequence, do not call error.
+       (main): Call error if recoding is not possible.
+
+       * configure.in: Replace DEFAULTCODE by DEFCHARSET.
+       * Makefile.in: Same, plus replace DEFAULT_CODE by DEFAULT_CHARSET.
+       * recode.c: Same, plus replace [*_]code[_*] by [*_]charset[_*],
+       NUMBER_OF_KEYWORDS by NUMBER_OF_CHARSETS and keyword_index by
+       charset_index.
+       * steps.h: Same things.
+
+       * recode.c (usage): Tell which is the default code value.
+
+       * recode.c: Implement --graphics (-g) option, and ascii_graphics.
+       * ibmplat1.c: Rename graphics_mode to ascii_graphics, making it
+       external.  Use, document and revise CONVERT_GRAPHICS constant,
+       introducing "round" corners and more systematic principles.
+
+Tue Nov 30 09:35:04 1993  Francois Pinard  (pinard@icule)
+
+       * recode.c: Process long options, then --help and --version.
+       Rename usage_and_exit() into usage(), accepting a parameter,
+       print a reminder about --help on stderr when in error, else
+       the longer usage message on stdout.  Adjust all calls.
+       (print_copyright): Deleted, use copyright_string instead.
+       (print_version): Deleted, use version_string instead.
+       * getopt1.c: New.
+       * Makefile.in: Take care of getopt1.c.
+
+       * HINTS: New file, to let README be smaller.
+
+       * steps.h: Remove ENUM_INT_BUG code.  The README did announce that
+       this code will disappear if nobody report it as necessary.
+
+       * banglat1.c: Add "!;" to \346 for "ae" and "!<" to \367 for "oe".
+       * lat1bang.c: Do the converse translatation.  "oe" is a kludge!
+       Reported by Pierre Gaumond.
+
+       * checkit: Always output "Checking" messages, regardless of -v.
+       Have those messages resembling more to the actual recode calls.
+       Remove now useless error identification messages.
+       Use "cmp -s" instead of "diff" for comparing files.
+       * Makefile.in: Use $(SHELL) instead of sh in CHECKTEST. Remove -v.
+
+Mon Nov 29 10:23:39 1993  Francois Pinard  (pinard@icule)
+
+       * recode.c (main): Declare argv as "char *const *argv" instead of
+       "const char *argv[]", for avoiding conflicts with some getopt().
+       Reported by Stephane Berube.
+       Reported by Andreas Schwab.
+
+       * Makefile.in (Makefile): Use $(SHELL).
+       (config.status): Use "$(SHELL) config.status --recheck" instead of
+       "configure --no-create".
+
+       * Makefile.in (LIBS): Include @LEXLIB@, Flex 2.4.1 needs this.
+       * configure.in: Test AC_ISC_POSIX earlier, AC_PROG_LEX needs it.
+
+       * txteasci.l: Move texte_ascii_diaeresis in section 3, because
+       Flex 2.4.1 does not get YY_CHAR defined for section 1.
+       * txtelat1.l: Move texte_latin1_diaeresis in section 3.
+       * mergelex.awk: Deeply revised.  Now able to merge Flex sources
+       having a non-empty section 3.  No more forward declarations for
+       yytext, yyleng, etc.  The output begins with a warning comment
+       saying this is a derived file, followed by the first block comment
+       found in any input file.  Produce an output cleaner for the eye.
+       * Makefile.in (merged.c): Remove synchronization directives, they
+       are useless for now.  Delete new temporary files merged[123].tmp.
+
+Wed Jun  9 15:00:58 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (dist): Replace "echo `pwd`" by a mere "pwd".
+       Adapt to the .gz change.
+
+Thu May  6 18:44:53 1993  Francois Pinard  (pinard@icule)
+
+       * asciflat.c: Transmit TAB and BKS, instead of using ^I or ^H.
+       However, BKS for applying a diacritic will still disappear.
+       Reported by Marc Verreault.
+
+       * Makefile.in: Use $U prefix for defining the .o dependencies over
+       include files obtained through maketabl.
+       Reported by Claude Goutier.
+
+       * c-boxes.el, cccaebcd.c, ebcdccca.c, getopt.[ch], iconibmp.c,
+       maketabl.c, mergelex.awk, recode.c, recode.texi, steps.h,
+       txteasci.l: Remove spurious suffix whitespace.
+       Reported by Claude Goutier.
+
+Tue May  4 07:58:26 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (dist): Use a gzipping tar, not a compressing one.
+
+       * checkit: Make checkit.tmp writeable, so it can be removed.  It
+       is commonly obtained by cp'ing COPYING.
+
+Mon May  3 21:19:45 1993  Francois Pinard  (pinard@icule)
+
+       * recode.c (execute_pass_sequence): Reverse the test on
+       input_name, controlling the fclose (input_file).
+       Reported by David Lebel.
+       Reported by Andreas Schwab.
+
+       * maketabl.c: New.
+       * Makefile.in: Distribute maketabl.c, use it for processing
+       ibmplat1.mtb and macilat1.mtb, take care of all dependencies.
+
+       * ibmplat1.mtb: New.
+       * ibmplat1.c: Use ibmplat1.h, while implementing graphics_mode.
+       This have the side effect of correcting the 1/2 symbol, which was
+       translated to 1/4, and the 1/4 symbol, which was translated to <<.
+       * lat1ibmp.c: Use lat1ibmp.h.
+       * steps.h: Replace LOOSE by EXACT for ibmp from/to lat1 entries.
+       Reported by Robert Joop.
+
+       * macilat1.mtb, macilat1.c, lat1maci.c: New.
+       * ibmpmaci.c, maciibmp.c: Deleted.
+       * steps.h: Remove old maci from/to ibmp, add new maci from/to lat1.
+       Reported by Joelle Stemp: copy of Macintosh character tables.
+       Reported by Jacques Richer: end of lines represented by 0x0d.
+
+Sat Feb  6 10:29:43 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: In dist goal, ensure 777 mode for directories, so
+       older tar's will restore file modes properly.
+
+       * asciflat.c: Remove old commented lex code.  Remove a useless
+       `case EOF:' from inner switch, the logic will work anyway.
+
+Sun Jan 17 15:50:28 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Put $(CFLAGS) after $(CPPFLAGS), so the installer
+       can override automatically configured choices.
+       Reported by Karl Berry.
+
+Sat Jan 16 09:54:03 1993  Francois Pinard  (pinard@icule)
+
+       * checkit: Do not call recode in verbose mode on /dev/null prior
+       to the first "Checking" message.  Rather call recode in verbose
+       mode only once, combined within the first test in a series.
+
+Thu Jan 14 01:15:23 1993  Francois Pinard  (pinard@icule)
+
+       * configure.in: Use AC_CONST.
+
+       * Makefile.in: Distribute getopt.h.  Add as getopt.o dependency.
+       Reported by Pierre Gaumond.
+
+Wed Jan 13 10:38:25 1993  Francois Pinard  (pinard@icule)
+
+       * recode.c: Merge in version.c.
+       * version.c: Deleted.
+
+       * All .c, mergelex.awk: Conditionnally include config.h, and do
+       not include common.h anymore.  Update Copyright year lists.
+       * common.h: Deleted.
+       * Makefile.in: Do not distribute common.h, but do distribute
+       config.h.in.  Have all objects depend upon config.h.  Force -I. in
+       CPPFLAGS so config.h will be found whenever --srcdir is used.
+       Newer version of autoconf related goals.
+       * configure.in: Use AC_CONFIG_HEADER.
+       * checkit: Study config.h instead of config.status.
+
+       * Makefile.in: Use texi2dvi instead of tex.
+       Reported by Martin Maechler.
+
+       * Makefile.in: Cleanup and reorganization.  New info and dvi
+       goals.  Remove recode.info from all.  Define and use MAKEINFO and
+       TEXI2DVI.  Use ALLOCA, because of getopt.  Distribute THANKS file.
+       Rename HDRS, SRCS and OBJS into HEADERS, SOURCES and OBJECTS.
+       Merge LIBSRCS and MSDOS_OBJS, remove them.
+
+       * alloca.c: New, from elsewhere.
+       * configure.in: Use AC_ALLOCA.
+
+       * getopt.c: Use more recent version.
+       * getopt.h: New, from elsewhere.
+
+       * recode.c: Replace tempnam by tmpnam.  Always allocate the
+       temporary file names statically, because some tmpnam's require
+       this.  Also delay tmpnam until open time, for NeXT's.
+       * pathmax.h: New, from elsewhere.
+       * Makefile.in: Distribute pathmax.h.
+       Reported by Andreas Mueller.
+
+       * configure.in: Replace AC_USG by AC_HAVE_HEADERS(string.h).
+       * recode.c: Replace USG test by HAVE_STRING_H test.
+
+       * recode.c: Everywhere, use error instead of assert or perror.
+       Include errno.h and conditionnaly declare errno.  Reformulate
+       `if ((var = value) == test)' by `if (var = value, var == test)'.
+       Use error in place of `fprintf(stderr, ...); exit(EXIT_FAILURE)'.
+       * error.c: New, from elsewhere.
+       * Makefile.in: Use and distribute error.c.
+
+       * recode.c: Remove unnecessary system prototypes.
+
+Fri Jan  1 20:07:36 1993  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Reinstate $(CPPFLAGS), use it.  Richard wants it
+       there.
+
+Sat Nov 28 20:47:17 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (clean, distclean): Remove ansi2knr rubbish.
+       Reported by Pierre Gaumond.
+
+       * Makefile.in: Remove all .PHONY's.
+
+Wed Nov 18 14:03:21 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Add definition for INSTALL.
+       Reported by Larry W. Virden.
+       Reported by Bastian Schlueter.
+       Reported by Ronald C.F. Antony.
+
+Wed Nov 18 13:38:39 1992  Jim Meyering  (meyering@idefix.comco.com)
+
+       * recode.c (most functions): Declare static.
+
+       * ascicdcn.c, cccaebcd.c, cdcaebcd.c, ebcdccca.c,
+       ebcdcdca.c, ibmplat1.c, ibmpmaci.c, lat1bang.c,
+       lat1ibmp.c, lat1ltex.c, lat1txte.c, maciibmp.c, recode.c,
+       steps.h: Declare with const attribute all static tables
+       and pointer variables that traverse them.
+
+       * recode.c: Declare `sequence' to be an array of const pointers.
+       (find_sequence): Declare the `step' field of critical_tree
+       with const attribute.
+
+       * steps.h [struct keyword_struct]: Separate type definition
+       and variable declaration.
+
+Fri Nov 13 00:12:01 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in (dist): chmod a+r before making the tar file.
+
+Thu Nov 12 23:58:02 1992  Francois Pinard  (pinard@icule)
+
+       * aclocal.m4: Update FP_STDC_CHECK, replacing by FP_PROTOTYPES.
+       * configure.in: Adjust accordingly.
+\f
+Wed Oct  7 17:58:32 1992  Francois Pinard  (pinard@icule)
+
+       * Version 3.2.4 to alt.sources, and later on prep.
+
+Tue Oct  6 12:51:42 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Use exec_prefix.  Add `uninstall'.
+
+Tue Sep 29 14:57:26 1992  Francois Pinard  (pinard@icule)
+
+       * recode.c: Define EXIT_SUCCESS and EXIT_FAILURE if not defined,
+       even after inclusion of <stdlib.h>, for SunOS 4.
+
+       * Makefile.in: Add a completion message to `make check'.
+
+       * configure.in: Make the `WARNING:' bigger if no Flex.
+\f
+Fri Sep 25 11:36:47 1992  Francois Pinard  (pinard@icule)
+
+       * Version 3.2.3.
+
+       * HINTS: New file, used to simplify README.
+       * Makefile.in: Distribute HINTS.
+
+       * configure.in: Remove tests for Apollo's and 286 systems.
+       * steps.h: Replace XENIX by ENUM_INT_BUG.
+       * HINTS: Tell about Apollo's and 286 systems installation hints.
+
+Thu Sep 24 16:51:33 1992  Francois Pinard  (pinard@icule)
+
+       * recode.c: Write `Recoding...' instead of `recoding...'.
+
+       * asciflat.c: Insure looking one character ahead at all times.
+       This also solves a bug by which the second diacritic of a pair of
+       two diacritics in a row was not properly flattened out.
+
+Wed Aug 26 10:40:11 1992  Francois Pinard  (pinard@icule)
+
+       * ltexlat1.l: Given `*' is a diacritic operation, insure
+       swallowing '{}' in `\*\i{}'.  Recognize also `\*{\i}'.
+
+       * asciltex.l: Prefer `\c{c}' to `\c c'.
+       * lat1ltex.c: Idem.
+
+       * lat1ltex.c: Insure NULs will go through.
+
+       * recode.c: Implement the -d `diacritics_only' option for LaTeX.
+       * asciltex.l: Idem.
+       * lat1ltex.c: Idem.
+       * ltexasci.l: Idem.
+       * ltexlat1.l: Idem.
+
+Sun Aug 23 07:50:38 1992  Francois Pinard  (pinard@icule)
+
+       * recode.texi: Merging in some other separate documents.
+       * table.texi, DisplayCode: Deleted.
+       * Makefile.in: Adjusted.
+
+       * configure.in: Split FP_STDC_CHECK out into aclocal.m4.
+       * aclocal.m4: New.
+       * Makefile.in: Distribute aclocal.m4.
+
+       * version.c: Insure next version will be 3.2.3, skipping 3.2.1 and
+       3.2.2, jumping over parallel numbering at U. de Montre'al.
+
+Wed Aug 19 16:33:25 1992  Francois Pinard  (pinard@icule)
+
+       * ansi2knr: New, from Ghostscript distribution.
+       * configure.in: Check for __STDC__ and define U.
+       * Makefile.in: Use U and ansi2knr.
+       * All .c's: Remove many __STDC__ checks.
+       * mergelex.awk: Remove generation of __STDC__ checks.
+
+Mon Jul 20 23:37:23 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Use various clean goals according to latest GNU
+       standards.  Moreover, add a recode.dvi goal and a texclean goal.
+
+Thu Jul 16 18:49:48 1992  Francois Pinard  (pinard@icule)
+
+       * configure.in: Changes for Autoconf 0.120.  Also test for popen,
+       even if almost any UNIX has it; so the user can later undefine it from
+       DEFS; avoid testing for pipe because of an old bug in this area.
+       * Makefile.in, recode.c, checkit, common.h: Replace all *_MISSING
+       by HAVE_*.
+
+Thu Jun 18 07:44:58 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Changes for Autoconf 0.118.  Use AWK and LEX
+       instead of GAWK and FLEX.
+
+Thu Jun  4 21:48:53 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Changes for Autoconf 0.115.  Use config.status to
+       recreate Makefile from Makefile.in.
+       * checkit: Retrieve DEFS value from config.status instead of
+       Makefile.
+
+Mon Jun  1 23:06:44 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in, configure.in: Changes for Autoconf 0.112.  Avoid
+       FP_PROG_MAKEINFO and use `makeinfo' directly.
+       * checkit: Get DEFS from Makefile instead of from config.status.
+
+Sun Feb  2 16:23:11 1992  Francois Pinard  (pinard@icule)
+
+       * recode.c (main): Returns int.
+
+Thu Jan 30 12:14:44 1992  Francois Pinard  (pinard@icule)
+
+       * Makefile.in: Use new names for clean goals.
+
+Mon Dec  2 20:30:53 1991  Francois Pinard  (pinard@icule)
+
+       * steps.h, recode.c: Removed comma at end of enum's.
+
+       * version.c: Added a few const's.
+
+Sat Nov 30 23:40:39 1991  Francois Pinard  (pinard@icule)
+
+       * recode.c: Use EXIT_FAILURE and EXIT_SUCCESS; define them if not
+       STDC_HEADERS.
+
+       * recode.c: Prototypes added for fstat, getopt, link, perror,
+       unlink and utime, if __STDC__.
+
+Thu Nov  7 11:21:38 1991  Francois Pinard  (pinard@icule)
+
+       * recode.texi: Should now be TeXable.
+       * Makefile.in: Insure distributing texinfo.tex.
+
+       * ibmpicon.c, iconibmp.c: Use 0x1E for QNX end of lines, 0x0E was
+       wrong.
+
+       * configure.in: Take care of POSIXish ISC.
+
+Tue Nov  5 09:47:15 1991  Francois Pinard  (pinard@icule)
+
+       * configure.in, Makefile.in: Do not absolutize $(srcdir), because
+       this could create problems with automounters.
+
+       * configure.in, Makefile.in: Remove IF_* devices, they were
+       solving a problem caused only by non timestamping shars, and
+       recode is now distributed in tar or zoo format.
+
+Mon Nov  4 18:14:49 1991  Francois Pinard  (pinard@icule)
+
+       * configure.in: Get rid of the head program, using sed.  I would
+       also like, eventually, to get rid of file and grep programs too.
+
+Fri Nov  1 12:30:59 1991  Francois Pinard  (pinard@icule)
+
+       * recode.c (main): Use rename library routine if available.
+       * configure.in: Check for rename availability.
+
+       * Makefile.in: Insure gawk is executed in the source directory
+       while preparing merged.c.
+
+       * recode.c (execute_pipe_sequence): Close descriptor after dup2.
+       Still bugged.
+
+       * recode.c (code_index): Reject partial matches for keywords.
+       Reported by Laurent Bourbeau.
+
+Mon Oct 28 14:39:36 1991  Francois Pinard  (pinard@icule)
+
+       * configure.in: New.
+       * configure: Automatically regenerated from file configure.in
+       and David MacKenzie's autoconf.
+\f
+Mon Oct 28 12:08:31 1991  Francois Pinard  (pinard@icule)
+
+       * Version 3.2.
+
+       * all: Replace GPL version 1 by GPL version 2.
+
+       * Makefile.in: Use `sh checkit' instead of `./checkit'.  For an
+       unknown reason, the Sparc requires this.
+
+       * recode.c: Define str[r]chr to be [r]index if not USG.
+
+       * recode.c: Force binary mode on files for MSDOS.
+
+Sun Oct 27 11:03:07 1991  Francois Pinard  (pinard@icule)
+
+       * recode.c: MSDOS port.  tempnam(), utime(), link() and getopt()
+       were missing; replacements inspired from by Rahul Dhesi's flip.
+       * configdos.pl, config.tcc: New.
+       * getopt.c: New, AT&T freed code.
+       * Makefile.in: Adjustements for MSDOS port, dist.dos goal.
+
+Fri Oct 25 09:35:10 1991  Francois Pinard  (pinard@icule)
+
+       * recode.c (execute_popen_sequence, execute_pipe_sequence):
+       Accept non filter mode.
+       (execute_pipe_sequence): Wait for children.  Still bugged.
+
+       * configure: Test dup2.
+       * recode.c: Have DUP2_MISSING imply PIPE_MISSING, for now.
+
+       * checkit: New.
+       * Makefile.in: Use checkit in check goal.
+
+Wed Oct 23 13:14:33 1991  Francois Pinard  (pinard@icule)
+
+       * recode.c: Revert back to -v instead of -q.  Give the user some
+       more control on the sequencing strategy through -i, -o and -p.
+       Get rid of any USE_FILE, USE_POPEN and USE_PIPE.  However, keep
+       POPEN_MISSING and PIPE_MISSING around, for MSDOS.  Segregating
+       between `popen' and `pipe' is only experimental, while trying to
+       have `pipe' working correctly.
+
+       * configure, Makefile.in: New.  Many new configuration features.
+       Among others, through IF_FLEX, be careful to never loose merged.c
+       on those systems which do not have the machinery to remake it.
+       * GNUmakefile, Makefile, Depends: deleted.
+
+Sun Mar 31 17:50:04 1991  Francois Pinard  (pinard@icule)
+
+       * mergelex.awk: remove exit() and read() definitions.
+
+Tue Jan 22 13:58:43 1991  Francois Pinard  (pinard@icule)
+
+       * ibmpicon.c, ibmplat1.c, ibmpmaci.c: Recognize old DOS end of
+       file (0x1A).
+
+Mon Jan 21 09:28:47 1991  Francois Pinard  (pinard@icule)
+
+       * lat1bang.c, lat1txte.c: Have the no-break space converted to a
+       single space.
+
+Tue Jan 15 09:46:46 1991  Francois Pinard  (pinard@icule)
+
+       * all: While/if ((var=exp) [test]) -> while/if (var=exp, var [test]),
+       switch (var=exp) -> var=exp; switch (var).
+
+       * recode.c (code_index): Use usage_and_exit ().  Moved.
+       * recode.c (echo_sequence): Print format changed.
+       * recode.c: Issue `recoding FILE ...done' messages, unless -q.
+
+       * ibmplat1.c, lat1ibmp.c, ibmpmaci, maciibmp.c, txteibmp.c:
+       While reading MS-DOS files, 0x0D followed by 0x0A is converted
+       to an end of line; while writing MS-DOS files, end of lines
+       are converted to 0x0D 0x0A.
+       * ibmpicon.c, iconibmp.c: While reading QNX files, 0x0E is
+       converted to 0x0D 0x0A; while writing QNX files, 0x0D followed
+       by 0x0A is converted to 0x0E.
+
+       * txteibmp.l: Deleted.
+       * steps.h: Remove references to texte_ibmpc.
+
+       * steps.h: Remove DONT_LEX conditionals; merged.c is always
+       available for installation.
+
+Wed Jul  4 19:01:56 1990  Francois Pinard  (pinard@icule)
+
+       * all: Copyright directly assigned to the FSF.
+
+Mon Mar 26 13:19:24 1990  Francois Pinard  (pinard@icule)
+
+       * txteasci.l, txteibmp.l, txtelat1.l: Change occurrences of a NUL
+       terminated cursor by a counter from 0 to yyleng-1.  This will
+       insure proper transmission of NULs through Flex, which can now
+       handle them.
+
+       * mergelex.awk: Make use of -8 option of Flex 2.2 alpha, adjust
+       documentation, insure proper pre-declarations of Flex variables
+       yytext, yyleng, yyint and yyout.
+
+Fri Mar 23 19:24:08 1990  Francois Pinard  (pinard@icule)
+
+       * recode.c (execute_popen_sequence): Get rid of unused variables.
+
+       * recode.c (code_index): Change index to counter, because on BSD
+       index is a library function.
+\f
+Fri Mar 16 10:17:48 1990  Francois Pinard  (pinard@icule)
+
+       * Version 3.1.
+
+Thu Mar 15 19:22:53 1990  Francois Pinard  (pinard@icule)
+
+       * version.c, recode.c (usage_and_exit): Change -V to -C to give
+       the Copyright conditions, print version identification.
+
+       * txtelat1.l: Real strange bug aroud Flex.  I ought to blindly
+       remove the specific case of a capital A with a diaeresis to get
+       rid of a `NULL in input' Flex diagnostic.  Doing so, I introduce a
+       new bug to get rid of another :-(.
+
+       * all: Added missing prototypes declarations, missing void
+       specifications for functions, missing const; removed unused
+       variables.
+       * common.h: New.
+
+Fri Feb  9 00:20:51 1990  Francois Pinard  (pinard@icule)
+
+       * recode.c, Makefile: If no files are specified, recode stdin on
+       stdout as before.  But if files are specified, each of them is now
+       recoded over itself, preserving its time stamps unless -t option
+       is used.  To make it work on BSD, split execute_sequence in three,
+       get rid of USE_FILES and hide USE_PIPE in the Makefile.  Also, see
+       the comment before execute_sequence routines, in recode.c.
+
+       * recode.c (main): Some code for -f, to be written later.
+
+       * recode.c (usage_and_exit): Rewritten.
+
+Mon Feb  5 22:42:54 1990  Francois Pinard  (pinard@kovic)
+
+       * recode.c (usage): Added commas to improve readability.
+
+       * lat1bang.c: Have lower case output instead of upper case, this
+       is more readable.
+\f
+Sat Feb  3 07:31:50 1990  Francois Pinard  (pinard@kovic)
+
+       * Version 3.0.1.
+
+       * recode.c: Corrected bugs related to USE_POPEN; recode step path
+       is now echoed once, and diaeresis selection is now propagated.
+
+Fri Feb  2 12:58:22 1990  Francois Pinard  (pinard@kovic)
+
+       * mergelex.awk: Option USE_FPUTC, so to compile merged.c using
+       fputc instead of putc.  It will hopefully ease Apollo C compiler,
+       which litterally trashes on merged.c.
+
+Sat Jan 27 10:06:09 1990  Francois Pinard  (pinard@kovic)
+
+       * all: Adaptation for Flex.  A few yyleng problems short-circuited
+       here and there in some .l's.
+       * lexcom.c:  Eliminated.
+       * mergelex.awk: New, for merging all .l's into a single merged.l.
+       This results in a shorter a.out, by a factor of 2 in fact.
+       * asciltex.l, ascitxte.l: Slight adjustments needed to escape <'s
+       with backslashes.
+
+       * cdcnasci.c, banglat1.c: Too many putc's, simplified to shorten
+       the object modules.
+
+       * recode.c: Temporary files were improperly unlinked.  Addition of
+       a -q option (quiet), removal of -d (debug): by default, choosen
+       step path is printed on stderr.
+
+       * lat1bang.c: Replacement for disappearing ascibang.l.
+       * ascibang.l: Removed.
+
+Sun Nov 19 10:35:00 1989  Francois Pinard  (pinard@icule)
+
+       * banglat1.c, lat1bang.c, iconibmp.c, cdcnasci.c, ascicdcn.c,
+       asciflat.c: Replacements for banglat1.l, ascibang.l, iconibmp.l,
+       cdcnasci.l, ascicdcn.l, asciflat.l.  I will get rid of some
+       simpler lex routines, to get speed and save space.
+       * steps.h, version.c: Various adjustments for the preceeding
+       changes.
+
+       * Most files: Removal of the dash to restrict each file name
+       into eight character, for MS-DOS.
+
+Fri Nov 10 09:03:11 1989  Francois Pinard  (pinard@icule)
+
+       * version.c: Added.
+
+       * recode.c: Provision for -V option.
+\f
+Sun Oct 29 13:02:53 1989  Francois Pinard  (pinard@icule)
+
+       * Version 3.0.
+
+       * txte-lat1.l, lat1-txte.c: Added.
+
+       * txte-ibmp.l: Capital E with acute accent now stays capital in
+       all cases.
+
+       * recode.c: Addition of USE_FILES feature for smaller machines.
+       PIPE_OUTSIDE renamed to USE_POPEN, PIPE_INSIDE to USE_PIPE.
+       Recognition of short keywords.
+
+       * ltex-asci.l, ltex-lat1.l: \$ now correctly translated into $.
+\f
+       * History from an old recode.texinfo:
+
+         August 1988:
+
+               Some tentative new charsets for TeX and texinfo, steps
+               merged and made more uniform, usage of Unix pipes
+               instead of translating chunks one at a time.
+
+               Loic Dachary first exposed me to Easy French.  Claude
+               Goutier, through numerous discussions, was helpful in
+               evaluating various work hypotheses.
+
+         July 1988:
+
+               Ported to BSD Unix, bent to meet most GNU standards.
+
+         December 1987:
+
+               Ported to Microsoft C, tables frozen instead of being
+               computed by auxiliary programs at installation time,
+               translation sequences sought at execution time instead
+               of built-in in the program.
+
+         July 1985:
+
+               Adapted in Turbo-Pascal on an IBM-PC, translation
+               tables completely redesigned.  Dropping of CAF, RUB
+               and INT support; ASCII now used as a common base.
+\f
+       * History from Cyber `secours,/s=codes,recode' documents:
+
+         March 1983:
+
+               Version 2.0.
+
+               Merge of features from all versions.  New extensive
+               documentation, in French.  Handling of French for 95
+               character CDC printers.
+
+         November 1982:
+
+               Version 1.0.
+
+               Modified to handle NOS (NOS 6/12 code), INT (Intercom 8/12
+               code), RUB (7.5 char per word tape format), support of
+               EBCDIC translations.  Restructuration into a few main
+               modules, one of which is CODES.  Made in preparation for
+               the Cray-1 at Canadian Meteorological Center.
+
+         December 1981:
+
+               Revision of comparison routines for French processing,
+               several suggestions from Francine Ouellette.
+
+         December 1980:
+
+               A few speedups and improvements.  My own definition of
+               extended ASCII, quite compatible with various usages at
+               Universite' de Montre'al.
+
+         July 1980:
+
+               Module GEN broken into several modules: ASC (ascii), BNG
+               (bang-bang), CAF (format for CAFE project), DPC (usual
+               display code), and TEL (TELUM packing).  Made in context
+               of some research for the PPMF group and the BLOPS project.
+
+         January 1980:
+
+               Unified module named GEN and program named GENCOP, in
+               Cyber Pascal and assembler, partly inspired from NOS/BE
+               Record Manager, partly from Claude Schne'egans' PESTUM
+               protocol.
+
+         Before 1980:
+
+               Several independant programs, most in Cyber COMPASS
+               assembler, to handle code conversions.  A few tries to
+               get some useful, unified, general approach, but with
+               limited success.
diff --git a/File-Latin1 b/File-Latin1
new file mode 100644 (file)
index 0000000..52f92a5
--- /dev/null
@@ -0,0 +1,68 @@
+From: Martin Maechler <maechler@stat.math.ethz.ch>
+Date: Thu, 30 Dec 93 17:32:26 +0100
+
+Here are ALL codes 128 - 255 [== OKTAL 200 - 377 ]     you see ISO-Latin1
+----------------------------           ---------               ----------
+
+To produce such a letter in Emacs, you type
+         <ctrl>qNNN
+where <ctrl>q or "C-q" or "^q" is <CONTROL> and "Q" ,  and   NNN = OCTAL code 
+
+BETTER: With 'iso-insert' [now in our default],
+------- type ([ C-x 8 " a ]) to get ä   --> C-x 8 C-h  gives bindings
+NUCH BETTER: with  "/u/sfs/emacs/international.el":
+===========  Alt + a =  A-a  |--> ä,   A-O  |--> Ö , etc.
+
+Note that \200 - \236  [the first 32,  128--160] are NOT ISO-latin1
+displayed:
+
+\80\81\82\83\84\85\86\87       |||     \88\89\8a\8b\8c\8d\8e
+\90\91\92\93\94\95\96\97       |||     \98\99\9a\9b\9c\9d\9e
+
+Note that \240 is VERY funny "invisible", makes things reversevideo../invisible
+depending on Emacs version.
+For this reason, I  OMIT it in the following [Enter it with ^Q240]:
+
+Dec Oct                 Dec Oct 
+         ¡¢£¤¥¦§                   ¨©ª«¬­®¯
+160 240: 01234567       168 250:   01234567
+                       
+         °±²³´µ¶·                  ¸¹º»¼½¾¿
+176 260: 01234567       184 270:   01234567
+                       
+         ÀÁÂÃÄÅÆÇ                  ÈÉÊËÌÍÎÏ
+192 300: 01234567       200 310:   01234567
+                       
+         ÐÑÒÓÔÕÖ×                  ØÙÚÛÜÝÞß
+208 320: 01234567       216 330:   01234567
+                       
+         àáâãäåæç                  èéêëìíîï
+224 340: 01234567       232 350:   01234567
+                       
+         ðñòóôõö÷                  øùúûüýþÿ
+240 360: 01234567       248 370:   01234567
+                                       
+--------------
+Ein paar Beispiele / some examples  [using OCT code]
+ ö <-|  366  - 40 = 326 |-> Ö
+ ä <-|  344  - 40 = 304 |-> Ä
+ ü <-|  374  - 40 = 334 |-> Ü
+
+Texte:
+
+Österreich ist für Zürcher und Zürcherinnen eigentlich näher als das
+Bärner Oberland, aber wer möchte wohl Kärnten mit einem Besuch beglücken ?
+
+Peter Bühlmann, Markus Hürzeler, Prof. Hansruedi Künsch, Frau Christina Künzli,
+ Martin Mächler -- alle hätten gerne ihre Namen mit Umlauten. 
+
+Ob dies Markus Äbi wohl auch so sähe ?
+
+Pour Paul-André ou Étienne, c'est plustôt les accents aigus, grave et
+circonflexes, ça c'est clair.
+
+El Niño, das ist ein warmer Wind in der südlichen Hemisphäre...
+
+ «3·4 = 3 × 4 = 12»  oder «(¯2)² = 4»  oder « 1÷2 = ½ » 
+
+ schreiben sich auch schöner...
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..0338fbc
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,167 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source directory by typing `make clean'.  To also remove the files
+     that `configure' created (so you can compile the package for a
+     different kind of computer), type `make distclean'.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Using a Different Build Directory
+=================================
+
+   You can compile the package in a different directory from the one
+containing the source code.  Doing so allows you to compile it on more
+than one kind of computer at the same time.  To do this, you must use a
+version of `make' that supports the `VPATH' variable, such as GNU
+`make'.  `cd' to the directory where you want the object files and
+executables to go and run the `configure' script.  `configure'
+automatically checks for the source code in the directory that
+`configure' is in and in `..'.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Save the results of the tests in FILE instead of `config.cache'.
+     Set FILE to `/dev/null' to disable caching, for debugging
+     `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..b5976da
--- /dev/null
@@ -0,0 +1,273 @@
+# Makefile for GNU recode.
+# Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+PRODUCT = @PRODUCT@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+# These CFLAGS values are not auto-configured:
+# -DDIFF_HASH          For using GNU diff's hash algorithm instead.
+# -DHASH_STATS         For printing a one-liner hash statistics.
+
+MSDOS_PROGS = recode
+MSDOS_CC = tcc -v -N -mh
+ZOOFILE = rec332as.zoo
+
+AR = ar
+AWK = @AWK@
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+DEFS = @DEFS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LIBS = @LIBS@
+MAKEINFO = makeinfo
+RANLIB = @RANLIB@
+TEXI2DVI = texi2dvi
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+bindir = $(exec_prefix)/bin
+infodir = $(prefix)/info
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+       $(COMPILE) $<
+
+ANSI2KNR = @ANSI2KNR@
+O = .@U@o
+
+.SUFFIXES: ._c ._o
+.c._c:
+       ./ansi2knr $< > $@
+._c._o:
+       @echo $(COMPILE) $<
+       @rm -f _$*.c
+       @ln $< _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+.c._o:
+       ./ansi2knr $< > $*._c
+       @echo $(COMPILE) $*._c
+       @rm -f _$*.c
+       @ln $*._c _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+
+INCLUDES = -I. -I$(srcdir)
+
+HEADERS = recode.h charname.h
+SOURCES = recode.c charname.c charset.c $(C_STEPS) $(L_STEPS)
+OBJECTS = recode$O charname$O charset$O $(STEPOBJS)
+LIBHDRS = getopt.h pathmax.h
+LIBSRCS = argmatch.c getopt.c getopt1.c error.c xmalloc.c xstrdup.c
+LIBOBJS = argmatch.o getopt.o getopt1.o error.o xmalloc.o xstrdup.o
+
+L_STEPS = ascilat1.l htmllat1.l ltexlat1.l txtelat1.l
+C_STEPS = \
+charset1.c charset2.c applemac.c atarist.c bangbang.c cdcnos.c \
+ebcdic.c flat.c ibmpc.c iconqnx.c lat1asci.c lat1html.c lat1ltex.c \
+lat1txte.c next.c 
+STEPOBJS = merged$O \
+charset1$O charset2$O applemac$O atarist$O bangbang$O cdcnos$O \
+ebcdic$O flat$O ibmpc$O iconqnx$O lat1asci$O lat1html$O lat1ltex$O \
+lat1txte$O next$O 
+
+DISTFILES = README NEWS TODO THANKS COPYING INSTALL ChangeLog \
+configure.in acconfig.h aclocal.m4 mkinstalldirs install-sh \
+Makefile.in mergelex.awk recode.texi File-Latin1 \
+$(HEADERS) $(SOURCES) $(LIBHDRS) $(LIBSRCS) checkit \
+ansi2knr.c ansi2knr.1 c-boxes.el texinfo.tex \
+rfc1345.txt charname.sed charname.pl charset.sed charset.pl \
+README.DOS configdos dosfn config.h.dos Makefile.os2 config_h.os2 \
+stamp-h.in config.h.in configure stamp-vti version.texi charset.texi \
+recode.info stamp-init initstep.h merged.c TAGS BACKLOG
+
+all: recode.info recode
+
+info: recode.info
+
+recode.info: recode.texi charset.texi version.texi
+       cd $(srcdir) && $(MAKEINFO) --no-split recode.texi
+
+dvi: recode.dvi
+
+recode.dvi: recode.texi
+       $(TEXI2DVI) $(srcdir)/recode.texi
+
+version.texi: stamp-vti
+stamp-vti: recode.texi configure.in
+       echo "@set EDITION $(VERSION)" > version.tmp
+       echo "@set UPDATED `date '+%B %Y'`" >> version.tmp
+       echo "@set VERSION $(VERSION)" >> version.tmp
+       if cmp -s version.tmp $(srcdir)/version.texi; then rm version.tmp; \
+       else mv version.tmp $(srcdir)/version.texi; fi
+       date > $(srcdir)/stamp-vti
+
+recode: initstep.h $(OBJECTS) librec.a
+       $(LINK) $(OBJECTS) librec.a $(LIBS)
+
+initstep.h: stamp-init
+stamp-init: $(C_STEPS) merged.c
+       @echo "updating initstep.h"
+       @(cd $(srcdir) && sed -n 's/^\(module_[^ ]*\).*/  \1 ();/p' \
+         $(C_STEPS) merged.c ) > initstep.tmp
+       @if cmp -s $(srcdir)/initstep.h initstep.tmp; then rm initstep.tmp; \
+       else mv initstep.tmp $(srcdir)/initstep.h; fi
+       date > $(srcdir)/stamp-init
+
+merged.c: mergelex.awk $(L_STEPS)
+       (cd $(srcdir) \
+         && $(AWK) -f mergelex.awk $(L_STEPS)
+         && rm merged1.tmp merged2.tmp merged3.tmp) > merged.tmp1
+       $(LEX) -t8 merged.tmp1 > merged.tmp2
+       grep -v '^# *line [0-9]' merged.tmp2 > $(srcdir)/merged.c
+       rm merged.tmp1 merged.tmp2
+
+charname.h: charname.sed charname.pl rfc1345.txt
+       cd $(srcdir) && sed -n -f charname.sed rfc1345.txt | perl charname.pl
+
+charset1.c charset2.c charset.texi: charset.sed charset.pl rfc1345.txt
+       cd $(srcdir) && sed -n -f charset.sed rfc1345.txt | perl charset.pl
+
+$(OBJECTS): $(ANSI2KNR) config.h
+recode$O charname$O charset$O $(STEPOBJS): recode.h
+recode$O: initstep.h getopt.h
+charname$O: charname.h
+
+ansi2knr: ansi2knr.o
+       $(LINK) ansi2knr.o $(LIBS)
+
+librec.a: $(LIBOBJS)
+       rm -f librec.a
+       $(AR) cru librec.a $(LIBOBJS)
+       $(RANLIB) librec.a
+
+$(LIBOBJS): config.h
+getopt.o getopt1.o: getopt.h
+
+CHECKING = @$(srcdir)/checkit $(srcdir)/COPYING
+
+check: recode
+       @./recode --version
+       $(CHECKING) texte texte
+       $(CHECKING) texte latin1
+       $(CHECKING) texte ibmpc
+       $(CHECKING) texte iconqnx
+       $(CHECKING) texte bangbang
+       $(CHECKING) ascii-bs ebcdic
+       @echo "All checks completed successfully."
+
+autocheck:
+       @echo "The following test may take part of an hour.  Be patient."
+       @(./recode --auto-check | grep UNACH | grep -v '^flat') || exit 0
+
+install: all
+       $(srcdir)/mkinstalldirs $(bindir) $(infodir)
+       $(INSTALL_PROGRAM) recode $(bindir)/`echo recode | sed '$(transform)'`
+       $(INSTALL_DATA) $(srcdir)/recode.info $(infodir)/recode.info
+
+uninstall:
+       rm -f $(bindir)/`echo recode | sed '$(transform)'`
+       rm -f $(infodir)/recode.info
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(LIBHDRS) $(LIBSRCS)
+       cd $(srcdir) && etags $(HEADERS) $(SOURCES) $(LIBHDRS) $(LIBSRCS)
+
+mostlyclean:
+       rm -f *.aux *.cp *.cps *.dvi *.fn *.fns *.ky *.log *.pg *.toc *.tp *.vr
+       rm -f *.a *.o *._c *._o core core.*
+       rm -f *.tmp yy.tab.*
+
+clean: mostlyclean
+       rm -f recode
+
+distclean: clean
+       rm -f ansi2knr
+       rm -f Makefile config.cache config.h config.log stamp-h config.status
+
+realclean: distclean
+       rm -f stamp-vti version.texi charset.texi recode.info
+       rm -f stamp-init initstep.h charset1.c charset2.c charname.h merged.c
+       rm -f TAGS
+
+dist: $(DISTFILES)
+       rm -rf $(PRODUCT)-$(VERSION)
+       mkdir $(PRODUCT)-$(VERSION)
+       chmod 777 $(PRODUCT)-$(VERSION)
+       @echo "Copying distribution files"
+       @for file in $(DISTFILES); do \
+         ln $(srcdir)/$$file $(PRODUCT)-$(VERSION) 2> /dev/null \
+           || cp -p $(srcdir)/$$file $(PRODUCT)-$(VERSION); \
+       done
+       chmod -R a+r $(PRODUCT)-$(VERSION)
+       tar chozf $(PRODUCT)-$(VERSION).tar.gz $(PRODUCT)-$(VERSION)
+       rm -rf $(PRODUCT)-$(VERSION)
+
+distdos: $(DISTFILES) recode
+       rm -rf distdos
+       rm -f $(ZOOFILE)
+       mkdir distdos
+       @echo "Copying distribution files"
+       @cp -p $(DISTFILES) distdos
+       ./configdos -tcc > distdos/Makefile
+       cp -p config.h.dos distdos/config.h
+       for name in $(LIBOBJS); do \
+         echo $$name | sed 's/^/+ /;s/$$/bj \&/' >> distdos/libobjs.lst; \
+       done
+       echo , >> distdos/libobjs.lst
+       for name in $(OBJECTS); do \
+         echo $$name | sed 's/$$/bj/' >> distdos/objects.lst; \
+       done
+       find distdos -type f | xargs chmod +w
+       find distdos -type f | xargs ./dosfn
+       find distdos -type f | xargs ./recode -v :ibmpc
+       find distdos -type f | zoo ahI $(ZOOFILE)
+       rm -rf distdos
+
+# For an explanation of the following Makefile rules, see node
+# `Automatic Remaking' in GNU Autoconf documentation.
+Makefile: Makefile.in config.status
+       CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+config.status: configure
+       ./config.status --recheck
+configure: configure.in aclocal.m4
+       cd $(srcdir) && autoconf
+
+config.h: stamp-h
+stamp-h: config.h.in config.status
+       CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status
+       date > stamp-h
+config.h.in: stamp-h.in
+stamp-h.in: configure.in aclocal.m4 acconfig.h
+       cd $(srcdir) && autoheader
+       date > $(srcdir)/stamp-h.in
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/Makefile.os2 b/Makefile.os2
new file mode 100644 (file)
index 0000000..148f215
--- /dev/null
@@ -0,0 +1,52 @@
+# Makefile for recode, adapted for OS2.
+# Copyright (C) 1991 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+release:
+       $(MAKE) -f Makefile.os2 all CC="gcc -Zomf -Zmtd -O -s" O=".obj"
+debug:
+       $(MAKE) -f Makefile.os2 all CC="gcc -g" O=".o"
+
+DEFS = -DOS2 -DHAVE_CONFIG_H
+LDEFS = 
+
+CFLAGS = -I. $(DEFS)
+LDFLAGS = $(LDEFS)
+LIBS = 
+
+STEPOBJS = charset$O applemac$O atarist$O bangbang$O cdcnos$O \
+       ebcdic$O flat$O ibmpc$O iconqnx$O lat1asci$O lat1ltex$O \
+       lat1txte$O nextstep$O merged$O
+
+C_STEPS = charset.c applemac.c atarist.c bangbang.c cdcnos.c \
+       ebcdic.c flat.c ibmpc.c iconqnx.c lat1asci.c lat1ltex.c \
+       lat1txte.c nextstep.c
+
+L_STEPS = ascilat1.l ltexlat1.l txtelat1.l
+
+LIBOBJS = xmalloc$O xstrdup$O getopt$O getopt1$O error$O argmatch$O flexlib$O
+
+OBJECTS = recode$O charname$O $(STEPOBJS) $(LIBOBJS)
+
+.SUFFIXES: . $O
+
+.c$O:
+       $(CC) -c $(CFLAGS) $<
+
+all: recode.exe recode.info
+
+recode.exe: $(OBJECTS)
+       $(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS)
+
+recode.info: recode.texi
+       makeinfo recode.texi
+
+initstep.h: charset.h $(C_STEPS) merged.c
+       sed -n "s/\(module_[^ ]*\).*/  \1 ();/p" \
+       charset.h $(C_STEPS) merged.c >initstep.h
+
+$(OBJECTS): config.h
+recode$O charname$O $(STEPOBJS): recode.h
+recode$O: initstep.h
+charname$O: charname.h
+charset$O: charset.h
diff --git a/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..c8946ca
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,80 @@
+GNU recode NEWS - User visible changes.
+Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+
+Version 3.4 - November 1994, by Franc,ois Pinard
+
+* Charset HTML is new, it handles `&...;' sequences for Latin-1.
+* Charset AtariST handling is more general, --list may be used with it.
+* Charset ASCII-BS overstriking has been extended, mainly for German.
+* Charset RFC1345 may be a goal, to debug or study RFC 1345 short names.
+* Charset names have been revised.  Note that nextstep is now NeXT.
+* Option --force (-f) is accepted, but does not yet protect reversibility.
+* Option --quiet or --silent (-q) silences irreversible recoding messages.
+* Option --known=PAIRS (-k) helps searching through recodings.
+* Option --sequence=pipe (-p) does not fall back on -o anymore.
+* Option --auto-check may narrow its study around one particular charset.
+* An MSDOS port is available, check ftp.iro.umontreal.ca in pub/gnuish.
+* Compilation should now succeed on OS/2 EMX.  Thanks to Kai Uwe Rommel.
+* Program initialization is almost three times faster on average.
+* Corrected reported bugs, added small improvements, some aesthetic.
+\f
+Version 3.3 - December 1993, by Franc,ois Pinard
+
+* Charsets atarist, ebcdic-ccc, ebcdic-ibm and nextstep have been added.
+* Also, most RFC 1345 charsets and aliases are handled.  That's a bunch!
+* Old ascii disappears because of RFC 1345's ascii, use ascii-bs instead.
+* Old maci disappears because of RFC 1345's macintosh, use applemac instead.
+* Charsets cccascii and cdcascii disappear, use ebcdic-ccc and ebcdic instead.
+* Recoding between latin1, ibmpc and applemac is (almost) reversible.
+* The texinfo documentation has been reorganized, this to be continued.
+* Long options are accepted, charset names may be abbreviated.
+* Option --list (-l) displays charsets, aliases and contents in many formats.
+* Option --strict (-s) asks for stricter, non-reversible recodings.
+* Option --graphics (-g) approximates ibmpc rulers with ASCII graphics.
+* Option --header (-h) produces C source for many recoding tables.
+* Option --auto-check (-a) reports about all possible recodings.
+* Option --ignore (-x) prevents a charset from being selected.
+* Execution has been sped up through step merging, hashing for charset names.
+* Many various buglets have been eradicated, portability increased.
+* Charsets may be edited out by modifying the Makefile only.
+* Configuration is made through the use of an external config.h file.
+
+Version 3.2.4 - October 1992, by Franc,ois Pinard
+
+* None.
+
+Version 3.2.3 - September 1992, by Franc,ois Pinard
+
+* New -d `diacritics_only' option for LaTeX.
+* A few bugs have been corrected.
+* Documentation reorganization and improvements.
+* Increased portability, now uses Autoconf.
+* A few bugs solved.
+
+Version 3.2 - October 1991, by Franc,ois Pinard
+
+* MSDOS port redone.
+* New check goal at installation time.
+* Add -v option for verbose processing, remove old -q.
+* Add -i, -o and -p for letting the user control the strategy.
+* A few bugs corrected.
+* Embedded NULs should now be transmitted.
+
+Version 3.1 - March 1990, by Franc,ois Pinard
+
+* Rename -V to -C for showing Copyright.
+* Calling sequence changed, said files now recoded on themselves.
+* Add -t option for touching files.
+* Better on-line help.
+
+Version 3.0.1 - February 1990, by Franc,ois Pinard
+
+* Add -q option for quiet processing.
+* Executable file now considerably smaller, also speedier.
+* A few bugs corrected.
+
+Version 3.0 - October 1989, by Franc,ois Pinard
+* New Text to Latin1 processing, should be faster.
+* A few bugs corrected.
+
+For prior history down to 1980, see at the end of the ChangeLog.
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..c14f661
--- /dev/null
+++ b/README
@@ -0,0 +1,62 @@
+GNU `recode' converts files between character sets and usages.  When
+exact transliterations are not possible, it may get rid of the
+offending characters or fall back on approximations.  This program
+recognizes or produces nearly 150 different character sets and is able
+to transliterate files between almost any pair.  Most RFC 1345
+character sets are supported.
+
+GNU `recode' has been written by Franc,ois Pinard.  It is an evolving
+product, and specifications might change in future releases.
+
+Note that `-f' is not completely implemented.  If you modify or add
+an `.l' source file, you need `mawk', GNU `awk' or `nawk', and Flex
+2.4.6 or better for remaking `merged.c'.  Finally, see further down,
+below, for various installation hints on special systems.
+
+See file `BACKLOG' for a summary of pending mail and articles.
+See file `COPYING' for copying conditions.
+See file `INSTALL' for compilation and installation instructions.
+See file `NEWS' for a list of major changes in the current release.
+See file `README.DOS' for notes about the MSDOS port.
+See file `THANKS' for a list of contributors.
+Use file `File-Latin1' to play with recode, if you feel like it.
+
+Your feedback will help us to make a better and more portable
+product.  Mail suggestions and bug reports (including documentation
+errors) for this program to `bug-gnu-utils@prep.ai.mit.edu'.  If you
+develop new charsets, new methods, or anything along `recode', let
+me know and share your findings, at `pinard@iro.umontreal.ca'.
+
+.-------.
+| Hints |
+`-------'
+
+Here are a few hints which might help installing `recode' on some
+systems.  Most may be applied by temporary presetting environment
+variables while calling `./configure'.  File `INSTALL' explains this.
+
+* You may override DEFAULT_CHARSET while configuring.  For example, on
+an AtariST using `bash', one could do:
+
+       DEFAULT_CHARSET=AtariST ./configure
+
+* Some C compilers, like Apollo's, have a real hard time compiling
+merged.c.  If this is your case, first avoid compiler optimization.
+From within the Bourne shell, you may use:
+
+       CPPFLAGS=-DUSE_FPUTC CFLAGS= ./configure
+
+* For 80286 based systems, it has been reported that some compilers
+generate wrong code while optimizing for *small* models.  So, from
+within the Bourne shell, do:
+
+       CFLAGS=-Ml LDFLAGS=-Ml ./configure
+
+to force large memory model.  For 80286 Xenix compiler, the last time
+it was tried a while ago, one ought to use:
+
+       CFLAGS='-Ml -F2000' LDFLAGS=-Ml ./configure
+
+* Some smallish systems have poor `popen' support or trash heavily
+when processes do fork.  In this case, just before doing `make', edit
+`config.h' and ensure HAVE_POPEN and HAVE_PIPE are *not* defined.
diff --git a/README.DOS b/README.DOS
new file mode 100644 (file)
index 0000000..8786fcb
--- /dev/null
@@ -0,0 +1,21 @@
+GNU recode has been ported to smallish MSDOS systems, using Borland's
+C compiler huge memory model.  At site ftp.iro.umontreal.ca in
+directory pub/gnuish, fetch reco34ax.zoo, or such, for an all-ready
+executable, and reco34as.zoo for sources and documentation.
+
+Here is my own installation recipe.  On the UNIX side, I got Larry
+Wall's Perl (I'm running 4.019) and Rahul Dhesi's Zoo 2.1.  On the
+MSDOS side, I got Rahul Dhesi's Zoo 2.1, Thorsten Ohl's port of GNU
+make and Borland's Turbo C++ 1.0 system.
+
+1.  On UNIX, configure recode right in the distribution directory.
+2.  Execute `make distdos'.  This should create reco34as.zoo, or such.
+3.  Move the zoo archive to the MSDOS side.
+4.  On MSDOS, create a directory, cd to it and unpack the zoo file.
+5.  Execute `make'.  This should produce recode.exe.
+6.  Make reco34ax.zoo out of readme{,.dos}, copying, recode.{inf,exe}.
+
+Even if GNU recode is free software, it is copyrighted.  See COPYING.
+In particular, make the full source available where the binaries are.
+
+                       Francois Pinard <pinard@iro.umontreal.ca>
diff --git a/TAGS b/TAGS
new file mode 100644 (file)
index 0000000..58323be
--- /dev/null
+++ b/TAGS
@@ -0,0 +1,252 @@
+\f
+recode.h,574
+#  define CHAR_BIT \7f35,1059
+# define EXIT_SUCCESS \7f41,1183
+# define EXIT_FAILURE \7f44,1235
+# define _(\7f48,1280
+# define _(\7f50,1308
+typedef const char* DOUBLE_TABLE[\7fDOUBLE_TABLE\ 160,1526
+typedef struct charset CHARSET;\7fCHARSET\ 162,1564
+struct charset\7fcharset\ 164,1597
+typedef enum quality QUALITY;\7fQUALITY\ 174,1876
+enum quality\7fquality\ 176,1907
+typedef struct step STEP;\7fSTEP\ 186,2259
+struct step\7fstep\ 188,2286
+typedef struct known_pair KNOWN_PAIR;\7fKNOWN_PAIR\ 1100,2759
+struct known_pair\7fknown_pair\ 1102,2798
+enum list_format\7flist_format\ 1110,2974
+# define DMALLOC_FUNC_CHECK\7f166,4738
+\f
+charname.h,141
+#define NUMBER_OF_SINGLES \7f22,925
+#define MAX_CHARNAME_LENGTH \7f24,956
+#define NUMBER_OF_CHARNAMES \7f26,988
+struct charname\7fcharname\ 1841,37275
+\f
+recode.c,1372
+#define MAX_SINGLE_STEPS \7f23,935
+#define MAX_SEQUENCE \7f26,1013
+#define RETSIGTYPE \7f38,1209
+#define strchr \7f45,1309
+#define strrchr \7f46,1330
+#define MSDOS_or_OS2 \7f50,1374
+#define unlink \7f52,1414
+#define MSDOS_or_OS2 \7f59,1504
+#define USE_TMPFILE \7f102,3346
+#define L_tmpnam \7f108,3443
+#define L_tmpnam \7f116,3543
+enum sequence_strategy\7fsequence_strategy\ 1241,8078
+signal_handler \7f273,9060
+setup_signals \7f284,9388
+quality_to_string \7f300,9704
+merge_qualities \7f330,10354
+decode_before_after \7f391,11344
+new_single_step \7f443,12456
+declare_step \7f470,13300
+declare_step \7f475,13486
+invert_table \7f495,14095
+complete_pairs \7f539,15409
+register_all_modules \7f701,19276
+output_header_file \7f773,21028
+declare_double_step \7f955,25295
+struct item\7fitem\ 1983,26086
+compare_struct_item \7f990,26234
+init_recode_rfc1345 \7f1003,26764
+#define UNREACHABLE    \7f1135,30803
+echo_sequence \7f1142,31054
+find_sequence \7f1180,32164
+simplify_type \7f1282,35203
+simplify_sequence \7f1301,35774
+file_copy \7f1478,40511
+file_one_to_one \7f1492,41005
+file_one_to_many \7f1510,41607
+execute_pass_sequence \7f1542,42680
+execute_popen_sequence \7f1689,46493
+dup2_recursive \7f1762,48654
+dup2 \7f1780,49103
+execute_pipe_sequence \7f1818,50253
+execute_pipe_sequence \7f1939,53873
+execute_sequence \7f2084,58409
+print_truncated_charset_name \7f2183,60798
+perform_auto_check_one \7f2203,61354
+perform_auto_check \7f2274,63180
+usage \7f2321,64425
+main \7f2455,69263
+\f
+charname.c,28
+symbol_to_charname \7f30,1162
+\f
+charset.c,680
+#define MAX_CHARSETS \7f23,918
+#define HASH_TABLE_SIZE \7f26,986
+#define MAX_SYMBOL_SIZE \7f29,1069
+struct hash\7fhash\ 138,1259
+code_to_symbol \7f63,2138
+print_symbol \7f95,2920
+decode_known_pairs \7f119,3500
+check_restricted \7f180,4923
+prepare_charset_initialization \7f221,5787
+cleanup_charset_name \7f239,6326
+#define UINT_BIT \7f269,7023
+#define ROTATE_LEFT(\7f270,7071
+#define HASH(\7f271,7136
+hash_string \7f274,7194
+hash_string \7f287,7423
+find_charset \7f306,7980
+declare_alias \7f363,9385
+make_argmatch_array \7f413,10570
+clean_charset_name \7f465,12085
+compare_struct_hash \7f507,13094
+list_all_charsets \7f527,13723
+init_table_for_rfc1345 \7f601,15519
+list_concise_charset \7f650,16624
+list_full_charset \7f729,18366
+\f
+charset1.c,28
+module_charset1 \7f1414,39697
+\f
+charset2.c,27
+module_charset2 \7f913,34146
+\f
+applemac.c,122
+#define NUMBER_OF_PAIRS \7f117,5089
+init_latin1_applemac \7f120,5171
+init_applemac_latin1 \7f126,5283
+module_applemac \7f132,5388
+\f
+atarist.c,151
+#define USE_DOUBLE_STEP \7f21,902
+#define NUMBER_OF_PAIRS \7f136,4244
+init_latin1_atarist \7f139,4326
+init_atarist_latin1 \7f145,4437
+module_atarist \7f153,4575
+\f
+bangbang.c,89
+init_latin1_bangbang \7f285,8809
+file_bangbang_latin1 \7f291,8900
+module_bangbang \7f375,11557
+\f
+cdcnos.c,80
+init_ascii_cdcnos \7f155,3736
+file_cdcnos_ascii \7f225,5181
+module_cdcnos \7f315,7831
+\f
+ebcdic.c,230
+#define ASCII \7f20,856
+init_ascii_ebcdic \7f139,7570
+init_ebcdic_ascii \7f145,7656
+init_ascii_ebcdic_ccc \7f151,7757
+init_ebcdic_ccc_ascii \7f157,7851
+init_ascii_ebcdic_ibm \7f163,7960
+init_ebcdic_ibm_ascii \7f169,8054
+module_ebcdic \7f175,8156
+\f
+flat.c,45
+file_ascii_flat \7f23,894
+module_flat \7f95,2188
+\f
+ibmpc.c,239
+#define DOS_EOF \7f22,883
+#define DOS_CR \7f23,925
+#define DOS_LF \7f24,966
+#define NUMBER_OF_PAIRS \7f162,5608
+file_latin1_ibmpc \7f165,5689
+file_ibmpc_latin1 \7f203,6637
+init_latin1_ibmpc \7f285,8293
+init_ibmpc_latin1 \7f292,8443
+module_ibmpc \7f313,8989
+\f
+iconqnx.c,237
+#define DOS_CR \7f22,883
+#define DOS_LF \7f23,924
+#define DOS_EOF \7f24,959
+#define ESCAPE \7f26,1002
+#define ENDLINE \7f27,1060
+#define TRANSLATE_AND_BREAK(\7f29,1109
+file_ibmpc_iconqnx \7f37,1292
+file_iconqnx_ibmpc \7f92,2713
+module_iconqnx \7f222,5403
+\f
+lat1asci.c,58
+init_latin1_ascii \7f156,6106
+module_latin1_ascii \7f178,6552
+\f
+lat1html.c,94
+struct translation\7ftranslation\ 122,877
+init_latin1_html \7f106,2678
+module_latin1_html \7f135,3419
+\f
+lat1ltex.c,96
+struct translation\7ftranslation\ 122,877
+init_latin1_latex \7f126,5411
+module_latin1_latex \7f155,6115
+\f
+lat1txte.c,58
+init_latin1_texte \7f156,5986
+module_latin1_texte \7f206,7480
+\f
+next.c,21
+module_next \7f55,2071
+\f
+ascilat1.l,0
+\f
+htmllat1.l,0
+\f
+ltexlat1.l,0
+\f
+txtelat1.l,0
+\f
+getopt.h,125
+#define _GETOPT_H \7f19,797
+#define        no_argument     \7f93,3221
+#define required_argument      \7f94,3244
+#define optional_argument      \7f95,3272
+\f
+pathmax.h,137
+#define _PATHMAX_H\7f19,807
+#define _POSIX_PATH_MAX \7f33,1193
+#define PATH_MAX \7f37,1277
+#define PATH_MAX \7f46,1585
+#define PATH_MAX \7f50,1638
+\f
+argmatch.c,39
+argmatch \7f37,1251
+invalid_arg \7f76,2233
+\f
+getopt.c,204
+#define _NO_PROTO\7f26,1085
+#define const\7f37,1302
+#define        my_index        \7f164,6120
+my_index \7f173,6270
+exchange \7f219,7715
+_getopt_initialize \7f277,9238
+_getopt_internal \7f367,12723
+getopt \7f665,20341
+main \7f684,20723
+\f
+getopt1.c,105
+#define const\7f29,1042
+#define NULL \7f55,1833
+getopt_long \7f59,1860
+getopt_long_only \7f75,2363
+main \7f93,2719
+\f
+error.c,175
+#  define VA_START(\7f29,1004
+#  define VA_START(\7f32,1092
+# define va_alist \7f35,1155
+# define va_dcl \7f36,1204
+private_strerror \7f59,1769
+#define strerror \7f69,1975
+error \7f80,2305
+\f
+xmalloc.c,133
+#define VOID \7f23,866
+#define VOID \7f25,890
+#define EXIT_FAILURE \7f39,1061
+fixup_null_alloc \7f53,1383
+xmalloc \7f69,1647
+xrealloc \7f85,1896
+\f
+xstrdup.c,17
+xstrdup \7f32,1025
diff --git a/THANKS b/THANKS
new file mode 100644 (file)
index 0000000..349fcf0
--- /dev/null
+++ b/THANKS
@@ -0,0 +1,44 @@
+GNU recode has originally been written by Franc,ois Pinard.  Other
+people contributed to GNU recode by reporting problems, suggesting
+various improvements or submitting actual code.  Here is a list of
+these people.  Help me keeping it complete and exempt of errors.
+
+Andreas Mueller                afm@othello.ch
+Andreas Schwab         schwab@ls5.informatik.uni-dortmund.de
+Bastian Schlueter      buzz@cs.tu-berlin.de
+Claude Goutier         goutier@jsp.umontreal.ca
+David E. A. Wilson     david@cs.uow.edu.au
+David Kastrup          dak@pool.informatik.rwth-aachen.de
+David Lebel            lebel@iro.umontreal.ca
+David van Leeuwen      david@gandalf.tm.tno.nl
+Francois Pinard                pinard@iro.umontreal.ca
+Francois Robitaille    f_robita@crim.ca
+Ghislain Plamondon     gplamon@edupac.qc.ca
+Hermann Hueni          hueni@iam.unibe.ch
+Jacques Richer         richer@cerca.umontreal.ca
+Jim Meyering           meyering@acm.org
+Joelle Stemp           stemp@ere.umontreal.ca
+Kai Uwe Rommel         rommel@ars.muc.de
+Karl Berry             karl@cs.umb.edu
+Keld J|rn Simonsen     keld@dkuug.dk
+Laurent Bourbeau       bourbeau@condor.citi.doc.ca
+Larry Virden           lvirden@cas.org
+Loic Dachary           loic@design.axis.fr
+Mac Pigman             gwp@dido.caltech.edu
+Marc Verreault         vero@iro.umontreal.ca
+Martin Maechler                maechler@stat.math.ethz.ch
+Michael Gschwind       mike@vlsivie.tuwien.ac.at
+Michael L. Dowling     mike@mo.math.nat.tu-bs.de
+Nicolas Anquetil       anquetil@iro.umontreal.ca
+Per Andersson          perand@stacken.kth.se
+Pierre Gaumond         gaumondp@ere.umontreal.ca
+Pierre Girard          pierreg@crt.umontreal.ca
+Pierre Mathieu         mathieu@geod.emr.ca
+Rejean Payette         rpayette@edupac.qc.ca
+Richard Stallman       rms@gnu.ai.mit.edu
+Robert Joop            rj@rainbow.in-berlin.de
+Roman Czyborra         czyborra@cs.tu-berlin.de
+Ronald C.F. Antony     rcfa@cubiculum.com
+Stephane Berube                berube@iro.umontreal.ca
+Vern Paxson            vern@ee.lbl.gov
+William Bader          wbader@scarecrow.csee.lehigh.edu
diff --git a/TODO b/TODO
new file mode 100644 (file)
index 0000000..f70747d
--- /dev/null
+++ b/TODO
@@ -0,0 +1,32 @@
+TODO file for GNU recode
+
+Tell <pinard@iro.umontreal.ca> if you feel like volunteering for any
+of these ideas, listed more or less in decreasing order of priority.
+
+* Mechanics
+  - Get a single distribution, even for MSDOS.
+  - Intercept signals to cleanup the temporary files in any event.
+  - Revise --sequence=pipe thoroughly.
+  - Rewrite execute_pipe_sequence for having only one child per parent.
+  - Revise --force thoroughly.
+  - Rewrite .l converses for lat1{asci,ltex,txte}, for --force.
+  - Optimize/merge all one-to-many cases.
+  - Write a better `make check', not as partial and forgiving.
+  - Modify recode so I can get rid of diacrit.[ch] (elsewhere).
+  - Have -l know which output charset to use (Martin Maechler, 93-12-07).
+  - Take note that ->RFC1345 recodings are non reversible.
+
+* Charsets
+  - Integrate -c and -g into charsets.
+  - `recode -g ibmpc:ibmpc' is not that trivial, find something.
+  - Clean up applemac vs macintosh and ibmpc vs ibm437.
+  - Implement RFC1345 more fully.
+  - Generalize older charsets (latex, texte, etc.) to RFC 1345 mnemonics.
+  - Support VT320 support and related character sets.  (Alain Simon)
+  - Support @code{[nt]roff} diacritics.
+  - Support Universite de Montreal ``accent'' convention.
+\f
+Local Variables:
+mode: outline
+outline-regexp: " *[-+*.] \\|\f"
+End:
diff --git a/acconfig.h b/acconfig.h
new file mode 100644 (file)
index 0000000..4f46f2e
--- /dev/null
@@ -0,0 +1,20 @@
+/* Special definitions for GNU recode, processed by autoheader.
+   Copyright (C) 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+*/
+
+/* Default charset is `Latin-1' on UNIX, `IBM-PC' on MSDOS.  */
+#undef DEFAULT_CHARSET
+
+/* Define to the name of the distribution.  */
+#undef PRODUCT
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define to 1 for better use of the debugging malloc library.  See 
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..9081240
--- /dev/null
@@ -0,0 +1,85 @@
+# Local additions to Autoconf macros.
+# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# @defmac AC_PROG_CC_STDC
+# @maindex PROG_CC_STDC
+# @ovindex CC
+# If the C compiler in not in ANSI C mode by default, try to add an option
+# to output variable @code{CC} to make it so.  This macro tries various
+# options that select ANSI C on some system or another.  It considers the
+# compiler to be in ANSI C mode if it defines @code{__STDC__} to 1 and
+# handles function prototypes correctly.
+# 
+# If you use this macro, you should check after calling it whether the C
+# compiler has been set to accept ANSI C; if not, the shell variable
+# @code{ac_cv_prog_cc_stdc} is set to @samp{no}.  If you wrote your source
+# code in ANSI C, you can make an un-ANSIfied copy of it by using the
+# program @code{ansi2knr}, which comes with Ghostscript.
+# @end defmac
+
+define(fp_PROG_CC_STDC,
+[AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(ac_cv_prog_cc_stdc,
+[ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX                  -qlanglvl=ansi
+# Ultrix and OSF/1     -std1
+# HP-UX                        -Aa -D_HPUX_SOURCE
+# SVR4                 -Xc
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  AC_TRY_COMPILE(
+[#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif 
+], [int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};],
+[ac_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CFLAGS="$ac_save_CFLAGS"
+])
+AC_MSG_RESULT($ac_cv_prog_cc_stdc)
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+])
+
+# Check for function prototypes.
+
+AC_DEFUN(fp_C_PROTOTYPES,
+[AC_REQUIRE([fp_PROG_CC_STDC])
+AC_MSG_CHECKING([for function prototypes])
+if test "$ac_cv_prog_cc_stdc" != no; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(PROTOTYPES)
+  U= ANSI2KNR=
+else
+  AC_MSG_RESULT(no)
+  U=_ ANSI2KNR=ansi2knr
+fi
+AC_SUBST(U)dnl
+AC_SUBST(ANSI2KNR)dnl
+])
+
+# Check if --with-dmalloc was given.
+
+AC_DEFUN(fp_WITH_DMALLOC,
+[AC_MSG_CHECKING(if malloc debugging is wanted)
+AC_ARG_WITH(dmalloc,
+[  --with-dmalloc          use dmalloc, as in dmalloc.tar.gz from
+                          @/ftp.antaire.com:antaire/src/dmalloc.],
+[if test "$withval" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(WITH_DMALLOC)
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  AC_MSG_RESULT(no)
+fi], [AC_MSG_RESULT(no)])])
+
diff --git a/ansi2knr.1 b/ansi2knr.1
new file mode 100644 (file)
index 0000000..434ce8f
--- /dev/null
@@ -0,0 +1,19 @@
+.TH ANSI2KNR 1 "31 December 1990" 
+.SH NAME
+ansi2knr \- convert ANSI C to Kernighan & Ritchie C
+.SH SYNOPSIS
+.I ansi2knr
+input_file output_file
+.SH DESCRIPTION
+If no output_file is supplied, output goes to stdout.
+.br
+There are no error messages.
+.sp
+.I ansi2knr
+recognizes functions by seeing a non-keyword identifier at the left margin, followed by a left parenthesis, with a right parenthesis as the last character on the line.  It will recognize a multi-line header if the last character on each line but the last is a left parenthesis or comma.  These algorithms ignore whitespace and comments, except that the function name must be the first thing on the line.
+.sp
+The following constructs will confuse it:
+.br
+     - Any other construct that starts at the left margin and follows the above syntax (such as a macro or function call).
+.br
+     - Macros that tinker with the syntax of the function header.
diff --git a/ansi2knr.c b/ansi2knr.c
new file mode 100644 (file)
index 0000000..9bcc4ad
--- /dev/null
@@ -0,0 +1,439 @@
+/* Copyright (C) 1989, 1991, 1993, 1994 Aladdin Enterprises. All rights reserved. */
+
+/* ansi2knr.c */
+/* Convert ANSI function declarations to K&R syntax */
+
+/*
+ansi2knr is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
+to anyone for the consequences of using it or for whether it serves any
+particular purpose or works at all, unless he says so in writing.  Refer
+to the GNU General Public License for full details.
+
+Everyone is granted permission to copy, modify and redistribute
+ansi2knr, but only under the conditions described in the GNU
+General Public License.  A copy of this license is supposed to have been
+given to you along with ansi2knr so you can know your rights and
+responsibilities.  It should be in a file named COPYLEFT.  Among other
+things, the copyright notice and this notice must be preserved on all
+copies.
+*/
+
+/*
+ * Usage:
+       ansi2knr [--varargs] input_file [output_file]
+ * If no output_file is supplied, output goes to stdout.
+ * There are no error messages.
+ *
+ * ansi2knr recognizes function definitions by seeing a non-keyword
+ * identifier at the left margin, followed by a left parenthesis,
+ * with a right parenthesis as the last character on the line.
+ * It will recognize a multi-line header provided that the last character
+ * of the last line of the header is a right parenthesis,
+ * and no intervening line ends with a left brace or a semicolon.
+ * These algorithms ignore whitespace and comments, except that
+ * the function name must be the first thing on the line.
+ * The following constructs will confuse it:
+ *     - Any other construct that starts at the left margin and
+ *         follows the above syntax (such as a macro or function call).
+ *     - Macros that tinker with the syntax of the function header.
+ *
+ * If the --varargs switch is supplied, ansi2knr will attempt to
+ * convert a ... argument to va_alist and va_dcl.  If this switch is not
+ * supplied, ansi2knr will simply drop any such arguments.
+ */
+
+/*
+ * The original and principal author of ansi2knr is L. Peter Deutsch
+ * <ghost@aladdin.com>.  Other authors are noted in the change history
+ * that follows (in reverse chronological order):
+       lpd 94-10-10 removed CONFIG_BROKETS conditional
+       lpd 94-07-16 added some conditionals to help GNU `configure',
+               suggested by Francois Pinard <pinard@iro.umontreal.ca>;
+               properly erase prototype args in function parameters,
+               contributed by Jim Avera <jima@netcom.com>;
+               correct error in writeblanks (it shouldn't erase EOLs)
+       lpd 89-xx-xx original version
+ */
+
+/* Most of the conditionals here are to make ansi2knr work with */
+/* the GNU configure machinery. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+
+#ifdef HAVE_CONFIG_H
+
+/*
+   For properly autoconfiguring ansi2knr, use AC_CONFIG_HEADER(config.h).
+   This will define HAVE_CONFIG_H and so, activate the following lines.
+ */
+
+# if STDC_HEADERS || HAVE_STRING_H
+#  include <string.h>
+# else
+#  include <strings.h>
+# endif
+
+#else /* not HAVE_CONFIG_H */
+
+/*
+   Without AC_CONFIG_HEADER, merely use <string.h> as in the original
+   Ghostscript distribution.  This loses on older BSD systems.
+ */
+
+# include <string.h>
+
+#endif /* not HAVE_CONFIG_H */
+
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#else
+/*
+   malloc and free should be declared in stdlib.h,
+   but if you've got a K&R compiler, they probably aren't.
+ */
+char *malloc();
+void free();
+#endif
+
+/* Scanning macros */
+#define isidchar(ch) (isalnum(ch) || (ch) == '_')
+#define isidfirstchar(ch) (isalpha(ch) || (ch) == '_')
+
+/* Forward references */
+char *skipspace();
+void writeblanks();
+int test1();
+int convert1();
+
+/* The main program */
+int
+main(argc, argv)
+    int argc;
+    char *argv[];
+{      FILE *in, *out;
+#define bufsize 5000                   /* arbitrary size */
+       char *buf;
+       char *line;
+       int convert_varargs = 0;
+       if ( argc > 1 && argv[1][0] == '-' )
+         {     if ( !strcmp(argv[1], "--varargs") )
+                 {     convert_varargs = 1;
+                       argc--;
+                       argv++;
+                 }
+               else
+                 {     fprintf(stderr, "Unrecognized switch: %s\n", argv[1]);
+                       exit(1);
+                 }
+         }
+       switch ( argc )
+          {
+       default:
+               printf("Usage: ansi2knr [--varargs] input_file [output_file]\n");
+               exit(0);
+       case 2:
+               out = stdout;
+               break;
+       case 3:
+               out = fopen(argv[2], "w");
+               if ( out == NULL )
+                  {    fprintf(stderr, "Cannot open output file %s\n", argv[2]);
+                       exit(1);
+                  }
+          }
+       in = fopen(argv[1], "r");
+       if ( in == NULL )
+          {    fprintf(stderr, "Cannot open input file %s\n", argv[1]);
+               exit(1);
+          }
+       fprintf(out, "#line 1 \"%s\"\n", argv[1]);
+       buf = malloc(bufsize);
+       line = buf;
+       while ( fgets(line, (unsigned)(buf + bufsize - line), in) != NULL )
+          {    switch ( test1(buf) )
+                  {
+               case 2:                 /* a function header */
+                       convert1(buf, out, 1, convert_varargs);
+                       break;
+               case 1:                 /* a function */
+                       convert1(buf, out, 0, convert_varargs);
+                       break;
+               case -1:                /* maybe the start of a function */
+                       line = buf + strlen(buf);
+                       if ( line != buf + (bufsize - 1) ) /* overflow check */
+                               continue;
+                       /* falls through */
+               default:                /* not a function */
+                       fputs(buf, out);
+                       break;
+                  }
+               line = buf;
+          }
+       if ( line != buf ) fputs(buf, out);
+       free(buf);
+       fclose(out);
+       fclose(in);
+       return 0;
+}
+
+/* Skip over space and comments, in either direction. */
+char *
+skipspace(p, dir)
+    register char *p;
+    register int dir;                  /* 1 for forward, -1 for backward */
+{      for ( ; ; )
+          {    while ( isspace(*p) ) p += dir;
+               if ( !(*p == '/' && p[dir] == '*') ) break;
+               p += dir;  p += dir;
+               while ( !(*p == '*' && p[dir] == '/') )
+                  {    if ( *p == 0 ) return p;        /* multi-line comment?? */
+                       p += dir;
+                  }
+               p += dir;  p += dir;
+          }
+       return p;
+}
+
+/*
+ * Write blanks over part of a string.
+ * Don't overwrite end-of-line characters.
+ */
+void
+writeblanks(start, end)
+    char *start;
+    char *end;
+{      char *p;
+       for ( p = start; p < end; p++ )
+         if ( *p != '\r' && *p != '\n' ) *p = ' ';
+}
+
+/*
+ * Test whether the string in buf is a function definition.
+ * The string may contain and/or end with a newline.
+ * Return as follows:
+ *     0 - definitely not a function definition;
+ *     1 - definitely a function definition;
+ *     2 - definitely a function prototype (NOT USED);
+ *     -1 - may be the beginning of a function definition,
+ *             append another line and look again.
+ * The reason we don't attempt to convert function prototypes is that
+ * Ghostscript's declaration-generating macros look too much like
+ * prototypes, and confuse the algorithms.
+ */
+int
+test1(buf)
+    char *buf;
+{      register char *p = buf;
+       char *bend;
+       char *endfn;
+       int contin;
+       if ( !isidfirstchar(*p) )
+               return 0;               /* no name at left margin */
+       bend = skipspace(buf + strlen(buf) - 1, -1);
+       switch ( *bend )
+          {
+       case ';': contin = 0 /*2*/; break;
+       case ')': contin = 1; break;
+       case '{': return 0;             /* not a function */
+       default: contin = -1;
+          }
+       while ( isidchar(*p) ) p++;
+       endfn = p;
+       p = skipspace(p, 1);
+       if ( *p++ != '(' )
+               return 0;               /* not a function */
+       p = skipspace(p, 1);
+       if ( *p == ')' )
+               return 0;               /* no parameters */
+       /* Check that the apparent function name isn't a keyword. */
+       /* We only need to check for keywords that could be followed */
+       /* by a left parenthesis (which, unfortunately, is most of them). */
+          {    static char *words[] =
+                  {    "asm", "auto", "case", "char", "const", "double",
+                       "extern", "float", "for", "if", "int", "long",
+                       "register", "return", "short", "signed", "sizeof",
+                       "static", "switch", "typedef", "unsigned",
+                       "void", "volatile", "while", 0
+                  };
+               char **key = words;
+               char *kp;
+               int len = endfn - buf;
+               while ( (kp = *key) != 0 )
+                  {    if ( strlen(kp) == len && !strncmp(kp, buf, len) )
+                               return 0;       /* name is a keyword */
+                       key++;
+                  }
+          }
+       return contin;
+}
+
+/* Convert a recognized function definition or header to K&R syntax. */
+int
+convert1(buf, out, header, convert_varargs)
+    char *buf;
+    FILE *out;
+    int header;                        /* Boolean */
+    int convert_varargs;       /* Boolean */
+{      char *endfn;
+       register char *p;
+       char **breaks;
+       unsigned num_breaks = 2;        /* for testing */
+       char **btop;
+       char **bp;
+       char **ap;
+       char *vararg = 0;
+       /* Pre-ANSI implementations don't agree on whether strchr */
+       /* is called strchr or index, so we open-code it here. */
+       for ( endfn = buf; *(endfn++) != '('; ) ;
+top:   p = endfn;
+       breaks = (char **)malloc(sizeof(char *) * num_breaks * 2);
+       if ( breaks == 0 )
+          {    /* Couldn't allocate break table, give up */
+               fprintf(stderr, "Unable to allocate break table!\n");
+               fputs(buf, out);
+               return -1;
+          }
+       btop = breaks + num_breaks * 2 - 2;
+       bp = breaks;
+       /* Parse the argument list */
+       do
+          {    int level = 0;
+               char *lp = NULL;
+               char *rp;
+               char *end = NULL;
+               if ( bp >= btop )
+                  {    /* Filled up break table. */
+                       /* Allocate a bigger one and start over. */
+                       free((char *)breaks);
+                       num_breaks <<= 1;
+                       goto top;
+                  }
+               *bp++ = p;
+               /* Find the end of the argument */
+               for ( ; end == NULL; p++ )
+                  {    switch(*p)
+                          {
+                       case ',':
+                               if ( !level ) end = p;
+                               break;
+                       case '(':
+                               if ( !level ) lp = p;
+                               level++;
+                               break;
+                       case ')':
+                               if ( --level < 0 ) end = p;
+                               else rp = p;
+                               break;
+                       case '/':
+                               p = skipspace(p, 1) - 1;
+                               break;
+                       default:
+                               ;
+                          }
+                  }
+               /* Erase any embedded prototype parameters. */
+               if ( lp )
+                 writeblanks(lp + 1, rp);
+               p--;                    /* back up over terminator */
+               /* Find the name being declared. */
+               /* This is complicated because of procedure and */
+               /* array modifiers. */
+               for ( ; ; )
+                  {    p = skipspace(p - 1, -1);
+                       switch ( *p )
+                          {
+                       case ']':       /* skip array dimension(s) */
+                       case ')':       /* skip procedure args OR name */
+                          {    int level = 1;
+                               while ( level )
+                                switch ( *--p )
+                                  {
+                               case ']': case ')': level++; break;
+                               case '[': case '(': level--; break;
+                               case '/': p = skipspace(p, -1) + 1; break;
+                               default: ;
+                                  }
+                          }
+                               if ( *p == '(' && *skipspace(p + 1, 1) == '*' )
+                                  {    /* We found the name being declared */
+                                       while ( !isidfirstchar(*p) )
+                                               p = skipspace(p, 1) + 1;
+                                       goto found;
+                                  }
+                               break;
+                       default: goto found;
+                          }
+                  }
+found:         if ( *p == '.' && p[-1] == '.' && p[-2] == '.' )
+                 {     if ( convert_varargs )
+                         {     *bp++ = "va_alist";
+                               vararg = p-2;
+                         }
+                       else
+                         {     p++;
+                               if ( bp == breaks + 1 ) /* sole argument */
+                                 writeblanks(breaks[0], p);
+                               else
+                                 writeblanks(bp[-1] - 1, p);
+                               bp--;
+                         }
+                  }
+               else
+                  {    while ( isidchar(*p) ) p--;
+                       *bp++ = p+1;
+                  }
+               p = end;
+          }
+       while ( *p++ == ',' );
+       *bp = p;
+       /* Make a special check for 'void' arglist */
+       if ( bp == breaks+2 )
+          {    p = skipspace(breaks[0], 1);
+               if ( !strncmp(p, "void", 4) )
+                  {    p = skipspace(p+4, 1);
+                       if ( p == breaks[2] - 1 )
+                          {    bp = breaks;    /* yup, pretend arglist is empty */
+                               writeblanks(breaks[0], p + 1);
+                          }
+                  }
+          }
+       /* Put out the function name and left parenthesis. */
+       p = buf;
+       while ( p != endfn ) putc(*p, out), p++;
+       /* Put out the declaration. */
+       if ( header )
+         {     fputs(");", out);
+               for ( p = breaks[0]; *p; p++ )
+                 if ( *p == '\r' || *p == '\n' )
+                   putc(*p, out);
+         }
+       else
+         {     for ( ap = breaks+1; ap < bp; ap += 2 )
+                 {     p = *ap;
+                       while ( isidchar(*p) )
+                         putc(*p, out), p++;
+                       if ( ap < bp - 1 )
+                         fputs(", ", out);
+                 }
+               fputs(")  ", out);
+               /* Put out the argument declarations */
+               for ( ap = breaks+2; ap <= bp; ap += 2 )
+                 (*ap)[-1] = ';';
+               if ( vararg != 0 )
+                 {     *vararg = 0;
+                       fputs(breaks[0], out);          /* any prior args */
+                       fputs("va_dcl", out);           /* the final arg */
+                       fputs(bp[0], out);
+                 }
+               else
+                 fputs(breaks[0], out);
+         }
+       free((char *)breaks);
+       return 0;
+}
diff --git a/applemac.c b/applemac.c
new file mode 100644 (file)
index 0000000..9187c92
--- /dev/null
@@ -0,0 +1,144 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+/* Data for Apple Macintosh to ISO Latin-1 code conversions.  */
+
+static KNOWN_PAIR known_pairs[] =
+  {
+    { 13,  10},                        /* (recoding end of lines for Unix) */
+
+    {128, 196},                        /* capital letter A diaeresis */
+    {129, 197},                        /* capital letter A with ring above */
+    {130, 199},                        /* capital letter C with cedilla */
+    {131, 201},                        /* capital letter E with acute accent */
+    {132, 209},                        /* capital letter N with tilde */
+    {133, 214},                        /* capital letter O with diaeresis */
+    {134, 220},                        /* capital letter U with diaeresis */
+    {135, 225},                        /* small letter a with acute accent */
+    {136, 224},                        /* small letter a with grave accent */
+    {137, 226},                        /* small letter a with circumflex accent */
+    {138, 228},                        /* small letter a with diaeresis */
+    {139, 227},                        /* small letter a with tilde */
+    {140, 229},                        /* small letter a with ring above */
+    {141, 231},                        /* small letter c with cedilla */
+    {142, 233},                        /* small letter e with acute accent */
+    {143, 232},                        /* small letter e with grave accent */
+    {144, 234},                        /* small letter e with circumflex accent */
+    {145, 235},                        /* small letter e with diaeresis */
+    {146, 237},                        /* small letter i with acute accent */
+    {147, 236},                        /* small letter i with grave accent */
+    {148, 238},                        /* small letter i with circumflex accent */
+    {149, 239},                        /* small letter i with diaeresis */
+    {150, 241},                        /* small letter n with tilde */
+    {151, 243},                        /* small letter o with acute accent */
+    {152, 242},                        /* small letter o with grave accent */
+    {153, 244},                        /* small letter o with circumflex accent */
+    {154, 246},                        /* small letter o with diaeresis */
+    {155, 245},                        /* small letter o with tilde */
+    {156, 250},                        /* small letter u with acute accent */
+    {157, 249},                        /* small letter u with grave accent */
+    {158, 251},                        /* small letter u with circumflex accent */
+    {159, 252},                        /* small letter u with diaeresis */
+
+    {161, 176},                        /* degree sign */
+    {162, 162},                        /* cent sign */
+    {163, 163},                        /* pound sign */
+    {164, 167},                        /* paragraph sign, section sign */
+
+    {166, 182},                        /* pilcrow sign */
+    {167, 223},                        /* small german letter sharp s */
+    {168, 174},                        /* registered trade mark sign */
+    {169, 169},                        /* copyright sign */
+
+    {174, 198},                        /* capital diphthong A with E */
+    {175, 216},                        /* capital letter O with oblique stroke */
+
+    {177, 177},                        /* plus-minus sign */
+
+    {180, 165},                        /* yen sign */
+    {181, 181},                        /* small greek letter mu, micro sign */
+
+    {187, 170},                        /* feminine ordinal indicator */
+    {188, 186},                        /* masculine ordinal indicator */
+
+    {190, 230},                        /* small diphthong a with e */
+    {191, 248},                        /* small letter o with oblique stroke */
+    {192, 191},                        /* inverted question mark */
+    {193, 161},                        /* inverted exclamation mark */
+    {194, 172},                        /* not sign */
+
+    {199, 171},                        /* left angle quotation mark */
+    {200, 187},                        /* right angle quotation mark */
+
+    {203, 192},                        /* capital letter A with grave accent */
+    {204, 195},                        /* capital letter A with tilde */
+    {205, 213},                        /* capital letter O with tilde */
+
+    {214, 247},                        /* division sign */
+
+    {216, 255},                        /* small letter y with diaeresis */
+    {217, 221},                        /* capital letter Y with acute accent */
+
+    {229, 194},                        /* capital letter A with circumflex accent */
+    {230, 202},                        /* capital letter E with circumflex accent */
+    {231, 193},                        /* capital letter A with acute accent */
+    {232, 203},                        /* capital letter E with diaeresis */
+    {233, 200},                        /* capital letter E with grave accent */
+    {234, 205},                        /* capital letter I with acute accent */
+    {235, 206},                        /* capital letter I with circumflex accent */
+    {236, 207},                        /* capital letter I with diaeresis */
+    {237, 204},                        /* capital letter I with grave accent */
+    {238, 211},                        /* capital letter O with acute accent */
+    {239, 212},                        /* capital letter O with circumflex accent */
+
+    {241, 210},                        /* capital letter O with grave accent */
+    {242, 218},                        /* capital letter U with acute accent */
+    {243, 219},                        /* capital letter U with circumflex accent */
+    {244, 217},                        /* capital letter U with grave accent */
+  };
+#define NUMBER_OF_PAIRS (sizeof (known_pairs) / sizeof (KNOWN_PAIR))
+
+static void
+init_latin1_applemac (STEP *step)
+{
+  complete_pairs (step, 1, known_pairs, NUMBER_OF_PAIRS, 1);
+}
+
+static void
+init_applemac_latin1 (STEP *step)
+{
+  complete_pairs (step, 1, known_pairs, NUMBER_OF_PAIRS, 0);
+}
+
+void
+module_applemac (void)
+{
+  declare_step ("Latin-1", "Apple-Mac",
+               strict_mapping ? ONE_TO_MANY : REVERSIBLE,
+               init_latin1_applemac, NULL);
+  declare_step ("Apple-Mac", "Latin-1",
+               strict_mapping ? ONE_TO_MANY : REVERSIBLE,
+               init_applemac_latin1, NULL);
+
+#if 0
+  declare_alias ("Apple-Mac", "macintosh");
+#endif
+}
diff --git a/argmatch.c b/argmatch.c
new file mode 100644 (file)
index 0000000..efc9c01
--- /dev/null
@@ -0,0 +1,87 @@
+/* argmatch.c -- find a match for a string in an array
+   Copyright (C) 1990 Free Software Foundation, Inc.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Written by David MacKenzie <djm@ai.mit.edu> */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#ifdef STDC_HEADERS
+#include <string.h>
+#endif
+
+extern char *program_name;
+
+/* If ARG is an unambiguous match for an element of the
+   null-terminated array OPTLIST, return the index in OPTLIST
+   of the matched element, else -1 if it does not match any element
+   or -2 if it is ambiguous (is a prefix of more than one element).  */
+
+int
+argmatch (arg, optlist)
+     char *arg;
+     char **optlist;
+{
+  int i;                       /* Temporary index in OPTLIST.  */
+  int arglen;                  /* Length of ARG.  */
+  int matchind = -1;           /* Index of first nonexact match.  */
+  int ambiguous = 0;           /* If nonzero, multiple nonexact match(es).  */
+
+  arglen = strlen (arg);
+
+  /* Test all elements for either exact match or abbreviated matches.  */
+  for (i = 0; optlist[i]; i++)
+    {
+      if (!strncmp (optlist[i], arg, arglen))
+       {
+         if (strlen (optlist[i]) == arglen)
+           /* Exact match found.  */
+           return i;
+         else if (matchind == -1)
+           /* First nonexact match found.  */
+           matchind = i;
+         else
+           /* Second nonexact match found.  */
+           ambiguous = 1;
+       }
+    }
+  if (ambiguous)
+    return -2;
+  else
+    return matchind;
+}
+
+/* Error reporting for argmatch.
+   KIND is a description of the type of entity that was being matched.
+   VALUE is the invalid value that was given.
+   PROBLEM is the return value from argmatch.  */
+
+void
+invalid_arg (kind, value, problem)
+     char *kind;
+     char *value;
+     int problem;
+{
+  fprintf (stderr, "%s: ", program_name);
+  if (problem == -1)
+    fprintf (stderr, "invalid");
+  else                         /* Assume -2.  */
+    fprintf (stderr, "ambiguous");
+  fprintf (stderr, " %s `%s'\n", kind, value);
+}
diff --git a/ascilat1.l b/ascilat1.l
new file mode 100644 (file)
index 0000000..47e2a99
--- /dev/null
@@ -0,0 +1,87 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* Step name: ascii_latin1.  */
+
+%%
+
+\<\b\"|\"\b\<                  { output (171); }
+\>\b\"|\"\b\>                  { output (187); }
+A\b`|`\bA                      { output (192); }
+A\b'|'\bA                      { output (193); }
+A\b^|^\bA                      { output (194); }
+A\b~|~\bA                      { output (195); }
+A\b\"|\"\bA                    { output (196); }
+C\b,|,\bC                      { output (199); }
+E\b`|`\bE                      { output (200); }
+E\b'|'\bE                      { output (201); }
+E\b^|^\bE                      { output (202); }
+E\b\"|\"\bE                    { output (203); }
+I\b`|`\bI                      { output (204); }
+I\b'|'\bI                      { output (205); }
+I\b^|^\bI                      { output (206); }
+I\b\"|\"\bI                    { output (207); }
+N\b~|~\bN                      { output (209); }
+O\b`|`\bO                      { output (210); }
+O\b'|'\bO                      { output (211); }
+O\b^|^\bO                      { output (212); }
+O\b~|~\bO                      { output (213); }
+O\b\"|\"\bO                    { output (214); }
+O\b\/|\/\bO                    { output (216); }
+U\b`|`\bU                      { output (217); }
+U\b'|'\bU                      { output (218); }
+U\b^|^\bU                      { output (219); }
+U\b\"|\"\bU                    { output (220); }
+Y\b'|'\bY                      { output (221); }
+s\b\"|\"\bs                    { output (223); }
+a\b`|`\ba                      { output (224); }
+a\b'|'\ba                      { output (225); }
+a\b^|^\ba                      { output (226); }
+a\b~|~\ba                      { output (227); }
+a\b\"|\"\ba                    { output (228); }
+c\b,|,\bc                      { output (231); }
+e\b`|`\be                      { output (232); }
+e\b'|'\be                      { output (233); }
+e\b^|^\be                      { output (234); }
+e\b\"|\"\be                    { output (235); }
+i\b`|`\bi                      { output (236); }
+i\b'|'\bi                      { output (237); }
+i\b^|^\bi                      { output (238); }
+i\b\"|\"\bi                    { output (239); }
+n\b~|~\bn                      { output (241); }
+o\b`|`\bo                      { output (242); }
+o\b'|'\bo                      { output (243); }
+o\b^|^\bo                      { output (244); }
+o\b~|~\bo                      { output (245); }
+o\b\"|\"\bo                    { output (246); }
+o\b\/|\/\bo                    { output (248); }
+u\b`|`\bu                      { output (249); }
+u\b'|'\bu                      { output (250); }
+u\b^|^\bu                      { output (251); }
+u\b\"|\"\bu                    { output (252); }
+y\b'|'\by                      { output (253); }
+y\b\"|\"\by                    { output (255); }
+
+%%
+
+void
+module_ascii_latin1 (void)
+{
+  declare_step ("ASCII-BS", "Latin-1", MANY_TO_ONE, NULL, file_ascii_latin1);
+}
diff --git a/atarist.c b/atarist.c
new file mode 100644 (file)
index 0000000..b945c28
--- /dev/null
+++ b/atarist.c
@@ -0,0 +1,171 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* Define for using new double step code.  */
+#define USE_DOUBLE_STEP 1
+
+#include "recode.h"
+
+#ifdef USE_DOUBLE_STEP
+
+/* RFC 1345 style description for AtariST (non official).  */
+
+/* Andreas Schwab writes:
+   
+   There are some characters which i'm not sure about.  When compared
+   with IBM865 (which i think is the original source for the atari
+   charset) the characters "bullet operator" and "middle dot" (dec
+   249/250) are swapped.  This may be intentional or a bug in the table
+   for IBM865.  Also character dec 238 looks more like "element of" than
+   "greek small letter epsilon", actually it is a bit too large for both
+   interpretations.  I suppose that the other changes were made for
+   copyright reasons.  */
+
+static DOUBLE_TABLE table =
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:a!aac,e>e:e!i:i>i!A:AAE'aeAEo>o:o!u>u!y:O:U:CtPdYessFl",
+    "a'i'o'u'n?N?-a-o?ININO1214!I<<>>a?o?O/o/oeOEA!A?O?':''/-PICoRgTM",
+    "ijIJA+B+G+D+H+W+Z+X+TjJ+K%K+L+M%M+N%N+S+E+P%P+ZjZJQ+R+ShT+SEAN00",
+    "a*b*G*p*S*s*m*t*F*H*W*d*Io/0(-(U=3+->==<IuIl-:?2ObSb.MRTnS2S3S'-",
+  };
+
+#else /* not USE_DOUBLE_STEP */
+
+/* Data for Atari ST to ISO Latin-1 code conversions.  */
+
+static KNOWN_PAIR known_pairs[] =
+  {
+    {128, 199},                        /* C, */
+    {129, 252},                        /* u" */
+    {130, 233},                        /* e' */
+    {131, 226},                        /* a^ */
+    {132, 228},                        /* a" */
+    {133, 224},                        /* a` */
+    {134, 229},                        /* aa */
+    {135, 231},                        /* c, */
+    {136, 234},                        /* e^ */
+    {137, 235},                        /* e" */
+    {138, 232},                        /* e` */
+    {139, 239},                        /* i" */
+    {140, 238},                        /* i^ */
+    {141, 236},                        /* i` */
+    {142, 196},                        /* A" */
+    {143, 197},                        /* AA */
+    {144, 201},                        /* E' */
+    {145, 230},                        /* ae */
+    {146, 198},                        /* AE */
+    {147, 244},                        /* o^ */
+    {148, 246},                        /* o" */
+    {149, 242},                        /* o` */
+    {150, 251},                        /* u^ */
+    {151, 249},                        /* u` */
+    {152, 255},                        /* y" */
+    {153, 214},                        /* O" */
+    {154, 220},                        /* U" */
+    {155, 162},                        /* \cent */
+    {156, 163},                        /* \pound */
+    {157, 165},                        /* \yen */
+    {158, 223},                        /* \ss */
+
+    {160, 225},                        /* a' */
+    {161, 237},                        /* i' */
+    {162, 243},                        /* o' */
+    {163, 250},                        /* u' */
+    {164, 241},                        /* n~ */
+    {165, 209},                        /* N~ */
+    {166, 170},                        /* a_ */
+    {167, 186},                        /* o_ */
+    {168, 191},                        /* ?' */
+
+    {170, 172},                        /* \neg */
+    {171, 189},                        /* 1/2 */
+    {172, 188},                        /* 1/4 */
+    {173, 161},                        /* !` */
+    {174, 171},                        /* `` */
+    {175, 187},                        /* '' */
+    {176, 227},                        /* a~ */
+    {177, 245},                        /* o~ */
+    {178, 216},                        /* O/ */
+    {179, 248},                        /* o/ */
+
+    {182, 192},                        /* A` */
+    {183, 195},                        /* A~ */
+    {184, 213},                        /* O~ */
+    {185, 168},                        /* diaeresis */
+    {186, 180},                        /* acute accent */
+
+    {188, 182},                        /* pilcrow sign */
+    {189, 169},                        /* copyright sign */
+    {190, 174},                        /* registered trade mark sign */
+
+    {221, 167},                        /* paragraph sign, section sign */
+
+    {230, 181},                        /* mu, micro */
+
+    {241, 177},                        /* +- */
+
+    {246, 247},                        /* \div */
+
+    {248, 176},                        /* \deg */
+
+    {250, 183},                        /* \cdot */
+
+    {253, 178},                        /* ^2 */
+    {254, 179},                        /* ^3 */
+  };
+#define NUMBER_OF_PAIRS (sizeof (known_pairs) / sizeof (KNOWN_PAIR))
+
+static void
+init_latin1_atarist (STEP *step)
+{
+  complete_pairs (step, 1, known_pairs, NUMBER_OF_PAIRS, 1);
+}
+
+static void
+init_atarist_latin1 (STEP *step)
+{
+  complete_pairs (step, 1, known_pairs, NUMBER_OF_PAIRS, 0);
+}
+
+#endif /* not USE_DOUBLE_STEP */
+
+void
+module_atarist (void)
+{
+
+#ifdef USE_DOUBLE_STEP
+
+  declare_double_step (&table, "AtariST", 2);
+
+#else /* not USE_DOUBLE_STEP */
+
+  declare_step ("Latin-1", "AtariST",
+               strict_mapping ? ONE_TO_MANY : REVERSIBLE,
+               init_latin1_atarist, NULL);
+  declare_step ("AtariST", "Latin-1",
+               strict_mapping ? ONE_TO_MANY : REVERSIBLE,
+               init_atarist_latin1, NULL);
+
+#endif /* not USE_DOUBLE_STEP */
+
+}
diff --git a/bangbang.c b/bangbang.c
new file mode 100644 (file)
index 0000000..8b19993
--- /dev/null
@@ -0,0 +1,381 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+static const char *const translation_table[256] =
+  {
+    "!!@",                     /*   0 */
+    "!!a",                     /*   1 */
+    "!!b",                     /*   2 */
+    "!!c",                     /*   3 */
+    "!!d",                     /*   4 */
+    "!!e",                     /*   5 */
+    "!!f",                     /*   6 */
+    "!!g",                     /*   7 */
+    "!!h",                     /*   8 */
+    "!!i",                     /*   9 */
+    "\n",                      /*  10, would have been "!!j" */
+    "!!k",                     /*  11 */
+    "!!l",                     /*  12 */
+    "!!m",                     /*  13 */
+    "!!n",                     /*  14 */
+    "!!o",                     /*  15 */
+    "!!p",                     /*  16 */
+    "!!q",                     /*  17 */
+    "!!r",                     /*  18 */
+    "!!s",                     /*  19 */
+    "!!t",                     /*  20 */
+    "!!u",                     /*  21 */
+    "!!v",                     /*  22 */
+    "!!w",                     /*  23 */
+    "!!x",                     /*  24 */
+    "!!y",                     /*  25 */
+    "!!z",                     /*  26 */
+    "!![",                     /*  27 */
+    "!!\\",                    /*  28 */
+    "!!]",                     /*  29 */
+    "!!^",                     /*  30 */
+    "!!_",                     /*  31 */
+    " ",                       /*  32 */
+    "!\"",                     /*  33 */
+    "\"",                      /*  34 */
+    "#",                       /*  35 */
+    "$",                       /*  36 */
+    "%",                       /*  37 */
+    "&",                       /*  38 */
+    "'",                       /*  39 */
+    "(",                       /*  40 */
+    ")",                       /*  41 */
+    "*",                       /*  42 */
+    "+",                       /*  43 */
+    ",",                       /*  44 */
+    "-",                       /*  45 */
+    ".",                       /*  46 */
+    "/",                       /*  47 */
+    "0",                       /*  48 */
+    "1",                       /*  49 */
+    "2",                       /*  50 */
+    "3",                       /*  51 */
+    "4",                       /*  52 */
+    "5",                       /*  53 */
+    "6",                       /*  54 */
+    "7",                       /*  55 */
+    "8",                       /*  56 */
+    "9",                       /*  57 */
+    ":",                       /*  58 */
+    ";",                       /*  59 */
+    "<",                       /*  60 */
+    "=",                       /*  61 */
+    ">",                       /*  62 */
+    "?",                       /*  63 */
+    "@",                       /*  64 */
+    "!a",                      /*  65 */
+    "!b",                      /*  66 */
+    "!c",                      /*  67 */
+    "!d",                      /*  68 */
+    "!e",                      /*  69 */
+    "!f",                      /*  70 */
+    "!g",                      /*  71 */
+    "!h",                      /*  72 */
+    "!i",                      /*  73 */
+    "!j",                      /*  74 */
+    "!k",                      /*  75 */
+    "!l",                      /*  76 */
+    "!m",                      /*  77 */
+    "!n",                      /*  78 */
+    "!o",                      /*  79 */
+    "!p",                      /*  80 */
+    "!q",                      /*  81 */
+    "!r",                      /*  82 */
+    "!s",                      /*  83 */
+    "!t",                      /*  84 */
+    "!u",                      /*  85 */
+    "!v",                      /*  86 */
+    "!w",                      /*  87 */
+    "!x",                      /*  88 */
+    "!y",                      /*  89 */
+    "!z",                      /*  90 */
+    "[",                       /*  91 */
+    "\\",                      /*  92 */
+    "]",                       /*  93 */
+    "^",                       /*  94 */
+    "_",                       /*  95 */
+    "!@",                      /*  96 */
+    "a",                       /*  97 */
+    "b",                       /*  98 */
+    "c",                       /*  99 */
+    "d",                       /* 100 */
+    "e",                       /* 101 */
+    "f",                       /* 102 */
+    "g",                       /* 103 */
+    "h",                       /* 104 */
+    "i",                       /* 105 */
+    "j",                       /* 106 */
+    "k",                       /* 107 */
+    "l",                       /* 108 */
+    "m",                       /* 109 */
+    "n",                       /* 110 */
+    "o",                       /* 111 */
+    "p",                       /* 112 */
+    "q",                       /* 113 */
+    "r",                       /* 114 */
+    "s",                       /* 115 */
+    "t",                       /* 116 */
+    "u",                       /* 117 */
+    "v",                       /* 118 */
+    "w",                       /* 119 */
+    "x",                       /* 120 */
+    "y",                       /* 121 */
+    "z",                       /* 122 */
+    "![",                      /* 123 */
+    "!\\",                     /* 124 */
+    "!]",                      /* 125 */
+    "!^",                      /* 126 */
+    "!_",                      /* 127 */
+
+    NULL,                      /* 128 */
+    NULL,                      /* 129 */
+    NULL,                      /* 130 */
+    NULL,                      /* 131 */
+    NULL,                      /* 132 */
+    NULL,                      /* 133 */
+    NULL,                      /* 134 */
+    NULL,                      /* 135 */
+    NULL,                      /* 136 */
+    NULL,                      /* 137 */
+    NULL,                      /* 138 */
+    NULL,                      /* 139 */
+    NULL,                      /* 140 */
+    NULL,                      /* 141 */
+    NULL,                      /* 142 */
+    NULL,                      /* 143 */
+    NULL,                      /* 144 */
+    NULL,                      /* 145 */
+    NULL,                      /* 146 */
+    NULL,                      /* 147 */
+    NULL,                      /* 148 */
+    NULL,                      /* 149 */
+    NULL,                      /* 150 */
+    NULL,                      /* 151 */
+    NULL,                      /* 152 */
+    NULL,                      /* 153 */
+    NULL,                      /* 154 */
+    NULL,                      /* 155 */
+    NULL,                      /* 156 */
+    NULL,                      /* 157 */
+    NULL,                      /* 158 */
+    NULL,                      /* 159 */
+
+    " ",                       /* 160 no-break space */
+    NULL,                      /* 161 inverted exclamation mark */
+    NULL,                      /* 162 cent sign */
+    NULL,                      /* 163 pound sign */
+    NULL,                      /* 164 currency sign */
+    NULL,                      /* 165 yen sign */
+    NULL,                      /* 166 broken bar */
+    NULL,                      /* 167 paragraph sign, section sign */
+    NULL,                      /* 168 diaeresis */
+    NULL,                      /* 169 copyright sign */
+    NULL,                      /* 170 feminine ordinal indicator */
+    "!>",                      /* 171 left angle quotation mark */
+    NULL,                      /* 172 not sign */
+    NULL,                      /* 173 soft hyphen */
+    NULL,                      /* 174 registered trade mark sign */
+    NULL,                      /* 175 macron */
+    NULL,                      /* 176 degree sign */
+    NULL,                      /* 177 plus-minus sign */
+    NULL,                      /* 178 superscript two */
+    NULL,                      /* 179 superscript three */
+    NULL,                      /* 180 acute accent */
+    NULL,                      /* 181 small greek mu, micro sign */
+    NULL,                      /* 182 pilcrow sign */
+    NULL,                      /* 183 middle dot */
+    NULL,                      /* 184 cedilla */
+    NULL,                      /* 185 superscript one */
+    NULL,                      /* 186 masculine ordinal indicator */
+    "!?",                      /* 187 right angle quotation mark */
+    NULL,                      /* 188 vulgar fraction one quarter */
+    NULL,                      /* 189 vulgar fraction one half */
+    NULL,                      /* 190 vulgar fraction three quarters */
+    NULL,                      /* 191 inverted question mark */
+    NULL,                      /* 192 capital A with grave accent */
+    NULL,                      /* 193 capital A with acute accent */
+    NULL,                      /* 194 capital A with circumflex accent */
+    NULL,                      /* 195 capital A with tilde */
+    NULL,                      /* 196 capital A diaeresis */
+    NULL,                      /* 197 capital A with ring above */
+    NULL,                      /* 198 capital diphthong A with E */
+    NULL,                      /* 199 capital C with cedilla */
+    NULL,                      /* 200 capital E with grave accent */
+    NULL,                      /* 201 capital E with acute accent */
+    NULL,                      /* 202 capital E with circumflex accent */
+    NULL,                      /* 203 capital E with diaeresis */
+    NULL,                      /* 204 capital I with grave accent */
+    NULL,                      /* 205 capital I with acute accent */
+    NULL,                      /* 206 capital I with circumflex accent */
+    NULL,                      /* 207 capital I with diaeresis */
+    NULL,                      /* 208 capital icelandic ETH */
+    NULL,                      /* 209 capital N with tilde */
+    NULL,                      /* 210 capital O with grave accent */
+    NULL,                      /* 211 capital O with acute accent */
+    NULL,                      /* 212 capital O with circumflex accent */
+    NULL,                      /* 213 capital O with tilde */
+    NULL,                      /* 214 capital O with diaeresis */
+    NULL,                      /* 215 multiplication sign */
+    NULL,                      /* 216 capital O with oblique stroke */
+    NULL,                      /* 217 capital U with grave accent */
+    NULL,                      /* 218 capital U with acute accent */
+    NULL,                      /* 219 capital U with circumflex accent */
+    NULL,                      /* 220 capital U with diaeresis */
+    NULL,                      /* 221 capital Y with acute accent */
+    NULL,                      /* 222 capital icelandic THORN */
+    NULL,                      /* 223 small german sharp s */
+    "!0",                      /* 224 small a with grave accent */
+    NULL,                      /* 225 small a with acute accent */
+    "!1",                      /* 226 small a with circumflex accent */
+    NULL,                      /* 227 small a with tilde */
+    NULL,                      /* 228 small a with diaeresis */
+    NULL,                      /* 229 small a with ring above */
+    "!;",                      /* 230 small diphthong a with e */
+    "!=",                      /* 231 small c with cedilla */
+    "!3",                      /* 232 small e with grave accent */
+    "!2",                      /* 233 small e with acute accent */
+    "!5",                      /* 234 small e with circumflex accent */
+    "!4",                      /* 235 small e with diaeresis */
+    NULL,                      /* 236 small i with grave accent */
+    NULL,                      /* 237 small i with acute accent */
+    "!7",                      /* 238 small i with circumflex accent */
+    "!6",                      /* 239 small i with diaeresis */
+    NULL,                      /* 240 small icelandic eth */
+    NULL,                      /* 241 small n with tilde */
+    NULL,                      /* 242 small o with grave accent */
+    NULL,                      /* 243 small o with acute accent */
+    "!8",                      /* 244 small o with circumflex accent */
+    NULL,                      /* 245 small o with tilde */
+    NULL,                      /* 246 small o with diaeresis */
+    "!<",                      /* 247 division sign (or French oe?) */
+    NULL,                      /* 248 small o with oblique stroke */
+    "!9",                      /* 249 small u with grave accent */
+    NULL,                      /* 250 small u with acute accent */
+    "!:",                      /* 251 small u with circumflex accent */
+    NULL,                      /* 252 small u with diaeresis */
+    NULL,                      /* 253 small y with acute accent */
+    NULL,                      /* 254 small icelandic thorn */
+    NULL,                      /* 255 small y with diaeresis */
+  };
+
+static void
+init_latin1_bangbang (STEP *step)
+{
+  step->one_to_many = translation_table;
+}
+
+static int
+file_bangbang_latin1 (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int reversible;              /* reversibility of recoding */
+  int input_char;              /* current character */
+
+  reversible = 1;
+  while (input_char = getc (input_file), input_char != EOF)
+    {
+      if (input_char >= 'A' && input_char <= 'Z')
+        input_char += 'a' - 'A';
+      else if (input_char == '!')
+       {
+         input_char = getc (input_file);
+         if (input_char >= 'a' && input_char <= 'z')
+           input_char += 'A' - 'a';
+         else if (input_char < 'A' || input_char > 'Z')
+           switch (input_char)
+             {
+             case '"': input_char = '!'; break;
+             case '0': input_char = 224; break; /* a` */
+             case '1': input_char = 226; break; /* a^ */
+             case '2': input_char = 233; break; /* e' */
+             case '3': input_char = 232; break; /* e` */
+             case '4': input_char = 235; break; /* e" */
+             case '5': input_char = 234; break; /* e^ */
+             case '6': input_char = 236; break; /* e" */
+             case '7': input_char = 238; break; /* i^ */
+             case '8': input_char = 244; break; /* o^ */
+             case '9': input_char = 249; break; /* u` */
+             case ':': input_char = 251; break; /* u^ */
+             case '=': input_char = 231; break; /* c, */
+             case '>': input_char = 171; break; /* `` */
+             case '?': input_char = 187; break; /* '' */
+             case ';': input_char = 230; break; /* ae */
+             case '<': input_char = 247; break; /* oe ??? */
+             case '@': input_char = '`'; break;
+             case '[': input_char = '{'; break;
+             case '\\': input_char = '|'; break;
+             case ']': input_char = '}'; break;
+             case '^': input_char = '~'; break;
+             case '_': input_char = 127; break; /* del */
+
+             case '!':
+               input_char = getc (input_file);
+
+               if (input_char == 'J' || input_char == 'j')
+                 reversible = 0;
+                   
+               if (input_char >= 'A' && input_char <= 'Z')
+                 input_char += 1 - 'A';
+               else if (input_char >= 'a' && input_char <= 'z')
+                 input_char += 1 - 'a';
+               else
+                 switch (input_char)
+                   {
+                   case '@': input_char =   0; break;
+                   case '[': input_char =  27; break;
+                   case '\\': input_char =  28; break;
+                   case ']': input_char =  29; break;
+                   case '^': input_char =  30; break;
+                   case '_': input_char =  31; break;
+
+                   default:
+                     reversible = 0;
+                     putc ('!', output_file);
+                     putc ('!', output_file);
+                     if (input_char == EOF)
+                       return 0;
+                   }
+               break;
+
+             default:
+               reversible = 0;
+               putc ('!', output_file);
+               if (input_char == EOF)
+                 return 0;
+             }
+       }
+      putc (input_char, output_file);
+    }
+  return reversible;
+}
+
+void
+module_bangbang (void)
+{
+  declare_step ("Latin-1", "Bang-Bang", ONE_TO_MANY, init_latin1_bangbang,
+               file_one_to_many);
+  declare_step ("Bang-Bang", "Latin-1", MANY_TO_ONE, NULL,
+               file_bangbang_latin1);
+}
diff --git a/c-boxes.el b/c-boxes.el
new file mode 100644 (file)
index 0000000..c1b80e3
--- /dev/null
@@ -0,0 +1,406 @@
+;;; Boxed comments for C mode.
+;;; Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+;;; Francois Pinard <pinard@iro.umontreal.ca>, April 1991.
+;;;
+;;; I often refill paragraphs inside C comments, while stretching or
+;;; shrinking the surrounding box as needed.  This is a real pain to
+;;; do by hand.  Here is the code I made to ease my life on this,
+;;; usable from within GNU Emacs.  It would not be fair giving all
+;;; sources for a product without also giving the means for nicely
+;;; modifying them.
+;;;
+;;; The function rebox-c-comment adjust comment boxes without
+;;; refilling comment paragraphs, while reindent-c-comment adjust
+;;; comment boxes after refilling.  Numeric prefixes are used to add,
+;;; remove, or change the style of the box surrounding the comment.
+;;; Since refilling paragraphs in C mode does make sense only for
+;;; comments, this code redefines the M-q command in C mode.  I use
+;;; this hack by putting, in my .emacs file:
+;;;
+;;;    (setq c-mode-hook
+;;;          '(lambda ()
+;;;             (define-key c-mode-map "\M-q" 'reindent-c-comment)))
+;;;    (autoload 'rebox-c-comment "c-boxes" nil t)
+;;;    (autoload 'reindent-c-comment "c-boxes" nil t)
+;;;
+;;; The cursor should be within a comment before any of these
+;;; commands, or else it should be between two comments, in which case
+;;; the command applies to the next comment.  When the command is
+;;; given without prefix, the current comment box type is recognized
+;;; and preserved.  Given 0 as a prefix, the comment box disappears
+;;; and the comment stays between a single opening `/*' and a single
+;;; closing `*/'.  Given 1 or 2 as a prefix, a single or doubled lined
+;;; comment box is forced.  Given 3 as a prefix, a Taarna style box is
+;;; forced, but you do not even want to hear about those.  When a
+;;; negative prefix is given, the absolute value is used, but the
+;;; default style is changed.  Any other value (like C-u alone) forces
+;;; the default box style.
+;;;
+;;; I observed rounded corners first in some code from Warren Tucker
+;;; <wht@n4hgf.mt-park.ga.us>.
+
+(defvar c-box-default-style 'single "*Preferred style for box comments.")
+(defvar c-mode-taarna-style nil "*Non-nil for Taarna team C-style.")
+
+;;; Set or reset the Taarna team's own way for a C style.
+
+(defun taarna-mode ()
+  (interactive)
+  (if c-mode-taarna-style
+      (progn
+
+       (setq c-mode-taarna-style nil)
+       (setq c-indent-level 2)
+       (setq c-continued-statement-offset 2)
+       (setq c-brace-offset 0)
+       (setq c-argdecl-indent 5)
+       (setq c-label-offset -2)
+       (setq c-tab-always-indent t)
+       (setq c-box-default-style 'single)
+       (message "C mode: GNU style"))
+
+    (setq c-mode-taarna-style t)
+    (setq c-indent-level 4)
+    (setq c-continued-statement-offset 4)
+    (setq c-brace-offset -4)
+    (setq c-argdecl-indent 4)
+    (setq c-label-offset -4)
+    (setq c-tab-always-indent t)
+    (setq c-box-default-style 'taarna)
+    (message "C mode: Taarna style")))
+
+;;; Return the minimum value of the left margin of all lines, or -1 if
+;;; all lines are empty.
+
+(defun buffer-left-margin ()
+  (let ((margin -1))
+    (goto-char (point-min))
+    (while (not (eobp))
+      (skip-chars-forward " \t")
+      (if (not (looking-at "\n"))
+         (setq margin
+               (if (< margin 0)
+                   (current-column)
+                 (min margin (current-column)))))
+      (forward-line 1))
+    margin))
+
+;;; Return the maximum value of the right margin of all lines.  Any
+;;; sentence ending a line has a space guaranteed before the margin.
+
+(defun buffer-right-margin ()
+  (let ((margin 0) period)
+    (goto-char (point-min))
+    (while (not (eobp))
+      (end-of-line)
+      (if (bobp)
+         (setq period 0)
+       (backward-char 1)
+       (setq period (if (looking-at "[.?!]") 1 0))
+       (forward-char 1))
+      (setq margin (max margin (+ (current-column) period)))
+      (forward-char 1))
+    margin))
+
+;;; Add, delete or adjust a C comment box.  If FLAG is nil, the
+;;; current boxing style is recognized and preserved.  When 0, the box
+;;; is removed; when 1, a single lined box is forced; when 2, a double
+;;; lined box is forced; when 3, a Taarna style box is forced.  If
+;;; negative, the absolute value is used, but the default style is
+;;; changed.  For any other value (like C-u), the default style is
+;;; forced.  If REFILL is not nil, refill the comment paragraphs prior
+;;; to reboxing.
+
+(defun rebox-c-comment-engine (flag refill)
+  (save-restriction
+    (let ((undo-list buffer-undo-list)
+         (marked-point (point-marker))
+         (saved-point (point))
+         box-style left-margin right-margin)
+
+      ;; First, find the limits of the block of comments following or
+      ;; enclosing the cursor, or return an error if the cursor is not
+      ;; within such a block of comments, narrow the buffer, and
+      ;; untabify it.
+
+      ;; - insure the point is into the following comment, if any
+
+      (skip-chars-forward " \t\n")
+      (if (looking-at "/\\*")
+         (forward-char 2))
+
+      (let ((here (point)) start end temp)
+
+       ;; - identify a minimal comment block
+
+       (search-backward "/*")
+       (setq temp (point))
+       (beginning-of-line)
+       (setq start (point))
+       (skip-chars-forward " \t")
+       (if (< (point) temp)
+           (progn
+             (goto-char saved-point)
+             (error "text before comment's start")))
+       (search-forward "*/")
+       (setq temp (point))
+       (end-of-line)
+       (if (looking-at "\n")
+           (forward-char 1))
+       (setq end (point))
+       (skip-chars-backward " \t\n")
+       (if (> (point) temp)
+           (progn
+             (goto-char saved-point)
+             (error "text after comment's end")))
+       (if (< end here)
+           (progn
+             (goto-char saved-point)
+             (error "outside any comment block")))
+
+       ;; - try to extend the comment block backwards
+
+       (goto-char start)
+       (while (and (not (bobp))
+                   (progn (previous-line 1)
+                          (beginning-of-line)
+                          (looking-at "[ \t]*/\\*.*\\*/[ \t]*$")))
+         (setq start (point)))
+
+       ;; - try to extend the comment block forward
+
+       (goto-char end)
+       (while (looking-at "[ \t]*/\\*.*\\*/[ \t]*$")
+         (forward-line 1)
+         (beginning-of-line)
+         (setq end (point)))
+
+       ;; - narrow to the whole block of comments
+
+       (narrow-to-region start end))
+
+      ;; Second, remove all the comment marks, and move all the text
+      ;; rigidly to the left to insure the left margin stays at the
+      ;; same place.  At the same time, recognize and save the box
+      ;; style in BOX-STYLE.
+
+      (let ((previous-margin (buffer-left-margin))
+           actual-margin)
+
+       ;; - remove all comment marks
+
+       (goto-char (point-min))
+       (replace-regexp "^\\([ \t]*\\)/\\*" "\\1  ")
+       (goto-char (point-min))
+       (replace-regexp "^\\([ \t]*\\)|" "\\1 ")
+       (goto-char (point-min))
+       (replace-regexp "\\(\\*/\\||\\)[ \t]*" "")
+       (goto-char (point-min))
+       (replace-regexp "\\*/[ \t]*/\\*" " ")
+
+       ;; - remove the first and last dashed lines
+
+       (setq box-style 'plain)
+       (goto-char (point-min))
+       (if (looking-at "^[ \t]*-*[.\+\\]?[ \t]*\n")
+           (progn
+             (setq box-style 'single)
+             (replace-match ""))
+         (if (looking-at "^[ \t]*=*[.\+\\]?[ \t]*\n")
+             (progn
+               (setq box-style 'double)
+               (replace-match ""))))
+       (goto-char (point-max))
+       (previous-line 1)
+       (beginning-of-line)
+       (if (looking-at "^[ \t]*[`\+\\]?*[-=]+[ \t]*\n")
+           (progn
+             (if (eq box-style 'plain)
+                 (setq box-style 'taarna))
+             (replace-match "")))
+
+       ;; - remove all spurious whitespace
+
+       (goto-char (point-min))
+       (replace-regexp "[ \t]+$" "")
+       (goto-char (point-min))
+       (if (looking-at "\n+")
+           (replace-match ""))
+       (goto-char (point-max))
+       (skip-chars-backward "\n")
+       (if (looking-at "\n\n+")
+           (replace-match "\n"))
+       (goto-char (point-min))
+       (replace-regexp "\n\n\n+" "\n\n")
+
+       ;; - move the text left is adequate
+
+       (setq actual-margin (buffer-left-margin))
+       (if (not (= previous-margin actual-margin))
+           (indent-rigidly (point-min) (point-max)
+                           (- previous-margin actual-margin))))
+
+      ;; Third, select the new box style from the old box style and
+      ;; the argument, choose the margins for this style and refill
+      ;; each paragraph.
+
+      ;; - modify box-style only if flag is defined
+
+      (if flag
+         (setq box-style
+               (cond ((eq flag 0) 'plain)
+                     ((eq flag 1) 'single)
+                     ((eq flag 2) 'double)
+                     ((eq flag 3) 'taarna)
+                     ((eq flag '-) (setq c-box-default-style 'plain) 'plain)
+                     ((eq flag -1) (setq c-box-default-style 'single) 'single)
+                     ((eq flag -2) (setq c-box-default-style 'double) 'double)
+                     ((eq flag -3) (setq c-box-default-style 'taarna) 'taarna)
+                     (t c-box-default-style))))
+
+      ;; - compute the left margin
+
+      (setq left-margin (buffer-left-margin))
+
+      ;; - temporarily set the fill prefix and column, then refill
+
+      (untabify (point-min) (point-max))
+
+      (if refill
+         (let ((fill-prefix (make-string left-margin ? ))
+               (fill-column (- fill-column
+                               (if (memq box-style '(single double)) 4 6))))
+           (fill-region (point-min) (point-max))))
+
+      ;; - compute the right margin after refill
+
+      (setq right-margin (buffer-right-margin))
+
+      ;; Fourth, put the narrowed buffer back into a comment box,
+      ;; according to the value of box-style.  Values may be:
+      ;;    plain: insert between a single pair of comment delimiters
+      ;;    single: complete box, overline and underline with dashes
+      ;;    double: complete box, overline and underline with equal signs
+      ;;    taarna: comment delimiters on each line, underline with dashes
+
+      ;; - move the right margin to account for left inserts
+
+      (setq right-margin (+ right-margin
+                           (if (memq box-style '(single double))
+                               2
+                             3)))
+
+      ;; - construct the box comment, from top to bottom
+
+      (goto-char (point-min))
+      (cond ((eq box-style 'plain)
+
+            ;; - construct a plain style comment
+
+            (skip-chars-forward " " (+ (point) left-margin))
+            (insert (make-string (- left-margin (current-column)) ? )
+                    "/* ")
+            (end-of-line)
+            (forward-char 1)
+            (while (not (eobp))
+              (skip-chars-forward " " (+ (point) left-margin))
+              (insert (make-string (- left-margin (current-column)) ? )
+                      "   ")
+              (end-of-line)
+              (forward-char 1))
+            (backward-char 1)
+            (insert "  */"))
+           ((eq box-style 'single)
+
+            ;; - construct a single line style comment
+
+            (indent-to left-margin)
+            (insert "/*")
+            (insert (make-string (- right-margin (current-column)) ?-)
+                    "-.\n")
+            (while (not (eobp))
+              (skip-chars-forward " " (+ (point) left-margin))
+              (insert (make-string (- left-margin (current-column)) ? )
+                      "| ")
+              (end-of-line)
+              (indent-to right-margin)
+              (insert " |")
+              (forward-char 1))
+            (indent-to left-margin)
+            (insert "`")
+            (insert (make-string (- right-margin (current-column)) ?-)
+                    "*/\n"))
+           ((eq box-style 'double)
+
+            ;; - construct a double line style comment
+
+            (indent-to left-margin)
+            (insert "/*")
+            (insert (make-string (- right-margin (current-column)) ?=)
+                    "=\\\n")
+            (while (not (eobp))
+              (skip-chars-forward " " (+ (point) left-margin))
+              (insert (make-string (- left-margin (current-column)) ? )
+                      "| ")
+              (end-of-line)
+              (indent-to right-margin)
+              (insert " |")
+              (forward-char 1))
+            (indent-to left-margin)
+            (insert "\\")
+            (insert (make-string (- right-margin (current-column)) ?=)
+                    "*/\n"))
+           ((eq box-style 'taarna)
+
+            ;; - construct a Taarna style comment
+
+            (while (not (eobp))
+              (skip-chars-forward " " (+ (point) left-margin))
+              (insert (make-string (- left-margin (current-column)) ? )
+                      "/* ")
+              (end-of-line)
+              (indent-to right-margin)
+              (insert " */")
+              (forward-char 1))
+            (indent-to left-margin)
+            (insert "/* ")
+            (insert (make-string (- right-margin (current-column)) ?-)
+                    " */\n"))
+           (t (error "unknown box style")))
+
+      ;; Fifth, retabify, restore the point position, then cleanup the
+      ;; undo list of any boundary since we started.
+
+      ;; - retabify before left margin only (adapted from tabify.el)
+
+      (goto-char (point-min))
+      (while (re-search-forward "^[ \t][ \t][ \t]*" nil t)
+       (let ((column (current-column))
+             (indent-tabs-mode t))
+         (delete-region (match-beginning 0) (point))
+         (indent-to column)))
+
+      ;; - restore the point position
+
+      (goto-char (marker-position marked-point))
+
+      ;; - remove all intermediate boundaries from the undo list
+
+      (if (not (eq buffer-undo-list undo-list))
+         (let ((cursor buffer-undo-list))
+           (while (not (eq (cdr cursor) undo-list))
+             (if (car (cdr cursor))
+                 (setq cursor (cdr cursor))
+               (rplacd cursor (cdr (cdr cursor))))))))))
+
+;;; Rebox a C comment without refilling it.
+
+(defun rebox-c-comment (flag)
+  (interactive "P")
+  (rebox-c-comment-engine flag nil))
+
+;;; Rebox a C comment after refilling.
+
+(defun reindent-c-comment (flag)
+  (interactive "P")
+  (rebox-c-comment-engine flag t))
diff --git a/cdcnos.c b/cdcnos.c
new file mode 100644 (file)
index 0000000..39c5473
--- /dev/null
+++ b/cdcnos.c
@@ -0,0 +1,322 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+static const char *const translation_table[128] =
+  {
+    "^5",                      /*   0 */
+    "^6",                      /*   1 */
+    "^7",                      /*   2 */
+    "^8",                      /*   3 */
+    "^9",                      /*   4 */
+    "^+",                      /*   5 */
+    "^-",                      /*   6 */
+    "^*",                      /*   7 */
+    "^/",                      /*   8 */
+    "^(",                      /*   9 */
+    "\n",                      /*  10, would have been "^)" */
+    "^$",                      /*  11 */
+    "^=",                      /*  12 */
+    "^ ",                      /*  13 */
+    "^,",                      /*  14 */
+    "^.",                      /*  15 */
+    "^#",                      /*  16 */
+    "^[",                      /*  17 */
+    "^]",                      /*  18 */
+    "^%",                      /*  19 */
+    "^\"",                     /*  20 */
+    "^_",                      /*  21 */
+    "^!",                      /*  22 */
+    "^&",                      /*  23 */
+    "^'",                      /*  24 */
+    "^?",                      /*  25 */
+    "^<",                      /*  26 */
+    "^>",                      /*  27 */
+    "^@",                      /*  28 */
+    "^\\",                     /*  29 */
+    "^^",                      /*  30 */
+    "^;",                      /*  31 */
+    " ",                       /*  32 */
+    "!",                       /*  33 */
+    "\"",                      /*  34 */
+    "#",                       /*  35 */
+    "$",                       /*  36 */
+    "%",                       /*  37 */
+    "&",                       /*  38 */
+    "'",                       /*  39 */
+    "(",                       /*  40 */
+    ")",                       /*  41 */
+    "*",                       /*  42 */
+    "+",                       /*  43 */
+    ",",                       /*  44 */
+    "-",                       /*  45 */
+    ".",                       /*  46 */
+    "/",                       /*  47 */
+    "0",                       /*  48 */
+    "1",                       /*  49 */
+    "2",                       /*  50 */
+    "3",                       /*  51 */
+    "4",                       /*  52 */
+    "5",                       /*  53 */
+    "6",                       /*  54 */
+    "7",                       /*  55 */
+    "8",                       /*  56 */
+    "9",                       /*  57 */
+    "@D",                      /*  58 */
+    ";",                       /*  59 */
+    "<",                       /*  60 */
+    "=",                       /*  61 */
+    ">",                       /*  62 */
+    "?",                       /*  63 */
+    "@A",                      /*  64 */
+    "A",                       /*  65 */
+    "B",                       /*  66 */
+    "C",                       /*  67 */
+    "D",                       /*  68 */
+    "E",                       /*  69 */
+    "F",                       /*  70 */
+    "G",                       /*  71 */
+    "H",                       /*  72 */
+    "I",                       /*  73 */
+    "J",                       /*  74 */
+    "K",                       /*  75 */
+    "L",                       /*  76 */
+    "M",                       /*  77 */
+    "N",                       /*  78 */
+    "O",                       /*  79 */
+    "P",                       /*  80 */
+    "Q",                       /*  81 */
+    "R",                       /*  82 */
+    "S",                       /*  83 */
+    "T",                       /*  84 */
+    "U",                       /*  85 */
+    "V",                       /*  86 */
+    "W",                       /*  87 */
+    "X",                       /*  88 */
+    "Y",                       /*  89 */
+    "Z",                       /*  90 */
+    "[",                       /*  91 */
+    "\\",                      /*  92 */
+    "]",                       /*  93 */
+    "@B",                      /*  94 */
+    "_",                       /*  95 */
+    "@G",                      /*  96 */
+    "^A",                      /*  97 */
+    "^B",                      /*  98 */
+    "^C",                      /*  99 */
+    "^D",                      /* 100 */
+    "^E",                      /* 101 */
+    "^F",                      /* 102 */
+    "^G",                      /* 103 */
+    "^H",                      /* 104 */
+    "^I",                      /* 105 */
+    "^J",                      /* 106 */
+    "^K",                      /* 107 */
+    "^L",                      /* 108 */
+    "^M",                      /* 109 */
+    "^N",                      /* 110 */
+    "^O",                      /* 111 */
+    "^P",                      /* 112 */
+    "^Q",                      /* 113 */
+    "^R",                      /* 114 */
+    "^S",                      /* 115 */
+    "^T",                      /* 116 */
+    "^U",                      /* 117 */
+    "^V",                      /* 118 */
+    "^W",                      /* 119 */
+    "^X",                      /* 120 */
+    "^Y",                      /* 121 */
+    "^Z",                      /* 122 */
+    "^0",                      /* 123 */
+    "^1",                      /* 124 */
+    "^2",                      /* 125 */
+    "^3",                      /* 126 */
+    "^4",                      /* 127 */
+  };
+
+static void
+init_ascii_cdcnos (STEP *step)
+{
+  const char **table;
+  int counter;
+
+  table = (const char **) xmalloc (256 * sizeof (char *));
+  for (counter = 0; counter < 128; counter++)
+    table[counter] = translation_table[counter];
+  for (; counter < 256; counter++)
+    table[counter] = NULL;
+
+  step->one_to_many = table;
+}
+
+/* Previous obsolete lex code:
+
+@A                     { output ('@'); }
+@B                     { output ('^'); }
+@D                     { output (':'); }
+@G                     { output ('`'); }
+
+\^" "                  { output ( 13); }
+\^!                    { output ( 22); }
+\^\"                   { output ( 20); }
+\^#                    { output ( 16); }
+\^$                    { output ( 11); }
+\^\%                   { output ( 19); }
+\^&                    { output ( 23); }
+\^'                    { output ( 24); }
+\^\(                   { output (  9); }
+\^\)                   { output ( 10); }
+\^\*                   { output (  7); }
+\^\+                   { output (  5); }
+\^\,                   { output ( 14); }
+\^-                    { output (  6); }
+\^\.                   { output ( 15); }
+\^\/                   { output (  8); }
+
+\^0                    { output ('{'); }
+\^1                    { output ('|'); }
+\^2                    { output ('}'); }
+\^3                    { output ('~'); }
+\^4                    { output (127); }
+
+\^5                    { output (  0); }
+\^6                    { output (  1); }
+\^7                    { output (  2); }
+\^8                    { output (  3); }
+\^9                    { output (  4); }
+
+\^;                    { output ( 31); }
+\^<                    { output ( 26); }
+\^=                    { output ( 12); }
+\^>                    { output ( 27); }
+\^?                    { output ( 25); }
+\^@                    { output ( 28); }
+
+\^[A-Z]                        { output (yytext[1]-'A'+'a'); }
+
+\^\[                   { output ( 17); }
+\^\\                   { output ( 29); }
+\^]                    { output ( 18); }
+\^\^                   { output ( 30); }
+\^_                    { output ( 21); }
+
+\^[a-z]                        { output (yytext[1]); }
+
+*/
+
+static int
+file_cdcnos_ascii (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int reversible;              /* reversibility of recoding */
+  int input_char;              /* current character */
+
+  reversible = 1;
+  while (input_char = getc (input_file), input_char != EOF)
+    {
+      switch (input_char)
+       {
+        case '@':
+         switch ((input_char = getc (input_file)))
+           {
+           case 'A': case 'a': input_char = '@'; break;
+           case 'B': case 'b': input_char = '^'; break;
+           case 'D': case 'd': input_char = ':'; break;
+           case 'G': case 'g': input_char = '`'; break;
+
+           default:
+             reversible = 0;
+             putc ('@', output_file);
+             if (input_char == EOF)
+               return 0;
+           }
+         break;
+
+       case '^':
+         input_char = getc (input_file);
+         if (input_char >= 'A' && input_char <= 'Z')
+           input_char += 'a' - 'A';
+         else if (input_char < 'a' || input_char > 'z')
+           switch (input_char)
+             {
+             case ' ': input_char = 13; break;
+             case '!': input_char = 22; break;
+             case '"': input_char = 20; break;
+             case '#': input_char = 16; break;
+             case '$': input_char = 11; break;
+             case '%': input_char = 19; break;
+             case '&': input_char = 23; break;
+             case '\'': input_char = 24; break;
+             case '(': input_char = 9; break;
+
+             case ')':
+               reversible = 0;
+               input_char = '\n'; /* 10 */
+               break;
+
+             case '*': input_char = 7; break;
+             case '+': input_char = 5; break;
+             case ',': input_char = 14; break;
+             case '-': input_char = 6; break;
+             case '.': input_char = 15; break;
+             case '/': input_char = 8; break;
+             case '0': input_char = '{'; break;
+             case '1': input_char = '|'; break;
+             case '2': input_char = '}'; break;
+             case '3': input_char = '~'; break;
+             case '4': input_char = 127; break;
+             case '5': input_char = 0; break;
+             case '6': input_char = 1; break;
+             case '7': input_char = 2; break;
+             case '8': input_char = 3; break;
+             case '9': input_char = 4; break;
+             case ';': input_char = 31; break;
+             case '<': input_char = 26; break;
+             case '=': input_char = 12; break;
+             case '>': input_char = 27; break;
+             case '?': input_char = 25; break;
+             case '@': input_char = 28; break;
+             case '[': input_char = 17; break;
+             case '\\': input_char = 29; break;
+             case ']': input_char = 18; break;
+             case '^': input_char = 30; break;
+             case '_': input_char = 21; break;
+
+             default:
+               reversible = 0;
+               putc ('^', output_file);
+               if (input_char == EOF)
+                 return 0;
+             }
+         break;
+       }
+      putc (input_char, output_file);
+    }
+  return reversible;
+}
+
+void
+module_cdcnos (void)
+{
+  declare_step ("ASCII-BS", "CDC-NOS", ONE_TO_MANY, init_ascii_cdcnos,
+               file_one_to_many);
+  declare_step ("CDC-NOS", "ASCII-BS", MANY_TO_ONE, NULL, file_cdcnos_ascii);
+
+  declare_alias ("NOS", "CDC-NOS");
+}
diff --git a/charname.c b/charname.c
new file mode 100644 (file)
index 0000000..1f132c1
--- /dev/null
@@ -0,0 +1,90 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+#include "charname.h"
+
+/*--------------------------------------------------------------------.
+| Return a statically allocated full charname associated with a given |
+| SYMBOL, or NULL if not found.                                              |
+`--------------------------------------------------------------------*/
+
+char *
+symbol_to_charname (const char *symbol)
+{
+  static char result[MAX_CHARNAME_LENGTH + 1];
+  int first;
+  int last;
+  int middle;
+  int value;
+  const char *in;
+  char *out;
+  const char *cursor;
+
+  /* Find the symbol by binary searching the charname table.  */
+
+  first = 0;
+  last = NUMBER_OF_CHARNAMES;
+  while (first < last)
+    {
+      middle = (first + last) / 2;
+      value = strcmp (charname[middle].symbol, symbol);
+      if (value < 0)
+       first = middle + 1;
+      else if (value > 0)
+       last = middle;
+      else
+       break;
+    }
+
+  /* If the symbol has not been found, return the NULL string.  */
+
+  if (first >= last)
+    return NULL;
+
+  /* Else, construct the resulting charname.  */
+
+  out = NULL;
+  for (in = charname[middle].crypted; *in; in++)
+    {
+
+      /* Decrypt the next word.  */
+
+      value = *(const unsigned char *) in - 1;
+      if (value >= NUMBER_OF_SINGLES)
+       value = (NUMBER_OF_SINGLES + 255 * (value - NUMBER_OF_SINGLES)
+                + *(const unsigned char *) ++in - 1);
+
+      /* Copy it.  */
+
+      if (out)
+       *out++ = ' ';
+      else
+       out = result;
+
+      for (cursor = word[value]; *cursor; cursor++)
+       *out++ = *cursor;
+    }
+
+  /* Return the result.  */
+
+  *out = '\0';
+  return result;
+}
diff --git a/charname.h b/charname.h
new file mode 100644 (file)
index 0000000..3b473f0
--- /dev/null
@@ -0,0 +1,2741 @@
+/* DO NOT MODIFY THIS FILE!  It was generated by "charname.pl".  */
+
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#define NUMBER_OF_SINGLES 252
+
+#define MAX_CHARNAME_LENGTH 66
+
+#define NUMBER_OF_CHARNAMES 1892
+
+static const char *const word[809] =
+  {
+    "letter",                   /* 001 */
+    "latin",                    /* 002 */
+    "with",                     /* 003 */
+    "small",                    /* 004 */
+    "capital",                  /* 005 */
+    "and",                      /* 006 */
+    "arabic",                   /* 007 */
+    "form",                     /* 010 */
+    "dot",                      /* 011 */
+    "cyrillic",                 /* 012 */
+    "below",                    /* 013 */
+    "greek",                    /* 014 */
+    "acute",                    /* 015 */
+    "katakana",                 /* 016 */
+    "above",                    /* 017 */
+    "hiragana",                 /* 020 */
+    "box",                      /* 021 */
+    "drawings",                 /* 022 */
+    "circled",                  /* 023 */
+    "o",                        /* 024 */
+    "circumflex",               /* 025 */
+    "u",                        /* 026 */
+    "a",                        /* 027 */
+    "digit",                    /* 030 */
+    "light",                    /* 031 */
+    "heavy",                    /* 032 */
+    "left",                     /* 033 */
+    "right",                    /* 034 */
+    "parenthesized",            /* 035 */
+    "e",                        /* 036 */
+    "sign",                     /* 037 */
+    "diaeresis",                /* 040 */
+    "i",                        /* 041 */
+    "final",                    /* 042 */
+    "tilde",                    /* 043 */
+    "bopomofo",                 /* 044 */
+    "caron",                    /* 045 */
+    "macron",                   /* 046 */
+    "mark",                     /* 047 */
+    "numeral",                  /* 050 */
+    "number",                   /* 051 */
+    "roman",                    /* 052 */
+    "grave",                    /* 053 */
+    "isolated",                 /* 054 */
+    "up",                       /* 055 */
+    "down",                     /* 056 */
+    "line",                     /* 057 */
+    "breve",                    /* 060 */
+    "hebrew",                   /* 061 */
+    "cedilla",                  /* 062 */
+    "n",                        /* 063 */
+    "s",                        /* 064 */
+    "vertical",                 /* 065 */
+    "double",                   /* 066 */
+    "hook",                     /* 067 */
+    "horizontal",               /* 070 */
+    "white",                    /* 071 */
+    "horn",                     /* 072 */
+    "l",                        /* 073 */
+    "black",                    /* 074 */
+    "medial",                   /* 075 */
+    "one",                      /* 076 */
+    "alef",                     /* 077 */
+    "full",                     /* 100 */
+    "g",                        /* 101 */
+    "initial",                  /* 102 */
+    "y",                        /* 103 */
+    "(character",               /* 104 */
+    "d",                        /* 105 */
+    "h",                        /* 106 */
+    "non-spacing",              /* 107 */
+    "stop",                     /* 110 */
+    "t",                        /* 111 */
+    "part)",                    /* 112 */
+    "r",                        /* 113 */
+    "z",                        /* 114 */
+    "c",                        /* 115 */
+    "ligature",                 /* 116 */
+    "of",                       /* 117 */
+    "to",                       /* 120 */
+    "bracket",                  /* 121 */
+    "w",                        /* 122 */
+    "superscript",              /* 123 */
+    "fraction",                 /* 124 */
+    "k",                        /* 125 */
+    "stroke",                   /* 126 */
+    "two",                      /* 127 */
+    "five",                     /* 130 */
+    "ring",                     /* 131 */
+    "square",                   /* 132 */
+    "subscript",                /* 133 */
+    "three",                    /* 134 */
+    "vulgar",                   /* 135 */
+    "(iso-ir-103",              /* 136 */
+    "ogonek",                   /* 137 */
+    "arrow",                    /* 140 */
+    "b",                        /* 141 */
+    "lam",                      /* 142 */
+    "quotation",                /* 143 */
+    "dash",                     /* 144 */
+    "four",                     /* 145 */
+    "m",                        /* 146 */
+    "accent",                   /* 147 */
+    "seven",                    /* 150 */
+    "x",                        /* 151 */
+    "angle",                    /* 152 */
+    "arabic-indic",             /* 153 */
+    "eastern",                  /* 154 */
+    "eight",                    /* 155 */
+    "equal",                    /* 156 */
+    "half",                     /* 157 */
+    "hamza",                    /* 160 */
+    "ideograph",                /* 161 */
+    "j",                        /* 162 */
+    "nine",                     /* 163 */
+    "p",                        /* 164 */
+    "six",                      /* 165 */
+    "space",                    /* 166 */
+    "triangle",                 /* 167 */
+    "v",                        /* 170 */
+    "iota",                     /* 171 */
+    "f",                        /* 172 */
+    "lower",                    /* 173 */
+    "ocr",                      /* 174 */
+    "single",                   /* 175 */
+    "suit",                     /* 176 */
+    "teh",                      /* 177 */
+    "character",                /* 200 */
+    "ideographic",              /* 201 */
+    "kaf",                      /* 202 */
+    "operator",                 /* 203 */
+    "ten",                      /* 204 */
+    "upsilon",                  /* 205 */
+    "(macedonian)",             /* 206 */
+    "ae",                       /* 207 */
+    "block",                    /* 210 */
+    "circle",                   /* 211 */
+    "control",                  /* 212 */
+    "end",                      /* 213 */
+    "fill",                     /* 214 */
+    "or",                       /* 215 */
+    "parenthesis",              /* 216 */
+    "pe",                       /* 217 */
+    "prime",                    /* 220 */
+    "q",                        /* 221 */
+    "triple",                   /* 222 */
+    "ya",                       /* 223 */
+    "yeh",                      /* 224 */
+    "yu",                       /* 225 */
+    "zero",                     /* 226 */
+    "ain",                      /* 227 */
+    "beh",                      /* 230 */
+    "dad",                      /* 231 */
+    "dasia",                    /* 232 */
+    "device",                   /* 233 */
+    "eleven",                   /* 234 */
+    "en",                       /* 235 */
+    "feh",                      /* 236 */
+    "ghain",                    /* 237 */
+    "hah",                      /* 240 */
+    "heh",                      /* 241 */
+    "integral",                 /* 242 */
+    "iteration",                /* 243 */
+    "jeem",                     /* 244 */
+    "ka",                       /* 245 */
+    "khah",                     /* 246 */
+    "left-pointing",            /* 247 */
+    "meem",                     /* 250 */
+    "middle",                   /* 251 */
+    "noon",                     /* 252 */
+    "not",                      /* 253 */
+    "psili",                    /* 254 */
+    "qaf",                      /* 255 */
+    "right-pointing",           /* 256 */
+    "sad",                      /* 257 */
+    "seen",                     /* 260 */
+    "sheen",                    /* 261 */
+    "start",                    /* 262 */
+    "tabulation",               /* 263 */
+    "tah",                      /* 264 */
+    "theh",                     /* 265 */
+    "thousand",                 /* 266 */
+    "twelve",                   /* 267 */
+    "upper",                    /* 270 */
+    "zah",                      /* 271 */
+    "(iso-10646-1dis",          /* 272 */
+    "(icelandic)",              /* 273 */
+    "(serbocroatian)",          /* 274 */
+    "alpha",                    /* 275 */
+    "area",                     /* 276 */
+    "be",                       /* 277 */
+    "corner",                   /* 300 */
+    "de",                       /* 301 */
+    "diamond",                  /* 302 */
+    "em",                       /* 303 */
+    "epsilon",                  /* 304 */
+    "eta",                      /* 305 */
+    "ezh",                      /* 306 */
+    "ghe",                      /* 307 */
+    "greater-than",             /* 310 */
+    "ha",                       /* 311 */
+    "hundred",                  /* 312 */
+    "ie",                       /* 313 */
+    "inverted",                 /* 314 */
+    "koppa",                    /* 315 */
+    "lenticular",               /* 316 */
+    "less-than",                /* 317 */
+    "low",                      /* 320 */
+    "madda",                    /* 321 */
+    "mu",                       /* 322 */
+    "nu",                       /* 323 */
+    "omega",                    /* 324 */
+    "omicron",                  /* 325 */
+    "perispomeni",              /* 326 */
+    "pi",                       /* 327 */
+    "pneumata",                 /* 330 */
+    "quadruple",                /* 331 */
+    "reversed",                 /* 332 */
+    "separator",                /* 333 */
+    "set",                      /* 334 */
+    "short",                    /* 335 */
+    "sound",                    /* 336 */
+    "te",                       /* 337 */
+    "tu",                       /* 340 */
+    "varia",                    /* 341 */
+    "wa",                       /* 342 */
+    "waw",                      /* 343 */
+    "yo",                       /* 344 */
+    "ze",                       /* 345 */
+    "(iso-ir-149",              /* 346 */
+    "(iso-ir-18",               /* 347 */
+    "(iso-ir-55",               /* 350 */
+    "beta",                     /* 351 */
+    "comma",                    /* 352 */
+    "dal",                      /* 353 */
+    "degree",                   /* 354 */
+    "diagonal",                 /* 355 */
+    "eighteen",                 /* 356 */
+    "eighth",                   /* 357 */
+    "eighths",                  /* 360 */
+    "eng",                      /* 361 */
+    "equals",                   /* 362 */
+    "er",                       /* 363 */
+    "exclamation",              /* 364 */
+    "face",                     /* 365 */
+    "feed",                     /* 366 */
+    "fifteen",                  /* 367 */
+    "fifths",                   /* 370 */
+    "fourteen",                 /* 371 */
+    "gamma",                    /* 372 */
+    "he",                       /* 373 */
+    "index",                    /* 374 */
+    "introducer",               /* 375 001 */
+    "katakana-hiragana",        /* 375 002 */
+    "ke",                       /* 375 003 */
+    "maksura",                  /* 375 004 */
+    "marbuta",                  /* 375 005 */
+    "minus",                    /* 375 006 */
+    "music",                    /* 375 007 */
+    "nineteen",                 /* 375 010 */
+    "no",                       /* 375 011 */
+    "partial",                  /* 375 012 */
+    "plus",                     /* 375 013 */
+    "question",                 /* 375 014 */
+    "reh",                      /* 375 015 */
+    "rightwards",               /* 375 016 */
+    "seventeen",                /* 375 017 */
+    "shade",                    /* 375 020 */
+    "sigma",                    /* 375 021 */
+    "sixteen",                  /* 375 022 */
+    "soft",                     /* 375 023 */
+    "solidus",                  /* 375 024 */
+    "string",                   /* 375 025 */
+    "telephone",                /* 375 026 */
+    "thal",                     /* 375 027 */
+    "thirteen",                 /* 375 030 */
+    "twenty",                   /* 375 031 */
+    "ve",                       /* 375 032 */
+    "voiced",                   /* 375 033 */
+    "zain",                     /* 375 034 */
+    "(byelorussian)",           /* 375 035 */
+    "(iso-ir-38",               /* 375 036 */
+    "(iso-ir-8-1",              /* 375 037 */
+    "(lappish)",                /* 375 040 */
+    "(ukrainian)",              /* 375 041 */
+    "201)",                     /* 375 042 */
+    "204)",                     /* 375 043 */
+    "206)",                     /* 375 044 */
+    "acknowledge",              /* 375 045 */
+    "all",                      /* 375 046 */
+    "apostrophe",               /* 375 047 */
+    "approximately",            /* 375 050 */
+    "asterisk",                 /* 375 051 */
+    "ba",                       /* 375 052 */
+    "bar",                      /* 375 053 */
+    "barred",                   /* 375 054 */
+    "bi",                       /* 375 055 */
+    "big",                      /* 375 056 */
+    "bo",                       /* 375 057 */
+    "break",                    /* 375 060 */
+    "bu",                       /* 375 061 */
+    "bullet",                   /* 375 062 */
+    "byelorussian-ukrainian",   /* 375 063 */
+    "cancel",                   /* 375 064 */
+    "ceiling",                  /* 375 065 */
+    "che",                      /* 375 066 */
+    "check",                    /* 375 067 */
+    "chi",                      /* 375 070 */
+    "club",                     /* 375 071 */
+    "command",                  /* 375 072 */
+    "compatibility",            /* 375 073 */
+    "copyright",                /* 375 074 */
+    "crosshatch",               /* 375 075 */
+    "curly",                    /* 375 076 */
+    "da",                       /* 375 077 */
+    "dagger",                   /* 375 100 */
+    "delta",                    /* 375 101 */
+    "di",                       /* 375 102 */
+    "digamma",                  /* 375 103 */
+    "ditto",                    /* 375 104 */
+    "dje",                      /* 375 105 */
+    "do",                       /* 375 106 */
+    "down-pointing",            /* 375 107 */
+    "du",                       /* 375 110 */
+    "dze",                      /* 375 111 */
+    "dzhe",                     /* 375 112 */
+    "east",                     /* 375 113 */
+    "ef",                       /* 375 114 */
+    "el",                       /* 375 115 */
+    "ellipsis",                 /* 375 116 */
+    "es",                       /* 375 117 */
+    "escape",                   /* 375 120 */
+    "eth",                      /* 375 121 */
+    "fifty",                    /* 375 122 */
+    "fita",                     /* 375 123 */
+    "floor",                    /* 375 124 */
+    "fork",                     /* 375 125 */
+    "function",                 /* 375 126 */
+    "ga",                       /* 375 127 */
+    "ge",                       /* 375 130 */
+    "gi",                       /* 375 131 */
+    "gje",                      /* 375 132 */
+    "go",                       /* 375 133 */
+    "gu",                       /* 375 134 */
+    "guarded",                  /* 375 135 */
+    "hard",                     /* 375 136 */
+    "heart",                    /* 375 137 */
+    "here",                     /* 375 140 */
+    "hi",                       /* 375 141 */
+    "high-reversed-9",          /* 375 142 */
+    "ho",                       /* 375 143 */
+    "hu",                       /* 375 144 */
+    "hyphen",                   /* 375 145 */
+    "ij",                       /* 375 146 */
+    "indicator",                /* 375 147 */
+    "inverse",                  /* 375 150 */
+    "io",                       /* 375 151 */
+    "izhitsa",                  /* 375 152 */
+    "je",                       /* 375 153 */
+    "kappa",                    /* 375 154 */
+    "ki",                       /* 375 155 */
+    "kje",                      /* 375 156 */
+    "ko",                       /* 375 157 */
+    "ku",                       /* 375 160 */
+    "lamda",                    /* 375 161 */
+    "leftwards",                /* 375 162 */
+    "lje",                      /* 375 163 */
+    "logical",                  /* 375 164 */
+    "low-9",                    /* 375 165 */
+    "ma",                       /* 375 166 */
+    "me",                       /* 375 167 */
+    "medium",                   /* 375 170 */
+    "mem",                      /* 375 171 */
+    "meridiam",                 /* 375 172 */
+    "message",                  /* 375 173 */
+    "mi",                       /* 375 174 */
+    "mo",                       /* 375 175 */
+    "much",                     /* 375 176 */
+    "n-ary",                    /* 375 177 */
+    "na",                       /* 375 200 */
+    "ne",                       /* 375 201 */
+    "next",                     /* 375 202 */
+    "ni",                       /* 375 203 */
+    "nje",                      /* 375 204 */
+    "north",                    /* 375 205 */
+    "note",                     /* 375 206 */
+    "notes",                    /* 375 207 */
+    "nun",                      /* 375 210 */
+    "oe",                       /* 375 211 */
+    "oi",                       /* 375 212 */
+    "ordinal",                  /* 375 213 */
+    "pa",                       /* 375 214 */
+    "phi",                      /* 375 215 */
+    "po",                       /* 375 216 */
+    "pointing",                 /* 375 217 */
+    "postal",                   /* 375 220 */
+    "private",                  /* 375 221 */
+    "psi",                      /* 375 222 */
+    "pu",                       /* 375 223 */
+    "quarter",                  /* 375 224 */
+    "ra",                       /* 375 225 */
+    "re",                       /* 375 226 */
+    "rectangle",                /* 375 227 */
+    "reverse",                  /* 375 230 */
+    "rho",                      /* 375 231 */
+    "ri",                       /* 375 232 */
+    "ro",                       /* 375 233 */
+    "ru",                       /* 375 234 */
+    "sa",                       /* 375 235 */
+    "sampi",                    /* 375 236 */
+    "se",                       /* 375 237 */
+    "selected",                 /* 375 240 */
+    "semicolon",                /* 375 241 */
+    "sha",                      /* 375 242 */
+    "shadda",                   /* 375 243 */
+    "sharp",                    /* 375 244 */
+    "shcha",                    /* 375 245 */
+    "shell",                    /* 375 246 */
+    "shift",                    /* 375 247 */
+    "si",                       /* 375 250 */
+    "single-shift",             /* 375 251 */
+    "smiling",                  /* 375 252 */
+    "so",                       /* 375 253 */
+    "south",                    /* 375 254 */
+    "spade",                    /* 375 255 */
+    "star",                     /* 375 256 */
+    "stigma",                   /* 375 257 */
+    "su",                       /* 375 260 */
+    "subset",                   /* 375 261 */
+    "superset",                 /* 375 262 */
+    "ta",                       /* 375 263 */
+    "tau",                      /* 375 264 */
+    "text",                     /* 375 265 */
+    "theta",                    /* 375 266 */
+    "thorn",                    /* 375 267 */
+    "ti",                       /* 375 270 */
+    "tortoise",                 /* 375 271 */
+    "transmission",             /* 375 272 */
+    "tsadi",                    /* 375 273 */
+    "tse",                      /* 375 274 */
+    "tshe",                     /* 375 275 */
+    "ukrainian",                /* 375 276 */
+    "up-pointing",              /* 375 277 */
+    "upturn",                   /* 375 300 */
+    "use",                      /* 375 301 */
+    "unit",                     /* 375 302 */
+    "vu",                       /* 375 303 */
+    "we",                       /* 375 304 */
+    "west",                     /* 375 305 */
+    "wi",                       /* 375 306 */
+    "wo",                       /* 375 307 */
+    "xi",                       /* 375 310 */
+    "yat",                      /* 375 311 */
+    "yeru",                     /* 375 312 */
+    "yi",                       /* 375 313 */
+    "yus",                      /* 375 314 */
+    "za",                       /* 375 315 */
+    "zeta",                     /* 375 316 */
+    "zhe",                      /* 375 317 */
+    "zi",                       /* 375 320 */
+    "zo",                       /* 375 321 */
+    "zu",                       /* 375 322 */
+    "space",                    /* 375 323 */
+    "(ack)",                    /* 375 324 */
+    "(apc)",                    /* 375 325 */
+    "(bel)",                    /* 375 326 */
+    "(bph)",                    /* 375 327 */
+    "(bs)",                     /* 375 330 */
+    "(can)",                    /* 375 331 */
+    "(cch)",                    /* 375 332 */
+    "(cr)",                     /* 375 333 */
+    "(csi)",                    /* 375 334 */
+    "(dc1)",                    /* 375 335 */
+    "(dc2)",                    /* 375 336 */
+    "(dc3)",                    /* 375 337 */
+    "(dc4)",                    /* 375 340 */
+    "(dcs)",                    /* 375 341 */
+    "(del)",                    /* 375 342 */
+    "(dle)",                    /* 375 343 */
+    "(em)",                     /* 375 344 */
+    "(enq)",                    /* 375 345 */
+    "(eot)",                    /* 375 346 */
+    "(epa)",                    /* 375 347 */
+    "(esa)",                    /* 375 350 */
+    "(esc)",                    /* 375 351 */
+    "(etb)",                    /* 375 352 */
+    "(etx)",                    /* 375 353 */
+    "(ff)",                     /* 375 354 */
+    "(german)",                 /* 375 355 */
+    "(greenlandic)",            /* 375 356 */
+    "(hop)",                    /* 375 357 */
+    "(ht)",                     /* 375 360 */
+    "(htj)",                    /* 375 361 */
+    "(hts)",                    /* 375 362 */
+    "(ibm437",                  /* 375 363 */
+    "(ibm868",                  /* 375 364 */
+    "(ind)",                    /* 375 365 */
+    "(is1)",                    /* 375 366 */
+    "(is2)",                    /* 375 367 */
+    "(is3)",                    /* 375 370 */
+    "(is4)",                    /* 375 371 */
+    "(iso-ir-128",              /* 375 372 */
+    "(iso-ir-143",              /* 375 373 */
+    "(iso-ir-158",              /* 375 374 */
+    "(iso-ir-70",               /* 375 375 */
+    "(iso-ir-83",               /* 375 376 */
+    "(lf)",                     /* 375 377 */
+    "(mw)",                     /* 376 001 */
+    "(mnemonic)",               /* 376 002 */
+    "(nak)",                    /* 376 003 */
+    "(nbh)",                    /* 376 004 */
+    "(nel)",                    /* 376 005 */
+    "(nul)",                    /* 376 006 */
+    "(osc)",                    /* 376 007 */
+    "(pad)",                    /* 376 010 */
+    "(pld)",                    /* 376 011 */
+    "(plu)",                    /* 376 012 */
+    "(pm)",                     /* 376 013 */
+    "(pu1)",                    /* 376 014 */
+    "(pu2)",                    /* 376 015 */
+    "(ri)",                     /* 376 016 */
+    "(sci)",                    /* 376 017 */
+    "(sgci)",                   /* 376 020 */
+    "(si)",                     /* 376 021 */
+    "(so)",                     /* 376 022 */
+    "(soh)",                    /* 376 023 */
+    "(sos)",                    /* 376 024 */
+    "(spa)",                    /* 376 025 */
+    "(ss2)",                    /* 376 026 */
+    "(ss3)",                    /* 376 027 */
+    "(ssa)",                    /* 376 030 */
+    "(st)",                     /* 376 031 */
+    "(sts)",                    /* 376 032 */
+    "(stx)",                    /* 376 033 */
+    "(sub)",                    /* 376 034 */
+    "(syn)",                    /* 376 035 */
+    "(tonos",                   /* 376 036 */
+    "(vt)",                     /* 376 037 */
+    "(vts)",                    /* 376 040 */
+    "(lowercase:",              /* 376 041 */
+    "000/000/001/240)",         /* 376 042 */
+    "0267)",                    /* 376 043 */
+    "0268)",                    /* 376 044 */
+    "0269)",                    /* 376 045 */
+    "0294)",                    /* 376 046 */
+    "032/032/037/122)",         /* 376 047 */
+    "032/032/038/046)",         /* 376 050 */
+    "032/032/042/164)",         /* 376 051 */
+    "032/032/042/165)",         /* 376 052 */
+    "064)",                     /* 376 053 */
+    "096)",                     /* 376 054 */
+    "124)",                     /* 376 055 */
+    "142)",                     /* 376 056 */
+    "144)",                     /* 376 057 */
+    "159)",                     /* 376 060 */
+    "192)",                     /* 376 061 */
+    "193)",                     /* 376 062 */
+    "194)",                     /* 376 063 */
+    "195)",                     /* 376 064 */
+    "196)",                     /* 376 065 */
+    "197)",                     /* 376 066 */
+    "198)",                     /* 376 067 */
+    "199)",                     /* 376 070 */
+    "200)",                     /* 376 071 */
+    "202)",                     /* 376 072 */
+    "203)",                     /* 376 073 */
+    "217)",                     /* 376 074 */
+    "221)",                     /* 376 075 */
+    "37)",                      /* 376 076 */
+    "38)",                      /* 376 077 */
+    "39)",                      /* 376 100 */
+    "92)",                      /* 376 101 */
+    "99)",                      /* 376 102 */
+    "account",                  /* 376 103 */
+    "accute",                   /* 376 104 */
+    "ai",                       /* 376 105 */
+    "almost",                   /* 376 106 */
+    "amount",                   /* 376 107 */
+    "ampersand",                /* 376 110 */
+    "an",                       /* 376 111 */
+    "ang",                      /* 376 112 */
+    "angstroem",                /* 376 113 */
+    "ante",                     /* 376 114 */
+    "application",              /* 376 115 */
+    "arc",                      /* 376 116 */
+    "as",                       /* 376 117 */
+    "asymptotically",           /* 376 120 */
+    "at",                       /* 376 121 */
+    "au",                       /* 376 122 */
+    "ayin",                     /* 376 123 */
+    "backspace",                /* 376 124 */
+    "backward",                 /* 376 125 */
+    "ballot",                   /* 376 126 */
+    "bank",                     /* 376 127 */
+    "because",                  /* 376 130 */
+    "bell",                     /* 376 131 */
+    "bet",                      /* 376 132 */
+    "bottom",                   /* 376 133 */
+    "branch",                   /* 376 134 */
+    "broken",                   /* 376 135 */
+    "bullseye",                 /* 376 136 */
+    "by",                       /* 376 137 */
+    "care",                     /* 376 140 */
+    "caret",                    /* 376 141 */
+    "carriage",                 /* 376 142 */
+    "cent",                     /* 376 143 */
+    "centigrade",               /* 376 144 */
+    "ch",                       /* 376 145 */
+    "chair",                    /* 376 146 */
+    "closing",                  /* 376 147 */
+    "colon",                    /* 376 150 */
+    "commercial",               /* 376 151 */
+    "containing",               /* 376 152 */
+    "contains",                 /* 376 153 */
+    "contour",                  /* 376 154 */
+    "corners",                  /* 376 155 */
+    "cross",                    /* 376 156 */
+    "currency",                 /* 376 157 */
+    "customer",                 /* 376 160 */
+    "dalet",                    /* 376 161 */
+    "damma",                    /* 376 162 */
+    "dammatan",                 /* 376 163 */
+    "dark",                     /* 376 164 */
+    "datalink",                 /* 376 165 */
+    "delete",                   /* 376 166 */
+    "differential",             /* 376 167 */
+    "division",                 /* 376 170 */
+    "dollar",                   /* 376 171 */
+    "dotless",                  /* 376 172 */
+    "downwards",                /* 376 173 */
+    "dutch",                    /* 376 174 */
+    "dialytika)",               /* 376 175 */
+    "eh",                       /* 376 176 */
+    "ei",                       /* 376 177 */
+    "element",                  /* 376 200 */
+    "empty",                    /* 376 201 */
+    "enquiry",                  /* 376 202 */
+    "exists",                   /* 376 203 */
+    "fahrenheit",               /* 376 204 */
+    "fatha",                    /* 376 205 */
+    "fathatan",                 /* 376 206 */
+    "female",                   /* 376 207 */
+    "feminine",                 /* 376 210 */
+    "ff",                       /* 376 211 */
+    "ffi",                      /* 376 212 */
+    "ffl",                      /* 376 213 */
+    "fi",                       /* 376 214 */
+    "fifth",                    /* 376 215 */
+    "file",                     /* 376 216 */
+    "fl",                       /* 376 217 */
+    "flat",                     /* 376 220 */
+    "for",                      /* 376 221 */
+    "forward",                  /* 376 222 */
+    "four-per-em",              /* 376 223 */
+    "ft",                       /* 376 224 */
+    "gaf",                      /* 376 225 */
+    "geta",                     /* 376 226 */
+    "gimel",                    /* 376 227 */
+    "gn",                       /* 376 230 */
+    "graphic",                  /* 376 231 */
+    "group",                    /* 376 232 */
+    "guilder",                  /* 376 233 */
+    "hair",                     /* 376 234 */
+    "hangul",                   /* 376 235 */
+    "heading",                  /* 376 236 */
+    "het",                      /* 376 237 */
+    "high",                     /* 376 240 */
+    "house",                    /* 376 241 */
+    "hyphen-minus",             /* 376 242 */
+    "identical",                /* 376 243 */
+    "identification",           /* 376 244 */
+    "idle",                     /* 376 245 */
+    "image",                    /* 376 246 */
+    "in",                       /* 376 247 */
+    "increment",                /* 376 250 */
+    "infinity",                 /* 376 251 */
+    "intersection",             /* 376 252 */
+    "iu",                       /* 376 253 */
+    "join",                     /* 376 254 */
+    "ju",                       /* 376 255 */
+    "justification",            /* 376 256 */
+    "kasra",                    /* 376 257 */
+    "kasratan",                 /* 376 260 */
+    "korean",                   /* 376 261 */
+    "kra",                      /* 376 262 */
+    "lamed",                    /* 376 263 */
+    "lazy",                     /* 376 264 */
+    "leader",                   /* 376 265 */
+    "lira",                     /* 376 266 */
+    "long",                     /* 376 267 */
+    "lozenge",                  /* 376 270 */
+    "male",                     /* 376 271 */
+    "maltese",                  /* 376 272 */
+    "masculine",                /* 376 273 */
+    "member",                   /* 376 274 */
+    "micro",                    /* 376 275 */
+    "midline",                  /* 376 276 */
+    "mille",                    /* 376 277 */
+    "minus-or-plus",            /* 376 300 */
+    "modifier",                 /* 376 301 */
+    "multiplication",           /* 376 302 */
+    "nabla",                    /* 376 303 */
+    "natural",                  /* 376 304 */
+    "negative",                 /* 376 305 */
+    "ng",                       /* 376 306 */
+    "no-break",                 /* 376 307 */
+    "null",                     /* 376 310 */
+    "numero",                   /* 376 311 */
+    "octet",                    /* 376 312 */
+    "ohm",                      /* 376 313 */
+    "open",                     /* 376 314 */
+    "operating",                /* 376 315 */
+    "orthogonal",               /* 376 316 */
+    "ou",                       /* 376 317 */
+    "out",                      /* 376 320 */
+    "overline",                 /* 376 321 */
+    "padding",                  /* 376 322 */
+    "parallel",                 /* 376 323 */
+    "peh",                      /* 376 324 */
+    "per",                      /* 376 325 */
+    "percent",                  /* 376 326 */
+    "period",                   /* 376 327 */
+    "permitted",                /* 376 330 */
+    "peseta",                   /* 376 331 */
+    "pilcrow",                  /* 376 332 */
+    "plus-minus",               /* 376 333 */
+    "post",                     /* 376 334 */
+    "pound",                    /* 376 335 */
+    "preceded",                 /* 376 336 */
+    "prescription",             /* 376 337 */
+    "preset",                   /* 376 340 */
+    "privacy",                  /* 376 341 */
+    "product",                  /* 376 342 */
+    "program",                  /* 376 343 */
+    "prolonged",                /* 376 344 */
+    "proportion",               /* 376 345 */
+    "proportional",             /* 376 346 */
+    "qof",                      /* 376 347 */
+    "quarters",                 /* 376 350 */
+    "ratio",                    /* 376 351 */
+    "rays",                     /* 376 352 */
+    "record",                   /* 376 353 */
+    "recorder",                 /* 376 354 */
+    "recording",                /* 376 355 */
+    "reference",                /* 376 356 */
+    "registered",               /* 376 357 */
+    "resh",                     /* 376 360 */
+    "return",                   /* 376 361 */
+    "root",                     /* 376 362 */
+    "rounded",                  /* 376 363 */
+    "samekh",                   /* 376 364 */
+    "section",                  /* 376 365 */
+    "semi-voiced",              /* 376 366 */
+    "sequence",                 /* 376 367 */
+    "service",                  /* 376 370 */
+    "sh",                       /* 376 371 */
+    "shin",                     /* 376 372 */
+    "six-per-em",               /* 376 373 */
+    "sixteenth",                /* 376 374 */
+    "sixth",                    /* 376 375 */
+    "sixths",                   /* 376 376 */
+    "slash",                    /* 376 377 */
+    "st",                       /* 377 001 */
+    "standard",                 /* 377 002 */
+    "state",                    /* 377 003 */
+    "substitute",               /* 377 004 */
+    "sukun",                    /* 377 005 */
+    "summation",                /* 377 006 */
+    "sun",                      /* 377 007 */
+    "symbol",                   /* 377 010 */
+    "syncronous",               /* 377 011 */
+    "system",                   /* 377 012 */
+    "tack",                     /* 377 013 */
+    "take",                     /* 377 014 */
+    "tatweel",                  /* 377 015 */
+    "tav",                      /* 377 016 */
+    "tel",                      /* 377 017 */
+    "terminator",               /* 377 020 */
+    "tet",                      /* 377 021 */
+    "there",                    /* 377 022 */
+    "therefore",                /* 377 023 */
+    "thin",                     /* 377 024 */
+    "third",                    /* 377 025 */
+    "thirds",                   /* 377 026 */
+    "this",                     /* 377 027 */
+    "three-per-em",             /* 377 030 */
+    "top",                      /* 377 031 */
+    "trade",                    /* 377 032 */
+    "transmit",                 /* 377 033 */
+    "umlaut",                   /* 377 034 */
+    "union",                    /* 377 035 */
+    "unit",                     /* 377 036 */
+    "upwards",                  /* 377 037 */
+    "va",                       /* 377 040 */
+    "vav",                      /* 377 041 */
+    "vector",                   /* 377 042 */
+    "veh",                      /* 377 043 */
+    "vi",                       /* 377 044 */
+    "vo",                       /* 377 045 */
+    "waiting",                  /* 377 046 */
+    "wave",                     /* 377 047 */
+    "won",                      /* 377 050 */
+    "yen",                      /* 377 051 */
+    "yod",                      /* 377 052 */
+    "yr",                       /* 377 053 */
+    "zayin",                    /* 377 054 */
+    "zh",                       /* 377 055 */
+    "and",                      /* 377 056 */
+    "florin",                   /* 377 057 */
+  };
+
+struct charname
+  {
+    const char *symbol;
+    const char *crypted;
+  };
+
+static const struct charname charname[NUMBER_OF_CHARNAMES] =
+  {
+    {"!", "\364\047"},
+    {"!!", "\065\057"},
+    {"!!>", "\375\254\375\113\140"},
+    {"!)", "\034\375\076\121"},
+    {"!*", "\014\341\272\376\051"},
+    {"!*2", "\066\364\047"},
+    {"!2", "\066\065\057"},
+    {"!:", "\014\040\006\341"},
+    {"!<", "\253\317"},
+    {"!=", "\253\156\120"},
+    {"!>", "\253\310"},
+    {"!I", "\314\364\047"},
+    {"\"", "\143\047"},
+    {"\"!", "\107\053\147\136\376\062\104\112"},
+    {"\"\"", "\107\066\376\104\136\375\043\104\112"},
+    {"\"'", "\107\015\147\136\376\063\104\112"},
+    {"\"(", "\107\060\136\376\067\104\112"},
+    {"\"+", "\007\376\163"},
+    {"\",", "\107\062\136\376\073\104\112"},
+    {"\"-", "\107\046\136\376\066\104\112"},
+    {"\".", "\107\011\017\136\376\070\104\112"},
+    {"\"/", "\107\376\267\375\024\375\372\375\042\104\112"},
+    {"\"0", "\107\131\017\136\376\072\104\112"},
+    {"\"1", "\107\040\003\147\375\375\376\061\104\112"},
+    {"\"3", "\107\377\034\375\036\375\042\104\112"},
+    {"\"5", "\375\002\375\033\336\047"},
+    {"\"6", "\033\066\143\047"},
+    {"\"9", "\034\066\143\047"},
+    {"\":", "\107\040\136\376\071\104\112"},
+    {"\";", "\107\137\136\375\044\104\112"},
+    {"\"<", "\107\045\136\375\044\104\112"},
+    {"\"=", "\107\066\320\057\375\036\376\074\104\112"},
+    {"\">", "\107\025\147\136\376\064\104\112"},
+    {"\"?", "\107\043\136\376\065\104\112"},
+    {"\"_", "\107\320\057\136\375\043\104\112"},
+    {"\"d", "\014\107\232\330\350\376\077\104\112"},
+    {"\"i", "\014\107\171\013\350\376\100\104\112"},
+    {"\"p", "\014\107\254\330\350\376\076\104\112"},
+    {"%", "\376\326\037"},
+    {"%\"", "\012\005\001\375\023\037"},
+    {"%'", "\012\004\001\375\023\037"},
+    {"%0", "\376\325\376\277\037"},
+    {"&", "\376\110"},
+    {"'", "\375\047"},
+    {"'!", "\053\147"},
+    {"'\"", "\066\015\147"},
+    {"'%", "\015\147\006\040\376\036\377\056\376\175"},
+    {"''", "\015\147"},
+    {"'(", "\060"},
+    {"'+", "\007\376\162"},
+    {"',", "\062"},
+    {"'-", "\376\321"},
+    {"'.", "\011\017"},
+    {"'0", "\131\017"},
+    {"'6", "\033\175\143\047"},
+    {"'9", "\034\175\143\047"},
+    {"':", "\040"},
+    {"';", "\137"},
+    {"'<", "\045"},
+    {"'>", "\025\147"},
+    {"'?", "\043"},
+    {"'G", "\014\050\037"},
+    {"'m", "\046"},
+    {"'n", "\002\004\001\063\376\336\376\137\375\047"},
+    {"(", "\033\216"},
+    {"(!", "\033\375\076\121"},
+    {"(\"", "\033\074\316\121"},
+    {"('", "\033\375\271\375\246\121"},
+    {"(-", "\376\200\117"},
+    {"(1)", "\035\030\076"},
+    {"(10)", "\035\051\204"},
+    {"(11)", "\035\051\234"},
+    {"(12)", "\035\051\267"},
+    {"(13)", "\035\051\375\030"},
+    {"(14)", "\035\051\371"},
+    {"(15)", "\035\051\367"},
+    {"(16)", "\035\051\375\022"},
+    {"(17)", "\035\051\375\017"},
+    {"(18)", "\035\051\356"},
+    {"(19)", "\035\051\375\010"},
+    {"(2)", "\035\030\127"},
+    {"(20)", "\035\051\375\031"},
+    {"(3)", "\035\030\134"},
+    {"(4)", "\035\030\145"},
+    {"(5)", "\035\030\130"},
+    {"(6)", "\035\030\165"},
+    {"(7)", "\035\030\150"},
+    {"(8)", "\035\030\155"},
+    {"(9)", "\035\030\163"},
+    {"(A", "\376\116"},
+    {"(C", "\375\261\117"},
+    {"(I", "\033\071\316\121"},
+    {"(JU)", "\035\376\235\376\255"},
+    {"(S", "\123\033\216"},
+    {"(U", "\376\252"},
+    {"(_", "\375\261\117\215\156\120"},
+    {"(a)", "\035\002\004\001\027"},
+    {"(b)", "\035\002\004\001\141"},
+    {"(c)", "\035\002\004\001\115"},
+    {"(d)", "\035\002\004\001\105"},
+    {"(e)", "\035\002\004\001\036"},
+    {"(f)", "\035\002\004\001\172"},
+    {"(g)", "\035\002\004\001\101"},
+    {"(h)", "\035\002\004\001\106"},
+    {"(i)", "\035\002\004\001\041"},
+    {"(j)", "\035\002\004\001\162"},
+    {"(k)", "\035\002\004\001\125"},
+    {"(l)", "\035\002\004\001\073"},
+    {"(m)", "\035\002\004\001\146"},
+    {"(n)", "\035\002\004\001\063"},
+    {"(o)", "\035\002\004\001\024"},
+    {"(p)", "\035\002\004\001\164"},
+    {"(q)", "\035\002\004\001\221"},
+    {"(r)", "\035\002\004\001\113"},
+    {"(s", "\133\033\216"},
+    {"(s)", "\035\002\004\001\064"},
+    {"(t)", "\035\002\004\001\111"},
+    {"(u)", "\035\002\004\001\026"},
+    {"(v)", "\035\002\004\001\170"},
+    {"(w)", "\035\002\004\001\122"},
+    {"(x)", "\035\002\004\001\151"},
+    {"(y)", "\035\002\004\001\103"},
+    {"(z)", "\035\002\004\001\114"},
+    {")", "\034\216"},
+    {")\"", "\034\074\316\121"},
+    {")'", "\034\375\271\375\246\121"},
+    {")>", "\034\132\121"},
+    {")C", "\375\262\117"},
+    {")I", "\034\071\316\121"},
+    {")S", "\123\034\216"},
+    {")U", "\377\035"},
+    {")_", "\375\262\117\215\156\120"},
+    {")s", "\133\034\216"},
+    {"*", "\375\051"},
+    {"*-", "\375\051\203"},
+    {"*1", "\071\375\256"},
+    {"*2", "\074\375\256"},
+    {"*5", "\020\243\047"},
+    {"*6", "\016\243\047"},
+    {"*>", "\375\176\310"},
+    {"*P", "\375\177\376\342"},
+    {"*X", "\376\302\037"},
+    {"*_", "\201\243\047"},
+    {"*s", "\014\004\001\042\375\021"},
+    {"+", "\375\013\037"},
+    {"+\"", "\375\104\047"},
+    {"++", "\007\377\015"},
+    {"+-", "\376\333\037"},
+    {"+5", "\020\375\033\243\047"},
+    {"+6", "\016\375\033\243\047"},
+    {"+S", "\123\375\013\037"},
+    {"+Z", "\375\177\377\006"},
+    {"+_", "\201\375\104\047"},
+    {"+s", "\133\375\013\037"},
+    {",", "\352"},
+    {",!", "\014\254\006\341"},
+    {",'", "\014\254\006\015\147"},
+    {",+", "\007\352"},
+    {",,", "\014\254\330\347\376\055"},
+    {",G", "\014\173\050\037"},
+    {",_", "\201\352"},
+    {"-", "\376\242"},
+    {"-!", "\377\037\140"},
+    {"-)", "\376\153\376\117\376\274"},
+    {"-+", "\376\300\037"},
+    {"--", "\375\023\375\145"},
+    {"-1", "\375\145"},
+    {"-2", "\375\006\037"},
+    {"-3", "\070\375\053"},
+    {"-6", "\375\002\376\344\336\047"},
+    {"-:", "\376\170\037"},
+    {"->", "\375\016\140"},
+    {"-?", "\377\047\144"},
+    {"-L", "\034\152"},
+    {"-M", "\303\144"},
+    {"-N", "\235\144"},
+    {"-S", "\123\375\006"},
+    {"-T", "\055\377\013"},
+    {"-V", "\152"},
+    {"-X", "\376\272\376\156"},
+    {"-a", "\376\210\375\213\375\147"},
+    {"-o", "\376\273\375\213\375\147"},
+    {"-s", "\133\375\006"},
+    {"-v", "\376\173\140"},
+    {".", "\100\110"},
+    {"..", "\127\011\376\265"},
+    {".3", "\376\276\070\375\116"},
+    {".6", "\016\251\011"},
+    {".9", "\175\375\165\143\047"},
+    {".:", "\377\023"},
+    {".M", "\251\011"},
+    {".P", "\011\203"},
+    {".S", "\031\375\020"},
+    {"._", "\201\376\327"},
+    {"/", "\375\024"},
+    {"/+", "\007\376\205"},
+    {"/-", "\375\100"},
+    {"//", "\375\230\375\024"},
+    {"//>", "\375\205\375\113\140"},
+    {"/0", "\376\201\334"},
+    {"/=", "\066\375\100"},
+    {"/>", "\256\152\121"},
+    {"/c", "\376\254\377\027\057\003\375\202\057\376\002"},
+    {"/f", "\124\376\377"},
+    {"0", "\030\226"},
+    {"0(", "\376\346\120"},
+    {"0+", "\007\377\005"},
+    {"0-o", "\023\030\226"},
+    {"0.", "\023\011\203"},
+    {"00", "\376\251"},
+    {"02", "\023\131\203"},
+    {"05", "\375\002\376\366\336\047"},
+    {"0L", "\211\003\033\157\074"},
+    {"0M", "\074\211"},
+    {"0R", "\211\003\034\157\074"},
+    {"0S", "\123\030\226"},
+    {"0U", "\074\375\252\365"},
+    {"0_", "\201\051\226"},
+    {"0a", "\154\153\030\226"},
+    {"0m", "\071\211"},
+    {"0o", "\376\136"},
+    {"0s", "\133\030\226"},
+    {"0u", "\071\375\252\365"},
+    {"1", "\030\076"},
+    {"1\"", "\332\220"},
+    {"1'", "\220"},
+    {"1+", "\007\376\257"},
+    {"1-o", "\023\030\076"},
+    {"1.", "\030\076\100\110"},
+    {"10-o", "\023\051\204"},
+    {"10.", "\051\204\100\110"},
+    {"10000R", "\052\050\204\266"},
+    {"1000R", "\052\050\076\266"},
+    {"1000RCD", "\052\050\076\266\115\105"},
+    {"1000r", "\004\052\050\076\266"},
+    {"100R", "\052\050\076\312"},
+    {"100r", "\004\052\050\076\312"},
+    {"10c", "\035\161\204"},
+    {"11-o", "\023\051\234"},
+    {"11.", "\051\234\100\110"},
+    {"12", "\135\124\076\157"},
+    {"12-o", "\023\051\267"},
+    {"12.", "\051\267\100\110"},
+    {"13", "\135\124\076\377\025"},
+    {"13-o", "\023\051\375\030"},
+    {"13.", "\051\375\030\100\110"},
+    {"14", "\135\124\076\375\224"},
+    {"14-o", "\023\051\371"},
+    {"14.", "\051\371\100\110"},
+    {"15", "\135\124\076\376\215"},
+    {"15-o", "\023\051\367"},
+    {"15.", "\051\367\100\110"},
+    {"16", "\135\124\076\376\375"},
+    {"16-o", "\023\051\375\022"},
+    {"16.", "\051\375\022\100\110"},
+    {"17-o", "\023\051\375\017"},
+    {"17.", "\051\375\017\100\110"},
+    {"18", "\135\124\076\357"},
+    {"18-o", "\023\051\356"},
+    {"18.", "\051\356\100\110"},
+    {"19-o", "\023\051\375\010"},
+    {"19.", "\051\375\010\100\110"},
+    {"1H", "\376\234\166"},
+    {"1M", "\303\166"},
+    {"1N", "\235\166"},
+    {"1R", "\052\050\076"},
+    {"1S", "\123\076"},
+    {"1T", "\377\024\166"},
+    {"1a", "\154\153\030\076"},
+    {"1c", "\035\161\076"},
+    {"1h", "\174\067"},
+    {"1j", "\174\376\134\376\127\376\244"},
+    {"1r", "\004\052\050\076"},
+    {"1s", "\133\030\076"},
+    {"2", "\030\127"},
+    {"2\"", "\332\066\220"},
+    {"2'", "\066\220"},
+    {"2-o", "\023\030\127"},
+    {"2.", "\030\127\100\110"},
+    {"20-o", "\023\051\375\031"},
+    {"20.", "\051\375\031\100\110"},
+    {"23", "\135\124\127\377\026"},
+    {"25", "\135\124\127\370"},
+    {"2R", "\052\050\127"},
+    {"2S", "\123\127"},
+    {"2a", "\154\153\030\127"},
+    {"2c", "\035\161\127"},
+    {"2h", "\174\375\125"},
+    {"2j", "\174\376\107\117\375\067"},
+    {"2r", "\004\052\050\127"},
+    {"2s", "\133\030\127"},
+    {"3", "\030\134"},
+    {"3!", "\021\022\031\222\144\065"},
+    {"3\"", "\332\222\220"},
+    {"3'", "\222\220"},
+    {"3+", "\007\375\243"},
+    {"3+;", "\007\375\243\075\010"},
+    {"3-", "\021\022\031\222\144\070"},
+    {"3-o", "\023\030\134"},
+    {"3.", "\030\134\100\110"},
+    {"3/", "\021\022\032\222\144\065"},
+    {"34", "\135\124\134\376\350"},
+    {"35", "\135\124\134\370"},
+    {"38", "\135\124\134\360"},
+    {"3M", "\377\030\166"},
+    {"3R", "\052\050\134"},
+    {"3S", "\123\134"},
+    {"3_", "\021\022\032\222\144\070"},
+    {"3a", "\154\153\030\134"},
+    {"3c", "\035\161\134"},
+    {"3h", "\174\376\146"},
+    {"3j", "\174\144"},
+    {"3r", "\004\052\050\134"},
+    {"3s", "\133\030\134"},
+    {"4", "\030\145"},
+    {"4!", "\021\022\031\331\144\065"},
+    {"4-", "\021\022\031\331\144\070"},
+    {"4-o", "\023\030\145"},
+    {"4.", "\030\145\100\110"},
+    {"4/", "\021\022\032\331\144\065"},
+    {"45", "\135\124\145\370"},
+    {"4M", "\376\223\166"},
+    {"4R", "\052\050\145"},
+    {"4S", "\123\030\145"},
+    {"4_", "\021\022\032\331\144\070"},
+    {"4a", "\154\153\030\145"},
+    {"4c", "\035\161\145"},
+    {"4h", "\174\314\375\125"},
+    {"4j", "\174\376\160\376\103\051"},
+    {"4r", "\004\052\050\145"},
+    {"4s", "\133\030\145"},
+    {"5", "\030\130"},
+    {"5-o", "\023\030\130"},
+    {"5.", "\030\130\100\110"},
+    {"5000R", "\052\050\130\266"},
+    {"500R", "\052\050\130\312"},
+    {"500r", "\004\052\050\130\312"},
+    {"50R", "\052\050\375\122"},
+    {"50r", "\004\052\050\375\122"},
+    {"56", "\135\124\130\376\376"},
+    {"58", "\135\124\130\360"},
+    {"5R", "\052\050\130"},
+    {"5S", "\123\030\130"},
+    {"5a", "\154\153\030\130"},
+    {"5c", "\035\161\130"},
+    {"5r", "\004\052\050\130"},
+    {"5s", "\133\030\130"},
+    {"6", "\030\165"},
+    {"6-o", "\023\030\165"},
+    {"6.", "\030\165\100\110"},
+    {"6M", "\376\373\166"},
+    {"6R", "\052\050\165"},
+    {"6S", "\123\030\165"},
+    {"6a", "\154\153\030\165"},
+    {"6c", "\035\161\165"},
+    {"6r", "\004\052\050\165"},
+    {"6s", "\133\030\165"},
+    {"7", "\030\150"},
+    {"7-o", "\023\030\150"},
+    {"7.", "\030\150\100\110"},
+    {"78", "\135\124\150\360"},
+    {"7<", "\033\375\124"},
+    {"7>", "\034\375\124"},
+    {"7R", "\052\050\150"},
+    {"7S", "\123\030\150"},
+    {"7a", "\154\153\030\150"},
+    {"7c", "\035\161\150"},
+    {"7r", "\004\052\050\150"},
+    {"7s", "\133\030\150"},
+    {"8", "\030\155"},
+    {"8-o", "\023\030\155"},
+    {"8.", "\030\155\100\110"},
+    {"8R", "\052\050\155"},
+    {"8S", "\123\030\155"},
+    {"8a", "\154\153\030\155"},
+    {"8c", "\035\161\155"},
+    {"8r", "\004\052\050\155"},
+    {"8s", "\133\030\155"},
+    {"9", "\030\163"},
+    {"9\"", "\066\375\142\143\047"},
+    {"9'", "\175\375\142\143\047"},
+    {"9-o", "\023\030\163"},
+    {"9.", "\030\163\100\110"},
+    {"9R", "\052\050\163"},
+    {"9S", "\123\030\163"},
+    {"9a", "\154\153\030\163"},
+    {"9c", "\035\161\163"},
+    {"9r", "\004\052\050\163"},
+    {"9s", "\133\030\163"},
+    {":", "\376\150"},
+    {":+", "\007\376\206"},
+    {":.", "\376\130"},
+    {":3", "\065\375\116"},
+    {":9", "\066\375\165\143\047"},
+    {"::", "\376\345"},
+    {":R", "\376\351"},
+    {":S", "\375\170\375\020"},
+    {":X", "\376\356\047"},
+    {";", "\375\241"},
+    {";!", "\014\232\006\341"},
+    {";'", "\014\232\006\015\147"},
+    {";+", "\007\375\241"},
+    {";;", "\014\232\330\347\376\101"},
+    {";S", "\376\301\001\033\157\131"},
+    {";_", "\201\376\147\047"},
+    {"<", "\317\037"},
+    {"<!!", "\375\205\375\305\140"},
+    {"<\"", "\033\071\300\121"},
+    {"<'", "\033\300\121"},
+    {"<(", "\033\132\121"},
+    {"<*", "\375\176\317"},
+    {"<+", "\033\066\152\121"},
+    {"<-", "\375\162\140"},
+    {"</", "\247\152\121"},
+    {"<//", "\375\254\375\305\140"},
+    {"<1", "\175\247\152\143\047"},
+    {"<7", "\033\375\065"},
+    {"<<", "\247\066\152\143\047"},
+    {"<=", "\375\162\066\140"},
+    {"<>", "\033\034\140"},
+    {"<H", "\071\033\375\217\374"},
+    {"=", "\362\037"},
+    {"=\"", "\012\005\001\375\136\037"},
+    {"='", "\012\004\001\375\136\037"},
+    {"=+", "\007\376\260"},
+    {"=2", "\066\320\057"},
+    {"=3", "\376\243\120"},
+    {"=<", "\317\215\156\120"},
+    {"==", "\033\034\066\140"},
+    {"=>", "\375\016\066\140"},
+    {"=?", "\375\046\156\120"},
+    {"=S", "\123\362\037"},
+    {"=T", "\375\220\047"},
+    {"=T:)", "\375\220\047\365"},
+    {"=_", "\376\226\047"},
+    {"=s", "\133\362\037"},
+    {">", "\310\037"},
+    {">\"", "\034\071\300\121"},
+    {">'", "\034\300\121"},
+    {">+", "\034\066\152\121"},
+    {">1", "\175\256\152\143\047"},
+    {">7", "\034\375\065"},
+    {">=", "\310\215\156\120"},
+    {">>", "\256\066\152\143\047"},
+    {">H", "\071\034\375\217\374"},
+    {">V", "\375\016\377\042\017\272\376\050"},
+    {"?", "\375\014\047"},
+    {"?*", "\014\326\272\376\052"},
+    {"?+", "\007\375\014\047"},
+    {"?,", "\014\254\006\326"},
+    {"?-", "\376\120\156\120"},
+    {"?1", "\043\203"},
+    {"?2", "\376\106\156\120"},
+    {"?:", "\014\040\006\326"},
+    {"?;", "\014\232\006\326"},
+    {"?=", "\375\050\156\120"},
+    {"?I", "\314\375\014\047"},
+    {"?S", "\376\164\375\020"},
+    {"A", "\002\005\001\027"},
+    {"A!", "\002\005\001\027\003\053"},
+    {"A%", "\014\005\001\275\003\015"},
+    {"A'", "\002\005\001\027\003\015"},
+    {"A(", "\002\005\001\027\003\060"},
+    {"A(!", "\002\005\001\027\003\060\006\053"},
+    {"A('", "\002\005\001\027\003\060\006\015"},
+    {"A(-.", "\002\005\001\027\003\060\006\011\013"},
+    {"A(2", "\002\005\001\027\003\060\006\067\017"},
+    {"A(?", "\002\005\001\027\003\060\006\043"},
+    {"A*", "\014\005\001\275"},
+    {"A+", "\061\001\077"},
+    {"A-", "\002\005\001\027\003\046"},
+    {"A-.", "\002\005\001\027\003\011\013"},
+    {"A-0", "\002\005\001\027\003\131\013"},
+    {"A-o", "\023\002\005\001\027"},
+    {"A1", "\002\005\001\027\003\040\006\046"},
+    {"A2", "\002\005\001\027\003\067\017"},
+    {"A3", "\002\005\001\207\003\046"},
+    {"A5", "\020\001\004\027"},
+    {"A6", "\016\001\027"},
+    {"A7", "\002\005\001\027\003\011\017\006\046"},
+    {"A:", "\002\005\001\027\003\040"},
+    {"A;", "\002\005\001\027\003\137"},
+    {"A<", "\002\005\001\027\003\045"},
+    {"A=", "\012\005\001\027"},
+    {"A>", "\002\005\001\027\003\025"},
+    {"A>!", "\002\005\001\027\003\025\006\053"},
+    {"A>'", "\002\005\001\027\003\025\006\015"},
+    {"A>-.", "\002\005\001\027\003\025\006\011\013"},
+    {"A>2", "\002\005\001\027\003\025\006\067\017"},
+    {"A>?", "\002\005\001\027\003\025\006\043"},
+    {"A?", "\002\005\001\027\003\043"},
+    {"AA", "\002\005\001\027\003\131\017"},
+    {"AA'", "\002\005\001\027\003\131\017\006\015"},
+    {"AC", "\376\115\376\343\375\072\375\325"},
+    {"AE", "\002\005\001\207"},
+    {"AE'", "\002\005\001\207\003\015"},
+    {"AK", "\375\045\375\324"},
+    {"AN", "\375\164\006"},
+    {"AO", "\376\113\037"},
+    {"At", "\376\151\376\121"},
+    {"B", "\002\005\001\141"},
+    {"B*", "\014\005\001\351"},
+    {"B+", "\061\001\376\132"},
+    {"B-.", "\002\005\001\141\003\011\013"},
+    {"B-o", "\023\002\005\001\141"},
+    {"B.", "\002\005\001\141\003\011\017"},
+    {"B=", "\012\005\001\277"},
+    {"BB", "\376\135\375\053"},
+    {"BD", "\021\022\031\355\270\033\120\173\034"},
+    {"BH", "\375\060\376\330\375\140\375\327"},
+    {"BL", "\376\131\375\326"},
+    {"BS", "\376\124\375\330"},
+    {"B_", "\002\005\001\141\003\057\013"},
+    {"Ba", "\016\001\375\052"},
+    {"Bd", "\074\173\033\167"},
+    {"Be", "\016\001\277"},
+    {"Bi", "\016\001\375\055"},
+    {"Bo", "\016\001\375\057"},
+    {"Bu", "\016\001\375\061"},
+    {"C", "\002\005\001\115"},
+    {"C%", "\012\005\001\375\066"},
+    {"C'", "\002\005\001\115\003\015"},
+    {"C*", "\014\005\001\375\310"},
+    {"C,", "\002\005\001\115\003\062"},
+    {"C,'", "\002\005\001\115\003\062\006\015"},
+    {"C-o", "\023\002\005\001\115"},
+    {"C.", "\002\005\001\115\003\011\017"},
+    {"C3", "\012\005\001\315"},
+    {"C<", "\002\005\001\115\003\045"},
+    {"C=", "\012\005\001\375\274"},
+    {"C>", "\002\005\001\115\003\025"},
+    {"CC", "\375\064\200\375\332"},
+    {"CG", "\314\376\264\064"},
+    {"CI", "\212\376\367\375\001\375\334"},
+    {"CN", "\375\064\375\331"},
+    {"CR", "\376\142\376\361\375\333"},
+    {"Ca", "\376\141"},
+    {"Ci", "\211\375\376\376\046"},
+    {"Co", "\375\074\037"},
+    {"Ct", "\376\143\037"},
+    {"Cu", "\376\157\037"},
+    {"D", "\002\005\001\105"},
+    {"D%", "\012\005\001\375\105\274"},
+    {"D*", "\014\005\001\375\101"},
+    {"D+", "\061\001\376\161"},
+    {"D,", "\002\005\001\105\003\062"},
+    {"D-", "\002\005\001\375\121\273"},
+    {"D-.", "\002\005\001\105\003\011\013"},
+    {"D->", "\002\005\001\105\003\025\013"},
+    {"D-o", "\023\002\005\001\105"},
+    {"D.", "\002\005\001\105\003\011\017"},
+    {"D/", "\002\005\001\105\003\126"},
+    {"D1", "\233\212\076\375\335"},
+    {"D2", "\233\212\127\375\336"},
+    {"D3", "\233\212\134\375\337"},
+    {"D4", "\233\212\145\375\340"},
+    {"D<", "\002\005\001\105\003\045"},
+    {"D=", "\012\005\001\301"},
+    {"DC", "\233\212\375\025\375\341"},
+    {"DE", "\376\250"},
+    {"DG", "\354\037"},
+    {"DH", "\021\022\032\056\006\070"},
+    {"DI", "\066\242"},
+    {"DL", "\376\165\375\120\375\343"},
+    {"DLr", "\021\022\034\031\006\033\056\032"},
+    {"DO", "\376\171\037"},
+    {"DR", "\021\022\032\056\006\034"},
+    {"DS", "\012\005\001\375\111\206"},
+    {"DT", "\376\166\375\342"},
+    {"DZ", "\012\005\001\375\112"},
+    {"D_", "\002\005\001\105\003\057\013"},
+    {"Da", "\016\001\375\077"},
+    {"Db", "\074\302"},
+    {"De", "\016\001\301"},
+    {"Dh", "\021\022\056\032\006\070\031"},
+    {"Di", "\016\001\375\102"},
+    {"Dl", "\021\022\056\032\006\033\031"},
+    {"DlR", "\021\022\033\031\006\034\056\032"},
+    {"Do", "\016\001\375\106"},
+    {"Dr", "\021\022\056\032\006\034\031"},
+    {"Dt", "\074\375\107\167"},
+    {"Du", "\016\001\375\110"},
+    {"Dw", "\071\302"},
+    {"E", "\002\005\001\036"},
+    {"E!", "\002\005\001\036\003\053"},
+    {"E%", "\014\005\001\304\003\015"},
+    {"E'", "\002\005\001\036\003\015"},
+    {"E(", "\002\005\001\036\003\060"},
+    {"E*", "\014\005\001\304"},
+    {"E+", "\061\001\376\123"},
+    {"E,(", "\002\005\001\036\003\062\006\060"},
+    {"E-", "\002\005\001\036\003\046"},
+    {"E-!", "\002\005\001\036\003\046\006\053"},
+    {"E-'", "\002\005\001\036\003\046\006\015"},
+    {"E-.", "\002\005\001\036\003\011\013"},
+    {"E->", "\002\005\001\036\003\025\013"},
+    {"E-?", "\002\005\001\036\003\043\013"},
+    {"E-o", "\023\002\005\001\036"},
+    {"E.", "\002\005\001\036\003\011\017"},
+    {"E2", "\002\005\001\036\003\067\017"},
+    {"E5", "\020\001\004\036"},
+    {"E6", "\016\001\036"},
+    {"E:", "\002\005\001\036\003\040"},
+    {"E;", "\002\005\001\036\003\137"},
+    {"E<", "\002\005\001\036\003\045"},
+    {"E=", "\012\005\001\313"},
+    {"E>", "\002\005\001\036\003\025"},
+    {"E>!", "\002\005\001\036\003\025\006\053"},
+    {"E>'", "\002\005\001\036\003\025\006\015"},
+    {"E>-.", "\002\005\001\036\003\025\006\011\013"},
+    {"E>2", "\002\005\001\036\003\025\006\067\017"},
+    {"E>?", "\002\005\001\036\003\025\006\043"},
+    {"E?", "\002\005\001\036\003\043"},
+    {"EB", "\213\117\375\272\210\375\352"},
+    {"EC", "\375\120\375\351"},
+    {"ED", "\002\005\001\306"},
+    {"EG", "\213\117\375\135\276\375\347"},
+    {"EM", "\213\117\375\170\375\344"},
+    {"EQ", "\376\202\375\345"},
+    {"ES", "\213\117\375\240\276\375\350"},
+    {"ET", "\213\117\375\272\375\346"},
+    {"EX", "\213\117\375\265\375\353"},
+    {"EZ", "\002\005\001\306\003\045"},
+    {"Eh", "\376\241"},
+    {"F", "\002\005\001\172"},
+    {"F*", "\014\005\001\375\215"},
+    {"F-o", "\023\002\005\001\172"},
+    {"F.", "\002\005\001\172\003\011\017"},
+    {"F3", "\012\005\001\375\123"},
+    {"F=", "\012\005\001\375\114"},
+    {"FA", "\376\221\375\046"},
+    {"FB", "\100\210"},
+    {"FD", "\021\022\031\355\270\034\120\173\033"},
+    {"FF", "\010\366\375\354"},
+    {"FS", "\376\216\333\375\371"},
+    {"Fd", "\074\173\034\167"},
+    {"Fl", "\376\174\376\233\037\375\363\376\060"},
+    {"Fm", "\376\207\037"},
+    {"G", "\002\005\001\101"},
+    {"G%", "\012\005\001\375\132\206"},
+    {"G'", "\002\005\001\101\003\015"},
+    {"G(", "\002\005\001\101\003\060"},
+    {"G*", "\014\005\001\372"},
+    {"G+", "\061\001\376\227"},
+    {"G,", "\002\005\001\101\003\062"},
+    {"G-", "\002\005\001\101\003\046"},
+    {"G-o", "\023\002\005\001\101"},
+    {"G.", "\002\005\001\101\003\011\017"},
+    {"G/", "\002\005\001\101\003\126"},
+    {"G3", "\012\005\001\307\003\375\300"},
+    {"G<", "\002\005\001\101\003\045"},
+    {"G=", "\012\005\001\307"},
+    {"G>", "\002\005\001\101\003\025"},
+    {"GC", "\175\376\231\200\375\001\376\020"},
+    {"GF", "\372\375\126\037\272\376\047"},
+    {"GS", "\376\232\333\375\370"},
+    {"Ga", "\016\001\375\127"},
+    {"Ge", "\016\001\375\130"},
+    {"Gi", "\016\001\375\131"},
+    {"Go", "\016\001\375\133"},
+    {"Gu", "\016\001\375\134"},
+    {"H", "\002\005\001\106"},
+    {"H'", "\007\001\160"},
+    {"H*", "\014\005\001\375\266"},
+    {"H+", "\061\001\373"},
+    {"H,", "\002\005\001\106\003\062"},
+    {"H-(", "\002\005\001\106\003\060\013"},
+    {"H-.", "\002\005\001\106\003\011\013"},
+    {"H-o", "\023\002\005\001\106"},
+    {"H.", "\002\005\001\106\003\011\017"},
+    {"H/", "\002\005\001\106\003\126"},
+    {"H:", "\002\005\001\106\003\040"},
+    {"H=", "\012\005\001\311"},
+    {"H>", "\002\005\001\106\003\025"},
+    {"HH", "\021\022\032\070"},
+    {"HI", "\376\246\117\215\375\050\156\120"},
+    {"HJ", "\200\263\003\376\256\375\361"},
+    {"HO", "\376\240\376\312\376\340\375\357"},
+    {"HS", "\200\263\334\375\362"},
+    {"HT", "\200\263\375\360"},
+    {"Ha", "\016\001\311"},
+    {"He", "\016\001\373"},
+    {"Hi", "\016\001\375\141"},
+    {"Ho", "\016\001\375\143"},
+    {"Hu", "\016\001\375\144"},
+    {"I", "\002\005\001\041"},
+    {"I!", "\002\005\001\041\003\053"},
+    {"I%", "\014\005\001\171\003\015"},
+    {"I'", "\002\005\001\041\003\015"},
+    {"I(", "\002\005\001\041\003\060"},
+    {"I*", "\014\005\001\171"},
+    {"I-", "\002\005\001\041\003\046"},
+    {"I-.", "\002\005\001\041\003\011\013"},
+    {"I-?", "\002\005\001\041\003\043\013"},
+    {"I-o", "\023\002\005\001\041"},
+    {"I.", "\002\005\001\041\003\011\017"},
+    {"I2", "\002\005\001\041\003\067\017"},
+    {"I5", "\020\001\004\041"},
+    {"I6", "\016\001\041"},
+    {"I:", "\002\005\001\041\003\040"},
+    {"I:'", "\002\005\001\041\003\040\006\015"},
+    {"I;", "\002\005\001\041\003\137"},
+    {"I<", "\002\005\001\041\003\045"},
+    {"I=", "\012\005\001\041"},
+    {"I>", "\002\005\001\041\003\025"},
+    {"I?", "\002\005\001\041\003\043"},
+    {"IE", "\012\005\001\375\276\313"},
+    {"II", "\012\005\001\375\063\041"},
+    {"IJ", "\002\005\116\375\146"},
+    {"IN", "\374\375\365"},
+    {"IO", "\012\005\001\375\151"},
+    {"IS", "\201\166"},
+    {"Ic", "\375\150\071\211"},
+    {"Il", "\376\133\157\242"},
+    {"In", "\242"},
+    {"Io", "\376\154\242"},
+    {"Iu", "\377\031\157\242"},
+    {"J", "\002\005\001\162"},
+    {"J%", "\012\005\001\375\153"},
+    {"J*", "\014\005\001\171\003\040"},
+    {"J+", "\061\001\377\052"},
+    {"J-o", "\023\002\005\001\162"},
+    {"J<", "\002\005\001\162\003\045\376\041\376\042"},
+    {"J=", "\012\005\001\335\041"},
+    {"J>", "\002\005\001\162\003\025"},
+    {"JA", "\012\005\001\223"},
+    {"JE", "\012\005\001\036"},
+    {"JU", "\012\005\001\225"},
+    {"K", "\002\005\001\125"},
+    {"K%", "\061\001\042\202"},
+    {"K'", "\002\005\001\125\003\015"},
+    {"K*", "\014\005\001\375\154"},
+    {"K+", "\061\001\202"},
+    {"K,", "\002\005\001\125\003\062"},
+    {"K-.", "\002\005\001\125\003\011\013"},
+    {"K-o", "\023\002\005\001\125"},
+    {"K3", "\014\005\001\315"},
+    {"K<", "\002\005\001\125\003\045"},
+    {"K=", "\012\005\001\245"},
+    {"KA", "\016\001\004\245"},
+    {"KE", "\016\001\004\375\003"},
+    {"KJ", "\012\005\001\375\156\206"},
+    {"KSC", "\376\261\377\002\377\010"},
+    {"K_", "\002\005\001\125\003\057\013"},
+    {"Ka", "\016\001\245"},
+    {"Ke", "\016\001\375\003"},
+    {"Ki", "\016\001\375\155"},
+    {"Ko", "\016\001\375\157"},
+    {"Ku", "\016\001\375\160"},
+    {"L", "\002\005\001\073"},
+    {"L'", "\002\005\001\073\003\015"},
+    {"L*", "\014\005\001\375\161"},
+    {"L+", "\061\001\376\263"},
+    {"L,", "\002\005\001\073\003\062"},
+    {"L--.", "\002\005\001\073\003\011\013\006\046"},
+    {"L-.", "\002\005\001\073\003\011\013"},
+    {"L->", "\002\005\001\073\003\025\013"},
+    {"L-o", "\023\002\005\001\073"},
+    {"L.", "\002\005\001\073\003\251\011"},
+    {"L/", "\002\005\001\073\003\126"},
+    {"L<", "\002\005\001\073\003\045"},
+    {"L=", "\012\005\001\375\115"},
+    {"LB", "\173\157\210"},
+    {"LD", "\021\022\032\056\006\033"},
+    {"LF", "\057\366\375\377"},
+    {"LJ", "\012\005\001\375\163"},
+    {"LZ", "\376\270"},
+    {"L_", "\002\005\001\073\003\057\013"},
+    {"Li", "\376\266\037"},
+    {"M", "\002\005\001\146"},
+    {"M%", "\061\001\042\375\171"},
+    {"M'", "\002\005\001\146\003\015"},
+    {"M*", "\014\005\001\322"},
+    {"M+", "\061\001\375\171"},
+    {"M-.", "\002\005\001\146\003\011\013"},
+    {"M-o", "\023\002\005\001\146"},
+    {"M.", "\002\005\001\146\003\011\017"},
+    {"M16", "\375\054\376\374\375\207"},
+    {"M2", "\375\054\357\375\207"},
+    {"M3", "\014\005\001\375\103"},
+    {"M8", "\357\375\206"},
+    {"M=", "\012\005\001\303"},
+    {"MW", "\375\173\377\046\376\001"},
+    {"MX", "\375\007\375\244\037"},
+    {"Ma", "\016\001\375\166"},
+    {"Mb", "\375\007\376\220\037"},
+    {"Md", "\375\224\375\206"},
+    {"Me", "\016\001\375\167"},
+    {"Mi", "\016\001\375\174"},
+    {"Ml", "\376\271\037"},
+    {"Mo", "\016\001\375\175"},
+    {"Mu", "\016\001\322"},
+    {"Mx", "\375\007\376\304\037"},
+    {"My", "\376\275\037"},
+    {"N", "\002\005\001\063"},
+    {"N%", "\061\001\042\375\210"},
+    {"N'", "\002\005\001\063\003\015"},
+    {"N*", "\014\005\001\323"},
+    {"N+", "\061\001\375\210"},
+    {"N,", "\002\005\001\063\003\062"},
+    {"N-.", "\002\005\001\063\003\011\013"},
+    {"N->", "\002\004\001\063\003\025\013"},
+    {"N-o", "\023\002\005\001\063"},
+    {"N.", "\002\005\001\063\003\011\017"},
+    {"N0", "\376\311\037"},
+    {"N6", "\016\001\063"},
+    {"N<", "\002\005\001\063\003\045"},
+    {"N=", "\012\005\001\235"},
+    {"N?", "\002\005\001\063\003\043"},
+    {"NB", "\376\303"},
+    {"NG", "\002\005\001\361\375\040"},
+    {"NH", "\375\011\375\060\375\140\376\004"},
+    {"NI", "\332\253\037"},
+    {"NJ", "\012\005\001\375\204"},
+    {"NK", "\376\305\375\045\376\003"},
+    {"NL", "\375\202\057\376\005"},
+    {"NO", "\253\037"},
+    {"NS", "\376\307\166"},
+    {"NU", "\376\310\376\006"},
+    {"N_", "\002\005\001\063\003\057\013"},
+    {"Na", "\016\001\375\200"},
+    {"Nb", "\051\037"},
+    {"Ne", "\016\001\375\201"},
+    {"Ni", "\016\001\375\203"},
+    {"No", "\016\001\375\011"},
+    {"Nu", "\016\001\323"},
+    {"O", "\002\005\001\024"},
+    {"O!", "\002\005\001\024\003\053"},
+    {"O\"", "\002\005\001\024\003\066\015"},
+    {"O%", "\014\005\001\325\003\015"},
+    {"O'", "\002\005\001\024\003\015"},
+    {"O(", "\002\005\001\024\003\060"},
+    {"O*", "\014\005\001\325"},
+    {"O-", "\002\005\001\024\003\046"},
+    {"O-!", "\002\005\001\024\003\046\006\053"},
+    {"O-'", "\002\005\001\024\003\046\006\015"},
+    {"O-.", "\002\005\001\024\003\011\013"},
+    {"O-o", "\023\002\005\001\024"},
+    {"O/", "\002\005\001\024\003\126"},
+    {"O/'", "\002\005\001\024\003\126\006\015"},
+    {"O1", "\002\005\001\024\003\137\006\046"},
+    {"O2", "\002\005\001\024\003\067\017"},
+    {"O3", "\012\005\001\375\056\375\314"},
+    {"O5", "\020\001\004\024"},
+    {"O6", "\016\001\024"},
+    {"O9", "\002\005\001\024\003\072"},
+    {"O9!", "\002\005\001\024\003\072\006\053"},
+    {"O9'", "\002\005\001\024\003\072\006\015"},
+    {"O9-.", "\002\005\001\024\003\072\006\011\013"},
+    {"O92", "\002\005\001\024\003\072\006\067\017"},
+    {"O9?", "\002\005\001\024\003\072\006\043"},
+    {"O:", "\002\005\001\024\003\040"},
+    {"O;", "\002\005\001\024\003\137"},
+    {"O<", "\002\005\001\024\003\045"},
+    {"O=", "\012\005\001\024"},
+    {"O>", "\002\005\001\024\003\025"},
+    {"O>!", "\002\005\001\024\003\025\006\053"},
+    {"O>'", "\002\005\001\024\003\025\006\015"},
+    {"O>-.", "\002\005\001\024\003\025\006\011\013"},
+    {"O>2", "\002\005\001\024\003\025\006\067\017"},
+    {"O>?", "\002\005\001\024\003\025\006\043"},
+    {"O?", "\002\005\001\024\003\043"},
+    {"O?'", "\002\005\001\024\003\043\006\015"},
+    {"O?:", "\002\005\001\024\003\043\006\040"},
+    {"OC", "\376\315\377\012\375\072\376\007"},
+    {"OE", "\002\005\116\375\211"},
+    {"OI", "\002\005\001\375\212"},
+    {"OK", "\375\067\047"},
+    {"OR", "\375\164\215"},
+    {"OS", "\071\132"},
+    {"Ob", "\131\203"},
+    {"Om", "\376\313\037"},
+    {"Or", "\071\375\227"},
+    {"P", "\002\005\001\164"},
+    {"P%", "\061\001\042\217"},
+    {"P'", "\002\005\001\164\003\015"},
+    {"P*", "\014\005\001\327"},
+    {"P+", "\061\001\217"},
+    {"P-o", "\023\002\005\001\164"},
+    {"P.", "\002\005\001\164\003\011\017"},
+    {"P1", "\375\221\375\301\076\376\014"},
+    {"P2", "\375\221\375\301\127\376\015"},
+    {"P3", "\014\005\001\375\236"},
+    {"P=", "\012\005\001\217"},
+    {"PA", "\376\322\200\376\010"},
+    {"PD", "\375\012\057\376\222\376\011"},
+    {"PI", "\376\332\037"},
+    {"PL", "\074\247\167"},
+    {"PM", "\376\341\375\173\376\013"},
+    {"PO", "\336\376\355\375\074"},
+    {"PP", "\376\323\120"},
+    {"PR", "\074\256\167"},
+    {"PU", "\375\012\057\376\125\376\012"},
+    {"Pa", "\016\001\375\214"},
+    {"Pd", "\376\335\037"},
+    {"Pe", "\016\001\217"},
+    {"Pi", "\016\001\327"},
+    {"Po", "\016\001\375\216"},
+    {"Pt", "\376\331\037"},
+    {"Pu", "\016\001\375\223"},
+    {"Q", "\002\005\001\221"},
+    {"Q*", "\014\005\001\375\222"},
+    {"Q+", "\061\001\376\347"},
+    {"Q-o", "\023\002\005\001\221"},
+    {"R", "\002\005\001\113"},
+    {"R'", "\002\005\001\113\003\015"},
+    {"R*", "\014\005\001\375\231"},
+    {"R+", "\061\001\376\360"},
+    {"R,", "\002\005\001\113\003\062"},
+    {"R--.", "\002\005\001\113\003\011\013\006\046"},
+    {"R-.", "\002\005\001\113\003\011\013"},
+    {"R-o", "\023\002\005\001\113"},
+    {"R.", "\002\005\001\113\003\011\017"},
+    {"R<", "\002\005\001\113\003\045"},
+    {"R=", "\012\005\001\363"},
+    {"RB", "\034\157\210"},
+    {"RF", "\132\003\070\214"},
+    {"RH", "\132\003\376\316\375\075\214"},
+    {"RI", "\375\230\057\366\376\016"},
+    {"RK", "\132\003\270\034\120\173\033\214"},
+    {"RO", "\071\132\003\376\363\376\155"},
+    {"RS", "\376\353\333\375\367"},
+    {"RT", "\132\376\362"},
+    {"RX", "\132\003\355\375\075\214"},
+    {"RY", "\132\003\065\214"},
+    {"RZ", "\132\003\270\033\120\173\034\214"},
+    {"R_", "\002\005\001\113\003\057\013"},
+    {"Ra", "\016\001\375\225"},
+    {"Re", "\016\001\375\226"},
+    {"Rg", "\376\357\037"},
+    {"Ri", "\016\001\375\232"},
+    {"Ro", "\016\001\375\233"},
+    {"Rr", "\071\132\376\152\074\004\132"},
+    {"Ru", "\016\001\375\234"},
+    {"Rx", "\376\337\377\014"},
+    {"S", "\002\005\001\064"},
+    {"S%", "\012\005\001\375\242"},
+    {"S'", "\002\005\001\064\003\015"},
+    {"S'.", "\002\005\001\064\003\015\006\011\017"},
+    {"S*", "\014\005\001\375\021"},
+    {"S+", "\061\001\376\364"},
+    {"S,", "\002\005\001\064\003\062"},
+    {"S-.", "\002\005\001\064\003\011\013"},
+    {"S-o", "\023\002\005\001\064"},
+    {"S.", "\002\005\001\064\003\011\017"},
+    {"S.-.", "\002\004\001\064\003\011\013\006\011\017"},
+    {"S2", "\375\251\127\376\026"},
+    {"S3", "\375\251\134\376\027"},
+    {"S<", "\002\005\001\064\003\045"},
+    {"S<.", "\002\005\001\064\003\045\006\011\017"},
+    {"S=", "\012\005\001\375\117"},
+    {"S>", "\002\005\001\064\003\025"},
+    {"SA", "\262\117\375\240\276\376\030"},
+    {"SB", "\377\004\376\034"},
+    {"SC", "\175\200\375\001\376\017"},
+    {"SE", "\376\365\037"},
+    {"SG", "\262\117\375\135\276\376\025"},
+    {"SH", "\262\117\376\236\376\023"},
+    {"SI", "\375\247\376\247\376\021"},
+    {"SM", "\376\370\047"},
+    {"SO", "\375\247\376\320\376\022"},
+    {"SP", "\166"},
+    {"SR", "\074\375\227"},
+    {"SS", "\262\117\375\025\376\024"},
+    {"ST", "\375\025\377\020\376\031"},
+    {"SU", "\071\377\007\003\376\352"},
+    {"SX", "\262\117\375\265\376\033"},
+    {"SY", "\377\011\376\245\376\035"},
+    {"Sa", "\016\001\375\235"},
+    {"Sb", "\375\062\203"},
+    {"Sc", "\012\005\001\375\245"},
+    {"Se", "\016\001\375\237"},
+    {"Sh", "\061\001\376\372"},
+    {"Si", "\016\001\375\250"},
+    {"Sn", "\375\150\375\062"},
+    {"So", "\016\001\375\253"},
+    {"Su", "\016\001\375\260"},
+    {"T", "\002\005\001\111"},
+    {"T*", "\014\005\001\375\264"},
+    {"T+", "\061\001\377\016"},
+    {"T,", "\002\005\001\111\003\062"},
+    {"T-.", "\002\005\001\111\003\011\013"},
+    {"T->", "\002\005\001\111\003\025\013"},
+    {"T-o", "\023\002\005\001\111"},
+    {"T.", "\002\005\001\111\003\011\017"},
+    {"T/", "\002\005\001\111\003\126"},
+    {"T3", "\014\005\001\375\257"},
+    {"T<", "\002\005\001\111\003\045"},
+    {"T=", "\012\005\001\337"},
+    {"TB", "\270\157\210"},
+    {"TE", "\377\022\376\203"},
+    {"TEL", "\074\375\026"},
+    {"TH", "\002\005\001\375\267\273"},
+    {"TM", "\377\032\047\037"},
+    {"TR", "\375\026\376\354"},
+    {"TS", "\334\377\033\377\003\376\032"},
+    {"TU", "\016\001\004\340"},
+    {"T_", "\002\005\001\111\003\057\013"},
+    {"Ta", "\016\001\375\263"},
+    {"Te", "\016\001\337"},
+    {"Tel", "\377\017\375\073\037\346\376\045"},
+    {"Ti", "\016\001\375\270"},
+    {"Tj", "\061\001\377\021"},
+    {"Tl", "\071\247\167"},
+    {"To", "\016\001\120"},
+    {"Tr", "\071\256\167"},
+    {"Ts", "\012\005\001\375\275\274"},
+    {"Tu", "\016\001\340"},
+    {"U", "\002\005\001\026"},
+    {"U!", "\002\005\001\026\003\053"},
+    {"U\"", "\002\005\001\026\003\066\015"},
+    {"U%", "\014\005\001\205\003\015"},
+    {"U'", "\002\005\001\026\003\015"},
+    {"U(", "\002\005\001\026\003\060"},
+    {"U*", "\014\005\001\205"},
+    {"U-", "\002\005\001\026\003\046"},
+    {"U--:", "\002\005\001\026\003\040\013"},
+    {"U-.", "\002\005\001\026\003\011\013"},
+    {"U-:", "\002\005\001\026\003\046\006\040"},
+    {"U->", "\002\005\001\026\003\025\013"},
+    {"U-?", "\002\005\001\026\003\043\013"},
+    {"U-o", "\023\002\005\001\026"},
+    {"U0", "\002\005\001\026\003\131\017"},
+    {"U2", "\002\005\001\026\003\067\017"},
+    {"U5", "\020\001\004\026"},
+    {"U6", "\016\001\026"},
+    {"U9", "\002\005\001\026\003\072"},
+    {"U9!", "\002\005\001\026\003\072\006\053"},
+    {"U9'", "\002\005\001\026\003\072\006\015"},
+    {"U9-.", "\002\005\001\026\003\072\006\011\013"},
+    {"U92", "\002\005\001\026\003\072\006\067\017"},
+    {"U9?", "\002\005\001\026\003\072\006\043"},
+    {"U:", "\002\005\001\026\003\040"},
+    {"U:!", "\002\005\001\026\003\040\006\053"},
+    {"U:'", "\002\005\001\026\003\040\006\015"},
+    {"U:-", "\002\005\001\026\003\040\006\046"},
+    {"U:<", "\002\005\001\026\003\040\006\045"},
+    {"U;", "\002\005\001\026\003\137"},
+    {"U<", "\002\005\001\026\003\045"},
+    {"U=", "\012\005\001\026"},
+    {"U>", "\002\005\001\026\003\025"},
+    {"U?", "\002\005\001\026\003\043"},
+    {"U?'", "\002\005\001\026\003\043\006\015"},
+    {"UA", "\375\302\375\323\027\375\037\376\053"},
+    {"UB", "\375\302\375\323\141\375\037\376\054"},
+    {"UD", "\055\056\140"},
+    {"UH", "\021\022\032\055\006\070"},
+    {"UL", "\021\022\032\055\006\033"},
+    {"ULr", "\021\022\034\031\006\033\055\032"},
+    {"UR", "\021\022\032\055\006\034"},
+    {"US", "\377\036\333\375\366"},
+    {"UT", "\074\375\277\167"},
+    {"UdH", "\021\022\056\031\006\055\070\032"},
+    {"UdL", "\021\022\056\031\006\033\055\032"},
+    {"UdLr", "\021\022\033\055\032\006\034\056\031"},
+    {"UdR", "\021\022\056\031\006\034\055\032"},
+    {"Udh", "\021\022\055\032\006\056\070\031"},
+    {"Udl", "\021\022\055\032\006\033\056\031"},
+    {"UdlR", "\021\022\034\055\032\006\033\056\031"},
+    {"Udr", "\021\022\055\032\006\034\056\031"},
+    {"Uh", "\021\022\055\032\006\070\031"},
+    {"Ul", "\021\022\055\032\006\033\031"},
+    {"UlR", "\021\022\033\031\006\034\055\032"},
+    {"Ur", "\021\022\055\032\006\034\031"},
+    {"V", "\002\005\001\170"},
+    {"V%", "\012\005\001\335\026\375\035"},
+    {"V*", "\014\005\001\205\003\040"},
+    {"V-.", "\002\005\001\170\003\011\013"},
+    {"V-o", "\023\002\005\001\170"},
+    {"V3", "\012\005\001\375\152"},
+    {"V=", "\012\005\001\375\032"},
+    {"V?", "\002\005\001\170\003\043"},
+    {"VH", "\021\022\032\065\006\070"},
+    {"VL", "\021\022\032\065\006\033"},
+    {"VLr", "\021\022\034\031\006\033\065\032"},
+    {"VR", "\021\022\032\065\006\034"},
+    {"VS", "\057\263\334\376\040"},
+    {"VT", "\057\263\376\037"},
+    {"VV", "\021\022\032\065"},
+    {"Va", "\016\001\377\040"},
+    {"Ve", "\016\001\375\032"},
+    {"Vh", "\021\022\065\032\006\070\031"},
+    {"Vi", "\016\001\377\044"},
+    {"Vl", "\021\022\065\032\006\033\031"},
+    {"VlR", "\021\022\033\031\006\034\065\032"},
+    {"Vo", "\016\001\377\045"},
+    {"Vr", "\021\022\065\032\006\034\031"},
+    {"Vs", "\376\314\021"},
+    {"Vu", "\016\001\375\303"},
+    {"W", "\002\005\001\122"},
+    {"W!", "\002\005\001\122\003\053"},
+    {"W%", "\014\005\001\324\003\015"},
+    {"W'", "\002\005\001\122\003\015"},
+    {"W*", "\014\005\001\324"},
+    {"W+", "\061\001\377\041"},
+    {"W-.", "\002\005\001\122\003\011\013"},
+    {"W-o", "\023\002\005\001\122"},
+    {"W.", "\002\005\001\122\003\011\017"},
+    {"W:", "\002\005\001\122\003\040"},
+    {"W=", "\377\050\037"},
+    {"W>", "\002\005\001\122\003\025"},
+    {"WA", "\016\001\004\342"},
+    {"Wa", "\016\001\342"},
+    {"We", "\016\001\375\304"},
+    {"Wi", "\016\001\375\306"},
+    {"Wo", "\016\001\375\307"},
+    {"X", "\002\005\001\151"},
+    {"X*", "\014\005\001\375\070"},
+    {"X+", "\061\001\376\237"},
+    {"X-o", "\023\002\005\001\151"},
+    {"X.", "\002\005\001\151\003\011\017"},
+    {"X:", "\002\005\001\151\003\040"},
+    {"XX", "\376\126\151"},
+    {"Y", "\002\005\001\103"},
+    {"Y!", "\002\005\001\103\003\053"},
+    {"Y%", "\014\005\001\305\003\015"},
+    {"Y'", "\002\005\001\103\003\015"},
+    {"Y*", "\014\005\001\305"},
+    {"Y-.", "\002\005\001\103\003\011\013"},
+    {"Y-o", "\023\002\005\001\103"},
+    {"Y.", "\002\005\001\103\003\011\017"},
+    {"Y2", "\002\005\001\103\003\067\017"},
+    {"Y3", "\012\005\001\375\311"},
+    {"Y:", "\002\005\001\103\003\040"},
+    {"Y=", "\012\005\001\375\312"},
+    {"Y>", "\002\005\001\103\003\025"},
+    {"Y?", "\002\005\001\103\003\043"},
+    {"YA", "\016\001\004\223"},
+    {"YI", "\012\005\001\375\313\375\041"},
+    {"YO", "\016\001\004\344"},
+    {"YU", "\016\001\004\225"},
+    {"Ya", "\016\001\223"},
+    {"Ye", "\377\051\037"},
+    {"Yo", "\016\001\344"},
+    {"Yu", "\016\001\225"},
+    {"Z", "\002\005\001\114"},
+    {"Z%", "\012\005\001\375\317"},
+    {"Z'", "\002\005\001\114\003\015"},
+    {"Z*", "\014\005\001\375\316"},
+    {"Z+", "\061\001\377\054"},
+    {"Z-.", "\002\005\001\114\003\011\013"},
+    {"Z-o", "\023\002\005\001\114"},
+    {"Z.", "\002\005\001\114\003\011\017"},
+    {"Z/", "\002\005\001\114\003\126"},
+    {"Z<", "\002\005\001\114\003\045"},
+    {"Z=", "\012\005\001\345"},
+    {"Z>", "\002\005\001\114\003\025"},
+    {"ZJ", "\061\001\375\273"},
+    {"Z_", "\002\005\001\114\003\057\013"},
+    {"Za", "\016\001\375\315"},
+    {"Ze", "\016\001\345"},
+    {"Zi", "\016\001\375\320"},
+    {"Zj", "\061\001\042\375\273"},
+    {"Zo", "\016\001\375\321"},
+    {"Zu", "\016\001\375\322"},
+    {"_", "\320\057"},
+    {"a", "\002\004\001\027"},
+    {"a!", "\002\004\001\027\003\053"},
+    {"a%", "\014\004\001\275\003\015"},
+    {"a'", "\002\004\001\027\003\015"},
+    {"a(", "\002\004\001\027\003\060"},
+    {"a(!", "\002\004\001\027\003\060\006\053"},
+    {"a('", "\002\004\001\027\003\060\006\015"},
+    {"a(-.", "\002\004\001\027\003\060\006\011\013"},
+    {"a(2", "\002\004\001\027\003\060\006\067\017"},
+    {"a(?", "\002\004\001\027\003\060\006\043"},
+    {"a*", "\014\004\001\275"},
+    {"a+", "\007\001\077"},
+    {"a+-", "\007\001\077\054\010"},
+    {"a+.", "\007\001\077\042\010"},
+    {"a+:", "\007\001\077\042\010\375\073\375\364\376\057"},
+    {"a-", "\002\004\001\027\003\046"},
+    {"a-.", "\002\004\001\027\003\011\013"},
+    {"a-0", "\002\004\001\027\003\131\013"},
+    {"a-o", "\023\002\004\001\027"},
+    {"a1", "\002\004\001\027\003\040\006\046"},
+    {"a2", "\002\004\001\027\003\067\017"},
+    {"a3", "\002\004\001\207\003\046"},
+    {"a4", "\044\001\027"},
+    {"a5", "\020\001\027"},
+    {"a6", "\016\001\004\027"},
+    {"a7", "\002\004\001\027\003\011\017\006\046"},
+    {"a:", "\002\004\001\027\003\040"},
+    {"a;", "\002\004\001\027\003\137"},
+    {"a<", "\002\004\001\027\003\045"},
+    {"a=", "\012\004\001\027"},
+    {"a>", "\002\004\001\027\003\025"},
+    {"a>!", "\002\004\001\027\003\025\006\053"},
+    {"a>'", "\002\004\001\027\003\025\006\015"},
+    {"a>-.", "\002\004\001\027\003\025\006\011\013"},
+    {"a>2", "\002\004\001\027\003\025\006\067\017"},
+    {"a>?", "\002\004\001\027\003\025\006\043"},
+    {"a?", "\002\004\001\027\003\043"},
+    {"aH", "\007\001\077\003\160\017"},
+    {"aH.", "\007\001\077\003\160\017\042\010"},
+    {"aM", "\007\001\077\003\321\017"},
+    {"aM.", "\007\001\077\003\321\017\042\010"},
+    {"aN", "\044\001\376\112"},
+    {"aR", "\052\050\204"},
+    {"aS", "\123\007\001\077"},
+    {"aa", "\002\004\001\027\003\131\017"},
+    {"aa'", "\002\004\001\027\003\131\017\006\015"},
+    {"ae", "\002\004\001\207"},
+    {"ae'", "\002\004\001\207\003\015"},
+    {"ah", "\007\001\077\003\160\013"},
+    {"ai", "\044\001\376\105"},
+    {"am", "\376\114\375\172\037\346\376\043"},
+    {"an", "\044\001\376\111"},
+    {"ar", "\004\052\050\204"},
+    {"au", "\044\001\376\122"},
+    {"b", "\002\004\001\141"},
+    {"b*", "\014\004\001\351"},
+    {"b+", "\007\001\230"},
+    {"b+,", "\007\001\230\102\010"},
+    {"b+-", "\007\001\230\054\010"},
+    {"b+.", "\007\001\230\042\010"},
+    {"b+;", "\007\001\230\075\010"},
+    {"b-.", "\002\004\001\141\003\011\013"},
+    {"b-o", "\023\002\004\001\141"},
+    {"b.", "\002\004\001\141\003\011\017"},
+    {"b3", "\014\004\001\251\351\347\376\102"},
+    {"b4", "\044\001\141"},
+    {"b=", "\012\004\001\277"},
+    {"bR", "\052\050\234"},
+    {"b_", "\002\004\001\141\003\057\013"},
+    {"ba", "\020\001\375\052"},
+    {"be", "\020\001\277"},
+    {"bi", "\020\001\375\055"},
+    {"bo", "\020\001\375\057"},
+    {"br", "\004\052\050\234"},
+    {"bu", "\020\001\375\061"},
+    {"c", "\002\004\001\115"},
+    {"c%", "\012\004\001\375\066"},
+    {"c'", "\002\004\001\115\003\015"},
+    {"c*", "\014\004\001\375\310"},
+    {"c+", "\007\001\257"},
+    {"c+,", "\007\001\257\102\010"},
+    {"c+-", "\007\001\257\054\010"},
+    {"c+.", "\007\001\257\042\010"},
+    {"c+;", "\007\001\257\075\010"},
+    {"c,", "\002\004\001\115\003\062"},
+    {"c,'", "\002\004\001\115\003\062\006\015"},
+    {"c-o", "\023\002\004\001\115"},
+    {"c.", "\002\004\001\115\003\011\017"},
+    {"c3", "\012\004\001\315"},
+    {"c4", "\044\001\115"},
+    {"c<", "\002\004\001\115\003\045"},
+    {"c=", "\012\004\001\375\274"},
+    {"c>", "\002\004\001\115\003\025"},
+    {"cC", "\074\375\071\176"},
+    {"cC-", "\071\375\071\176"},
+    {"cD", "\071\302\176"},
+    {"cD-", "\074\302\176"},
+    {"cH", "\071\375\137\176"},
+    {"cH-", "\074\375\137\176"},
+    {"cR", "\052\050\267"},
+    {"cS", "\074\375\255\176"},
+    {"cS-", "\071\375\255\176"},
+    {"ch", "\044\001\376\145"},
+    {"co", "\376\140\117"},
+    {"cr", "\004\052\050\267"},
+    {"d", "\002\004\001\105"},
+    {"d%", "\012\004\001\375\105\274"},
+    {"d*", "\014\004\001\375\101"},
+    {"d+", "\007\001\353"},
+    {"d+-", "\007\001\353\054\010"},
+    {"d+.", "\007\001\353\042\010"},
+    {"d,", "\002\004\001\105\003\062"},
+    {"d-", "\002\004\001\375\121\273"},
+    {"d-.", "\002\004\001\105\003\011\013"},
+    {"d->", "\002\004\001\105\003\025\013"},
+    {"d-o", "\023\002\004\001\105"},
+    {"d.", "\002\004\001\105\003\011\017"},
+    {"d/", "\002\004\001\105\003\126"},
+    {"d4", "\044\001\105"},
+    {"d<", "\002\004\001\105\003\045"},
+    {"d=", "\012\004\001\301"},
+    {"dH", "\021\022\056\031\006\070\032"},
+    {"dL", "\021\022\056\031\006\033\032"},
+    {"dLr", "\021\022\033\032\006\034\056\031"},
+    {"dP", "\375\012\376\167"},
+    {"dR", "\021\022\056\031\006\034\032"},
+    {"dT", "\071\375\107\167"},
+    {"d_", "\002\004\001\105\003\057\013"},
+    {"da", "\020\001\375\077"},
+    {"dd", "\007\001\231"},
+    {"dd,", "\007\001\231\102\010"},
+    {"dd-", "\007\001\231\054\010"},
+    {"dd.", "\007\001\231\042\010"},
+    {"dd;", "\007\001\231\075\010"},
+    {"de", "\020\001\301"},
+    {"dh", "\021\022\031\056\006\070"},
+    {"di", "\020\001\375\102"},
+    {"dk", "\007\001\375\027"},
+    {"dk-", "\007\001\375\027\054\010"},
+    {"dk.", "\007\001\375\027\042\010"},
+    {"dl", "\021\022\031\056\006\033"},
+    {"dlR", "\021\022\034\032\006\033\056\031"},
+    {"do", "\020\001\375\106"},
+    {"dr", "\021\022\031\056\006\034"},
+    {"ds", "\012\004\001\375\111\206"},
+    {"du", "\020\001\375\110"},
+    {"dz", "\012\004\001\375\112"},
+    {"e", "\002\004\001\036"},
+    {"e!", "\002\004\001\036\003\053"},
+    {"e%", "\014\004\001\304\003\015"},
+    {"e'", "\002\004\001\036\003\015"},
+    {"e(", "\002\004\001\036\003\060"},
+    {"e*", "\014\004\001\304"},
+    {"e+", "\007\001\227"},
+    {"e+,", "\007\001\227\102\010"},
+    {"e+-", "\007\001\227\054\010"},
+    {"e+.", "\007\001\227\042\010"},
+    {"e+;", "\007\001\227\075\010"},
+    {"e,(", "\002\004\001\036\003\062\006\060"},
+    {"e-", "\002\004\001\036\003\046"},
+    {"e-!", "\002\004\001\036\003\046\006\053"},
+    {"e-'", "\002\004\001\036\003\046\006\015"},
+    {"e-.", "\002\004\001\036\003\011\013"},
+    {"e->", "\002\004\001\036\003\025\013"},
+    {"e-?", "\002\004\001\036\003\043\013"},
+    {"e-o", "\023\002\004\001\036"},
+    {"e.", "\002\004\001\036\003\011\017"},
+    {"e2", "\002\004\001\036\003\067\017"},
+    {"e4", "\044\001\036"},
+    {"e5", "\020\001\036"},
+    {"e6", "\016\001\004\036"},
+    {"e:", "\002\004\001\036\003\040"},
+    {"e;", "\002\004\001\036\003\137"},
+    {"e<", "\002\004\001\036\003\045"},
+    {"e=", "\012\004\001\313"},
+    {"e>", "\002\004\001\036\003\025"},
+    {"e>!", "\002\004\001\036\003\025\006\053"},
+    {"e>'", "\002\004\001\036\003\025\006\015"},
+    {"e>-.", "\002\004\001\036\003\025\006\011\013"},
+    {"e>2", "\002\004\001\036\003\025\006\067\017"},
+    {"e>?", "\002\004\001\036\003\025\006\043"},
+    {"e?", "\002\004\001\036\003\043"},
+    {"eN", "\044\001\361"},
+    {"ed", "\002\004\001\306\375\374\376\056"},
+    {"eh4", "\044\001\376\176"},
+    {"ei", "\044\001\376\177"},
+    {"en", "\044\001\235"},
+    {"er", "\044\001\363"},
+    {"ez", "\002\004\001\306\003\045"},
+    {"f", "\002\004\001\172"},
+    {"f(", "\375\126\037\375\373\376\075"},
+    {"f*", "\014\004\001\375\215"},
+    {"f+", "\007\001\236"},
+    {"f+,", "\007\001\236\102\010"},
+    {"f+-", "\007\001\236\054\010"},
+    {"f+.", "\007\001\236\042\010"},
+    {"f+;", "\007\001\236\075\010"},
+    {"f-o", "\023\002\004\001\172"},
+    {"f.", "\002\004\001\172\003\011\017"},
+    {"f2", "\377\057"},
+    {"f3", "\012\004\001\375\123"},
+    {"f4", "\044\001\172"},
+    {"f=", "\012\004\001\375\114"},
+    {"fS", "\074\132"},
+    {"ff", "\002\004\116\376\211"},
+    {"ffi", "\002\004\116\376\212"},
+    {"ffl", "\002\004\116\376\213"},
+    {"fi", "\002\004\116\376\214"},
+    {"fl", "\002\004\116\376\217"},
+    {"ft", "\002\004\116\376\224"},
+    {"g", "\002\004\001\101"},
+    {"g%", "\012\004\001\375\132\206"},
+    {"g'", "\002\004\001\101\003\015"},
+    {"g(", "\002\004\001\101\003\060"},
+    {"g*", "\014\004\001\372"},
+    {"g+", "\007\001\244"},
+    {"g+,", "\007\001\244\102\010"},
+    {"g+-", "\007\001\244\054\010"},
+    {"g+.", "\007\001\244\042\010"},
+    {"g+;", "\007\001\244\075\010"},
+    {"g,", "\002\004\001\101\003\062"},
+    {"g-", "\002\004\001\101\003\046"},
+    {"g-o", "\023\002\004\001\101"},
+    {"g.", "\002\004\001\101\003\011\017"},
+    {"g/", "\002\004\001\101\003\126"},
+    {"g3", "\012\004\001\307\003\375\300"},
+    {"g4", "\044\001\101"},
+    {"g<", "\002\004\001\101\003\045"},
+    {"g=", "\012\004\001\307"},
+    {"g>", "\002\004\001\101\003\025"},
+    {"ga", "\020\001\375\127"},
+    {"ge", "\020\001\375\130"},
+    {"gf", "\007\001\376\225"},
+    {"gi", "\020\001\375\131"},
+    {"gn", "\044\001\376\230"},
+    {"go", "\020\001\375\133"},
+    {"gu", "\020\001\375\134"},
+    {"h", "\002\004\001\106"},
+    {"h*", "\014\004\001\375\266"},
+    {"h+", "\007\001\241"},
+    {"h+,", "\007\001\241\102\010"},
+    {"h+-", "\007\001\241\054\010"},
+    {"h+.", "\007\001\241\042\010"},
+    {"h+;", "\007\001\241\075\010"},
+    {"h,", "\002\004\001\106\003\062"},
+    {"h-(", "\002\004\001\106\003\060\013"},
+    {"h-.", "\002\004\001\106\003\011\013"},
+    {"h-o", "\023\002\004\001\106"},
+    {"h.", "\002\004\001\106\003\011\017"},
+    {"h/", "\002\004\001\106\003\126"},
+    {"h4", "\044\001\106"},
+    {"h:", "\002\004\001\106\003\040"},
+    {"h=", "\012\004\001\311"},
+    {"h>", "\002\004\001\106\003\025"},
+    {"h_", "\002\004\001\106\003\057\013"},
+    {"ha", "\020\001\311"},
+    {"he", "\020\001\373"},
+    {"hh", "\021\022\031\070"},
+    {"hi", "\020\001\375\141"},
+    {"hk", "\007\001\240"},
+    {"hk,", "\007\001\240\102\010"},
+    {"hk-", "\007\001\240\054\010"},
+    {"hk.", "\007\001\240\042\010"},
+    {"hk;", "\007\001\240\075\010"},
+    {"ho", "\020\001\375\143"},
+    {"hu", "\020\001\375\144"},
+    {"i", "\002\004\001\041"},
+    {"i!", "\002\004\001\041\003\053"},
+    {"i%", "\014\004\001\171\003\015"},
+    {"i'", "\002\004\001\041\003\015"},
+    {"i(", "\002\004\001\041\003\060"},
+    {"i*", "\014\004\001\171"},
+    {"i+", "\007\001\237"},
+    {"i+,", "\007\001\237\102\010"},
+    {"i+-", "\007\001\237\054\010"},
+    {"i+.", "\007\001\237\042\010"},
+    {"i+;", "\007\001\237\075\010"},
+    {"i-", "\002\004\001\041\003\046"},
+    {"i-.", "\002\004\001\041\003\011\013"},
+    {"i-?", "\002\004\001\041\003\043\013"},
+    {"i-o", "\023\002\004\001\041"},
+    {"i.", "\002\004\001\041\376\172"},
+    {"i2", "\002\004\001\041\003\067\017"},
+    {"i3", "\014\004\001\171\003\015\006\040"},
+    {"i4", "\044\001\041"},
+    {"i5", "\020\001\041"},
+    {"i6", "\016\001\004\041"},
+    {"i:", "\002\004\001\041\003\040"},
+    {"i:'", "\002\004\001\041\003\040\006\015"},
+    {"i;", "\002\004\001\041\003\137"},
+    {"i<", "\002\004\001\041\003\045"},
+    {"i=", "\012\004\001\041"},
+    {"i>", "\002\004\001\041\003\025"},
+    {"i?", "\002\004\001\041\003\043"},
+    {"ie", "\012\004\001\375\276\313"},
+    {"ii", "\012\004\001\375\063\041"},
+    {"ij", "\002\004\116\375\146"},
+    {"io", "\012\004\001\375\151"},
+    {"iu", "\044\001\376\253"},
+    {"j", "\002\004\001\162"},
+    {"j%", "\012\004\001\375\153"},
+    {"j*", "\014\004\001\171\003\040"},
+    {"j+", "\007\001\077\375\004"},
+    {"j+-", "\007\001\077\375\004\054\010"},
+    {"j+.", "\007\001\077\375\004\042\010"},
+    {"j-o", "\023\002\004\001\162"},
+    {"j3", "\014\171\013"},
+    {"j4", "\044\001\162"},
+    {"j<", "\002\004\001\162\003\045"},
+    {"j=", "\012\004\001\335\041"},
+    {"j>", "\002\004\001\162\003\025"},
+    {"ja", "\012\004\001\223"},
+    {"je", "\012\004\001\036"},
+    {"ju", "\012\004\001\225"},
+    {"k", "\002\004\001\125"},
+    {"k'", "\002\004\001\125\003\015"},
+    {"k*", "\014\004\001\375\154"},
+    {"k+", "\007\001\202"},
+    {"k+,", "\007\001\202\102\010"},
+    {"k+-", "\007\001\202\054\010"},
+    {"k+.", "\007\001\202\042\010"},
+    {"k+;", "\007\001\202\075\010"},
+    {"k,", "\002\004\001\125\003\062"},
+    {"k-.", "\002\004\001\125\003\011\013"},
+    {"k-o", "\023\002\004\001\125"},
+    {"k3", "\014\004\001\315"},
+    {"k4", "\044\001\125"},
+    {"k<", "\002\004\001\125\003\045"},
+    {"k=", "\012\004\001\245"},
+    {"k_", "\002\004\001\125\003\057\013"},
+    {"ka", "\020\001\245"},
+    {"ke", "\020\001\375\003"},
+    {"ki", "\020\001\375\155"},
+    {"kj", "\012\004\001\375\156\206"},
+    {"kk", "\002\004\001\376\262\375\356"},
+    {"ko", "\020\001\375\157"},
+    {"ku", "\020\001\375\160"},
+    {"l", "\002\004\001\073"},
+    {"l'", "\002\004\001\073\003\015"},
+    {"l*", "\014\004\001\375\161"},
+    {"l+", "\007\001\142"},
+    {"l+,", "\007\001\142\102\010"},
+    {"l+-", "\007\001\142\054\010"},
+    {"l+.", "\007\001\142\042\010"},
+    {"l+;", "\007\001\142\075\010"},
+    {"l,", "\002\004\001\073\003\062"},
+    {"l--.", "\002\004\001\073\003\011\013\006\046"},
+    {"l-.", "\002\004\001\073\003\011\013"},
+    {"l->", "\002\004\001\073\003\025\013"},
+    {"l-o", "\023\002\004\001\073"},
+    {"l.", "\002\004\001\073\003\251\011"},
+    {"l/", "\002\004\001\073\003\126"},
+    {"l4", "\044\001\073"},
+    {"l<", "\002\004\001\073\003\045"},
+    {"l=", "\012\004\001\375\115"},
+    {"lB", "\033\157\210"},
+    {"lH-", "\007\116\142\003\077\003\160\017\054\010"},
+    {"lH.", "\007\116\142\003\077\003\160\017\042\010"},
+    {"lM-", "\007\116\142\003\077\003\321\017\054\010"},
+    {"lM.", "\007\116\142\003\077\003\321\017\042\010"},
+    {"l_", "\002\004\001\073\003\057\013"},
+    {"la-", "\007\116\142\003\077\054\010"},
+    {"la.", "\007\116\142\003\077\042\010"},
+    {"lh-", "\007\116\142\003\077\003\160\013\054\010"},
+    {"lh.", "\007\116\142\003\077\003\160\013\042\010"},
+    {"lj", "\012\004\001\375\163"},
+    {"m", "\002\004\001\146"},
+    {"m'", "\002\004\001\146\003\015"},
+    {"m*", "\014\004\001\322"},
+    {"m+", "\007\001\250"},
+    {"m+,", "\007\001\250\102\010"},
+    {"m+-", "\007\001\250\054\010"},
+    {"m+.", "\007\001\250\042\010"},
+    {"m+;", "\007\001\250\075\010"},
+    {"m-.", "\002\004\001\146\003\011\013"},
+    {"m-o", "\023\002\004\001\146"},
+    {"m.", "\002\004\001\146\003\011\017"},
+    {"m3", "\014\004\001\375\103"},
+    {"m4", "\044\001\146"},
+    {"m=", "\012\004\001\303"},
+    {"ma", "\020\001\375\166"},
+    {"me", "\020\001\375\167"},
+    {"mi", "\020\001\375\174"},
+    {"mo", "\020\001\375\175"},
+    {"mu", "\020\001\322"},
+    {"n", "\002\004\001\063"},
+    {"n'", "\002\004\001\063\003\015"},
+    {"n*", "\014\004\001\323"},
+    {"n+", "\007\001\252"},
+    {"n+,", "\007\001\252\102\010"},
+    {"n+-", "\007\001\252\054\010"},
+    {"n+.", "\007\001\252\042\010"},
+    {"n+;", "\007\001\252\075\010"},
+    {"n,", "\002\004\001\063\003\062"},
+    {"n-.", "\002\004\001\063\003\011\013"},
+    {"n-o", "\023\002\004\001\063"},
+    {"n.", "\002\004\001\063\003\011\017"},
+    {"n4", "\044\001\063"},
+    {"n5", "\020\001\063"},
+    {"n<", "\002\004\001\063\003\045"},
+    {"n=", "\012\004\001\235"},
+    {"n?", "\002\004\001\063\003\043"},
+    {"nG", "\044\001\376\306"},
+    {"nS", "\123\002\004\001\063"},
+    {"n_", "\002\004\001\063\003\057\013"},
+    {"na", "\020\001\375\200"},
+    {"ne", "\020\001\375\201"},
+    {"ng", "\002\004\001\361\375\040"},
+    {"ni", "\020\001\375\203"},
+    {"nj", "\012\004\001\375\204"},
+    {"no", "\020\001\375\011"},
+    {"nu", "\020\001\323"},
+    {"o", "\002\004\001\024"},
+    {"o!", "\002\004\001\024\003\053"},
+    {"o\"", "\002\004\001\024\003\066\015"},
+    {"o%", "\014\004\001\325\003\015"},
+    {"o'", "\002\004\001\024\003\015"},
+    {"o(", "\002\004\001\024\003\060"},
+    {"o*", "\014\004\001\325"},
+    {"o-", "\002\004\001\024\003\046"},
+    {"o-!", "\002\004\001\024\003\046\006\053"},
+    {"o-'", "\002\004\001\024\003\046\006\015"},
+    {"o-.", "\002\004\001\024\003\011\013"},
+    {"o-o", "\023\002\004\001\024"},
+    {"o/", "\002\004\001\024\003\126"},
+    {"o/'", "\002\004\001\024\003\126\006\015"},
+    {"o1", "\002\004\001\024\003\137\006\046"},
+    {"o2", "\002\004\001\024\003\067\017"},
+    {"o3", "\012\004\001\375\056\375\314"},
+    {"o4", "\044\001\024"},
+    {"o5", "\020\001\024"},
+    {"o6", "\016\001\004\024"},
+    {"o9", "\002\004\001\024\003\072"},
+    {"o9!", "\002\004\001\024\003\072\006\053"},
+    {"o9'", "\002\004\001\024\003\072\006\015"},
+    {"o9-.", "\002\004\001\024\003\072\006\011\013"},
+    {"o92", "\002\004\001\024\003\072\006\067\017"},
+    {"o9?", "\002\004\001\024\003\072\006\043"},
+    {"o:", "\002\004\001\024\003\040"},
+    {"o;", "\002\004\001\024\003\137"},
+    {"o<", "\002\004\001\024\003\045"},
+    {"o=", "\012\004\001\024"},
+    {"o>", "\002\004\001\024\003\025"},
+    {"o>!", "\002\004\001\024\003\025\006\053"},
+    {"o>'", "\002\004\001\024\003\025\006\015"},
+    {"o>-.", "\002\004\001\024\003\025\006\011\013"},
+    {"o>2", "\002\004\001\024\003\025\006\067\017"},
+    {"o>?", "\002\004\001\024\003\025\006\043"},
+    {"o?", "\002\004\001\024\003\043"},
+    {"o?'", "\002\004\001\024\003\043\006\015"},
+    {"o?:", "\002\004\001\024\003\043\006\040"},
+    {"oC", "\354\376\144"},
+    {"oF", "\354\376\204"},
+    {"oe", "\002\004\116\375\211"},
+    {"oi", "\002\004\001\375\212"},
+    {"ou", "\044\001\376\317"},
+    {"p", "\002\004\001\164"},
+    {"p'", "\002\004\001\164\003\015"},
+    {"p*", "\014\004\001\327"},
+    {"p+", "\007\001\376\324"},
+    {"p-o", "\023\002\004\001\164"},
+    {"p.", "\002\004\001\164\003\011\017"},
+    {"p3", "\014\004\001\375\236"},
+    {"p4", "\044\001\164"},
+    {"p=", "\012\004\001\217"},
+    {"pa", "\020\001\375\214"},
+    {"pe", "\020\001\217"},
+    {"pi", "\020\001\327"},
+    {"pm", "\376\334\375\172\037\346\376\044"},
+    {"po", "\020\001\375\216"},
+    {"pu", "\020\001\375\223"},
+    {"q", "\002\004\001\221"},
+    {"q*", "\014\004\001\375\222"},
+    {"q+", "\007\001\255"},
+    {"q+,", "\007\001\255\102\010"},
+    {"q+-", "\007\001\255\054\010"},
+    {"q+.", "\007\001\255\042\010"},
+    {"q+;", "\007\001\255\075\010"},
+    {"q-o", "\023\002\004\001\221"},
+    {"q4", "\044\001\221"},
+    {"r", "\002\004\001\113"},
+    {"r'", "\002\004\001\113\003\015"},
+    {"r*", "\014\004\001\375\231"},
+    {"r+", "\007\001\375\015"},
+    {"r+-", "\007\001\375\015\054\010"},
+    {"r+.", "\007\001\375\015\042\010"},
+    {"r,", "\002\004\001\113\003\062"},
+    {"r--.", "\002\004\001\113\003\011\013\006\046"},
+    {"r-.", "\002\004\001\113\003\011\013"},
+    {"r-o", "\023\002\004\001\113"},
+    {"r.", "\002\004\001\113\003\011\017"},
+    {"r4", "\044\001\113"},
+    {"r<", "\002\004\001\113\003\045"},
+    {"r=", "\012\004\001\363"},
+    {"r_", "\002\004\001\113\003\057\013"},
+    {"ra", "\020\001\375\225"},
+    {"re", "\020\001\375\226"},
+    {"ri", "\020\001\375\232"},
+    {"ro", "\020\001\375\233"},
+    {"ru", "\020\001\375\234"},
+    {"s", "\002\004\001\064"},
+    {"s%", "\012\004\001\375\242"},
+    {"s'", "\002\004\001\064\003\015"},
+    {"s'.", "\002\004\001\064\003\015\006\011\017"},
+    {"s*", "\014\004\001\375\021"},
+    {"s+", "\007\001\260"},
+    {"s+,", "\007\001\260\102\010"},
+    {"s+-", "\007\001\260\054\010"},
+    {"s+.", "\007\001\260\042\010"},
+    {"s+;", "\007\001\260\075\010"},
+    {"s,", "\002\004\001\064\003\062"},
+    {"s-.", "\002\004\001\064\003\011\013"},
+    {"s-o", "\023\002\004\001\064"},
+    {"s.", "\002\004\001\064\003\011\017"},
+    {"s4", "\044\001\064"},
+    {"s<", "\002\004\001\064\003\045"},
+    {"s<.", "\002\004\001\064\003\045\006\011\017"},
+    {"s=", "\012\004\001\375\117"},
+    {"s>", "\002\004\001\064\003\025"},
+    {"sB", "\074\004\132"},
+    {"sa", "\020\001\375\235"},
+    {"sc", "\012\004\001\375\245"},
+    {"se", "\020\001\375\237"},
+    {"sh", "\044\001\376\371"},
+    {"si", "\020\001\375\250"},
+    {"sn", "\007\001\261"},
+    {"sn,", "\007\001\261\102\010"},
+    {"sn-", "\007\001\261\054\010"},
+    {"sn.", "\007\001\261\042\010"},
+    {"sn;", "\007\001\261\075\010"},
+    {"so", "\020\001\375\253"},
+    {"ss", "\002\004\001\375\244\064\375\355"},
+    {"st", "\002\004\116\377\001"},
+    {"su", "\020\001\375\260"},
+    {"t", "\002\004\001\111"},
+    {"t*", "\014\004\001\375\264"},
+    {"t+", "\007\001\177"},
+    {"t+,", "\007\001\177\102\010"},
+    {"t+-", "\007\001\177\054\010"},
+    {"t+.", "\007\001\177\042\010"},
+    {"t+;", "\007\001\177\075\010"},
+    {"t,", "\002\004\001\111\003\062"},
+    {"t-.", "\002\004\001\111\003\011\013"},
+    {"t->", "\002\004\001\111\003\025\013"},
+    {"t-o", "\023\002\004\001\111"},
+    {"t.", "\002\004\001\111\003\011\017"},
+    {"t/", "\002\004\001\111\003\126"},
+    {"t3", "\014\004\001\375\257"},
+    {"t4", "\044\001\111"},
+    {"t:", "\002\004\001\111\003\040"},
+    {"t<", "\002\004\001\111\003\045"},
+    {"t=", "\012\004\001\337"},
+    {"tU", "\020\001\004\340"},
+    {"t_", "\002\004\001\111\003\057\013"},
+    {"ta", "\020\001\375\263"},
+    {"te", "\020\001\337"},
+    {"tel", "\071\375\026"},
+    {"th", "\002\004\001\375\267\273"},
+    {"ti", "\020\001\375\270"},
+    {"tj", "\007\001\264"},
+    {"tj,", "\007\001\264\102\010"},
+    {"tj-", "\007\001\264\054\010"},
+    {"tj.", "\007\001\264\042\010"},
+    {"tj;", "\007\001\264\075\010"},
+    {"tk", "\007\001\265"},
+    {"tk,", "\007\001\265\102\010"},
+    {"tk-", "\007\001\265\054\010"},
+    {"tk.", "\007\001\265\042\010"},
+    {"tk;", "\007\001\265\075\010"},
+    {"tm", "\007\001\177\375\005"},
+    {"tm-", "\007\001\177\375\005\054\010"},
+    {"tm.", "\007\001\177\375\005\042\010"},
+    {"to", "\020\001\120"},
+    {"ts", "\012\004\001\375\275\274"},
+    {"tu", "\020\001\340"},
+    {"u", "\002\004\001\026"},
+    {"u!", "\002\004\001\026\003\053"},
+    {"u\"", "\002\004\001\026\003\066\015"},
+    {"u%", "\014\004\001\205\003\015"},
+    {"u'", "\002\004\001\026\003\015"},
+    {"u(", "\002\004\001\026\003\060"},
+    {"u*", "\014\004\001\205"},
+    {"u-", "\002\004\001\026\003\046"},
+    {"u--:", "\002\004\001\026\003\040\013"},
+    {"u-.", "\002\004\001\026\003\011\013"},
+    {"u-:", "\002\004\001\026\003\046\006\040"},
+    {"u->", "\002\004\001\026\003\025\013"},
+    {"u-?", "\002\004\001\026\003\043\013"},
+    {"u-o", "\023\002\004\001\026"},
+    {"u0", "\002\004\001\026\003\131\017"},
+    {"u2", "\002\004\001\026\003\067\017"},
+    {"u3", "\014\004\001\205\003\015\006\040"},
+    {"u4", "\044\001\026"},
+    {"u5", "\020\001\026"},
+    {"u6", "\016\001\004\026"},
+    {"u9", "\002\004\001\026\003\072"},
+    {"u9!", "\002\004\001\026\003\072\006\053"},
+    {"u9'", "\002\004\001\026\003\072\006\015"},
+    {"u9-.", "\002\004\001\026\003\072\006\011\013"},
+    {"u92", "\002\004\001\026\003\072\006\067\017"},
+    {"u9?", "\002\004\001\026\003\072\006\043"},
+    {"u:", "\002\004\001\026\003\040"},
+    {"u:!", "\002\004\001\026\003\040\006\053"},
+    {"u:'", "\002\004\001\026\003\040\006\015"},
+    {"u:-", "\002\004\001\026\003\040\006\046"},
+    {"u:<", "\002\004\001\026\003\040\006\045"},
+    {"u;", "\002\004\001\026\003\137"},
+    {"u<", "\002\004\001\026\003\045"},
+    {"u=", "\012\004\001\026"},
+    {"u>", "\002\004\001\026\003\025"},
+    {"u?", "\002\004\001\026\003\043"},
+    {"u?'", "\002\004\001\026\003\043\006\015"},
+    {"uDH", "\021\022\055\031\006\056\070\032"},
+    {"uDL", "\021\022\055\031\006\033\056\032"},
+    {"uDLr", "\021\022\033\056\032\006\034\055\031"},
+    {"uDR", "\021\022\055\031\006\034\056\032"},
+    {"uDh", "\021\022\056\032\006\055\070\031"},
+    {"uDl", "\021\022\056\032\006\033\055\031"},
+    {"uDlR", "\021\022\034\056\032\006\033\055\031"},
+    {"uDr", "\021\022\056\032\006\034\055\031"},
+    {"uH", "\021\022\055\031\006\070\032"},
+    {"uL", "\021\022\055\031\006\033\032"},
+    {"uLr", "\021\022\033\032\006\034\055\031"},
+    {"uR", "\021\022\055\031\006\034\032"},
+    {"uT", "\071\375\277\167"},
+    {"uh", "\021\022\031\055\006\070"},
+    {"ul", "\021\022\031\055\006\033"},
+    {"ulR", "\021\022\034\032\006\033\055\031"},
+    {"ur", "\021\022\031\055\006\034"},
+    {"v", "\002\004\001\170"},
+    {"v%", "\012\004\001\335\026\375\035"},
+    {"v*", "\014\004\001\205\003\040"},
+    {"v+", "\007\001\377\043"},
+    {"v-.", "\002\004\001\170\003\011\013"},
+    {"v-o", "\023\002\004\001\170"},
+    {"v3", "\012\004\001\375\152"},
+    {"v4", "\044\001\170"},
+    {"v=", "\012\004\001\375\032"},
+    {"v?", "\002\004\001\170\003\043"},
+    {"vH", "\021\022\065\031\006\070\032"},
+    {"vL", "\021\022\065\031\006\033\032"},
+    {"vLr", "\021\022\033\032\006\034\065\031"},
+    {"vR", "\021\022\065\031\006\034\032"},
+    {"vh", "\021\022\031\065\006\070"},
+    {"vl", "\021\022\031\065\006\033"},
+    {"vlR", "\021\022\034\032\006\033\065\031"},
+    {"vr", "\021\022\031\065\006\034"},
+    {"vu", "\020\001\375\303"},
+    {"vv", "\021\022\031\065"},
+    {"w", "\002\004\001\122"},
+    {"w!", "\002\004\001\122\003\053"},
+    {"w%", "\014\004\001\324\003\015"},
+    {"w'", "\002\004\001\122\003\015"},
+    {"w*", "\014\004\001\324"},
+    {"w+", "\007\001\343"},
+    {"w+-", "\007\001\343\054\010"},
+    {"w+.", "\007\001\343\042\010"},
+    {"w-.", "\002\004\001\122\003\011\013"},
+    {"w-o", "\023\002\004\001\122"},
+    {"w.", "\002\004\001\122\003\011\017"},
+    {"w0", "\002\004\001\122\003\131\017"},
+    {"w:", "\002\004\001\122\003\040"},
+    {"w>", "\002\004\001\122\003\025"},
+    {"wA", "\020\001\004\342"},
+    {"wH", "\007\001\343\003\160\017"},
+    {"wa", "\020\001\342"},
+    {"we", "\020\001\375\304"},
+    {"wi", "\020\001\375\306"},
+    {"wo", "\020\001\375\307"},
+    {"x", "\002\004\001\151"},
+    {"x*", "\014\004\001\375\070"},
+    {"x+", "\007\001\246"},
+    {"x+,", "\007\001\246\102\010"},
+    {"x+-", "\007\001\246\054\010"},
+    {"x+.", "\007\001\246\042\010"},
+    {"x+;", "\007\001\246\075\010"},
+    {"x-o", "\023\002\004\001\151"},
+    {"x.", "\002\004\001\151\003\011\017"},
+    {"x4", "\044\001\151"},
+    {"x:", "\002\004\001\151\003\040"},
+    {"y", "\002\004\001\103"},
+    {"y!", "\002\004\001\103\003\053"},
+    {"y%", "\014\004\001\305\003\015"},
+    {"y'", "\002\004\001\103\003\015"},
+    {"y*", "\014\004\001\305"},
+    {"y+", "\007\001\224"},
+    {"y+,", "\007\001\224\102\010"},
+    {"y+-", "\007\001\224\054\010"},
+    {"y+.", "\007\001\224\042\010"},
+    {"y+;", "\007\001\224\075\010"},
+    {"y-.", "\002\004\001\103\003\011\013"},
+    {"y-o", "\023\002\004\001\103"},
+    {"y.", "\002\004\001\103\003\011\017"},
+    {"y0", "\002\004\001\103\003\131\017"},
+    {"y2", "\002\004\001\103\003\067\017"},
+    {"y3", "\012\004\001\375\311"},
+    {"y:", "\002\004\001\103\003\040"},
+    {"y=", "\012\004\001\375\312"},
+    {"y>", "\002\004\001\103\003\025"},
+    {"y?", "\002\004\001\103\003\043"},
+    {"yA", "\020\001\004\223"},
+    {"yH", "\007\001\224\003\160\017"},
+    {"yO", "\020\001\004\344"},
+    {"yU", "\020\001\004\225"},
+    {"ya", "\020\001\223"},
+    {"yi", "\012\004\001\375\313\375\041"},
+    {"yo", "\020\001\344"},
+    {"yr", "\002\001\377\053"},
+    {"yu", "\020\001\225"},
+    {"z", "\002\004\001\114"},
+    {"z%", "\012\004\001\375\317"},
+    {"z'", "\002\004\001\114\003\015"},
+    {"z*", "\014\004\001\375\316"},
+    {"z+", "\007\001\375\034"},
+    {"z+-", "\007\001\375\034\054\010"},
+    {"z+.", "\007\001\375\034\042\010"},
+    {"z-.", "\002\004\001\114\003\011\013"},
+    {"z-o", "\023\002\004\001\114"},
+    {"z.", "\002\004\001\114\003\011\017"},
+    {"z/", "\002\004\001\114\003\126"},
+    {"z4", "\044\001\114"},
+    {"z<", "\002\004\001\114\003\045"},
+    {"z=", "\012\004\001\345"},
+    {"z>", "\002\004\001\114\003\025"},
+    {"zH", "\007\001\271"},
+    {"zH,", "\007\001\271\102\010"},
+    {"zH-", "\007\001\271\054\010"},
+    {"zH.", "\007\001\271\042\010"},
+    {"zH;", "\007\001\271\075\010"},
+    {"z_", "\002\004\001\114\003\057\013"},
+    {"za", "\020\001\375\315"},
+    {"ze", "\020\001\345"},
+    {"zh", "\044\001\377\055"},
+    {"zi", "\020\001\375\320"},
+    {"zo", "\020\001\375\321"},
+    {"zu", "\020\001\375\322"},
+  };
diff --git a/charname.pl b/charname.pl
new file mode 100644 (file)
index 0000000..2d6afa1
--- /dev/null
@@ -0,0 +1,202 @@
+# Automatically derive charname.h from rfc1345.txt.
+# Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+open (HDR, ">charname.h");
+
+print HDR <<END_OF_TEXT;
+/* DO NOT MODIFY THIS FILE!  It was generated by "charname.pl".  */
+
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+END_OF_TEXT
+
+# Save a few definitions added after or independantly of RFC 1345.
+
+$charname{"f2"} = "florin";
+$max_length = 2;
+$code{"florin"}++;
+
+# Read the character comments.  Count words in charnames.
+
+print STDERR "Reading...";
+
+$_ = <>;
+while ($_)
+{
+    chop;
+
+    # Look ahead one line and merge it if it should.
+
+    $next = <>;
+    if ($next =~ /^              ( .*)/)
+    {
+       $_ .= $1;
+       $next = <>;
+    }
+
+    # Separate fields and save needed information.
+
+    if (/([^ ]+) +[0-9a-f]+ +(.*)/)
+    {
+       $charname{$1} = $2;
+       if (length ($2) > $max_length)
+       {
+           $max_length = length ($2);
+       }
+       foreach $word (split (/ /, $2))
+       {
+           $code{$word}++;
+       }
+    }
+    elsif (!/ +e000/)
+    {
+       print "What about <<", $_, ">>?\n";
+    }
+
+    # Prepare for next line.
+
+    $_ = $next;
+}
+
+# Establish a mild compression scheme.  Words @word[0] to
+# @word[$singles-1] will be represented by a single byte running from
+# 1 to $singles.  All remaining words will be represented by two
+# bytes, the first one running slowly from $singles+1 to 255, the
+# second cycling faster from 1 to 255.
+
+print STDERR "Sorting words...";
+
+@word = sort descending keys %code;
+$count = 0 + @word;
+$singles = int ((255 * 255 - $count) / 254);
+
+# Transmit a few values for further usage by the C code.
+
+print STDERR "and charnames...";
+
+@symbol = sort keys %charname;
+
+printf HDR "\n#define NUMBER_OF_SINGLES %d\n", $singles;
+printf HDR "\n#define MAX_CHARNAME_LENGTH %d\n", $max_length;
+printf HDR "\n#define NUMBER_OF_CHARNAMES %d\n", (0 + @symbol);
+
+# Establish a mild compression scheme (one or two bytes per word).
+
+print STDERR "Writing words...";
+
+print HDR "\n";
+print HDR "static const char *const word[$count] =\n";
+print HDR "  {\n";
+
+$char1 = 1;
+$char2 = 1;
+
+for ($counter = 0; $counter < $singles; $counter++)
+{
+    $word = $word[$counter];
+    $word =~ tr/A-Z/a-z/;
+    printf HDR "    %-28s/* %0.3o */\n", "\"$word\",", $char1;
+    $code{$word[$counter]} = $char1;
+    $char1++;
+}
+
+for (; $counter < $count; $counter++)
+{
+    $word = $word[$counter];
+    $word =~ tr/A-Z/a-z/;
+    printf HDR "    %-28s/* %0.3o %0.3o */\n", "\"$word\",", $char1, $char2;
+    $code{$word[$counter]} = 256 * $char1 + $char2;
+    if ($char2 == 255)
+    {
+       $char1++;
+       $char2 = 1;
+    }
+    else
+    {
+       $char2++;
+    }
+}
+print HDR "  };\n";
+
+# Print compressed charnames for all characters.
+
+print STDERR "and charnames...";
+
+print HDR "\n";
+print HDR "struct charname\n";
+print HDR "  {\n";
+print HDR "    const char *symbol;\n";
+print HDR "    const char *crypted;\n";
+print HDR "  };\n";
+
+print HDR "\n";
+print HDR "static const struct charname charname[NUMBER_OF_CHARNAMES] =\n";
+print HDR "  {\n";
+
+foreach $symbol (@symbol)
+{
+    $string = $symbol;
+    $string =~ s/([\"])/\\\1/g;
+    print HDR "    {\"$string\", \"";
+    foreach $word (split (' ', $charname{$symbol}))
+    {
+       $code = $code{$word};
+       if ($code < 256)
+       {
+           printf HDR "\\%0.3o", $code;
+       }
+       else
+       {
+           printf HDR "\\%0.3o\\%0.3o", int ($code / 256), $code % 256;
+       }
+    }
+    print HDR "\"},\n";
+}
+
+print HDR "  };\n";
+
+print STDERR "done\n";
+
+close HDR;
+exit 0;
+
+# Comparison routine for descending frequency sort.
+
+sub descending
+{
+    local ($result);
+
+    $result = $code{$b} - $code{$a};
+    $result == 0 ? $a cmp $b : $result;
+}
diff --git a/charname.sed b/charname.sed
new file mode 100644 (file)
index 0000000..48d6971
--- /dev/null
@@ -0,0 +1,5 @@
+1,/^   3rd field is the long descriptive/d
+/^Simonsen/,/^RFC 1345/d
+/^4.  CHARSETS/q
+/^$/d
+s/^ //p
diff --git a/charset.c b/charset.c
new file mode 100644 (file)
index 0000000..9c3bb80
--- /dev/null
+++ b/charset.c
@@ -0,0 +1,763 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+/* Maximum number of charset values.  */
+#define MAX_CHARSETS 200
+
+/* Hash table size for charset names.  */
+#define HASH_TABLE_SIZE 997
+
+/* Maximum number of characters per 10646 symbol.  */
+#define MAX_SYMBOL_SIZE 9
+
+/* Known pairs (for restricting listing).  */
+
+static struct known_pair *pair_restriction = NULL;
+static int pair_restrictions = 0;
+
+/* Known character sets.  */
+
+struct hash
+  {
+    const char *name;          /* charset or alias name, or NULL */
+    CHARSET *charset;          /* associated charset */
+    struct hash *next;         /* next index in table, or NULL */
+  };
+struct hash hash_table[HASH_TABLE_SIZE];
+CHARSET charset_array[MAX_CHARSETS];
+int number_of_charsets;
+
+/* Array of strings ready for argmatch.  */
+static const char **argmatch_array;
+\f
+/* Character names.  */
+
+/* This module takes care only of short 10646 forms.  Module charname.c
+   takes care of the full descriptive name for characters.  */
+
+/*--------------------------------------------------------------------.
+| Return a statically allocated 10646 symbol in a CHARSET for a given |
+| CODE, or NULL if this symbol is not defined.  There are two static  |
+| buffers used in alternance.                                        |
+`--------------------------------------------------------------------*/
+
+static char *
+code_to_symbol (CHARSET *charset, int code)
+{
+  static char buffer[2][MAX_SYMBOL_SIZE + 1];
+  static int which = 0;
+  const char *in;
+  char *out;
+  int counter;
+
+  if (in = (*charset->table)[code / 32], !in)
+    return NULL;
+
+  in += charset->size * (code % 32);
+  if (*in == ' ')
+    return NULL;
+
+  which = !which;
+  out = buffer[which];
+  for (counter = 0; counter < charset->size; counter++)
+    if (*in == ' ')
+      in++;
+    else
+      *out++ = *in++;
+  *out = '\0'; 
+  return buffer[which];
+}
+
+/*------------------------------------------------------------------------.
+| Print a 10646 symbol in a CHARSET for a given CODE, padding with spaces |
+| after to the proper width.                                             |
+`------------------------------------------------------------------------*/
+
+static void
+print_symbol (CHARSET *charset, int code)
+{
+  int counter;
+  char *cursor;
+
+  counter = 0;
+  cursor = code_to_symbol (charset, code);
+  
+  if (cursor)
+    for (; *cursor && counter < charset->size; counter++)
+      {
+       putchar (*cursor);
+       cursor++;
+      }
+  for (; counter < charset->size; counter++)
+    putchar (' ');
+}
+
+/*-----------------------------------------------------------------.
+| Decode a known PAIRS argument, given in STRING, constructing the |
+| pair_restriction array out of it.                               |
+`-----------------------------------------------------------------*/
+
+void
+decode_known_pairs (const char *string)
+{
+  struct known_pair pair;
+  const char *cursor;
+  int value;
+
+  pair_restriction = (struct known_pair *)
+    xmalloc (16 * sizeof (struct known_pair));
+
+  value = -1;
+  for (cursor = string; *cursor; cursor++)
+    switch (*cursor)
+      {
+      default:
+       usage (EXIT_FAILURE);
+
+      case '0':
+      case '1':
+      case '2':
+      case '3':
+      case '4':
+      case '5':
+      case '6':
+      case '7':
+      case '8':
+      case '9':
+       if (value < 0)
+         value = *cursor - '0';
+       else
+         value = 10 * value + *cursor - '0';
+       break;
+
+      case ':':
+       if (value < 0 || value > 255)
+         usage (EXIT_FAILURE);
+       pair_restriction[pair_restrictions].left = (unsigned char) value;
+       value = -1;
+       break;
+
+      case ',':
+       if (value < 0 || value > 255)
+         usage (EXIT_FAILURE);
+       pair_restriction[pair_restrictions++].right = (unsigned char) value;
+       if (pair_restrictions % 16 == 0)
+         pair_restriction = (struct known_pair *)
+           xrealloc (pair_restriction,
+                     (pair_restrictions + 16) * sizeof (struct known_pair));
+       value = -1;
+       break;
+      }
+
+  if (value < 0 || value > 255)
+    usage (EXIT_FAILURE);
+  pair_restriction[pair_restrictions++].right = (unsigned char) value;
+}
+
+/*-------------------------------------------------------------.
+| Return non-zero if BEFORE to AFTER is currently restricted.  |
+`-------------------------------------------------------------*/
+
+static int
+check_restricted (CHARSET *before, CHARSET *after)
+{
+  struct known_pair *pair;
+  const char *left;
+  const char *right;
+
+  /* Reject the charset if not RFC1345.  */
+
+  if (!before->table || !after->table)
+    return 1;
+
+  for (pair = pair_restriction;
+       pair < pair_restriction + pair_restrictions;
+       pair++)
+    {
+
+      /* Reject the charset if the characters in the pair do not exist of
+        if their respective definition do not match.  */
+
+      left = code_to_symbol (before, pair->left);
+      if (!left)
+       return 1;
+      right = code_to_symbol (after, pair->right);
+      if (!right)
+       return 1;
+      if (strcmp (left, right))
+       return 1;
+    }
+
+  /* No restriction found.  */
+
+  return 0;
+}
+\f
+/* Charset names.  */
+
+/*--------------------------------------.
+| Prepare charsets for initialization.  |
+`--------------------------------------*/
+
+void
+prepare_charset_initialization (void)
+{
+  int counter;
+
+  for (counter = 0; counter < HASH_TABLE_SIZE; counter++)
+    {
+      hash_table[counter].name = NULL;
+      hash_table[counter].next = NULL;
+    }
+  number_of_charsets = 0;
+}
+
+/*-----------------------------------------------------------------------.
+| Return a newly allocated copy of charset NAME, with upper case letters |
+| turned into lower case, and all non alphanumeric discarded.           |
+`-----------------------------------------------------------------------*/
+
+static char *
+cleanup_charset_name (const char *name)
+{
+  char *result;
+  char *out;
+  const char *in;
+  int character;
+
+  result = xmalloc (strlen (name) + 1);
+  out = result;
+  for (in = name; *in; in++)
+    {
+      character = *(const unsigned char *) in;
+      if ((character >= 'a' && character <= 'z')
+         || (character >= '0' && character <= '9'))
+       *out++ = character;
+      else if (character >= 'A' && character <= 'Z')
+       *out++ = character - 'A' + 'a';
+    }
+  *out = '\0';
+  return result;
+}
+
+/*-----------------------------------.
+| Return a hash index for a STRING.  |
+`-----------------------------------*/
+
+#ifdef DIFF_HASH
+
+/* Given a hash value and a new character, return a new hash value.  */
+
+#define UINT_BIT (sizeof (unsigned) * CHAR_BIT)
+#define ROTATE_LEFT(v, n) ((v) << (n) | (v) >> (UINT_BIT - (n)))
+#define HASH(h, c) ((c) + ROTATE_LEFT (h, 7))
+
+static int
+hash_string (const char *string)
+{
+  unsigned value;
+
+  value = 0;
+  for (; *string; string++)
+    value = HASH (value, *(const unsigned char *) string);
+  return value % HASH_TABLE_SIZE;
+}
+
+#else /* not DIFF_HASH */
+
+static int
+hash_string (const char *string)
+{
+  unsigned value;
+
+  value = 0;
+  for (; *string; string++)
+    value = ((value * 31 + (int) *(const unsigned char *) string)
+            % HASH_TABLE_SIZE);
+  return value;
+}
+
+#endif /* not DIFF_HASH */
+
+/*--------------------------------------------------------------------------.
+| Return the charset from its NAME or alias name.  If it does not already   |
+| exist, add a new charset entry and initialize it with a brand new value.  |
+`--------------------------------------------------------------------------*/
+
+CHARSET *
+find_charset (const char *name)
+{
+  char *hashname;
+  struct hash *hash;
+  CHARSET *charset;
+
+  /* Search the whole hash bucket and return any match.  */
+
+  hashname = cleanup_charset_name (name);
+  for (hash = hash_table + hash_string (hashname);
+       hash->name;
+       hash = hash->next)
+    {
+      if (strcmp (hashname, hash->name) == 0)
+       {
+         free (hashname);
+         return hash->charset;
+       }
+      if (!hash->next)
+       break;
+    }
+
+  /* A new charset has to be created.  */
+
+  if (number_of_charsets == MAX_CHARSETS)
+    error (EXIT_FAILURE, 0, "MAX_CHARSETS is too small");
+
+  charset = charset_array + number_of_charsets++;
+
+  /* If the current slot is already used, create an overflow entry and
+     initialize it enough so it could be taken for the current slot.  */
+
+  if (hash->name)
+    {
+      hash->next = (struct hash *) xmalloc (sizeof (struct hash));
+      hash = hash->next;
+      hash->next = NULL;
+    }
+
+  /* Initialize the current slot with the new charset.  */
+
+  hash->name = hashname;
+  hash->charset = charset;
+
+  charset->name = name;
+  charset->ignore = 0;
+  charset->table = NULL;
+
+  return charset;
+}
+
+/*-------------------------------------------------------------------------.
+| Have NAME as an alternate charset name for OLD_NAME.  Create OLD_NAME if |
+| it does not exist already.                                              |
+`-------------------------------------------------------------------------*/
+
+void
+declare_alias (const char *name, const char *old_name)
+{
+  char *hashname;
+  struct hash *hash;
+  CHARSET *old_charset;
+
+  /* Find the old value.  */
+
+  old_charset = find_charset (old_name);
+
+  /* Search the whole hash bucket.  */
+
+  hashname = cleanup_charset_name (name);
+  for (hash = hash_table + hash_string (hashname);
+       hash->name;
+       hash = hash->next)
+    {
+      if (strcmp (hashname, hash->name) == 0)
+       {
+         if (hash->charset != old_charset)
+           error (EXIT_FAILURE, 0, "Charset %s already exists and is not %s",
+                  name, old_name);
+         free (hashname);
+         return;
+       }
+      if (!hash->next)
+       break;
+    }
+
+  /* If the current slot is already used, create an overflow entry and
+     initialize it enough so it could be taken for the current slot.  */
+
+  if (hash->name)
+    {
+      hash->next = (struct hash *) xmalloc (sizeof (struct hash));
+      hash = hash->next;
+      hash->next = NULL;
+    }
+
+  /* Initialize the current slot with the old charset.  */
+
+  hash->name = hashname;
+  hash->charset = old_charset;
+}
+
+/*------------------------------------------.
+| Construct the string array for argmatch.  |
+`------------------------------------------*/
+
+void
+make_argmatch_array (void)
+{
+  struct hash *hash;           /* cursor in charsets */
+  int number;                  /* number of strings */
+  int counter;                 /* all purpose counter */
+#ifdef HASH_STATS
+  int buckets;                 /* number of non-empty buckets */
+#endif
+
+  /* Count how many strings we need.  */
+
+  number = 0;
+  for (counter = 0; counter < HASH_TABLE_SIZE; counter++)
+    for (hash = hash_table + counter;
+        hash && hash->name;
+        hash = hash->next)
+      number++;
+
+#ifdef HASH_STATS
+  buckets = 0;
+  for (counter = 0; counter < HASH_TABLE_SIZE; counter++)
+    if (hash_table[counter].name)
+      buckets++;
+
+  fprintf (stderr, "Hash stats: %d names using %d buckets out of %d\n",
+          number, buckets, HASH_TABLE_SIZE);
+#endif
+
+  /* Allocate the argmatch array, with place for a NULL sentinel.  */
+
+  argmatch_array
+    = (const char **) xmalloc ((number + 1) * sizeof (const char *));
+
+  /* Fill in the array.  */
+
+  number = 0;
+  for (counter = 0; counter < HASH_TABLE_SIZE; counter++)
+    for (hash = hash_table + counter;
+        hash && hash->name;
+        hash = hash->next)
+      argmatch_array[number++] = hash->name;
+
+  argmatch_array[number] = NULL;
+}
+
+/*-----------------------------------------------------------------------.
+| Return the NAME of a charset, un-abbreviated and cleaned up.  Diagnose |
+| and abort if this cannot be done successfully.  A NULL or empty string |
+| means the default charset, if this default charset is defined.        |
+`-----------------------------------------------------------------------*/
+
+const char *
+clean_charset_name (const char *name)
+{
+  char *hashname;
+  int ordinal;
+
+  /* Look for a match.  */
+
+  if (!name)
+    name = "";
+#ifdef DEFAULT_CHARSET
+  if (!*name)
+    name = DEFAULT_CHARSET;
+#endif
+  hashname = cleanup_charset_name (name);
+  ordinal = argmatch (hashname, argmatch_array);
+  free (hashname);
+
+  /* Diagnose any match error, notifying usage that we are decoding
+     charsets.  */
+
+  switch (ordinal)
+    {
+    case -2:
+      error (0, 0, "Ambiguous charset `%s'", name);
+      decoding_charset_flag = 1;
+      usage (EXIT_FAILURE);
+
+    case -1:
+      error (0, 0, "Unknown charset `%s'", name);
+      decoding_charset_flag = 1;
+      usage (EXIT_FAILURE);
+    }
+
+  return argmatch_array[ordinal];
+}
+
+/*----------------------------------------------------------------------.
+| Order two struct hash's, using the true charset name as the first key |
+| and the current name as the second key.                              |
+`----------------------------------------------------------------------*/
+
+static int
+compare_struct_hash (const void *void_first, const void *void_second)
+{
+  int value;
+
+  value = strcmp (((const struct hash *) void_first)->charset->name,
+                 ((const struct hash *) void_second)->charset->name);
+  if (value != 0)
+    return value;
+  
+  value = strcmp (((const struct hash *) void_first)->name,
+                 ((const struct hash *) void_second)->name);
+  return value;
+}
+
+/*-----------------------------------------------------------------------.
+| List all available charsets, obeying restrictions for an AFTER charset |
+| if any.                                                               |
+`-----------------------------------------------------------------------*/
+
+void
+list_all_charsets (CHARSET *after)
+{
+  struct hash *array;
+  struct hash *hash;
+  int number;
+  int counter;
+  int list_flag;
+
+  /* Count how many charsets we have.  */
+
+  number = 0;
+  for (counter = 0; counter < HASH_TABLE_SIZE; counter++)
+    for (hash = hash_table + counter;
+        hash && hash->name;
+        hash = hash->next)
+      number++;
+
+  /* Allocate a structure to hold them.  */
+
+  array = (struct hash *) xmalloc (number * sizeof (struct hash));
+
+  /* Copy all charsets in it.  */
+
+  number = 0;
+  for (counter = 0; counter < HASH_TABLE_SIZE; counter++)
+    for (hash = hash_table + counter;
+        hash && hash->name;
+        hash = hash->next)
+      array[number++] = *hash;
+
+  /* Sort it.  */
+
+  qsort (array, number, sizeof (struct hash), compare_struct_hash);
+
+  /* Print it, one line per charset, giving the true charset name first,
+     followed by all its alias in lexicographic order.  */
+
+  for (hash = array; hash < array + number; hash++)
+    {
+
+      /* Begin a new line with the true charset name when it changes.  */
+
+      if (hash == array || hash->charset->name != (hash - 1)->charset->name)
+       {
+         if (list_flag && hash != array)
+           printf ("\n");
+
+         list_flag = !after || !check_restricted (hash->charset, after);
+
+         if (list_flag)
+           printf ("%s", hash->charset->name);
+       }
+
+      /* Print the charset name or alias in its cleaned up form.  */
+
+      if (list_flag)
+       printf (" %s", hash->name);
+    }
+  if (list_flag)
+    printf ("\n");
+
+  /* Release the work array.  */
+
+  free (array);
+}
+\f
+/* Charset contents.  */
+
+/*-----------------------------------------------------------------------.
+| For a given STEP recoding into a RFC 1345 charset, produce an explicit |
+| recoding table.                                                       |
+`-----------------------------------------------------------------------*/
+
+void
+init_table_for_rfc1345 (STEP *step)
+{
+  const char *symbol;
+  char *pool;
+  const char **table;
+  int length;
+  int counter;
+
+  /* First compute how much memory is needed.  */
+
+  length = 0;
+  for (counter = 0; counter < 256; counter++)
+    {
+      symbol = code_to_symbol (step->before, counter);
+      if (symbol)
+       length += strlen (symbol) + 1;
+    }
+
+  /* Do the actual allocation and filling.  */
+
+  table = (const char **) xmalloc (256 * sizeof (char *) + length);
+  pool = (char *) (table + 256);
+
+  for (counter = 0; counter < 256; counter++)
+    {
+      symbol = code_to_symbol (step->before, counter);
+      if (symbol)
+       {
+         if (strcmp (symbol, "SP") == 0)
+           symbol = " ";
+         else if (strcmp (symbol, "LF") == 0)
+           symbol = "\n";
+
+         table[counter] = pool;
+         while (*pool++ = *symbol++)
+           ;
+       }
+      else
+       table[counter] = NULL;
+    }
+
+  step->one_to_many = table;
+}
+
+/*------------------------------------------------------------------.
+| Print a concise, tabular CHARSET description on standard output.  |
+`------------------------------------------------------------------*/
+
+void
+list_concise_charset (CHARSET *charset)
+{
+  DOUBLE_TABLE *table;         /* double table */
+  int half;                    /* half 0, half 1 of the table */
+  const char *format;          /* format string */
+  int counter;                 /* code counter */
+  int counter2;                        /* code counter */
+  int code;                    /* code value */
+
+  /* Ensure we have a double table to play with.  */
+
+  if (charset->table)
+    table = charset->table;
+  else
+    error (EXIT_FAILURE, 0,
+          "Cannot list `%s', no 10646 names available for this charset",
+          charset->name);
+
+  printf ("%s\n", charset->name);
+
+  /* Select format for numbers.  */
+
+  switch (list_format)
+    {
+    default:
+      return;                  /* cannot happen */
+
+    case NO_FORMAT:
+    case DECIMAL_FORMAT:
+      format = "%3d";
+      break;
+
+    case OCTAL_FORMAT:
+      format = "%0.3o";
+      break;
+
+    case HEXADECIMAL_FORMAT:
+      format = "%0.2x";
+      break;
+    }
+
+  /* Print both halves of the table.  */
+
+  for (half = 0; half < 2; half++)
+    {
+
+      /* Skip printing this half if it is empty.  */
+
+      for (counter = 4 * half; counter < 4 * half + 4; counter++)
+       if ((*table)[counter])
+         break;
+      if (counter == 4 * half + 4)
+       continue;
+
+      /* Print this half.  */
+
+      printf ("\n");
+      for (counter = 128 * half; counter < 128 * half + 16; counter++)
+       for (counter2 = 0; counter2 < 128; counter2 += 16)
+         {
+           if (counter2 > 0)
+             printf ("  ");
+
+           code = counter + counter2;
+           printf (format, code);
+           printf (" ");
+           print_symbol (charset, code);
+
+           if (counter2 == 112)
+             printf ("\n");
+         }
+    }
+}
+
+/*------------------------------------------------------.
+| Print a full CHARSET description on standard output.  |
+`------------------------------------------------------*/
+
+void
+list_full_charset (CHARSET *charset)
+{
+  int insert_white;            /* insert a while line before printing */
+  int code;                    /* code counter */
+  const char *symbol;          /* symbol for code */
+  const char *charname;                /* charname for code */
+
+  /* Ensure we have a double table to play with.  */
+
+  if (!charset->table)
+    error (EXIT_FAILURE, 0,
+          "Sorry, no 10646 names available for `%s'", charset->name);
+
+  /* Print the long table.  */
+
+  printf ("dec  oct hex    ch   %s\n", charset->name);
+  insert_white = 1;
+
+  for (code = 0; code < 256; code++)
+    if ((symbol = code_to_symbol (charset, code)), symbol)
+      {
+       if (insert_white)
+         {
+           printf ("\n");
+           insert_white = 0;
+         }
+       printf ("%3d  %0.3o  %0.2x    ", code, code, code);
+       print_symbol (charset, code);
+       if ((charname = symbol_to_charname (symbol)), charname)
+         printf ("   %s", charname);
+       printf ("\n");
+      }
+    else
+      insert_white = 1;
+}
diff --git a/charset.pl b/charset.pl
new file mode 100644 (file)
index 0000000..a7ebc7d
--- /dev/null
@@ -0,0 +1,314 @@
+# Automatically derive charset.c from rfc1345.txt.
+# Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$overall_header = <<END_OF_TEXT;
+/* DO NOT MODIFY THIS FILE!  It was generated by "charset.pl".  */
+
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+END_OF_TEXT
+
+$split_point = 80;
+
+$charset_ordinal = 0;
+$discard_charset = 0;
+$alias_count = 0;
+
+$header = "";
+
+while (<>)
+{
+
+    # Recognize `&charset'.
+
+    if (/^&charset (.*)/)
+    {
+
+       # Before beginning a new charset, process the previous one.
+
+       $next_charset = $1;
+
+       &complete_charset;
+
+       $charset = $next_charset;
+
+       # Save the charset name for further declaration.  Announce
+       # this charset in the array initialization section, and
+       # initialize its processing.
+
+       print STDERR $charset, "...";
+
+       $header = "\n/* $charset\n";
+
+       $hashname = $charset;
+       $hashname =~ tr/A-Z/a-z/;
+       $hashname =~ s/[^a-z0-9]//g;
+       if ($used{$hashname})
+       {
+           printf STDERR " duplicate of %s...", $used{$hashname};
+           $discard_charset = 1;
+           next;
+       }
+       $used{$hashname} = $charset;
+
+       $alias_count = 0;
+       @table = ();
+       $codedim = 0;
+       $code = 0;
+       $list = "";
+       $body = "";
+       next;
+    }
+
+    # Ignore discarded charsets, and character set escapes.
+
+    next if $discard_charset;
+    next if /^&g[0-4]esc/;
+
+    # Recognize other `&' directives.
+
+    if (/^&rem (.*)/)
+    {
+
+       # Save C comments for Texinfo.
+
+       $body .= "$1\n";
+       next;
+    }
+    if (/^&alias (.*)/)
+    {
+
+       # Save synonymous charset names for later declarations.
+
+       $alias = $1;
+       $header .= "   $alias\n";
+
+       $hashname = $alias;
+       $hashname =~ tr/A-Z/a-z/;
+       $hashname =~ s/[^a-z0-9]//g;
+       if ($used{$hashname} && $used{$hashname} ne $charset)
+       {
+           printf STDERR " duplicate of %s...", $used{$hashname};
+           next;
+       }
+       $used{$hashname} = $charset;
+
+       $list .= "," if $list;
+       $list .= $alias;
+       push (@declare_alias, "$alias,$charset");
+       $alias_count++;
+       next;
+    }
+    if (/^&code (.*)/)
+    {
+
+       # Save the code position.
+
+       $code = $1;
+       next;
+    }
+    if (/^&duplicate/)
+    {
+
+       # Ignore duplicates for now.
+
+       next;
+    }
+    if (/^&([^ ]+)/)
+    {
+
+       # This is an unrecognized & line, discard the charset.
+
+       print STDERR " &$1...";
+       $discard_charset = 1;
+       next;
+    }
+
+    # Save all other tokens into the double table.
+
+    foreach $token (split)
+    {
+       if ($token ne "??" && $token ne "__")
+       {
+           $table[$code] = $token;
+           if (length ($token) > $codedim)
+           {
+               $codedim = length ($token);
+           }
+       }
+       $code++;
+    }
+}
+
+# Process the last accumulated charset.
+
+&complete_charset;
+&complete_file (2);
+
+# Print the documentation.
+
+open (TEXI, ">charset.texi");
+for $charset (sort keys %body)
+{
+    print TEXI "\n@item $charset\n";
+    @list = sort (split (/,/, $list{$charset}));
+    if (@list == 1)
+    {
+       print TEXI "@code{", $list[0], "} is an alias for this charset.\n";
+    }
+    elsif (@list > 0)
+    {
+       $string = "@code{" . join ("}, @code{", @list) . "}";
+       $string =~ s/,([^,]+)$/ and\1/;
+       print TEXI $string, " are aliases for this charset. \n";
+    }
+    print TEXI $body{$charset};
+}
+close TEXI;
+
+exit 0;
+
+# Routine for printing all accumulated initialization information, and
+# then closing the file.  Argument is 1 or 2 depending on output file.
+
+sub complete_file
+{
+
+    # Print the collectable initialization function.
+
+    print SRC "\n";
+    print SRC "void\n";
+    printf SRC "module_charset%d (void)\n", $_[0];
+    print SRC "{\n";
+    $counter = $_[0] == 1 ? 0 : $split_point;
+    while ($string = shift @declare_charset)
+    {
+       $string =~ s/(.*),/"\1", /;
+       print SRC "  declare_double_step (&table_$counter, $string);\n";
+       $counter++;
+    }
+    print SRC "\n";
+    while ($string = shift @declare_alias)
+    {
+       $string =~ s/,/", "/;
+       print SRC "  declare_alias (\"$string\");\n";
+    }
+    print SRC "}\n";
+    close SRC;
+}
+
+# Routine for printing all accumulated information for the charset.
+# If the charset should be discarded, adjust tables.
+
+sub complete_charset
+{
+    if ($discard_charset)
+    {
+       while ($alias_count-- > 0)
+       {
+           pop @declare_alias;
+       }
+       $discard_charset = 0;
+       print STDERR " DISCARDED\n";
+    }
+    elsif ($header)
+    {
+
+       # Save the documentation.
+
+       $list{$charset} = $list;
+       $body{$charset} = $body;
+
+       # Open a new source file if needed.
+
+       if ($charset_ordinal == 0)
+       {
+           print STDERR " writing on charset1.c...";
+           open (SRC, ">charset1.c");
+           print SRC $overall_header;
+       }
+       elsif ($charset_ordinal == $split_point)
+       {
+           &complete_file (1);
+           
+           print STDERR " writing on charset2.c...";
+           open (SRC, ">charset2.c");
+           print SRC $overall_header;
+       }
+
+       # Make introductory C comments.
+
+       print SRC $header;
+       print SRC "*/\n";
+
+       # Make the table for this charset.
+
+       print SRC "\n";
+       print SRC "static DOUBLE_TABLE table_$charset_ordinal = \n";
+       print SRC "  {\n";
+       $code = 0;
+       for ($index1 = 0; $index1 < 8; $index1++)
+       {
+           $header = "";
+           $flag = 0;
+           for ($index2 = 0; $index2 < 32; $index2++)
+           {
+               $token = $table[$code++];
+               $flag = 1 if $token;
+               $token .= " " while length ($token) < $codedim;
+               $header .= $token;
+           }
+           if ($flag)
+           {
+               $header =~ s/\"/\\\"/g;
+               print SRC "    \"", $header, "\",\n";
+           }
+           else
+           {
+               print SRC "    NULL,\n";
+           }
+       }
+       print SRC "  };\n";
+
+       # Register the table.
+
+       push (@declare_charset, "$charset,$codedim");
+
+       print STDERR " done\n";
+       $charset_ordinal++;
+    }
+    $header = "";
+}
diff --git a/charset.sed b/charset.sed
new file mode 100644 (file)
index 0000000..b3214b0
--- /dev/null
@@ -0,0 +1,5 @@
+1,/^5\.  CHARSET TABLES$/d
+/^Simonsen/,/^RFC 1345/d
+/^ACKNOWLEDGEMENTS$/q
+/^$/d
+s/^  //p
diff --git a/charset.texi b/charset.texi
new file mode 100644 (file)
index 0000000..def415f
--- /dev/null
@@ -0,0 +1,516 @@
+
+@item ANSI_X3.4-1968
+@code{ANSI_X3.4-1986}, @code{ASCII}, @code{IBM367}, @code{ISO646-US}, @code{ISO_646.irv:1991}, @code{US-ASCII}, @code{cp367}, @code{iso-ir-6} and @code{us} are aliases for this charset. 
+source: ECMA registry
+
+@item ASMO_449
+@code{ISO_9036}, @code{arabic7} and @code{iso-ir-89} are aliases for this charset. 
+source: ECMA registry
+
+@item BS_4730
+@code{ISO646-GB}, @code{gb}, @code{iso-ir-4} and @code{uk} are aliases for this charset. 
+source: ECMA registry
+
+@item BS_viewdata
+@code{iso-ir-47} is an alias for this charset.
+source: ECMA registry
+
+@item CSA_Z243.4-1985-1
+@code{ISO646-CA}, @code{ca}, @code{csa7-1} and @code{iso-ir-121} are aliases for this charset. 
+source: ECMA registry
+
+@item CSA_Z243.4-1985-2
+@code{ISO646-CA2}, @code{csa7-2} and @code{iso-ir-122} are aliases for this charset. 
+source: ECMA registry
+
+@item CSA_Z243.4-1985-gr
+@code{iso-ir-123} is an alias for this charset.
+source: ECMA registry
+
+@item CSN_369103
+@code{iso-ir-139} is an alias for this charset.
+source: ECMA registry
+
+@item DEC-MCS
+@code{dec} is an alias for this charset.
+VAX/VMS User's Manual, Order Number: AI-Y517A-TE, April 1986.
+
+@item DIN_66003
+@code{ISO646-DE}, @code{de} and @code{iso-ir-21} are aliases for this charset. 
+source: ECMA registry
+
+@item DS_2089
+@code{DS2089}, @code{ISO646-DK} and @code{dk} are aliases for this charset. 
+source: Danish Standard, DS 2089, February 1974
+
+@item EBCDIC-AT-DE
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-AT-DE-A
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-CA-FR
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-DK-NO
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-DK-NO-A
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-ES
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-ES-A
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-ES-S
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-FI-SE
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-FI-SE-A
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-FR
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-IT
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-PT
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-UK
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item EBCDIC-US
+source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+@item ECMA-cyrillic
+@code{iso-ir-111} is an alias for this charset.
+source: ECMA registry
+
+@item ES
+@code{ISO646-ES} and @code{iso-ir-17} are aliases for this charset. 
+source: ECMA registry
+
+@item ES2
+@code{ISO646-ES2} and @code{iso-ir-85} are aliases for this charset. 
+source: ECMA registry
+
+@item GB_1988-80
+@code{ISO646-CN}, @code{cn} and @code{iso-ir-57} are aliases for this charset. 
+source: ECMA registry
+
+@item GOST_19768-74
+@code{ST_SEV_358-88} and @code{iso-ir-153} are aliases for this charset. 
+source: ECMA registry
+
+@item IBM037
+@code{cp037}, @code{ebcdic-cp-ca}, @code{ebcdic-cp-nl}, @code{ebcdic-cp-us} and @code{ebcdic-cp-wt} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM038
+@code{EBCDIC-INT} and @code{cp038} are aliases for this charset. 
+source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+@item IBM1026
+@code{CP1026} is an alias for this charset.
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM273
+@code{CP273} is an alias for this charset.
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM274
+@code{CP274} and @code{EBCDIC-BE} are aliases for this charset. 
+source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+@item IBM275
+@code{EBCDIC-BR} and @code{cp275} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM277
+@code{EBCDIC-CP-DK} and @code{EBCDIC-CP-NO} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM278
+@code{CP278}, @code{ebcdic-cp-fi} and @code{ebcdic-cp-se} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM280
+@code{CP280} and @code{ebcdic-cp-it} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM281
+@code{EBCDIC-JP-E} and @code{cp281} are aliases for this charset. 
+source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+@item IBM284
+@code{CP284} and @code{ebcdic-cp-es} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM285
+@code{CP285} and @code{ebcdic-cp-gb} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM290
+@code{EBCDIC-JP-kana} and @code{cp290} are aliases for this charset. 
+source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+@item IBM297
+@code{cp297} and @code{ebcdic-cp-fr} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM420
+@code{cp420} and @code{ebcdic-cp-ar1} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+IBM NLS RM p 11-11
+
+@item IBM423
+@code{cp423} and @code{ebcdic-cp-gr} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM424
+@code{cp424} and @code{ebcdic-cp-he} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM437
+@code{437} and @code{cp437} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM500
+@code{CP500}, @code{ebcdic-cp-be} and @code{ebcdic-cp-ch} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM850
+@code{850} and @code{cp850} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM851
+@code{851} and @code{cp851} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM852
+@code{852} and @code{cp852} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM855
+@code{855} and @code{cp855} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM857
+@code{857} and @code{cp857} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM860
+@code{860} and @code{cp860} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM861
+@code{861}, @code{cp-is} and @code{cp861} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM862
+@code{862} and @code{cp862} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM863
+@code{863} and @code{cp863} are aliases for this charset. 
+source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+
+@item IBM864
+@code{cp864} is an alias for this charset.
+source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+
+@item IBM865
+@code{865} and @code{cp865} are aliases for this charset. 
+source: IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)
+
+@item IBM868
+@code{CP868} and @code{cp-ar} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM869
+@code{869}, @code{cp-gr} and @code{cp869} are aliases for this charset. 
+source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+
+@item IBM870
+@code{CP870}, @code{ebcdic-cp-roece} and @code{ebcdic-cp-yu} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM871
+@code{CP871} and @code{ebcdic-cp-is} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM880
+@code{EBCDIC-Cyrillic} and @code{cp880} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM891
+@code{cp891} is an alias for this charset.
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM903
+@code{cp903} is an alias for this charset.
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM904
+@code{904} and @code{cp904} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IBM905
+@code{CP905} and @code{ebcdic-cp-tr} are aliases for this charset. 
+source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+@item IBM918
+@code{CP918} and @code{ebcdic-cp-ar2} are aliases for this charset. 
+source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+@item IEC_P27-1
+@code{iso-ir-143} is an alias for this charset.
+source: ECMA registry
+
+@item INIS
+@code{iso-ir-49} is an alias for this charset.
+source: ECMA registry
+
+@item INIS-8
+@code{iso-ir-50} is an alias for this charset.
+source: ECMA registry
+
+@item INIS-cyrillic
+@code{iso-ir-51} is an alias for this charset.
+source: ECMA registry
+
+@item INVARIANT
+
+@item ISO_10367-box
+@code{iso-ir-155} is an alias for this charset.
+source: ECMA registry
+
+@item ISO_2033-1983
+@code{e13b} and @code{iso-ir-98} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_5427
+@code{iso-ir-37} is an alias for this charset.
+source: ECMA registry
+
+@item ISO_5427:1981
+@code{iso-ir-54} is an alias for this charset.
+source: ECMA registry
+
+@item ISO_5428:1980
+@code{iso-ir-55} is an alias for this charset.
+source: ECMA registry
+
+@item ISO_646.basic:1983
+@code{ref} is an alias for this charset.
+source: ECMA registry
+
+@item ISO_646.irv:1983
+@code{irv} and @code{iso-ir-2} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_6937-2-25
+@code{iso-ir-152} is an alias for this charset.
+source: ECMA registry
+
+@item ISO_8859-1:1987
+@code{CP819}, @code{IBM819}, @code{ISO-8859-1}, @code{ISO_8859-1}, @code{iso-ir-100}, @code{l1} and @code{latin1} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-2:1987
+@code{ISO-8859-2}, @code{ISO_8859-2}, @code{iso-ir-101}, @code{l2} and @code{latin2} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-3:1988
+@code{ISO-8859-3}, @code{ISO_8859-3}, @code{iso-ir-109}, @code{l3} and @code{latin3} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-4:1988
+@code{ISO-8859-4}, @code{ISO_8859-4}, @code{iso-ir-110}, @code{l4} and @code{latin4} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-5:1988
+@code{ISO-8859-5}, @code{ISO_8859-5}, @code{cyrillic} and @code{iso-ir-144} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-6:1987
+@code{ASMO-708}, @code{ECMA-114}, @code{ISO-8859-6}, @code{ISO_8859-6}, @code{arabic} and @code{iso-ir-127} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-7:1987
+@code{ECMA-118}, @code{ELOT_928}, @code{ISO-8859-7}, @code{ISO_8859-7}, @code{greek}, @code{greek8} and @code{iso-ir-126} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-8:1988
+@code{ISO-8859-8}, @code{ISO_8859-8}, @code{hebrew} and @code{iso-ir-138} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-9:1989
+@code{ISO-8859-9}, @code{ISO_8859-9}, @code{iso-ir-148}, @code{l5} and @code{latin5} are aliases for this charset. 
+source: ECMA registry
+
+@item ISO_8859-supp
+@code{iso-ir-154} and @code{latin1-2-5} are aliases for this charset. 
+source: ECMA registry
+
+@item IT
+@code{ISO646-IT} and @code{iso-ir-15} are aliases for this charset. 
+source: ECMA registry
+
+@item JIS_C6220-1969-jp
+@code{JIS_C6220-1969}, @code{iso-ir-13}, @code{katakana} and @code{x0201-7} are aliases for this charset. 
+source: ECMA registry
+
+@item JIS_C6220-1969-ro
+@code{ISO646-JP}, @code{iso-ir-14} and @code{jp} are aliases for this charset. 
+source: ECMA registry
+
+@item JIS_C6229-1984-a
+@code{jp-ocr-a} is an alias for this charset.
+source: ECMA registry
+
+@item JIS_C6229-1984-b
+@code{ISO646-JP-OCR-B} and @code{jp-ocr-b} are aliases for this charset. 
+source: ECMA registry
+
+@item JIS_C6229-1984-b-add
+@code{iso-ir-93} and @code{jp-ocr-b-add} are aliases for this charset. 
+source: ECMA registry
+
+@item JIS_C6229-1984-hand
+@code{iso-ir-94} and @code{jp-ocr-hand} are aliases for this charset. 
+source: ECMA registry
+
+@item JIS_C6229-1984-hand-add
+@code{iso-ir-95} and @code{jp-ocr-hand-add} are aliases for this charset. 
+source: ECMA registry
+
+@item JIS_C6229-1984-kana
+@code{iso-ir-96} is an alias for this charset.
+source: ECMA registry
+
+@item JIS_X0201
+@code{X0201} is an alias for this charset.
+
+@item JUS_I.B1.002
+@code{ISO646-YU}, @code{iso-ir-141}, @code{js} and @code{yu} are aliases for this charset. 
+source: ECMA registry
+
+@item JUS_I.B1.003-mac
+@code{iso-ir-147} and @code{macedonian} are aliases for this charset. 
+source: ECMA registry
+
+@item JUS_I.B1.003-serb
+@code{iso-ir-146} and @code{serbian} are aliases for this charset. 
+source: ECMA registry
+
+@item KSC5636
+@code{ISO646-KR} is an alias for this charset.
+
+@item Latin-greek-1
+@code{iso-ir-27} is an alias for this charset.
+source: ECMA registry
+
+@item MSZ_7795.3
+@code{ISO646-HU}, @code{hu} and @code{iso-ir-86} are aliases for this charset. 
+source: ECMA registry
+
+@item NATS-DANO
+@code{iso-ir-9-1} is an alias for this charset.
+source: ECMA registry
+
+@item NATS-DANO-ADD
+@code{iso-ir-9-2} is an alias for this charset.
+source: ECMA registry
+
+@item NATS-SEFI
+@code{iso-ir-8-1} is an alias for this charset.
+source: ECMA registry
+
+@item NATS-SEFI-ADD
+@code{iso-ir-8-2} is an alias for this charset.
+source: ECMA registry
+
+@item NC_NC00-10:81
+@code{ISO646-CU}, @code{cuba} and @code{iso-ir-151} are aliases for this charset. 
+source: ECMA registry
+
+@item NF_Z_62-010
+@code{ISO646-FR}, @code{fr} and @code{iso-ir-69} are aliases for this charset. 
+source: ECMA registry
+
+@item NF_Z_62-010_(1973)
+@code{ISO646-FR1} and @code{iso-ir-25} are aliases for this charset. 
+source: ECMA registry
+
+@item NS_4551-1
+@code{ISO646-NO}, @code{iso-ir-60} and @code{no} are aliases for this charset. 
+source: ECMA registry
+
+@item NS_4551-2
+@code{ISO646-NO2}, @code{iso-ir-61} and @code{no2} are aliases for this charset. 
+source: ECMA registry
+
+@item PT
+@code{ISO646-PT} and @code{iso-ir-16} are aliases for this charset. 
+source: ECMA registry
+
+@item PT2
+@code{ISO646-PT2} and @code{iso-ir-84} are aliases for this charset. 
+source: ECMA registry
+
+@item SEN_850200_B
+@code{FI}, @code{ISO646-FI}, @code{ISO646-SE}, @code{iso-ir-10} and @code{se} are aliases for this charset. 
+source: ECMA registry
+
+@item SEN_850200_C
+@code{ISO646-SE2}, @code{iso-ir-11} and @code{se2} are aliases for this charset. 
+source: ECMA registry
+
+@item T.61-7bit
+@code{iso-ir-102} is an alias for this charset.
+source: ECMA registry
+
+@item dk-us
+
+@item greek-ccitt
+@code{iso-ir-150} is an alias for this charset.
+source: ECMA registry
+
+@item greek7
+@code{iso-ir-88} is an alias for this charset.
+source: ECMA registry
+
+@item greek7-old
+@code{iso-ir-18} is an alias for this charset.
+source: ECMA registry
+
+@item hp-roman8
+@code{r8} and @code{roman8} are aliases for this charset. 
+source: LaserJet IIP Printer User's Manual,
+HP part no 33471-90901, Hewlet-Packard, June 1989.
+
+@item latin-greek
+@code{iso-ir-19} is an alias for this charset.
+source: ECMA registry
+
+@item latin-lap
+@code{iso-ir-158} and @code{lap} are aliases for this charset. 
+source: ECMA registry
+
+@item latin6
+@code{iso-ir-157} and @code{l6} are aliases for this charset. 
+source: ECMA registry
+
+@item macintosh
+@code{mac} is an alias for this charset.
+source: The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991
+
+@item us-dk
+for compatibility with ASCII
diff --git a/charset1.c b/charset1.c
new file mode 100644 (file)
index 0000000..f9029eb
--- /dev/null
@@ -0,0 +1,1686 @@
+/* DO NOT MODIFY THIS FILE!  It was generated by "charset.pl".  */
+
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+/* ISO_646.basic:1983
+   ref
+*/
+
+static DOUBLE_TABLE table_0 = 
+  {
+    NULL,
+    "SP! \"     % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z         _ ",
+    "  a b c d e f g h i j k l m n o p q r s t u v w x y z           ",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* INVARIANT
+*/
+
+static DOUBLE_TABLE table_1 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \"     % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z         _ ",
+    "  a b c d e f g h i j k l m n o p q r s t u v w x y z         DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_646.irv:1983
+   iso-ir-2
+   irv
+*/
+
+static DOUBLE_TABLE table_2 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* BS_4730
+   iso-ir-4
+   ISO646-GB
+   gb
+   uk
+*/
+
+static DOUBLE_TABLE table_3 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ANSI_X3.4-1968
+   iso-ir-6
+   ANSI_X3.4-1986
+   ISO_646.irv:1991
+   ASCII
+   ISO646-US
+   US-ASCII
+   us
+   IBM367
+   cp367
+*/
+
+static DOUBLE_TABLE table_4 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NATS-SEFI
+   iso-ir-8-1
+*/
+
+static DOUBLE_TABLE table_5 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "UAA B C D E F G H I J K L M N O P Q R S T U V W X Y Z A:O:AAfS_ ",
+    "UBa b c d e f g h i j k l m n o p q r s t u v w x y z a:o:aa-NDT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NATS-SEFI-ADD
+   iso-ir-8-2
+*/
+
+static DOUBLE_TABLE table_6 = 
+  {
+    NULL,
+    NULL,
+    "  A!    D/E'                    TH        U:          AEO/      ",
+    "  a!    d/e'                    th        u:          aeo/      ",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NATS-DANO
+   iso-ir-9-1
+*/
+
+static DOUBLE_TABLE table_7 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! <<>>DO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "UAA B C D E F G H I J K L M N O P Q R S T U V W X Y Z AEO/AAfS_ ",
+    "UBa b c d e f g h i j k l m n o p q r s t u v w x y z aeo/aa-NDT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NATS-DANO-ADD
+   iso-ir-9-2
+*/
+
+static DOUBLE_TABLE table_8 = 
+  {
+    NULL,
+    NULL,
+    "  A!    D/E'                    TH        U:          A:O:      ",
+    "  a!    d/e'                    th        u:          a:o:      ",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* SEN_850200_B
+   iso-ir-10
+   FI
+   ISO646-FI
+   ISO646-SE
+   se
+*/
+
+static DOUBLE_TABLE table_9 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z A:O:AA'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z a:o:aa'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* SEN_850200_C
+   iso-ir-11
+   ISO646-SE2
+   se2
+*/
+
+static DOUBLE_TABLE table_10 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "E'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A:O:AAU:_ ",
+    "e'a b c d e f g h i j k l m n o p q r s t u v w x y z a:o:aau:DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6220-1969-jp
+   JIS_C6220-1969
+   iso-ir-13
+   katakana
+   x0201-7
+*/
+
+static DOUBLE_TABLE table_11 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP._<'>',_.6Woa6i6u6e6o6YAYUYOTU-6A6I6U6E6O6KaKiKuKeKoSaSiSuSeSo",
+    "TaTiTuTeToNaNiNuNeNoHaHiHuHeHoMaMiMuMeMoYaYuYoRaRiRuReRoWaN6\"505",
+    "                                                              DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6220-1969-ro
+   iso-ir-14
+   jp
+   ISO646-JP
+*/
+
+static DOUBLE_TABLE table_12 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(Ye)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* IT
+   iso-ir-15
+   ISO646-IT
+*/
+
+static DOUBLE_TABLE table_13 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "SEA B C D E F G H I J K L M N O P Q R S T U V W X Y Z DGc,e''>_ ",
+    "u!a b c d e f g h i j k l m n o p q r s t u v w x y z a!o!e!i!DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* PT
+   iso-ir-16
+   ISO646-PT
+*/
+
+static DOUBLE_TABLE table_14 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "SEA B C D E F G H I J K L M N O P Q R S T U V W X Y Z A?C,O?'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z a?c,o?DGDT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ES
+   iso-ir-17
+   ISO646-ES
+*/
+
+static DOUBLE_TABLE table_15 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "SEA B C D E F G H I J K L M N O P Q R S T U V W X Y Z !IN??I'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z DGn?c,'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* greek7-old
+   iso-ir-18
+*/
+
+static DOUBLE_TABLE table_16 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "''a*b*q*d*e*f*g*y*i*c*k*l*m*n*o*p*j3r*s*t*h*w**sx*u*z*?,,,,''?_ ",
+    "'!A*B*Q*D*E*F*G*Y*I*C*K*L*M*N*O*P*  R*S*T*H*W*.MX*U*Z*?;;;;'':DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* latin-greek
+   iso-ir-19
+*/
+
+static DOUBLE_TABLE table_17 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!A*B*Q*D*E*F*G*Y*I*C*K*L*M*N*O*P*  R*S*T*H*W*.MX*U*Z*(!!!!)':DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* DIN_66003
+   iso-ir-21
+   de
+   ISO646-DE
+*/
+
+static DOUBLE_TABLE table_18 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "SEA B C D E F G H I J K L M N O P Q R S T U V W X Y Z A:O:U:'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z a:o:u:ssDT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NF_Z_62-010_(1973)
+   iso-ir-25
+   ISO646-FR1
+*/
+
+static DOUBLE_TABLE table_19 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "a!A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DGc,SE'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z e'u!e!':DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* Latin-greek-1
+   iso-ir-27
+*/
+
+static DOUBLE_TABLE table_20 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SPC*\" G*Cu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 Q*; < = > P*",
+    "D*A B C D E F G H I J K L M N O P Q R S T U V W X Y Z W*H*F*L*S*",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_5427
+   iso-ir-37
+*/
+
+static DOUBLE_TABLE table_21 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "jua=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=jar=s=t=u=z%v=%'y=z=s%jescc%='",
+    "JUA=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=JAR=S=T=U=Z%V=%\"Y=Z=S%JEScC%DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* BS_viewdata
+   iso-ir-47
+*/
+
+static DOUBLE_TABLE table_22 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <-12->-!OS",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z 14PP34-:DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* INIS
+   iso-ir-49
+*/
+
+static DOUBLE_TABLE table_23 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP      DO%   ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = >   ",
+    "  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(  )>    ",
+    "  a b c d e f g h i j k l m n o p q r s t u v w x y z   !!    DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* INIS-8
+   iso-ir-50
+*/
+
+static DOUBLE_TABLE table_24 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP                                                  a*b*g*d*C*  ",
+    "                                                            ->In",
+    "0S1S2S3S4S5S6S7S8S9S+S-SRuD*L*W*0s1s2s3s4s5s6s7s8s9sS*m*n*w*p*DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* INIS-cyrillic
+   iso-ir-51
+*/
+
+static DOUBLE_TABLE table_25 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP                      RT  ->Ina*b*g*d*S*m*n*w*p*C*D*L*W*=\"-S+S",
+    "jua=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=jar=s=t=u=z%v=%'y=z=s%jescc%='",
+    "JUA=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=JAR=S=T=U=Z%V=%\"Y=Z=S%JEScC%DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_5427:1981
+   iso-ir-54
+*/
+
+static DOUBLE_TABLE table_26 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP                                                              ",
+    "g3d%g%ieiodsiiyij%ljnjtskjv%dz  y3f3v3o3              <(  )>  _ ",
+    "G3D%G%IEIODSIIYIJ%LJNJTsKJV%DZ=\"Y3F3V3O3                      DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_5428:1980
+   iso-ir-55
+*/
+
+static DOUBLE_TABLE table_27 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP\"!\"'\":\"?\"p\"d\"i                <<>>\"9\"6'G,G          .M      ; ",
+    "  A*B*  G*D*E*T3M3Z*Y*H*I*K*L*M*N*C*O*P*K3R*S*  T*U*F*X*Q*W*P3  ",
+    "  a*b*b3g*d*e*t3m3z*y*h*i*k*l*m*n*c*o*p*k3r*s**st*u*f*x*q*w*p3DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* GB_1988-80
+   iso-ir-57
+   cn
+   ISO646-CN
+*/
+
+static DOUBLE_TABLE table_28 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbYe% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NS_4551-1
+   iso-ir-60
+   ISO646-NO
+   no
+*/
+
+static DOUBLE_TABLE table_29 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z AEO/AA'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z aeo/aa'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NS_4551-2
+   ISO646-NO2
+   iso-ir-61
+   no2
+*/
+
+static DOUBLE_TABLE table_30 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PIDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z AEO/AA'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z aeo/aa!!DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NF_Z_62-010
+   iso-ir-69
+   ISO646-FR
+   fr
+*/
+
+static DOUBLE_TABLE table_31 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "a!A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DGc,SE'>_ ",
+    "Mya b c d e f g h i j k l m n o p q r s t u v w x y z e'u!e!':DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* PT2
+   iso-ir-84
+   ISO646-PT2
+*/
+
+static DOUBLE_TABLE table_32 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "''A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A?C,O?'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z a?c,o?'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ES2
+   iso-ir-85
+   ISO646-ES2
+*/
+
+static DOUBLE_TABLE table_33 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "SbA B C D E F G H I J K L M N O P Q R S T U V W X Y Z !IN?C,?I_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z ''n?c,':DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* MSZ_7795.3
+   iso-ir-86
+   ISO646-HU
+   hu
+*/
+
+static DOUBLE_TABLE table_34 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "A'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z E'O:U:'>_ ",
+    "a'a b c d e f g h i j k l m n o p q r s t u v w x y z e'o:u:'\"DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* greek7
+   iso-ir-88
+*/
+
+static DOUBLE_TABLE table_35 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA*B*G*D*E*Z*Y*H*I*  K*L*M*N*C*O*P*R*S*T*U*F*  X*Q*W*<(//)>'>_ ",
+    "'!a*b*g*d*e*z*y*h*i*  k*l*m*n*c*o*p*r*s*t*u*f**sx*q*w*(!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ASMO_449
+   ISO_9036
+   arabic7
+   iso-ir-89
+*/
+
+static DOUBLE_TABLE table_36 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + ,+- . / 0 1 2 3 4 5 6 7 8 9 : ;+< = > ?+",
+    "AtH'aMaHwHahyHa+b+tmt+tkg+hkx+d+dkr+z+s+snc+ddtjzHe+i+<(//)>'>_ ",
+    "++f+q+k+l+m+n+h+w+j+y+:+\"+=+/+'+1+3+0+                (!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6229-1984-a
+   iso-ir-91
+   jp-ocr-a
+*/
+
+static DOUBLE_TABLE table_37 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP  \" PdDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; 1h= 3h? ",
+    "  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z   Ye2h'>_ ",
+    "                                                        4h    DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6229-1984-b
+   iso-ir-92
+   ISO646-JP-OCR-B
+   jp-ocr-b
+*/
+
+static DOUBLE_TABLE table_38 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z </Ye/>'>_ ",
+    "  a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)  DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6229-1984-b-add
+   iso-ir-93
+   jp-ocr-b-add
+*/
+
+static DOUBLE_TABLE table_39 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP    PdCu//  SE                                                ",
+    NULL,
+    "                                                              DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6229-1984-hand
+   iso-ir-94
+   jp-ocr-hand
+*/
+
+static DOUBLE_TABLE table_40 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z </Ye/>'>_ ",
+    "                                                        !!    DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6229-1984-hand-add
+   iso-ir-95
+   jp-ocr-hand-add
+*/
+
+static DOUBLE_TABLE table_41 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP        //                                                    ",
+    NULL,
+    "                                                              DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_C6229-1984-kana
+   iso-ir-96
+*/
+
+static DOUBLE_TABLE table_42 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP  <'>'    Wo                  -6A6I6U6E6O6KaKiKuKeKoSaSiSuSeSo",
+    "TaTiTuTeToNaNiNuNeNoHaHiHuHeHoMaMiMuMeMoYaYuYoRaRiRuReRoWaN6\"505",
+    "                                                              DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_2033-1983
+   iso-ir-98
+   e13b
+*/
+
+static DOUBLE_TABLE table_43 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP                              0 1 2 3 4 5 6 7 8 9 1j2j3j4j    ",
+    NULL,
+    "                                                              DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_8859-1:1987
+   iso-ir-100
+   ISO_8859-1
+   ISO-8859-1
+   latin1
+   l1
+   IBM819
+   CP819
+*/
+
+static DOUBLE_TABLE table_44 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS!ICtPdCuYeBBSE':Co-a<<NO--Rg'-DG+-2S3S''MyPI.M',1S-o>>141234?I",
+    "A!A'A>A?A:AAAEC,E!E'E>E:I!I'I>I:D-N?O!O'O>O?O:*XO/U!U'U>U:Y'THss",
+    "a!a'a>a?a:aaaec,e!e'e>e:i!i'i>i:d-n?o!o'o>o?o:-:o/u!u'u>u:y'thy:",
+  };
+
+/* ISO_8859-2:1987
+   iso-ir-101
+   ISO_8859-2
+   ISO-8859-2
+   latin2
+   l2
+*/
+
+static DOUBLE_TABLE table_45 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSA;'(L/CuL<S'SE':S<S,T<Z'--Z<Z.DGa;';l/''l<s''<',s<s,t<z''\"z<z.",
+    "R'A'A>A(A:L'C'C,C<E'E;E:E<I'I>D<D/N'N<O'O>O\"O:*XR<U0U'U\"U:Y'T,ss",
+    "r'a'a>a(a:l'c'c,c<e'e;e:e<i'i>d<d/n'n<o'o>o\"o:-:r<u0u'u\"u:y't,'.",
+  };
+
+/* T.61-7bit
+   iso-ir-102
+*/
+
+static DOUBLE_TABLE table_46 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(  )>  _ ",
+    "  a b c d e f g h i j k l m n o p q r s t u v w x y z   !!    DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_8859-3:1988
+   iso-ir-109
+   ISO_8859-3
+   ISO-8859-3
+   latin3
+   l3
+*/
+
+static DOUBLE_TABLE table_47 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSH/'(PdCu  H>SE':I.S,G(J>--  Z.DGh/2S3S''Myh>.M',i.s,g(j>12  z.",
+    "A!A'A>  A:C.C>C,E!E'E>E:I!I'I>I:  N?O!O'O>G.O:*XG>U!U'U>U:U(S>ss",
+    "a!a'a>  a:c.c>c,e!e'e>e:i!i'i>i:  n?o!o'o>g.o:-:g>u!u'u>u:u(s>'.",
+  };
+
+/* ISO_8859-4:1988
+   iso-ir-110
+   ISO_8859-4
+   ISO-8859-4
+   latin4
+   l4
+*/
+
+static DOUBLE_TABLE table_48 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSA;kkR,CuI?L,SE':S<E-G,T/--Z<'-DGa;';r,''i?l,'<',s<e-g,t/NGz<ng",
+    "A-A'A>A?A:AAAEI;C<E'E;E:E.I'I>I-D/N,O-K,O>O?O:*XO/U;U'U>U:U?U-ss",
+    "a-a'a>a?a:aaaei;c<e'e;e:e.i'i>i-d/n,o-k,o>o?o:-:o/u;u'u>u:u?u-'.",
+  };
+
+/* ECMA-cyrillic
+   iso-ir-111
+*/
+
+static DOUBLE_TABLE table_49 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSIOD%G%IEDSIIYIJ%LJNJTsKJ--V%DZN0iod%g%iedsiiyij%ljnjtskjCuv%dz",
+    "A=B=V=G=D=E=Z%Z=I=J=K=L=M=N=O=P=R=S=T=U=F=H=C=C%S%Sc=\"Y=%\"JEJUJA",
+    "a=b=v=g=d=e=z%z=i=j=k=l=m=n=o=p=r=s=t=u=f=h=c=c%s%sc='y=%'jejuja",
+  };
+
+/* CSA_Z243.4-1985-1
+   iso-ir-121
+   ISO646-CA
+   csa7-1
+   ca
+*/
+
+static DOUBLE_TABLE table_50 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "a!A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a>c,e>i>_ ",
+    "o>a b c d e f g h i j k l m n o p q r s t u v w x y z e'u!e!u>DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* CSA_Z243.4-1985-2
+   iso-ir-122
+   ISO646-CA2
+   csa7-2
+*/
+
+static DOUBLE_TABLE table_51 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "a!A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a>c,e>E'_ ",
+    "o>a b c d e f g h i j k l m n o p q r s t u v w x y z e'u!e!u>DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* CSA_Z243.4-1985-gr
+   iso-ir-123
+*/
+
+static DOUBLE_TABLE table_52 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS!I':PdCtYe+-''(S)S12+S',--.M-S0S1S2S3S4S5S6S7S8S9S1434<=!=>=?I",
+    "A!A'A>C,E!E'E>E:I'I>I:N?O'O>U!U'U>U:RgSEPIm*-a-o'6'9\"6\"9<<>>DGBB",
+    "a!a'a>c,e!e'e>e:i'i>i:n?o'o>u!u'u>u:CohhvvuruldldrvruhvldhvhNOFB",
+  };
+
+/* ISO_8859-7:1987
+   iso-ir-126
+   ISO_8859-7
+   ISO-8859-7
+   ELOT_928
+   ECMA-118
+   greek
+   greek8
+*/
+
+static DOUBLE_TABLE table_53 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS9''9Pd    BBSE':Co  <<NO--  -MDG+-2S3S'''%A%.ME%Y%I%>>O%12U%W%",
+    "i3A*B*G*D*E*Z*Y*H*I*K*L*M*N*C*O*P*R*  S*T*U*F*X*Q*W*J*V*a%e%y%i%",
+    "u3a*b*g*d*e*z*y*h*i*k*l*m*n*c*o*p*r**ss*t*u*f*x*q*w*j*v*o%u%w%  ",
+  };
+
+/* ISO_8859-6:1987
+   iso-ir-127
+   ISO_8859-6
+   ISO-8859-6
+   ECMA-114
+   ASMO-708
+   arabic
+*/
+
+static DOUBLE_TABLE table_54 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS      Cu              ,+--                          ;+      ?+",
+    "  H'aMaHwHahyHa+b+tmt+tkg+hkx+d+dkr+z+s+snc+ddtjzHe+i+          ",
+    "++f+q+k+l+m+n+h+w+j+y+:+\"+=+/+'+1+3+0+                          ",
+  };
+
+/* ISO_8859-8:1988
+   iso-ir-138
+   ISO_8859-8
+   ISO-8859-8
+   hebrew
+*/
+
+static DOUBLE_TABLE table_55 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS  CtPdCuYeBBSE':Co*X<<NO--Rg'-DG+-2S3S''MyPI.M',1S-:>>141234  ",
+    "                                                              =2",
+    "A+B+G+D+H+W+Z+X+TjJ+K%K+L+M%M+N%N+S+E+P%P+ZjZJQ+R+ShT+          ",
+  };
+
+/* CSN_369103
+   iso-ir-139
+*/
+
+static DOUBLE_TABLE table_56 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSA;'(L/DOL<S'SE':S<S,T<Z'--Z<Z.DGa;';l/''l<s''<',s<s,t<z''\"z<z.",
+    "R'A'A>A(A:L'C'C,C<E'E;E:E<I'I>D<D/N'N<O'O>O\"O:*XR<U0U'U\"U:Y'T,ss",
+    "r'a'a>a(a:l'c'c,c<e'e;e:e<i'i>d<d/n'n<o'o>o\"o:-:r<u0u'u\"u:y't,'.",
+  };
+
+/* JUS_I.B1.002
+   iso-ir-141
+   ISO646-YU
+   js
+   yu
+*/
+
+static DOUBLE_TABLE table_57 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "Z<A B C D E F G H I J K L M N O P Q R S T U V W X Y Z S<D/C'C<_ ",
+    "z<a b c d e f g h i j k l m n o p q r s t u v w x y z s<d/c'c<DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* IEC_P27-1
+   iso-ir-143
+*/
+
+static DOUBLE_TABLE table_58 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "'<=3ANOR(U)U(C)C<==>.::.(--)(_)_InIo00NBdP?1?2?-?==<!=>=<>NOFATE",
+    "A+OSPPG*D*-T-V-LH*<//>L*1'2'C*-+P*2SS**X3SU*F*.MQ*W*/0>VRTf(0(+-",
+    "DGa*b*g*d*e*z*y*h*i*k*l*m*n*c*%0p*r*s*-:t*u*f*x*q*w*/-<--!->-v'-",
+  };
+
+/* ISO_8859-5:1988
+   iso-ir-144
+   ISO_8859-5
+   ISO-8859-5
+   cyrillic
+*/
+
+static DOUBLE_TABLE table_59 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSIOD%G%IEDSIIYIJ%LJNJTsKJ--V%DZA=B=V=G=D=E=Z%Z=I=J=K=L=M=N=O=P=",
+    "R=S=T=U=F=H=C=C%S%Sc=\"Y=%\"JEJUJAa=b=v=g=d=e=z%z=i=j=k=l=m=n=o=p=",
+    "r=s=t=u=f=h=c=c%s%sc='y=%'jejujaN0iod%g%iedsiiyij%ljnjtskjSEv%dz",
+  };
+
+/* JUS_I.B1.003-serb
+   iso-ir-146
+   serbian
+*/
+
+static DOUBLE_TABLE table_60 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "Z%A=B=C=D=E=F=G=H=I=J%K=L=M=N=O=P=LJR=S=T=U=V=NJDZDSZ=S%D%TsC%_ ",
+    "z%a=b=c=d=e=f=g=h=i=j%k=l=m=n=o=p=ljr=s=t=u=v=njdzdsz=s%d%tsc%DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JUS_I.B1.003-mac
+   macedonian
+   iso-ir-147
+*/
+
+static DOUBLE_TABLE table_61 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "Z%A=B=C=D=E=F=G=H=I=J%K=L=M=N=O=P=LJR=S=T=U=V=NJDZDSZ=S%G%KJC%_ ",
+    "z%a=b=c=d=e=f=g=h=i=j%k=l=m=n=o=p=ljr=s=t=u=v=njdzdsz=s%g%kjc%DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_8859-9:1989
+   iso-ir-148
+   ISO_8859-9
+   ISO-8859-9
+   latin5
+   l5
+*/
+
+static DOUBLE_TABLE table_62 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS!ICtPdCuYeBBSE':Co-a<<NO--Rg'-DG+-2S3S''MyPI.M',1S-o>>141234?I",
+    "A!A'A>A?A:AAAEC,E!E'E>E:I!I'I>I:G(N?O!O'O>O?O:*XO/U!U'U>U:I.S,ss",
+    "a!a'a>a?a:aaaec,e!e'e;e:e.i'i>i-g(n?o!o'o>o?o:-:o/u!u'u>u:i.s,y:",
+  };
+
+/* greek-ccitt
+   iso-ir-150
+*/
+
+static DOUBLE_TABLE table_63 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA*B*G*D*E*Z*Y*H*I*K*L*M*N*C*O*P*R*  S*T*U*F*X*Q*W*  <(//)>'>_ ",
+    "  a*b*g*d*e*z*y*h*i*k*l*m*n*c*o*p*r**ss*t*u*f*x*q*w*  (!!!!)'-DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* NC_NC00-10:81
+   cuba
+   iso-ir-151
+   ISO646-CU
+*/
+
+static DOUBLE_TABLE table_64 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z !IN?)>?I_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z ''n?<(':DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* ISO_6937-2-25
+   iso-ir-152
+*/
+
+static DOUBLE_TABLE table_65 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbCu% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS                  \"6  <--!->-v                    \"9          ",
+    "                                        TMMd            18385878",
+    "Om          IJL.    OE  W>Y>Y:'n            ijl.    oe  w>y>    ",
+  };
+
+/* GOST_19768-74
+   ST_SEV_358-88
+   iso-ir-153
+*/
+
+static DOUBLE_TABLE table_66 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSIO                      --    A=B=V=G=D=E=Z%Z=I=J=K=L=M=N=O=P=",
+    "R=S=T=U=F=H=C=C%S%Sc=\"Y=%\"JEJUJAa=b=v=g=d=e=z%z=i=j=k=l=m=n=o=p=",
+    "r=s=t=u=f=h=c=c%s%sc='y=%'jejuja  io                            ",
+  };
+
+/* ISO_8859-supp
+   iso-ir-154
+   latin1-2-5
+*/
+
+static DOUBLE_TABLE table_67 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "    A-C>C.  E.E-G>'6\"6TM<--!->-v    a-c>c.d-e.e-g>'9\"9Md18385878",
+    "  G(G.G,H>H/I?I.I-I;IJJ>K,L,L.N,-MNGO-OER,S>T/THU?U(U-U;W>Y'Y>Y:",
+    "Omg(g.g,h>h/i?i.i-i;ijj>k,l,l.n,kkngo-oer,s>t/thu?u(u-u;w>y'y>'n",
+  };
+
+/* ISO_10367-box
+   iso-ir-155
+*/
+
+static DOUBLE_TABLE table_68 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    NULL,
+    "VVHHDRLDURULVRVLDHUHVHUBLBFBsB  vvhhdrdlurulvrvldhuhvh.S:S?S    ",
+    NULL,
+  };
+
+/* latin6
+   iso-ir-157
+   l6
+*/
+
+static DOUBLE_TABLE table_69 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSA;E-G,I-I?K,L,N'R,S<T/Z<--kkNGd/a;e-g,i-i?k,l,n'r,s<t/z<SEssng",
+    "A-A'A>A?A:AAAEI;C<E'E;E:E.I'I>I:D/N,O-O'O>O?O:U?O/U;U'U>U:Y'THU-",
+    "a-a'a>a?a:aaaei;c<e'e;e:e.i'i>i:d-n,o-o'o>o?o:u?o/u;u'u>u:y'thu-",
+  };
+
+/* latin-lap
+   lap
+   iso-ir-158
+*/
+
+static DOUBLE_TABLE table_70 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "''                              ;S                              ",
+    "A(A>A!A-A1A7A3E(E!E-G/G<K<O(O!O;O1U-EDEZ                        ",
+    "a(a>a!a-a1a7a3e(e!e-g/g<k<o(o!o;o1u-edez                        ",
+  };
+
+/* DS_2089
+   DS2089
+   ISO646-DK
+   dk
+*/
+
+static DOUBLE_TABLE table_71 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z AEO/AA'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z aeo/aa'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* us-dk
+*/
+
+static DOUBLE_TABLE table_72 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* dk-us
+*/
+
+static DOUBLE_TABLE table_73 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z AEO/AA'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z aeo/aa'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* JIS_X0201
+   X0201
+*/
+
+static DOUBLE_TABLE table_74 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(Ye)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'-DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NS._<'>',_.6Woa6i6u6e6o6YAYUYOTU-6A6I6U6E6O6KaKiKuKeKoSaSiSuSeSo",
+    "TaTiTuTeToNaNiNuNeNoHaHiHuHeHoMaMiMuMeMoYaYuYoRaRiRuReRoWaN6\"505",
+    NULL,
+  };
+
+/* KSC5636
+   ISO646-KR
+*/
+
+static DOUBLE_TABLE table_75 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(W=)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* DEC-MCS
+   dec
+*/
+
+static DOUBLE_TABLE table_76 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "  !ICtPd  Ye  SECuCo-a<<        DG+-2S3S  MyPI.M  1S-o>>1412  ?I",
+    "A!A'A>A?A:AAAEC,E!E'E>E:I!I'I>I:  N?O!O'O>O?O:OEO/U!U'U>U:Y:  ss",
+    "a!a'a>a?a:aaaec,e!e'e>e:i!i'i>i:  n?o!o'o>o?o:oeo/u!u'u>u:y:    ",
+  };
+
+/* hp-roman8
+   roman8
+   r8
+*/
+
+static DOUBLE_TABLE table_77 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "PAHOBHNHINNLSAESHSHJVSPDPURIS2S3DCP1P2TSCCMWSGEGSSGCSCCISTOCPMAC",
+    "NSA!A>E!E>E:I>I:''1\"AN':?1U!U>Li'-Y'y'DGC,c,N?n?!I?ICuPdYeSEFlCt",
+    "a>e>o>u>a'e'o'u'a!e!o!u!a:e:o:u:AAi>O/AEaai'o/aeA:i!O:U:E'i:ssO>",
+    "A'A?a?D-d-I'I!O'O!O?o?S<s<U'Y:y:THth.MMyPI34-M1412-a-o<<fS>>+-  ",
+  };
+
+/* macintosh
+   mac
+*/
+
+static DOUBLE_TABLE table_78 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "A:AAC,E'N?O:U:a'a!a>a:a?aac,e'e!e>e:i'i!i>i:n?o'o!o>o:o?u'u!u>u:",
+    "/-DGCtPdSESbPIssRgCoTM''':!=AEO/00+-=<>=YeMydP+Z*Pp*In-a-oW*aeo/",
+    "?I!INORTFl?2D*<<>>.3NSA!A?O?OEoe-M-N\"6\"9'6'9-:Dby:Y:/fCu<1>1fifl",
+    "/=.M.9:9%0A>E>A'E:E!I'I>I:I!O'O>  O!U'U>U!i.    '-'('.'0','\"';'<",
+  };
+
+/* IBM037
+   cp037
+   ebcdic-cp-us
+   ebcdic-cp-ca
+   ebcdic-cp-wt
+   ebcdic-cp-nl
+*/
+
+static DOUBLE_TABLE table_79 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:a!a'a?aac,n?Ct. < ( + !!& e'e>e:e!i'i>i:i!ss! DO* ) ; NO",
+    "- / A>A:A!A'A?AAC,N?BB, % _ > ? o/E'E>E:E!I'I>I:I!'!: NbAt' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-DGj k l m n o p q r -a-oae',AECu",
+    "My'?s t u v w x y z !I?ID-Y'THRg'>PdYe.MCoSEPI141234<()>'-':''*X",
+    "(!A B C D E F G H I --o>o:o!o'o?!)J K L M N O P Q R 1Su>u:u!u'y:",
+    "//-:S T U V W X Y Z 2SO>O:O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+void
+module_charset1 (void)
+{
+  declare_double_step (&table_0, "ISO_646.basic:1983", 2);
+  declare_double_step (&table_1, "INVARIANT", 2);
+  declare_double_step (&table_2, "ISO_646.irv:1983", 2);
+  declare_double_step (&table_3, "BS_4730", 2);
+  declare_double_step (&table_4, "ANSI_X3.4-1968", 2);
+  declare_double_step (&table_5, "NATS-SEFI", 2);
+  declare_double_step (&table_6, "NATS-SEFI-ADD", 2);
+  declare_double_step (&table_7, "NATS-DANO", 2);
+  declare_double_step (&table_8, "NATS-DANO-ADD", 2);
+  declare_double_step (&table_9, "SEN_850200_B", 2);
+  declare_double_step (&table_10, "SEN_850200_C", 2);
+  declare_double_step (&table_11, "JIS_C6220-1969-jp", 2);
+  declare_double_step (&table_12, "JIS_C6220-1969-ro", 2);
+  declare_double_step (&table_13, "IT", 2);
+  declare_double_step (&table_14, "PT", 2);
+  declare_double_step (&table_15, "ES", 2);
+  declare_double_step (&table_16, "greek7-old", 2);
+  declare_double_step (&table_17, "latin-greek", 2);
+  declare_double_step (&table_18, "DIN_66003", 2);
+  declare_double_step (&table_19, "NF_Z_62-010_(1973)", 2);
+  declare_double_step (&table_20, "Latin-greek-1", 2);
+  declare_double_step (&table_21, "ISO_5427", 2);
+  declare_double_step (&table_22, "BS_viewdata", 2);
+  declare_double_step (&table_23, "INIS", 2);
+  declare_double_step (&table_24, "INIS-8", 2);
+  declare_double_step (&table_25, "INIS-cyrillic", 2);
+  declare_double_step (&table_26, "ISO_5427:1981", 2);
+  declare_double_step (&table_27, "ISO_5428:1980", 2);
+  declare_double_step (&table_28, "GB_1988-80", 2);
+  declare_double_step (&table_29, "NS_4551-1", 2);
+  declare_double_step (&table_30, "NS_4551-2", 2);
+  declare_double_step (&table_31, "NF_Z_62-010", 2);
+  declare_double_step (&table_32, "PT2", 2);
+  declare_double_step (&table_33, "ES2", 2);
+  declare_double_step (&table_34, "MSZ_7795.3", 2);
+  declare_double_step (&table_35, "greek7", 2);
+  declare_double_step (&table_36, "ASMO_449", 2);
+  declare_double_step (&table_37, "JIS_C6229-1984-a", 2);
+  declare_double_step (&table_38, "JIS_C6229-1984-b", 2);
+  declare_double_step (&table_39, "JIS_C6229-1984-b-add", 2);
+  declare_double_step (&table_40, "JIS_C6229-1984-hand", 2);
+  declare_double_step (&table_41, "JIS_C6229-1984-hand-add", 2);
+  declare_double_step (&table_42, "JIS_C6229-1984-kana", 2);
+  declare_double_step (&table_43, "ISO_2033-1983", 2);
+  declare_double_step (&table_44, "ISO_8859-1:1987", 2);
+  declare_double_step (&table_45, "ISO_8859-2:1987", 2);
+  declare_double_step (&table_46, "T.61-7bit", 2);
+  declare_double_step (&table_47, "ISO_8859-3:1988", 2);
+  declare_double_step (&table_48, "ISO_8859-4:1988", 2);
+  declare_double_step (&table_49, "ECMA-cyrillic", 2);
+  declare_double_step (&table_50, "CSA_Z243.4-1985-1", 2);
+  declare_double_step (&table_51, "CSA_Z243.4-1985-2", 2);
+  declare_double_step (&table_52, "CSA_Z243.4-1985-gr", 2);
+  declare_double_step (&table_53, "ISO_8859-7:1987", 2);
+  declare_double_step (&table_54, "ISO_8859-6:1987", 2);
+  declare_double_step (&table_55, "ISO_8859-8:1988", 2);
+  declare_double_step (&table_56, "CSN_369103", 2);
+  declare_double_step (&table_57, "JUS_I.B1.002", 2);
+  declare_double_step (&table_58, "IEC_P27-1", 2);
+  declare_double_step (&table_59, "ISO_8859-5:1988", 2);
+  declare_double_step (&table_60, "JUS_I.B1.003-serb", 2);
+  declare_double_step (&table_61, "JUS_I.B1.003-mac", 2);
+  declare_double_step (&table_62, "ISO_8859-9:1989", 2);
+  declare_double_step (&table_63, "greek-ccitt", 2);
+  declare_double_step (&table_64, "NC_NC00-10:81", 2);
+  declare_double_step (&table_65, "ISO_6937-2-25", 2);
+  declare_double_step (&table_66, "GOST_19768-74", 2);
+  declare_double_step (&table_67, "ISO_8859-supp", 2);
+  declare_double_step (&table_68, "ISO_10367-box", 2);
+  declare_double_step (&table_69, "latin6", 2);
+  declare_double_step (&table_70, "latin-lap", 2);
+  declare_double_step (&table_71, "DS_2089", 2);
+  declare_double_step (&table_72, "us-dk", 2);
+  declare_double_step (&table_73, "dk-us", 2);
+  declare_double_step (&table_74, "JIS_X0201", 2);
+  declare_double_step (&table_75, "KSC5636", 2);
+  declare_double_step (&table_76, "DEC-MCS", 2);
+  declare_double_step (&table_77, "hp-roman8", 2);
+  declare_double_step (&table_78, "macintosh", 2);
+  declare_double_step (&table_79, "IBM037", 2);
+
+  declare_alias ("ref", "ISO_646.basic:1983");
+  declare_alias ("iso-ir-2", "ISO_646.irv:1983");
+  declare_alias ("irv", "ISO_646.irv:1983");
+  declare_alias ("iso-ir-4", "BS_4730");
+  declare_alias ("ISO646-GB", "BS_4730");
+  declare_alias ("gb", "BS_4730");
+  declare_alias ("uk", "BS_4730");
+  declare_alias ("iso-ir-6", "ANSI_X3.4-1968");
+  declare_alias ("ANSI_X3.4-1986", "ANSI_X3.4-1968");
+  declare_alias ("ISO_646.irv:1991", "ANSI_X3.4-1968");
+  declare_alias ("ASCII", "ANSI_X3.4-1968");
+  declare_alias ("ISO646-US", "ANSI_X3.4-1968");
+  declare_alias ("US-ASCII", "ANSI_X3.4-1968");
+  declare_alias ("us", "ANSI_X3.4-1968");
+  declare_alias ("IBM367", "ANSI_X3.4-1968");
+  declare_alias ("cp367", "ANSI_X3.4-1968");
+  declare_alias ("iso-ir-8-1", "NATS-SEFI");
+  declare_alias ("iso-ir-8-2", "NATS-SEFI-ADD");
+  declare_alias ("iso-ir-9-1", "NATS-DANO");
+  declare_alias ("iso-ir-9-2", "NATS-DANO-ADD");
+  declare_alias ("iso-ir-10", "SEN_850200_B");
+  declare_alias ("FI", "SEN_850200_B");
+  declare_alias ("ISO646-FI", "SEN_850200_B");
+  declare_alias ("ISO646-SE", "SEN_850200_B");
+  declare_alias ("se", "SEN_850200_B");
+  declare_alias ("iso-ir-11", "SEN_850200_C");
+  declare_alias ("ISO646-SE2", "SEN_850200_C");
+  declare_alias ("se2", "SEN_850200_C");
+  declare_alias ("JIS_C6220-1969", "JIS_C6220-1969-jp");
+  declare_alias ("iso-ir-13", "JIS_C6220-1969-jp");
+  declare_alias ("katakana", "JIS_C6220-1969-jp");
+  declare_alias ("x0201-7", "JIS_C6220-1969-jp");
+  declare_alias ("iso-ir-14", "JIS_C6220-1969-ro");
+  declare_alias ("jp", "JIS_C6220-1969-ro");
+  declare_alias ("ISO646-JP", "JIS_C6220-1969-ro");
+  declare_alias ("iso-ir-15", "IT");
+  declare_alias ("ISO646-IT", "IT");
+  declare_alias ("iso-ir-16", "PT");
+  declare_alias ("ISO646-PT", "PT");
+  declare_alias ("iso-ir-17", "ES");
+  declare_alias ("ISO646-ES", "ES");
+  declare_alias ("iso-ir-18", "greek7-old");
+  declare_alias ("iso-ir-19", "latin-greek");
+  declare_alias ("iso-ir-21", "DIN_66003");
+  declare_alias ("de", "DIN_66003");
+  declare_alias ("ISO646-DE", "DIN_66003");
+  declare_alias ("iso-ir-25", "NF_Z_62-010_(1973)");
+  declare_alias ("ISO646-FR1", "NF_Z_62-010_(1973)");
+  declare_alias ("iso-ir-27", "Latin-greek-1");
+  declare_alias ("iso-ir-37", "ISO_5427");
+  declare_alias ("iso-ir-47", "BS_viewdata");
+  declare_alias ("iso-ir-49", "INIS");
+  declare_alias ("iso-ir-50", "INIS-8");
+  declare_alias ("iso-ir-51", "INIS-cyrillic");
+  declare_alias ("iso-ir-54", "ISO_5427:1981");
+  declare_alias ("iso-ir-55", "ISO_5428:1980");
+  declare_alias ("iso-ir-57", "GB_1988-80");
+  declare_alias ("cn", "GB_1988-80");
+  declare_alias ("ISO646-CN", "GB_1988-80");
+  declare_alias ("iso-ir-60", "NS_4551-1");
+  declare_alias ("ISO646-NO", "NS_4551-1");
+  declare_alias ("no", "NS_4551-1");
+  declare_alias ("ISO646-NO2", "NS_4551-2");
+  declare_alias ("iso-ir-61", "NS_4551-2");
+  declare_alias ("no2", "NS_4551-2");
+  declare_alias ("iso-ir-69", "NF_Z_62-010");
+  declare_alias ("ISO646-FR", "NF_Z_62-010");
+  declare_alias ("fr", "NF_Z_62-010");
+  declare_alias ("iso-ir-84", "PT2");
+  declare_alias ("ISO646-PT2", "PT2");
+  declare_alias ("iso-ir-85", "ES2");
+  declare_alias ("ISO646-ES2", "ES2");
+  declare_alias ("iso-ir-86", "MSZ_7795.3");
+  declare_alias ("ISO646-HU", "MSZ_7795.3");
+  declare_alias ("hu", "MSZ_7795.3");
+  declare_alias ("iso-ir-88", "greek7");
+  declare_alias ("ISO_9036", "ASMO_449");
+  declare_alias ("arabic7", "ASMO_449");
+  declare_alias ("iso-ir-89", "ASMO_449");
+  declare_alias ("jp-ocr-a", "JIS_C6229-1984-a");
+  declare_alias ("ISO646-JP-OCR-B", "JIS_C6229-1984-b");
+  declare_alias ("jp-ocr-b", "JIS_C6229-1984-b");
+  declare_alias ("iso-ir-93", "JIS_C6229-1984-b-add");
+  declare_alias ("jp-ocr-b-add", "JIS_C6229-1984-b-add");
+  declare_alias ("iso-ir-94", "JIS_C6229-1984-hand");
+  declare_alias ("jp-ocr-hand", "JIS_C6229-1984-hand");
+  declare_alias ("iso-ir-95", "JIS_C6229-1984-hand-add");
+  declare_alias ("jp-ocr-hand-add", "JIS_C6229-1984-hand-add");
+  declare_alias ("iso-ir-96", "JIS_C6229-1984-kana");
+  declare_alias ("iso-ir-98", "ISO_2033-1983");
+  declare_alias ("e13b", "ISO_2033-1983");
+  declare_alias ("iso-ir-100", "ISO_8859-1:1987");
+  declare_alias ("ISO_8859-1", "ISO_8859-1:1987");
+  declare_alias ("ISO-8859-1", "ISO_8859-1:1987");
+  declare_alias ("latin1", "ISO_8859-1:1987");
+  declare_alias ("l1", "ISO_8859-1:1987");
+  declare_alias ("IBM819", "ISO_8859-1:1987");
+  declare_alias ("CP819", "ISO_8859-1:1987");
+  declare_alias ("iso-ir-101", "ISO_8859-2:1987");
+  declare_alias ("ISO_8859-2", "ISO_8859-2:1987");
+  declare_alias ("ISO-8859-2", "ISO_8859-2:1987");
+  declare_alias ("latin2", "ISO_8859-2:1987");
+  declare_alias ("l2", "ISO_8859-2:1987");
+  declare_alias ("iso-ir-102", "T.61-7bit");
+  declare_alias ("iso-ir-109", "ISO_8859-3:1988");
+  declare_alias ("ISO_8859-3", "ISO_8859-3:1988");
+  declare_alias ("ISO-8859-3", "ISO_8859-3:1988");
+  declare_alias ("latin3", "ISO_8859-3:1988");
+  declare_alias ("l3", "ISO_8859-3:1988");
+  declare_alias ("iso-ir-110", "ISO_8859-4:1988");
+  declare_alias ("ISO_8859-4", "ISO_8859-4:1988");
+  declare_alias ("ISO-8859-4", "ISO_8859-4:1988");
+  declare_alias ("latin4", "ISO_8859-4:1988");
+  declare_alias ("l4", "ISO_8859-4:1988");
+  declare_alias ("iso-ir-111", "ECMA-cyrillic");
+  declare_alias ("iso-ir-121", "CSA_Z243.4-1985-1");
+  declare_alias ("ISO646-CA", "CSA_Z243.4-1985-1");
+  declare_alias ("csa7-1", "CSA_Z243.4-1985-1");
+  declare_alias ("ca", "CSA_Z243.4-1985-1");
+  declare_alias ("iso-ir-122", "CSA_Z243.4-1985-2");
+  declare_alias ("ISO646-CA2", "CSA_Z243.4-1985-2");
+  declare_alias ("csa7-2", "CSA_Z243.4-1985-2");
+  declare_alias ("iso-ir-123", "CSA_Z243.4-1985-gr");
+  declare_alias ("iso-ir-126", "ISO_8859-7:1987");
+  declare_alias ("ISO_8859-7", "ISO_8859-7:1987");
+  declare_alias ("ISO-8859-7", "ISO_8859-7:1987");
+  declare_alias ("ELOT_928", "ISO_8859-7:1987");
+  declare_alias ("ECMA-118", "ISO_8859-7:1987");
+  declare_alias ("greek", "ISO_8859-7:1987");
+  declare_alias ("greek8", "ISO_8859-7:1987");
+  declare_alias ("iso-ir-127", "ISO_8859-6:1987");
+  declare_alias ("ISO_8859-6", "ISO_8859-6:1987");
+  declare_alias ("ISO-8859-6", "ISO_8859-6:1987");
+  declare_alias ("ECMA-114", "ISO_8859-6:1987");
+  declare_alias ("ASMO-708", "ISO_8859-6:1987");
+  declare_alias ("arabic", "ISO_8859-6:1987");
+  declare_alias ("iso-ir-138", "ISO_8859-8:1988");
+  declare_alias ("ISO_8859-8", "ISO_8859-8:1988");
+  declare_alias ("ISO-8859-8", "ISO_8859-8:1988");
+  declare_alias ("hebrew", "ISO_8859-8:1988");
+  declare_alias ("iso-ir-139", "CSN_369103");
+  declare_alias ("iso-ir-141", "JUS_I.B1.002");
+  declare_alias ("ISO646-YU", "JUS_I.B1.002");
+  declare_alias ("js", "JUS_I.B1.002");
+  declare_alias ("yu", "JUS_I.B1.002");
+  declare_alias ("iso-ir-143", "IEC_P27-1");
+  declare_alias ("iso-ir-144", "ISO_8859-5:1988");
+  declare_alias ("ISO_8859-5", "ISO_8859-5:1988");
+  declare_alias ("ISO-8859-5", "ISO_8859-5:1988");
+  declare_alias ("cyrillic", "ISO_8859-5:1988");
+  declare_alias ("iso-ir-146", "JUS_I.B1.003-serb");
+  declare_alias ("serbian", "JUS_I.B1.003-serb");
+  declare_alias ("macedonian", "JUS_I.B1.003-mac");
+  declare_alias ("iso-ir-147", "JUS_I.B1.003-mac");
+  declare_alias ("iso-ir-148", "ISO_8859-9:1989");
+  declare_alias ("ISO_8859-9", "ISO_8859-9:1989");
+  declare_alias ("ISO-8859-9", "ISO_8859-9:1989");
+  declare_alias ("latin5", "ISO_8859-9:1989");
+  declare_alias ("l5", "ISO_8859-9:1989");
+  declare_alias ("iso-ir-150", "greek-ccitt");
+  declare_alias ("cuba", "NC_NC00-10:81");
+  declare_alias ("iso-ir-151", "NC_NC00-10:81");
+  declare_alias ("ISO646-CU", "NC_NC00-10:81");
+  declare_alias ("iso-ir-152", "ISO_6937-2-25");
+  declare_alias ("ST_SEV_358-88", "GOST_19768-74");
+  declare_alias ("iso-ir-153", "GOST_19768-74");
+  declare_alias ("iso-ir-154", "ISO_8859-supp");
+  declare_alias ("latin1-2-5", "ISO_8859-supp");
+  declare_alias ("iso-ir-155", "ISO_10367-box");
+  declare_alias ("iso-ir-157", "latin6");
+  declare_alias ("l6", "latin6");
+  declare_alias ("lap", "latin-lap");
+  declare_alias ("iso-ir-158", "latin-lap");
+  declare_alias ("DS2089", "DS_2089");
+  declare_alias ("ISO646-DK", "DS_2089");
+  declare_alias ("dk", "DS_2089");
+  declare_alias ("X0201", "JIS_X0201");
+  declare_alias ("ISO646-KR", "KSC5636");
+  declare_alias ("dec", "DEC-MCS");
+  declare_alias ("roman8", "hp-roman8");
+  declare_alias ("r8", "hp-roman8");
+  declare_alias ("mac", "macintosh");
+  declare_alias ("cp037", "IBM037");
+  declare_alias ("ebcdic-cp-us", "IBM037");
+  declare_alias ("ebcdic-cp-ca", "IBM037");
+  declare_alias ("ebcdic-cp-wt", "IBM037");
+  declare_alias ("ebcdic-cp-nl", "IBM037");
+  declare_alias ("EBCDIC-INT", "IBM038");
+  declare_alias ("cp038", "IBM038");
+}
diff --git a/charset2.c b/charset2.c
new file mode 100644 (file)
index 0000000..227f544
--- /dev/null
@@ -0,0 +1,1046 @@
+/* DO NOT MODIFY THIS FILE!  It was generated by "charset.pl".  */
+
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+/* IBM038
+   EBCDIC-INT
+   cp038
+*/
+
+static DOUBLE_TABLE table_80 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  <(. < ( + ! &                   )>DO* ) ; '>",
+    "- /                 BB, % _ > ?                   '!: NbAt' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  '?s t u v w x y z                                             ",
+    "(!A B C D E F G H I             !)J K L M N O P Q R             ",
+    "//  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* IBM273
+   CP273
+*/
+
+static DOUBLE_TABLE table_81 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>(!a!a'a?aac,n?A:. < ( + ! & e'e>e:e!i'i>i:i!'?U:DO* ) ; '>",
+    "- / A><(A!A'A?AAC,N?o:, % _ > ? o/E'E>E:E!I'I>I:I!'!: NbSE' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-DGj k l m n o p q r -a-oae',AECu",
+    "Mysss t u v w x y z !I?ID-Y'THRgCtPdYe.MCoAtPI141234NO!!'-':''*X",
+    "a:A B C D E F G H I --o>BBo!o'o?u:J K L M N O P Q R 1Su>!)u!u'y:",
+    "O:-:S T U V W X Y Z 2SO>//O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>)>U!U'DT",
+  };
+
+/* IBM274
+   EBCDIC-BE
+   CP274
+*/
+
+static DOUBLE_TABLE table_82 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  <(. < ( + ! &                   )>DO* ) ; '>",
+    "- /                 u!, % _ > ?                   '!: Nba!' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  ':s t u v w x y z                                             ",
+    "e'A B C D E F G H I             e!J K L M N O P Q R             ",
+    "c,  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* IBM275
+   EBCDIC-BR
+   cp275
+*/
+
+static DOUBLE_TABLE table_83 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  E'. < ( + ! &                   DOC,* ) ; '>",
+    "- /                 c,, % _ > ?                   a?: O?A?' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  '?s t u v w x y z                                             ",
+    "o?A B C D E F G H I             e'J K L M N O P Q R             ",
+    "//  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* IBM277
+   EBCDIC-CP-DK
+   EBCDIC-CP-NO
+*/
+
+static DOUBLE_TABLE table_84 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:a!a'a?!)c,n?Nb. < ( + ! & e'e>e:e!i'i>i:i!ssCuAA* ) ; '>",
+    "- / A>A:A!A'A?DOC,N?o/, % _ > ? BBE'E>E:E!I'I>I:I!'!: AEO/' = \" ",
+    "Ata b c d e f g h i <<>>d-y'th+-DGj k l m n o p q r -a-o(!',<()>",
+    "Myu:s t u v w x y z !I?ID-Y'THRgCtPdYe.MCoSEPI141234NO!!'-':''*X",
+    "aeA B C D E F G H I --o>o:o!o'o?aaJ K L M N O P Q R 1Su>'?u!u'y:",
+    "//-:S T U V W X Y Z 2SO>O:O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM278
+   CP278
+   ebcdic-cp-fi
+   ebcdic-cp-se
+*/
+
+static DOUBLE_TABLE table_85 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>(!a!a'a?!)c,n?SE. < ( + ! & '!e>e:e!i'i>i:i!ssCuAA* ) ; '>",
+    "- / A>NbA!A'A?DOC,N?o:, % _ > ? o/E'E>E:E!I'I>I:I!e': A:O:' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-DGj k l m n o p q r -a-oae',AE)>",
+    "Myu:s t u v w x y z !I?ID-Y'THRgCtPdYe.MCo<(PI141234NO!!'-':''*X",
+    "a:A B C D E F G H I --o>BBo!o'o?aaJ K L M N O P Q R 1Su>'?u!u'y:",
+    "//-:S T U V W X Y Z 2SO>AtO!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM280
+   CP280
+   ebcdic-cp-it
+*/
+
+static DOUBLE_TABLE table_86 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:(!a'a?aa//n?DG. < ( + ! & )>e>e:!)i'i>i:'?sse'DO* ) ; '>",
+    "- / A>A:A!A'A?AAC,N?o!, % _ > ? o/E'E>E:E!I'I>I:I!u!: PdSE' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-<(j k l m n o p q r -a-oae',AECu",
+    "Myi!s t u v w x y z !I?ID-Y'THRgCtNbYe.MCoAtPI141234NO!!'-':''*X",
+    "a!A B C D E F G H I --o>o:BBo'o?e!J K L M N O P Q R 1Su>u:'!u'y:",
+    "c,-:S T U V W X Y Z 2SO>O:O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM281
+   EBCDIC-JP-E
+   cp281
+*/
+
+static DOUBLE_TABLE table_87 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  Pd. < ( + !!&                   ! Ye* ) ; NO",
+    "- /                 BB, % _ > ?                   '!: NbAt' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  '-s t u v w x y z                                             ",
+    "(!A B C D E F G H I             !)J K L M N O P Q R             ",
+    "DO  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* IBM284
+   CP284
+   ebcdic-cp-es
+*/
+
+static DOUBLE_TABLE table_88 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:a!a'a?aac,BB<(. < ( + !!& e'e>e:e!i'i>i:i!ss)>DO* ) ; NO",
+    "- / A>A:A!A'A?AAC,Nbn?, % _ > ? o/E'E>E:E!I'I>I:I!'!: N?At' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-DGj k l m n o p q r -a-oae',AECu",
+    "My':s t u v w x y z !I?ID-Y'THRgCtPdYe.MCoSEPI141234'>! '-'?''*X",
+    "(!A B C D E F G H I --o>o:o!o'o?!)J K L M N O P Q R 1Su>u:u!u'y:",
+    "//-:S T U V W X Y Z 2SO>O:O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM285
+   CP285
+   ebcdic-cp-gb
+*/
+
+static DOUBLE_TABLE table_89 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:a!a'a?aac,n?DO. < ( + !!& e'e>e:e!i'i>i:i!ss! Pd* ) ; NO",
+    "- / A>A:A!A'A?AAC,N?BB, % _ > ? o/E'E>E:E!I'I>I:I!'!: NbAt' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-DGj k l m n o p q r -a-oae',AECu",
+    "My'?s t u v w x y z !I?ID-Y'THRgCt<(Ye.MCoSEPI141234'>)>'-':''*X",
+    "(!A B C D E F G H I --o>o:o!o'o?!)J K L M N O P Q R 1Su>u:u!u'y:",
+    "//-:S T U V W X Y Z 2SO>O:O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM290
+   cp290
+   EBCDIC-JP-kana
+*/
+
+static DOUBLE_TABLE table_90 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP._<'>',_.6Woa6i6u6Pd. < ( + !!& e6o6YAYUYOTU  -6  ! Ye* ) ; NO",
+    "- /                 BB, % _ > ?                   '!: NbAt' = \" ",
+    "  A6I6U6E6O6KaKiKuKeKo  SaSiSuSeSoTaTiTuTeToNaNiNuNeNo    HaHiHu",
+    "  '-HeHoMaMiMuMeMoYaYu  YoRaRiRu                    ReRoWaN6\"505",
+    "  A B C D E F G H I               J K L M N O P Q R             ",
+    "DO  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* IBM297
+   cp297
+   ebcdic-cp-fr
+*/
+
+static DOUBLE_TABLE table_91 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:Ata'a?aa//n?DG. < ( + ! & (!e>e:!)i'i>i:i!ssSEDO* ) ; '>",
+    "- / A>A:A!A'A?AAC,N?u!, % _ > ? o/E'E>E:E!I'I>I:I!My: Pda!' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-<(j k l m n o p q r -a-oae',AECu",
+    "'!':s t u v w x y z !I?ID-Y'THRgCtNbYe.MCo)>PI141234NO!!'-'?''*X",
+    "e'A B C D E F G H I --o>o:o!o'o?e!J K L M N O P Q R 1Su>u:BBu'y:",
+    "c,-:S T U V W X Y Z 2SO>O:O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM420
+   cp420
+   ebcdic-cp-ar1
+*/
+
+static DOUBLE_TABLE table_92 = 
+  {
+    "NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US ",
+    NULL,
+    "SP NS 3+ 3+;++    H' aM aM.aH Ct .  <  (  +  !! &  aH.wH       yH a+ a+.b+ b+,!  DO *  )  ;  NO ",
+    "-  /  tm t+ t+,tk tk,g+ g+,hk BB ,  %  _  >  ?  hk,x+ x+,d+ dk r+ z+ s+ s+,,+ :  Nb At '  =  \"  ",
+    "sn a  b  c  d  e  f  g  h  i  sn,c+ c+,dd dd,tj zH j  k  l  m  n  o  p  q  r  e+ e+.e+,e+;i+ i+.",
+    "i+,-: s  t  u  v  w  x  y  z  i+;f+ f+,q+ q+,k+ k+,l+ lM-lM.lH-lH.      la-la.l+,m+ m+,n+ n+,h+ ",
+    ";+ A  B  C  D  E  F  G  H  I  -- h+,   h+;   w+ ?+ J  K  L  M  N  O  P  Q  R  j+ j+.y+ y+.y+,0a ",
+    "*X    S  T  U  V  W  X  Y  Z  1a 2a    3a 4a 5a 0  1  2  3  4  5  6  7  8  9     6a 7a 8a 9a DT ",
+  };
+
+/* IBM423
+   cp423
+   ebcdic-cp-gr
+*/
+
+static DOUBLE_TABLE table_93 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPA*B*G*D*E*Z*Y*H*I*<(. < ( + ! & K*L*M*N*C*O*P*R*S*)>DO* ) ; '>",
+    "- / T*U*F*X*Q*W*      , % _ > ?   A%E%Y%  I%O%U%W%'!: PdSE' = \" ",
+    "A:a b c d e f g h i a*b*g*d*e*z*O:j k l m n o p q r y*h*i*k*l*m*",
+    "U:':s t u v w x y z n*c*o*p*r**s  a%e%y%j*i%o%u%v*w%s*t*u*f*x*q*",
+    "%'y=z=s%jescc%='JUA=B=C=D=E=F=G=',A B C D E F G H I   w*A>a!a:e>",
+    "''J K L M N O P Q R +-e'e!e:i>i:DG  S T U V W X Y Z 12o:o>u>u!u:",
+  };
+
+/* IBM424
+   cp424
+   ebcdic-cp-he
+*/
+
+static DOUBLE_TABLE table_94 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPA+B+G+D+H+W+Z+X+TjCt. < ( + !!& J+K%K+L+M%M+N%N+S+! DO* ) ; NO",
+    "- / E+P%P+ZjZJQ+R+ShBB, % _ > ?   T+    NS      =='!: NbAt' = \" ",
+    "  a b c d e f g h i <<>>        DGj k l m n o p q r       ',  Cu",
+    "My'?s t u v w x y z           Rg'>PdYe.MCoSEPI141234<()>'-':''*X",
+    "(!A B C D E F G H I --          !)J K L M N O P Q R 1S          ",
+    "//-:S T U V W X Y Z 2S          0 1 2 3 4 5 6 7 8 9 3S        DT",
+  };
+
+/* IBM437
+   cp437
+   437
+*/
+
+static DOUBLE_TABLE table_95 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:a!aac,e>e:e!i:i>i!A:AAE'aeAEo>o:o!u>u!y:O:U:CtPdYePtFl",
+    "a'i'o'u'n?N?-a-o?ININO1214!I<<>>.S:S?SvvvlvLVlDldLVLVVLDULUluLdl",
+    "uruhdhvrhhvhvRVrURDRUHDHVRHHVHuHUhdHDhUruRdRDrVhvHuldrFBLBlBRBTB",
+    "a*b*G*p*S*s*m*t*F*H*W*d*00/0e*(U=3+->==<IuIl-:?2Ob.MSbRTnS2SfSNS",
+  };
+
+/* IBM500
+   CP500
+   ebcdic-cp-be
+   ebcdic-cp-ch
+*/
+
+static DOUBLE_TABLE table_96 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:a!a'a?aac,n?<(. < ( + ! & e'e>e:e!i'i>i:i!ss)>DO* ) ; '>",
+    "- / A>A:A!A'A?AAC,N?BB, % _ > ? o/E'E>E:E!I'I>I:I!'!: NbAt' = \" ",
+    "O/a b c d e f g h i <<>>d-y'th+-DGj k l m n o p q r -a-oae',AECu",
+    "My'?s t u v w x y z !I?ID-Y'THRgCtPdYe.MCoSEPI141234NO!!'-':''*X",
+    "(!A B C D E F G H I --o>o:o!o'o?!)J K L M N O P Q R 1Su>u:u!u'y:",
+    "//-:S T U V W X Y Z 2SO>O:O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM850
+   cp850
+   850
+*/
+
+static DOUBLE_TABLE table_97 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:a!aac,e>e:e!i:i>i!A:AAE'aeAEo>o:o!u>u!y:O:U:o/PdO/*XFl",
+    "a'i'o'u'n?N?-a-o?IRgNO1214!I<<>>.S:S?SvvvlA'A>A!CoVLVVLDULCtYedl",
+    "uruhdhvrhhvha?A?URDRUHDHVRHHVHCud-D-E>E:E!i.I'I>I:uldrFBLBBBI!TB",
+    "O'ssO>O!o?O?m*THthU'U>U!y'Y'-M''--+-==34PISE-:';DG':'.1S3S2SfSNS",
+  };
+
+/* IBM851
+   cp851
+   851
+*/
+
+static DOUBLE_TABLE table_98 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:a!A%c,e>e:e!i:i>E%A:Y%I%  O%o>o:U%u>u!W%O:U:a%Pde%y%i%",
+    "j*i3o%u%A*B*G*D*E*Z*Y*12H*I*<<>>.S:S?SvvvlK*L*N*M*VLVVLDULC*O*dl",
+    "uruhdhvrhhvhP*R*URDRUHDHVRHHVHS*T*U*F*X*Q*W*a*b*g*uldrFBLBd*e*TB",
+    "z*y*h*i*k*l*m*n*c*o*p*r*s**st*''--+-u*f*x*SEq*';DG':w*v*u3w%fSNS",
+  };
+
+/* IBM852
+   cp852
+   852
+*/
+
+static DOUBLE_TABLE table_99 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:u0c'c,l/e:O\"o\"i>Z'A:C'E'L'l'o>o:L<l<S's'O:U:T<t<L/*Xc<",
+    "a'i'o'u'A;a;Z<z<E;e;  z'C<s,<<>>.S:S?SvvvlA'A>E<S,VLVVLDULZ.z.dl",
+    "uruhdhvrhhvhA(a(URDRUHDHVRHHVHCud/D/D<E:d<N<I'U>e<uldrFBLBT,U0TB",
+    "O'ssO>N'n'n<S<s<R'U'r'U\"y'Y't,''--'\"','<'(SE-:';DG':'.u\"R<r<fSNS",
+  };
+
+/* IBM855
+   cp855
+   855
+*/
+
+static DOUBLE_TABLE table_100 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "d%D%g%G%ioIOieIEdsDSiiIIyiYIj%J%ljLJnjNJtsTSkjKJv%V%dzDZjuJU='=\"",
+    "a=A=b=B=c=C=d=D=e=E=f=F=g=G=<<>>.S:S?Svvvlh=H=i=I=VLVVLDULj=J=dl",
+    "uruhdhvrhhvhk=K=URDRUHDHVRHHVHCul=L=m=M=n=N=o=O=p=uldrFBLBP=jaTB",
+    "JAr=R=s=S=t=T=u=U=z%Z%v=V=%'%\"''--y=Y=z=Z=s%S%jeJEscScc%C%  fSNS",
+  };
+
+/* IBM857
+   cp857
+   857
+*/
+
+static DOUBLE_TABLE table_101 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:a!aac,e>e:e!i:i>i.A:AAE'aeAEo>o:o!u>u!I.O:U:o/PdO/S,s,",
+    "a'i'o'u'n?N?G(g(?IRgNO1214!I<<>>.S:S?SvvvlA'A>A!CoVLVVLDULCtYedl",
+    "uruhdhvrhhvha?A?URDRUHDHVRHHVHCu-o-aE>E:E!  I'I>I:uldrFBLBBBI!TB",
+    "O'ssO>O!o?O?m*  *XU'U>U!i!y:-M''--+-  34PISE-:';DG':'.1S3S2SfSNS",
+  };
+
+/* IBM860
+   cp860
+   860
+*/
+
+static DOUBLE_TABLE table_102 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a?a!A'c,e>E>e!I>O>i!A?A>E'A!E!o>o?o!U'u!I!O?U:CtPdU!PtO!",
+    "a'i'o'u'n?N?-a-o?IO'NO1214!I<<>>.S:S?SvvvlvLVlDldLVLVVLDULUluLdl",
+    "uruhdhvrhhvhvRVrURDRUHDHVRHHVHuHUhdHDhUruRdRDrVhvHuldrFBLBlBRBTB",
+    "a*b*G*p*S*s*m*t*F*H*W*d*00/0e*(U=3+->==<IuIl-:?2Ob.MSbRTnS2SfSNS",
+  };
+
+/* IBM861
+   cp861
+   861
+   cp-is
+*/
+
+static DOUBLE_TABLE table_103 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:a!aac,e>e:e!D-d-THA:AAE'aeAEo>o:thu>Y'y'O:U:o/PdO/PtO!",
+    "a'i'o'u'A'I'O'U'?I  NO1214!I<<>>.S:S?SvvvlvLVlDldLVLVVLDULUluLdl",
+    "uruhdhvrhhvhvRVrURDRUHDHVRHHVHuHUhdHDhUruRdRDrVhvHuldrFBLBlBRBTB",
+    "a*b*G*p*S*s*m*t*F*H*W*d*00/0e*(U=3+->==<IuIl-:?2Ob.MSbRTnS2SfSNS",
+  };
+
+/* IBM862
+   cp862
+   862
+*/
+
+static DOUBLE_TABLE table_104 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "A+B+G+D+H+W+Z+X+TjJ+K%K+L+M%M+N%N+S+E+P%P+ZjZJQ+R+ShT+CtPdU!PtO!",
+    "a'i'o'u'n?N?-a-o?I  NO1214!I<<>>.S:S?SvvvlvLVlDldLVLVVLDULUluLdl",
+    "uruhdhvrhhvhvRVrURDRUHDHVRHHVHuHUhdHDhUruRdRDrVhvHuldrFBLBlBRBTB",
+    "a*b*G*p*S*s*m*t*F*H*W*d*00/0e*(U=3+->==<IuIl-:?2Ob.MSbRTnS2SfSNS",
+  };
+
+/* IBM863
+   cp863
+   863
+*/
+
+static DOUBLE_TABLE table_105 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>A>a!PIc,e>e:e!i:i>i!A!SEE'E!E>o>E:I:u>u!CuO>U:CtPdU!U>Fl",
+    "BB''o'u'':',3S'-I>NINO121434<<>>.S:S?SvvvlvLVlDldLVLVVLDULUluLdl",
+    "uruhdhvrhhvhvRVrURDRUHDHVRHHVHuHUhdHDhUruRdRDrVhvHuldrFBLBlBRBTB",
+    "a*b*G*p*S*s*m*t*F*H*W*d*00/0e*(U=3+->==<IuIl-:?2Ob.MSbRTnS2SfSNS",
+  };
+
+/* IBM864
+   cp864
+*/
+
+static DOUBLE_TABLE table_106 = 
+  {
+    "NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US ",
+    "SP !  \"  Nb DO %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  ",
+    "At A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  <( // )> '> _  ",
+    "'! a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  (! !! !) '? DT ",
+    "DG .M Ob RT :S hh vv vh vl dh vr uh dl dr ur ul ss 00 o/ +- 12 14 ?2 << >> lH-lH.      la-la.a+:",
+    "   -- aM.Pd Cu aH.      a+.b+ t+ tk ,+ g+ hk x+ 0a 1a 2a 3a 4a 5a 6a 7a 8a 9a v+ ;+ s+ sn c+ ?+ ",
+    "Ct H' aM aH wH e+.yH a+ b+,tm t+,tk,g+,hk,x+,d+ dk r+ z+ s+,sn,c+,dd,tj zH e+,i+,BB NO -: *X e+ ",
+    "++ f+.q+.k+,l+.m+,n+.h+,w+ j+ y+,dd m+.i+.i+ m+ 3+;3+ n+ h+ h+;j+.y+.f+ q+ lM-lM.l+ k+ y+ fS NS ",
+  };
+
+/* IBM865
+   cp865
+   865
+*/
+
+static DOUBLE_TABLE table_107 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "C,u:e'a>a:a!aac,e>e:e!i:i>i!A:AAE'aeAEo>o:o!u>u!y:O:U:o/PdO/PtFl",
+    "a'i'o'u'n?N?-a-o?ININO1214!I<<>>.S:S?SvvvlvLVlDldLVLVVLDULUluLdl",
+    "uruhdhvrhhvhvRVrURDRUHDHVRHHVHuHUhdHDhUruRdRDrVhvHuldrFBLBlBRBTB",
+    "a*b*G*p*S*s*m*t*F*H*W*d*00/0e*(U=3+->==<IuIl-:?2Ob.MSbRTnS2SfSNS",
+  };
+
+/* IBM868
+   CP868
+   cp-ar
+*/
+
+static DOUBLE_TABLE table_108 = 
+  {
+    "NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US ",
+    "SP !  \"  Nb DO %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  ",
+    "At A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  <( // )> '> _  ",
+    "'! a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z  (! !! !) '? DT ",
+    "0a 1a 2a 3a 4a 5a 6a 7a 8a 9a ,+ ;+ ?+ aM a+ a+.a+:b+ b+,p+    tm t+ t+,      tk tk,g+ g+,      ",
+    "hk hk,x+ x+,d+    dk r+    z+    s+ s+,sn << >> sn,c+ .S :S ?S vv vl c+,dd dd,tj VL VV LD UL zH ",
+    "e+ dl ur uh dh vr hh vh e+.e+,UR DR UH DH VR HH VH e+;i+ i+.i+,i+;f+ f+,q+ q+,k+.ul dr FB TB k+,",
+    "   LB    l+ l+.l+;m+ m+,   n+ n+,   w+             H' --                         3+ 3+;   fS NS ",
+  };
+
+/* IBM869
+   cp869
+   869
+   cp-gr
+*/
+
+static DOUBLE_TABLE table_109 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "            A%  .MNOBB9''9E%-MY%I%J*O%    U%V*CoW%2S3Sa%Pde%y%i%",
+    "j*i3o%u%A*B*G*D*E*Z*Y*12H*I*<<>>.S:S?SvvvlK*L*M*N*VLVVLDULC*O*dl",
+    "uruhdhvrhhvhP*R*URDRUHDHVRHHVHS*T*U*F*X*Q*W*a*b*g*uldrFBLBd*e*TB",
+    "z*y*h*i*k*l*m*n*c*o*p*r*s**st*''--+-u*f*x*SEq*'%DG':w*v*u3w%fSNS",
+  };
+
+/* IBM870
+   CP870
+   ebcdic-cp-roece
+   ebcdic-cp-yu
+*/
+
+static DOUBLE_TABLE table_110 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNS  a:  a'a(c<c,c'<(. < ( + ! & e'  e:u0i'  l<l'ss)>DO* ) ; '>",
+    "- /   A:'\"A'  C<C,C'!!, % _ > ? '<E'  E:U0I'  L<L''!: NbAt' = \" ",
+    "'(a b c d e f g h i s'n<d/y'r<  DGj k l m n o p q r l/n's<',';Cu",
+    "a;'?s t u v w x y z S'N<D/Y'R<  .MA;z.  Z.SEPIz<z'Z<Z'N'S<':''*X",
+    "(!A B C D E F G H I --o>o:r'o'o\"!)J K L M N O P Q R E<u\"u:t<u'e<",
+    "//-:S T U V W X Y Z d<O>O:R'O'O\"0 1 2 3 4 5 6 7 8 9 D<U\"U:T<U'DT",
+  };
+
+/* IBM871
+   CP871
+   ebcdic-cp-is
+*/
+
+static DOUBLE_TABLE table_111 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:a!a'a?aac,n?th. < ( + ! & e'e>e:e!i'i>i:i!ssAEDO* ) ; O:",
+    "- / A>A:A!A'A?AAC,N?BB, % _ > ? o/E'E>E:E!I'I>I:I!d-: NbD-' = \" ",
+    "O/a b c d e f g h i <<>>'!y'(!+-DGj k l m n o p q r -a-o!)',)>Cu",
+    "Myo:s t u v w x y z !I?IAtY'<(RgCtPdYe.MCoSEPI141234NO!!'-'://*X",
+    "THA B C D E F G H I --o>'?o!o'o?aeJ K L M N O P Q R 1Su>u:u!u'y:",
+    "''-:S T U V W X Y Z 2SO>'>O!O'O?0 1 2 3 4 5 6 7 8 9 3SU>U:U!U'DT",
+  };
+
+/* IBM880
+   cp880
+   EBCDIC-Cyrillic
+*/
+
+static DOUBLE_TABLE table_112 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP  d%g%io  dsiiyij%<(. < ( + ! & ljnjtskj  dz=\"N0D%)>DO* ) ; '>",
+    "- / G%IO  DSIIYIJ%LJBB, % _ > ? NJTsKJ    DZjua=b=  : NbAt' = \" ",
+    "c=a b c d e f g h i d=e=f=g=h=i=j=j k l m n o p q r k=l=m=n=o=p=",
+    "ja  s t u v w x y z r=s=t=u=z%v=%'y=z=s%jescc%='JUA=B=C=D=E=F=G=",
+    "  A B C D E F G H I H=I=J=K=L=M=  J K L M N O P Q R N=O=P=JAR=S=",
+    "//CuS T U V W X Y Z T=U=Z%V=%\"Y=0 1 2 3 4 5 6 7 8 9 Z=S%JEScC%DT",
+  };
+
+/* IBM891
+   cp891
+*/
+
+static DOUBLE_TABLE table_113 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* IBM903
+   cp903
+*/
+
+static DOUBLE_TABLE table_114 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+  };
+
+/* IBM904
+   cp904
+   904
+*/
+
+static DOUBLE_TABLE table_115 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "Ct                                                              ",
+    NULL,
+    NULL,
+    "                                                          NOBB  ",
+  };
+
+/* IBM905
+   CP905
+   ebcdic-cp-tr
+*/
+
+static DOUBLE_TABLE table_116 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP  a>a:a!a'  c.(!n?C,. < ( + ! & e'e>e:e!i'i>i:i!ssG(I.* ) ; '>",
+    "- / A>A:A!A'  C.<(N?s,, % _ > ?   E'E>E:E!I'I>I:I!i.: O:S,' = U:",
+    "'(a b c d e f g h i h/c>s>u(  !!DGj k l m n o p q r h>g>j>';  Cu",
+    "Myo:s t u v w x y z H/C>S>U(  At.MPdz.!)Z.SE)>  12DOH>G>J>':''*X",
+    "c,A B C D E F G H I --o>'?o!o'g.g(J K L M N O P Q R '!u>//u!u'  ",
+    "u:-:S T U V W X Y Z 2SO>NbO!O'G.0 1 2 3 4 5 6 7 8 9 3SU>\" U!U'DT",
+  };
+
+/* IBM918
+   CP918
+   ebcdic-cp-ar2
+*/
+
+static DOUBLE_TABLE table_117 = 
+  {
+    "NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US ",
+    NULL,
+    "SP NS ,+ ;+ ?+ aH a+ a+.   b+ <( .  <  (  +  !  &  b+,p+    tm t+ t+,      tk )> DO *  )  ;  '> ",
+    "-  /  tk,g+ g+,      hk hk,x+ '! ,  %  _  >  ?  0a 1a 2a 3a 4a 5a 6a 7a 8a 9a :  Nb At '  =  \"  ",
+    "x+,a  b  c  d  e  f  g  h  i  d+    dk r+    z+    j  k  l  m  n  o  p  q  r  s+ s+,sn sn,c+ c+,",
+    "dd '? s  t  u  v  w  x  y  z  dd,tj zH e+ e+.e+,e+;i+ i+.i+,i+;f+ f+,q+ q+,k+ k+,!!       l+ l+.",
+    "(! A  B  C  D  E  F  G  H  I  --    m+ m+,   n+ !) J  K  L  M  N  O  P  Q  R  n+,   w+          ",
+    "//    S  T  U  V  W  X  Y  Z  H'                0  1  2  3  4  5  6  7  8  9           3+ 3+;DT ",
+  };
+
+/* IBM1026
+   CP1026
+*/
+
+static DOUBLE_TABLE table_118 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SPNSa>a:a!a'a?aa(!n?C,. < ( + ! & e'e>e:e!i'i>i:i!ssG(I.* ) ; '>",
+    "- / A>A:A!A'A?AA<(N?s,, % _ > ? o/E'E>E:E!I'I>I:I!i.: O:S,' = U:",
+    "O/a b c d e f g h i <<>>!)'!BB+-DGj k l m n o p q r -a-oae';AECu",
+    "Myo:s t u v w x y z !I?I)>DOAtRgCtPdYe.MCoSEPI141234NO!!-M':''*X",
+    "c,A B C D E F G H I --o>'?o!o'o?g(J K L M N O P Q R 1Su>//u!u'y:",
+    "u:-:S T U V W X Y Z 2SO>NbO!O'O?0 1 2 3 4 5 6 7 8 9 3SU>\" U!U'DT",
+  };
+
+/* EBCDIC-AT-DE
+*/
+
+static DOUBLE_TABLE table_119 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  A:. < ( + ! &                   U:DO* ) ; '>",
+    "- /                 o:, % _ > ?                   '!: NbSE' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  sss t u v w x y z                                             ",
+    "a:A B C D E F G H I             u:J K L M N O P Q R             ",
+    "O:  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-AT-DE-A
+*/
+
+static DOUBLE_TABLE table_120 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  o:. < ( + !!&                   u:U:* ) ; NO",
+    "- /                 ss, % _ > ?                     : A:O:' = a:",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "    s t u v w x y z                                             ",
+    "  A B C D E F G H I               J K L M N O P Q R             ",
+    "    S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-CA-FR
+*/
+
+static DOUBLE_TABLE table_121 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP  a>          c,  a!. < ( + ! &   e>e:    i>i:    ''DO* ) ; '>",
+    "- / A>  A!      C,  u!, % _ > ?   E'E>E:  I>I:    '!: NbAt' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  ':s t u v w x y z                                             ",
+    "e'A B C D E F G H I   o>        e!J K L M N O P Q R   u>u:      ",
+    "',  S T U V W X Y Z   O>        0 1 2 3 4 5 6 7 8 9   U>U:U!  DT",
+  };
+
+/* EBCDIC-DK-NO
+*/
+
+static DOUBLE_TABLE table_122 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  Nb. < ( + ! &                   CuAA* ) ; '>",
+    "- /                 o/, % _ > ?                   '!: AEO/' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  u:s t u v w x y z                                             ",
+    "aeA B C D E F G H I             aaJ K L M N O P Q R             ",
+    "//  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-DK-NO-A
+*/
+
+static DOUBLE_TABLE table_123 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  o/. < ( + !!&                   aaAA* ) ; NO",
+    "- /                 BB, % _ > ?                     : AEO/' = ae",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "    s t u v w x y z                                             ",
+    "  A B C D E F G H I               J K L M N O P Q R             ",
+    "    S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-FI-SE
+*/
+
+static DOUBLE_TABLE table_124 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  SE. < ( + ! &                   CuAA* ) ; '>",
+    "- /                 o:, % _ > ?                   e': A:O:' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  u:s t u v w x y z                                             ",
+    "a:A B C D E F G H I             aaJ K L M N O P Q R             ",
+    "E'  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-FI-SE-A
+*/
+
+static DOUBLE_TABLE table_125 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  o:. < ( + !!&                   aaAA* ) ; NO",
+    "- /                 BB, % _ > ?                     : A:O:' = a:",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "    s t u v w x y z                                             ",
+    "  A B C D E F G H I               J K L M N O P Q R             ",
+    "    S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-FR
+*/
+
+static DOUBLE_TABLE table_126 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  DG. < ( + ! &                   SEDO* ) ; '>",
+    "- /                 u!, % _ > ?                   '!: Pda!' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  ':s t u v w x y z                                             ",
+    "e'A B C D E F G H I             e!J K L M N O P Q R             ",
+    "c,  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-IT
+*/
+
+static DOUBLE_TABLE table_127 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  DG. < ( + ! &                   e'DO* ) ; '>",
+    "- /                 o!, % _ > ?                   u!: PdSE' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  i!s t u v w x y z                                             ",
+    "a!A B C D E F G H I             e!J K L M N O P Q R             ",
+    "c,  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-PT
+*/
+
+static DOUBLE_TABLE table_128 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  <(. < ( + ! &                   )>DO* ) ; '>",
+    "- /                 o?, % _ > ?                   '!: A?O?' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  c,s t u v w x y z                                             ",
+    "a?A B C D E F G H I             ''J K L M N O P Q R             ",
+    "C,  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-ES
+*/
+
+static DOUBLE_TABLE table_129 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  Ct. < ( + !!&                   ! Pt* ) ; NO",
+    "- /                 n?, % _ > ?                   '!: N?At' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  ':s t u v w x y z                                             ",
+    "(!A B C D E F G H I             !)J K L M N O P Q R             ",
+    "//  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-ES-A
+*/
+
+static DOUBLE_TABLE table_130 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  Ct. < ( + !!&                   ! Pt* ) ; NO",
+    "- /                 BB, % _ > ?                     : N?At' = n?",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "    s t u v w x y z                                             ",
+    "  A B C D E F G H I               J K L M N O P Q R             ",
+    "    S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-ES-S
+*/
+
+static DOUBLE_TABLE table_131 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  Ct. < ( + !!&                   ! DO* ) ; NO",
+    "- /                 n?, % _ > ?                   '!: N?At' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  ':s t u v w x y z                                             ",
+    "(!A B C D E F G H I             !)J K L M N O P Q R             ",
+    "//  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-UK
+*/
+
+static DOUBLE_TABLE table_132 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  DO. < ( + !!&                   ! Pd* ) ; NO",
+    "- /                 BB, % _ > ?                   '!: NbAt' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  '-s t u v w x y z                                             ",
+    "(!A B C D E F G H I             !)J K L M N O P Q R             ",
+    "//  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+/* EBCDIC-US
+*/
+
+static DOUBLE_TABLE table_133 = 
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    NULL,
+    "SP                  Ct. < ( + !!&                   ! DO* ) ; NO",
+    "- /                 BB, % _ > ?                   '!: NbAt' = \" ",
+    "  a b c d e f g h i               j k l m n o p q r             ",
+    "  '?s t u v w x y z                                             ",
+    "(!A B C D E F G H I             !)J K L M N O P Q R             ",
+    "//  S T U V W X Y Z             0 1 2 3 4 5 6 7 8 9           DT",
+  };
+
+void
+module_charset2 (void)
+{
+  declare_double_step (&table_80, "IBM038", 2);
+  declare_double_step (&table_81, "IBM273", 2);
+  declare_double_step (&table_82, "IBM274", 2);
+  declare_double_step (&table_83, "IBM275", 2);
+  declare_double_step (&table_84, "IBM277", 2);
+  declare_double_step (&table_85, "IBM278", 2);
+  declare_double_step (&table_86, "IBM280", 2);
+  declare_double_step (&table_87, "IBM281", 2);
+  declare_double_step (&table_88, "IBM284", 2);
+  declare_double_step (&table_89, "IBM285", 2);
+  declare_double_step (&table_90, "IBM290", 2);
+  declare_double_step (&table_91, "IBM297", 2);
+  declare_double_step (&table_92, "IBM420", 3);
+  declare_double_step (&table_93, "IBM423", 2);
+  declare_double_step (&table_94, "IBM424", 2);
+  declare_double_step (&table_95, "IBM437", 2);
+  declare_double_step (&table_96, "IBM500", 2);
+  declare_double_step (&table_97, "IBM850", 2);
+  declare_double_step (&table_98, "IBM851", 2);
+  declare_double_step (&table_99, "IBM852", 2);
+  declare_double_step (&table_100, "IBM855", 2);
+  declare_double_step (&table_101, "IBM857", 2);
+  declare_double_step (&table_102, "IBM860", 2);
+  declare_double_step (&table_103, "IBM861", 2);
+  declare_double_step (&table_104, "IBM862", 2);
+  declare_double_step (&table_105, "IBM863", 2);
+  declare_double_step (&table_106, "IBM864", 3);
+  declare_double_step (&table_107, "IBM865", 2);
+  declare_double_step (&table_108, "IBM868", 3);
+  declare_double_step (&table_109, "IBM869", 2);
+  declare_double_step (&table_110, "IBM870", 2);
+  declare_double_step (&table_111, "IBM871", 2);
+  declare_double_step (&table_112, "IBM880", 2);
+  declare_double_step (&table_113, "IBM891", 2);
+  declare_double_step (&table_114, "IBM903", 2);
+  declare_double_step (&table_115, "IBM904", 2);
+  declare_double_step (&table_116, "IBM905", 2);
+  declare_double_step (&table_117, "IBM918", 3);
+  declare_double_step (&table_118, "IBM1026", 2);
+  declare_double_step (&table_119, "EBCDIC-AT-DE", 2);
+  declare_double_step (&table_120, "EBCDIC-AT-DE-A", 2);
+  declare_double_step (&table_121, "EBCDIC-CA-FR", 2);
+  declare_double_step (&table_122, "EBCDIC-DK-NO", 2);
+  declare_double_step (&table_123, "EBCDIC-DK-NO-A", 2);
+  declare_double_step (&table_124, "EBCDIC-FI-SE", 2);
+  declare_double_step (&table_125, "EBCDIC-FI-SE-A", 2);
+  declare_double_step (&table_126, "EBCDIC-FR", 2);
+  declare_double_step (&table_127, "EBCDIC-IT", 2);
+  declare_double_step (&table_128, "EBCDIC-PT", 2);
+  declare_double_step (&table_129, "EBCDIC-ES", 2);
+  declare_double_step (&table_130, "EBCDIC-ES-A", 2);
+  declare_double_step (&table_131, "EBCDIC-ES-S", 2);
+  declare_double_step (&table_132, "EBCDIC-UK", 2);
+  declare_double_step (&table_133, "EBCDIC-US", 2);
+
+  declare_alias ("CP273", "IBM273");
+  declare_alias ("EBCDIC-BE", "IBM274");
+  declare_alias ("CP274", "IBM274");
+  declare_alias ("EBCDIC-BR", "IBM275");
+  declare_alias ("cp275", "IBM275");
+  declare_alias ("EBCDIC-CP-DK", "IBM277");
+  declare_alias ("EBCDIC-CP-NO", "IBM277");
+  declare_alias ("CP278", "IBM278");
+  declare_alias ("ebcdic-cp-fi", "IBM278");
+  declare_alias ("ebcdic-cp-se", "IBM278");
+  declare_alias ("CP280", "IBM280");
+  declare_alias ("ebcdic-cp-it", "IBM280");
+  declare_alias ("EBCDIC-JP-E", "IBM281");
+  declare_alias ("cp281", "IBM281");
+  declare_alias ("CP284", "IBM284");
+  declare_alias ("ebcdic-cp-es", "IBM284");
+  declare_alias ("CP285", "IBM285");
+  declare_alias ("ebcdic-cp-gb", "IBM285");
+  declare_alias ("cp290", "IBM290");
+  declare_alias ("EBCDIC-JP-kana", "IBM290");
+  declare_alias ("cp297", "IBM297");
+  declare_alias ("ebcdic-cp-fr", "IBM297");
+  declare_alias ("cp420", "IBM420");
+  declare_alias ("ebcdic-cp-ar1", "IBM420");
+  declare_alias ("cp423", "IBM423");
+  declare_alias ("ebcdic-cp-gr", "IBM423");
+  declare_alias ("cp424", "IBM424");
+  declare_alias ("ebcdic-cp-he", "IBM424");
+  declare_alias ("cp437", "IBM437");
+  declare_alias ("437", "IBM437");
+  declare_alias ("CP500", "IBM500");
+  declare_alias ("ebcdic-cp-be", "IBM500");
+  declare_alias ("ebcdic-cp-ch", "IBM500");
+  declare_alias ("cp850", "IBM850");
+  declare_alias ("850", "IBM850");
+  declare_alias ("cp851", "IBM851");
+  declare_alias ("851", "IBM851");
+  declare_alias ("cp852", "IBM852");
+  declare_alias ("852", "IBM852");
+  declare_alias ("cp855", "IBM855");
+  declare_alias ("855", "IBM855");
+  declare_alias ("cp857", "IBM857");
+  declare_alias ("857", "IBM857");
+  declare_alias ("cp860", "IBM860");
+  declare_alias ("860", "IBM860");
+  declare_alias ("cp861", "IBM861");
+  declare_alias ("861", "IBM861");
+  declare_alias ("cp-is", "IBM861");
+  declare_alias ("cp862", "IBM862");
+  declare_alias ("862", "IBM862");
+  declare_alias ("cp863", "IBM863");
+  declare_alias ("863", "IBM863");
+  declare_alias ("cp864", "IBM864");
+  declare_alias ("cp865", "IBM865");
+  declare_alias ("865", "IBM865");
+  declare_alias ("CP868", "IBM868");
+  declare_alias ("cp-ar", "IBM868");
+  declare_alias ("cp869", "IBM869");
+  declare_alias ("869", "IBM869");
+  declare_alias ("cp-gr", "IBM869");
+  declare_alias ("CP870", "IBM870");
+  declare_alias ("ebcdic-cp-roece", "IBM870");
+  declare_alias ("ebcdic-cp-yu", "IBM870");
+  declare_alias ("CP871", "IBM871");
+  declare_alias ("ebcdic-cp-is", "IBM871");
+  declare_alias ("cp880", "IBM880");
+  declare_alias ("EBCDIC-Cyrillic", "IBM880");
+  declare_alias ("cp891", "IBM891");
+  declare_alias ("cp903", "IBM903");
+  declare_alias ("cp904", "IBM904");
+  declare_alias ("904", "IBM904");
+  declare_alias ("CP905", "IBM905");
+  declare_alias ("ebcdic-cp-tr", "IBM905");
+  declare_alias ("CP918", "IBM918");
+  declare_alias ("ebcdic-cp-ar2", "IBM918");
+  declare_alias ("CP1026", "IBM1026");
+}
diff --git a/checkit b/checkit
new file mode 100755 (executable)
index 0000000..ec94e9c
--- /dev/null
+++ b/checkit
@@ -0,0 +1,68 @@
+:
+# Script to help checking `recode'.
+# Copyright (C) 1991 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1991.
+
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# Use this script by `checkit [-v] FILE BEFORE AFTER'.  It does
+# various check of recoding FILE from BEFORE to AFTER or vice-versa.
+# The -v parameter gives more verbose output.  Exit with a non-zero
+# status if any error found.
+
+if test "$1" = -v; then
+  shift
+  verbose=1
+fi
+
+# Select methods to be tested by studying `configure' output.
+
+methods=i
+grep '#define  *HAVE_POPEN  *1' config.h > /dev/null && methods="$methods o"
+grep '#define  *HAVE_PIPE  *1' config.h > /dev/null && methods="$methods p"
+
+# Try all methods, both in filter and in non-filter modes.  Echo the
+# tested sequence of steps in verbose mode, but only once after the
+# first "Checking" message.
+
+test -n "$verbose" && verbose_once=-v
+for method in $methods; do
+  echo "Checking -$method $2:$3 FILE  (and $3:$2 too)"
+  cp $1 checkit.tmp
+  chmod +w checkit.tmp
+  ./recode $verbose_once -q$method $2:$3 checkit.tmp
+  ./recode $verbose_once -q$method $3:$2 checkit.tmp
+  verbose_once=
+  if cmp -s $1 checkit.tmp; then
+    :
+  else
+    rm checkit.tmp
+    exit 1
+  fi
+
+  echo "Checking -$method $2:$3 <FILE (and $3:$2 too)"
+  ./recode -q$method < $1 $2:$3 | ./recode -q$method $3:$2 > checkit.tmp
+  if cmp -s $1 checkit.tmp; then
+    :
+  else
+    rm checkit.tmp
+    exit 1
+  fi
+done
+
+# Return success.
+
+rm checkit.tmp
+exit 0
diff --git a/config.h.dos b/config.h.dos
new file mode 100644 (file)
index 0000000..5de841a
--- /dev/null
@@ -0,0 +1,11 @@
+/* config.h for MSDOS.  Hand edited from config.h.in.  */
+
+#define DEFAULT_CHARSET "IBM-PC"
+
+#define MSDOS
+#define USE_FPUTC
+
+#define STDC_HEADERS 1
+#define HAVE_RENAME 1
+#define HAVE_STRERROR 1
+#define HAVE_STRING_H 1
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..5dcf704
--- /dev/null
@@ -0,0 +1,70 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+#undef _ALL_SOURCE
+#endif
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function.  */
+#undef HAVE_VPRINTF
+
+/* Define if on MINIX.  */
+#undef _MINIX
+
+/* Define if the system does not provide POSIX.1 features except
+   with this defined.  */
+#undef _POSIX_1_SOURCE
+
+/* Define if you need to in order for stat and other things to work.  */
+#undef _POSIX_SOURCE
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Default charset is `Latin-1' on UNIX, `IBM-PC' on MSDOS.  */
+#undef DEFAULT_CHARSET
+
+/* Define to the name of the distribution.  */
+#undef PRODUCT
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define to 1 for better use of the debugging malloc library.  See 
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
+
+/* Define if you have the dup2 function.  */
+#undef HAVE_DUP2
+
+/* Define if you have the pipe function.  */
+#undef HAVE_PIPE
+
+/* Define if you have the popen function.  */
+#undef HAVE_POPEN
+
+/* Define if you have the rename function.  */
+#undef HAVE_RENAME
+
+/* Define if you have the strerror function.  */
+#undef HAVE_STRERROR
+
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
diff --git a/config_h.os2 b/config_h.os2
new file mode 100644 (file)
index 0000000..31b01b2
--- /dev/null
@@ -0,0 +1,22 @@
+/* config.h  Generated manually for emx under OS/2 */\r
+\r
+/* Define if you need to in order for stat and other things to work.  */\r
+#define _POSIX_SOURCE 1\r
+\r
+/* Define if you have the ANSI C header files.  */\r
+#define STDC_HEADERS 1\r
+\r
+/* Default charset is latin1 on UNIX, ibmpc on MSDOS.  */\r
+#define DEFAULT_CHARSET "ibmpc"\r
+\r
+/* Define if you have dup2.  */\r
+#define HAVE_DUP2 1\r
+\r
+/* Define if you have popen.  */\r
+#define HAVE_POPEN 1\r
+\r
+/* Define if you have rename.  */\r
+#define HAVE_RENAME 1\r
+\r
+/* Define if you have the <string.h> header file.  */\r
+#define HAVE_STRING_H 1\r
diff --git a/configdos b/configdos
new file mode 100755 (executable)
index 0000000..1beb500
--- /dev/null
+++ b/configdos
@@ -0,0 +1,327 @@
+#!/usr/bin/perl -s
+eval "exec /usr/bin/perl -s -S $0 $*"
+    if $running_under_some_shell;
+
+# Convert `Makefile.in' into a Makefile for MSDOS.
+# Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1991
+
+# Usage: $0 [-tcc]
+
+$output_name = $tcc ? "makefile.tcc" : "makefile.xxx";
+$output_name = "-";
+
+open (INPUT, "Makefile.in") || die "Cannot read Makefile.in\n";
+open (OUTPUT, ">$output_name") || die "Cannot create $output_name\n";
+
+# Default @VARIABLE@ substitutions for MSDOS.  Changed or activated by
+# MSDOS_<variable>=<new-default> lines in Makefile.in.
+
+$configure{"ALLOCA"} = "";
+$configure{"LIBOBJS"} = "";
+$configure{"VPATH"} = ".";
+$configure{"srcdir"} = ".";
+
+# Default VARIABLE= overrides and @VARIABLE@ substitutions for MSDOS.
+# VARIABLE= overrides are deactivated for variables in %configure.
+
+$override{"AR"} = $tcc ? "tlib" : "ar";
+$override{"AWK"} = "@echo :";
+$override{"CC"} = $tcc ? "tcc -v -N" : "gcc";
+$override{"CFLAGS"} = "";
+$override{"DEFS"} = "-DHAVE_CONFIG_H";
+$override{"INSTALL"} = "@echo :";
+$override{"INSTALL_DATA"} = $tcc ? "copy" : "cp";
+$override{"INSTALL_PROGRAM"} = $tcc ? "copy" : "cp";
+$override{"LDFLAGS"} = "";
+$override{"LEX"} = $tcc ? "@echo :" : "flex";
+$override{"LIBS"} = "";
+$override{"MAKEINFO"} = "@echo :";
+$override{"RANLIB"} = $tcc ? "@echo :" : "ranlib";
+$override{"TEXI2DVI"} = "@echo :";
+$override{"U"} = "";
+$override{"YACC"} = $tcc ? "@echo :" : "bison -y";
+
+# Default file renames for MSDOS.  Macros DISTFILES, *HDRS, *HEADERS,
+# *SRCS, *SOURCES, *OBJS, *OBJECTS also introduce file lists.
+
+$renaming{"GNUmakefile"} = "makefile.gnu";
+$renaming{"tags"} = "tags";
+$renaming{"TAGS"} = "tagse";
+
+# Transform `Makefile.in' into `$output_name'.
+
+print OUTPUT "# Generated automatically from Makefile.in by `$0'.\n";
+while (<INPUT>)
+{
+    chop;
+
+    # Process Makefile.in comments.  A few are special purpose.
+
+    if (/^\#=MSDOS=(.*)/)
+    {
+       # An =MSDOS= comment outputs the remainder of the line, verbatim.
+
+       print OUTPUT $1, "\n";
+       next;
+    }
+    elsif (/^\#-MSDOS/)
+    {
+       # An -MSDOS comment remove all lines until an +MSDOS comment.
+
+       while (<INPUT>)
+       {
+           last if /^\#\+MSDOS/;
+       }
+       last if !$_;
+       next;
+    }
+    elsif (/^\#/)
+    {
+       # Copy other comments right now.
+
+       print OUTPUT $_, "\n";
+       next;
+    }
+
+    # Remove $U prefixes, useless, so file name renaming works better.
+
+    s/\$U//g;
+
+    # Execute @...@ substitutions.
+
+    while (/(.*)\@(\w[\w0-9]*)\@(.*)/)
+    {
+       if (defined $configure{$2})
+       {
+           $_ = $1 . $configure{$2} . $3;
+       }
+       elsif (defined $override{$2})
+       {
+           $_ = $1 . $override{$2} . $3;
+       }
+       else
+       {
+           warn "*** @$2@ not substituted ***";
+           last;
+       }
+    }
+
+    # Save MSDOS_* definitions for later substitution.  MSDOS_PROGS
+    # announce file names which should have .exe appended.
+
+    if (/^MSDOS_PROGS\s*=\s*(.*)/)
+    {
+       foreach $prog (split (' ', $1))
+       {
+           $renaming{$prog} = &dosfn ("$prog.exe");
+           $program{$prog} = 1;
+       }
+       next;
+    }
+
+    if (/^MSDOS_([^\s]+)\s*=\s*(.*)/)
+    {
+       $configure{$1} = $2;
+       next;
+    }
+
+    # Some macros annonce list of files.  Study these lines to get a
+    # better %renaming cache.
+
+    if (/^(DISTFILES|\w*HDRS|\w*HEADERS)\s*=\s*(.*)/)
+    {
+       &studylist ($2);
+       $studylist = 1;
+    }
+    elsif (/^(\w*SRCS|\w*SOURCES|\w*OBJS|\w*OBJECTS)\s*=\s*(.*)/)
+    {
+       &studylist ($2);
+       $studylist = 1;
+    }
+    elsif ($studylist)
+    {
+       &studylist ($_);
+    }
+
+    if ($studylist && ! /\\$/)
+    {
+       $studylist = 0;
+    }
+
+    # Extract each word of the line and process it.
+
+    ($_, $line) = /^(\w[\w0-9]*\s*=\s*)?(.*)/;
+    while ($line =~ /[-.\w\/]+/)
+    {
+       $_ .= $`;
+       $line = $';
+
+       if (defined $renaming{$&})
+       {
+           # Execute any previously saved substitution.
+
+           $value = $renaming{$&};
+       }
+       else
+       {
+           $value = $&;
+           if ($value =~ /^[^.]+\.[^.]+$/)
+           {
+               # Normalize anything resembling a file name.
+
+               $value = &dosfn ($value);
+           }
+       }
+       $_ .= $value;
+    }
+    $_ .= $line;
+
+    # Check for other special modifications.
+
+    if (/^SHELL\s*=/)
+    {
+       s/^/#/;
+    }
+    elsif (/^  \$\(CC\).*-o\s+(\w+)/)
+    {
+       if ($tcc)
+       {
+           s/-o\s+/-e/;
+           s/\$\(OBJECTS\)/@objects.lst/;
+       }
+       else
+       {
+           $aout = $1;
+           s/\.exe//;
+       }
+    }
+    elsif (/^  \$\(AR\)\scru\s/ && $tcc)
+    {
+       s/\scru//;
+       s/\$\(LIBOBJS\)/@libobjs.lst/;
+    }
+    elsif (/^\w+\s*=\s*:\b/ || /^      :\b/)
+    {
+       s/:/@echo :/;
+    }
+    elsif ((/^\w+\s*=\s*cp\b/ || /^    cp\b/) && $tcc)
+    {
+       s/cp(\s+-\w+)*/copy/;
+    }
+    elsif ((/^\w+\s*=\s*rm\b/ || /^    rm\b/) && $tcc)
+    {
+       s/rm(\s+-\w+)*/erase/;
+    }
+    elsif (/^\.c\.o:$/ && $tcc)
+    {
+       print OUTPUT ".SUFFIXES: .obj\n";
+       s/\.o/\.obj/;
+    }
+    elsif (/^(\w+)\s*=/)
+    {
+       if (!defined $configure{$1} && defined $override{$1})
+       {
+           $_ = $1 . " = " . $override{$1};
+       }
+    }
+    elsif (/^$/ && $aout)
+    {
+       print OUTPUT "\taout2exe $aout\n";
+       print OUTPUT "\trm $aout\n";
+       $aout = "";
+    }
+
+    print OUTPUT $_, "\n";
+}
+close INPUT;
+close OUTPUT;
+exit 0;
+
+# Prepare substitutions for the given list of files.
+
+sub studylist
+{
+    $list = $_[0];
+    $list =~ s/\$\(\w+\)//g;
+    $list =~ s/\\$//;
+    while ($list =~ /([-.\w\/]+)/)
+    {
+       $list = $';
+       $value = $&;
+       $renaming{$value} = &dosfn ($&);
+    }
+}
+
+# Turn the argument into an MSDOS file name.
+# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# Predefine $tcc if necessary.
+
+sub dosfn
+{
+    local ($whole, $prefix, $name, $ext);
+
+    $whole = $_[0];
+    $whole =~ y/A-Z/a-z/;
+
+    # Change any beginning period with an underline.
+
+    $whole =~ s/^\./_/;
+
+    # Change all periods except the last with underlines.
+
+    while ($whole =~ /(.*)\.(.*)\.(.*)/)
+    {
+       $whole = "$1_$2.$3";
+    }
+
+    # If no period at all, let flow characters after the 8th into the
+    # the extension.
+
+    if ($whole =~ /^(.*\/)?([^.\/]+)$/)
+    {
+       ($prefix, $name, $ext) = ($1, $2, "");
+       if (length ($name) > 8)
+       {
+           $ext = substr ($name, 8);
+           $name = substr ($name, 0, 8);
+           $ext = substr ($ext, 0, 3) if length ($ext) > 3;
+           return "$prefix$name.$ext";
+       }
+       return "$prefix$name";
+    }
+
+    # There is only one period, truncate to 8 characters before it and
+    # to 3 characters after it.
+
+    if ($whole =~ /^(.*\/)?([^.\/]+)\.([^.\/]+)$/)
+    {
+       ($prefix, $name, $ext) = ($1, $2, $3);
+       $name = substr ($name, 0, 8) if length ($name) > 8;
+       if ($ext eq "a" && $tcc)
+       {
+           $ext = "lib";
+       }
+       elsif ($ext eq "o" && $tcc)
+       {
+           $ext = "obj";
+       }
+       elsif ($ext eq "texi" || $ext eq "texinfo")
+       {
+           $ext = "ti";
+       }
+       elsif (length ($ext) > 3)
+       {
+           $ext = substr ($ext, 0, 3);
+       }
+       return "$prefix$name.$ext";
+    }
+
+    # This should not happen.
+
+    warn "Error in dosfn.pl for \`$_[0]'\n";
+    return $_[0];
+}
+
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..49646de
--- /dev/null
+++ b/configure
@@ -0,0 +1,1625 @@
+#!/bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.1 
+# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+  --with-dmalloc          use dmalloc, as in dmalloc.tar.gz from
+                          @/ftp.antaire.com:antaire/src/dmalloc."
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Initialize some other variables.
+subdirs=
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -build | --build | --buil | --bui | --bu | --b)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=* | --b=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=PREFIX    install architecture-dependent files in PREFIX
+                          [same as prefix]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+--enable and --with options recognized:$ac_help
+EOF
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.1"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *) 
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 unused; standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 unused; some systems may open it to /dev/tty
+# 4 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 4>/dev/null
+else
+  exec 4>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=recode.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} $CFLAGS $CPPFLAGS conftest.$ac_ext -c 1>&5 2>&5'
+ac_link='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext -o conftest $LIBS 1>&5 2>&5'
+
+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
+
+
+
+if test "$program_transform_name" = s,x,x,; then
+  program_transform_name=
+else
+  # Double any \ or $.
+  echo 's,\\,\\\\,g; s,\$,$$,g' > conftestsed
+  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+  rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+
+PRODUCT=recode
+VERSION=3.4
+cat >> confdefs.h <<EOF
+#define PRODUCT "$PRODUCT"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+
+for ac_prog in mawk gawk nawk awk
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_prog_AWK'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AWK="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+AWK="$ac_cv_prog_AWK"
+if test -n "$AWK"; then
+  echo "$ac_t""$AWK" 1>&4
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+test -n "$AWK" && break
+done
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&4
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if ${CC-cc} -E conftest.c 2>&5 | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+echo "$ac_t""$ac_cv_prog_gcc" 1>&4
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+  if test "${CFLAGS+set}" != set; then
+    echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_prog_gcc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_gcc_g=yes
+else
+  ac_cv_prog_gcc_g=no
+fi
+rm -f conftest*
+
+fi
+    echo "$ac_t""$ac_cv_prog_gcc_g" 1>&4
+    if test $ac_cv_prog_gcc_g = yes; then
+      CFLAGS="-g -O"
+    else
+      CFLAGS="-O"
+    fi
+  fi
+else
+  GCC=
+  test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&4
+if test -z "$INSTALL"; then
+if eval "test \"`echo '${'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+    IFS="${IFS=        }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    case "$ac_dir" in
+    ''|.|/etc|/usr/sbin|/usr/etc|/sbin|/usr/afsws/bin|/usr/ucb) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      for ac_prog in ginstall installbsd scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           # OSF/1 installbsd also uses dspmsg, but is usable.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_ifs"
+  # As a last resort, use the slow shell script.
+  test -z "$ac_cv_path_install" && ac_cv_path_install="$ac_install_sh"
+fi
+  INSTALL="$ac_cv_path_install"
+fi
+echo "$ac_t""$INSTALL" 1>&4
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_RANLIB="ranlib"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+  echo "$ac_t""$RANLIB" 1>&4
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&4
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '${'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 655 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 669 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+fi
+CPP="$ac_cv_prog_CPP"
+echo "$ac_t""$CPP" 1>&4
+
+echo $ac_n "checking for AIX""... $ac_c" 1>&4
+cat > conftest.$ac_ext <<EOF
+#line 694 "configure"
+#include "confdefs.h"
+#ifdef _AIX
+  yes
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  echo "$ac_t""yes" 1>&4; cat >> confdefs.h <<\EOF
+#define _ALL_SOURCE 1
+EOF
+
+else
+  rm -rf conftest*
+  echo "$ac_t""no" 1>&4
+fi
+rm -f conftest*
+
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&4
+if test -d /etc/conf/kconfig.d &&
+  grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+  echo "$ac_t""yes" 1>&4
+  ISC=yes # If later tests want to check for ISC.
+  cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+  if test "$GCC" = yes; then
+    CC="$CC -posix"
+  else
+    CC="$CC -Xp"
+  fi
+else
+  echo "$ac_t""no" 1>&4
+  ISC=
+fi
+
+ac_safe=`echo "minix/config.h" | tr './\055' '___'`
+echo $ac_n "checking for minix/config.h""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 741 "configure"
+#include "confdefs.h"
+#include <minix/config.h>
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&4
+  MINIX=yes
+else
+  echo "$ac_t""no" 1>&4
+MINIX=
+fi
+
+if test "$MINIX" = yes; then
+  cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _POSIX_1_SOURCE 2
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _MINIX 1
+EOF
+
+fi
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_prog_cc_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX                  -qlanglvl=ansi
+# Ultrix and OSF/1     -std1
+# HP-UX                        -Aa -D_HPUX_SOURCE
+# SVR4                 -Xc
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  cat > conftest.$ac_ext <<EOF
+#line 796 "configure"
+#include "confdefs.h"
+#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif 
+
+int main() { return 0; }
+int t() {
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+; return 0; }
+EOF
+if eval $ac_compile; then
+  rm -rf conftest*
+  ac_cv_prog_cc_stdc="$ac_arg"; break
+fi
+rm -f conftest*
+
+done
+CFLAGS="$ac_save_CFLAGS"
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_stdc" 1>&4
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+
+echo $ac_n "checking for function prototypes""... $ac_c" 1>&4
+if test "$ac_cv_prog_cc_stdc" != no; then
+  echo "$ac_t""yes" 1>&4
+  cat >> confdefs.h <<\EOF
+#define PROTOTYPES 1
+EOF
+
+  U= ANSI2KNR=
+else
+  echo "$ac_t""no" 1>&4
+  U=_ ANSI2KNR=ansi2knr
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_c_const'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 845 "configure"
+#include "confdefs.h"
+
+int main() { return 0; }
+int t() {
+
+/* Ultrix mips cc rejects this.  */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this.  */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this.  */
+struct point {int x, y;};
+static struct point const zero;
+/* AIX XL C 1.02.0.0 rejects this.
+   It does not let you subtract one const X* pointer from another in an arm
+   of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this.  */
+  char *t;
+  char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+  *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+  int x[] = {25, 17};
+  const int *foo = &x[0];
+  ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+  typedef const int *iptr;
+  iptr p = 0;
+  ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+  struct s { int j; const int *ap[3]; };
+  struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+  const int foo = 10;
+}
+
+; return 0; }
+EOF
+if eval $ac_compile; then
+  rm -rf conftest*
+  ac_cv_c_const=yes
+else
+  rm -rf conftest*
+  ac_cv_c_const=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_c_const" 1>&4
+if test $ac_cv_c_const = no; then
+  cat >> confdefs.h <<\EOF
+#define const 
+EOF
+
+fi
+
+
+# Extract the first word of "flex", so it can be a program name with args.
+set dummy flex; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_prog_LEX'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  if test -n "$LEX"; then
+  ac_cv_prog_LEX="$LEX" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_LEX="flex"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex"
+fi
+fi
+LEX="$ac_cv_prog_LEX"
+if test -n "$LEX"; then
+  echo "$ac_t""$LEX" 1>&4
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+if test -z "$LEXLIB"
+then
+  case "$LEX" in
+  flex*) ac_lib=fl ;;
+  *) ac_lib=l ;;
+  esac
+  echo $ac_n "checking for -l$ac_lib""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_lib_$ac_lib'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  ac_save_LIBS="$LIBS"
+LIBS="$LIBS -l$ac_lib "
+cat > conftest.$ac_ext <<EOF
+#line 955 "configure"
+#include "confdefs.h"
+
+int main() { return 0; }
+int t() {
+main()
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib`\" = yes"; then
+  echo "$ac_t""yes" 1>&4
+  LEXLIB="-l$ac_lib"
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+fi
+
+test "$LEX" = flex || echo "configure: warning: flex not found" 1>&2
+
+# If we cannot run a trivial program, we must be cross compiling.
+echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_c_cross'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_cross=yes
+else
+cat > conftest.$ac_ext <<EOF
+#line 994 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+eval $ac_link
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+  ac_cv_c_cross=no
+else
+  ac_cv_c_cross=yes
+fi
+fi
+rm -fr conftest*
+fi
+cross_compiling=$ac_cv_c_cross
+echo "$ac_t""$ac_cv_c_cross" 1>&4
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_header_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1015 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  ac_cv_header_stdc=yes
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1037 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1055 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  ac_cv_header_stdc=no
+else
+cat > conftest.$ac_ext <<EOF
+#line 1076 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+eval $ac_link
+if test -s conftest && (./conftest; exit) 2>/dev/null; then
+  :
+else
+  ac_cv_header_stdc=no
+fi
+fi
+rm -fr conftest*
+fi
+fi
+echo "$ac_t""$ac_cv_header_stdc" 1>&4
+if test $ac_cv_header_stdc = yes; then
+  cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+for ac_hdr in limits.h string.h
+do
+ac_safe=`echo "$ac_hdr" | tr './\055' '___'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1113 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&4
+    ac_tr_hdr=HAVE_`echo $ac_hdr | tr '[a-z]./\055' '[A-Z]___'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&4
+fi
+done
+
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_type_signal'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1146 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+extern void (*signal ()) ();
+int main() { return 0; }
+int t() {
+int i;
+; return 0; }
+EOF
+if eval $ac_compile; then
+  rm -rf conftest*
+  ac_cv_type_signal=void
+else
+  rm -rf conftest*
+  ac_cv_type_signal=int
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_signal" 1>&4
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+
+for ac_func in dup2 pipe popen rename strerror
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1183 "configure"
+#include "confdefs.h"
+#include <ctype.h> /* Arbitrary system header to define __stub macros. */
+/* Override any gcc2 internal prototype to avoid an error.  */
+char $ac_func(); 
+
+int main() { return 0; }
+int t() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+
+fi
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&4
+    ac_tr_func=HAVE_`echo $ac_func | tr '[a-z]' '[A-Z]'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&4
+fi
+done
+
+echo $ac_n "checking for vprintf""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_func_vprintf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1230 "configure"
+#include "confdefs.h"
+#include <ctype.h> /* Arbitrary system header to define __stub macros. */
+/* Override any gcc2 internal prototype to avoid an error.  */
+char vprintf(); 
+
+int main() { return 0; }
+int t() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_vprintf) || defined (__stub___vprintf)
+choke me
+#else
+vprintf();
+#endif
+
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=no"
+fi
+rm -f conftest*
+
+fi
+if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
+  echo "$ac_t""yes" 1>&4
+  cat >> confdefs.h <<\EOF
+#define HAVE_VPRINTF 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+if test "$ac_cv_func_vprintf" != yes; then
+echo $ac_n "checking for _doprnt""... $ac_c" 1>&4
+if eval "test \"`echo '${'ac_cv_func__doprnt'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1276 "configure"
+#include "confdefs.h"
+#include <ctype.h> /* Arbitrary system header to define __stub macros. */
+/* Override any gcc2 internal prototype to avoid an error.  */
+char _doprnt(); 
+
+int main() { return 0; }
+int t() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+_doprnt();
+#endif
+
+; return 0; }
+EOF
+if eval $ac_link; then
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=yes"
+else
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=no"
+fi
+rm -f conftest*
+
+fi
+if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
+  echo "$ac_t""yes" 1>&4
+  cat >> confdefs.h <<\EOF
+#define HAVE_DOPRNT 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+fi
+
+
+echo $ac_n "checking the default charset""... $ac_c" 1>&4
+if test -n "$DEFAULT_CHARSET"; then
+  echo "$ac_t""$DEFAULT_CHARSET" 1>&4
+  cat >> confdefs.h <<EOF
+#define DEFAULT_CHARSET "$DEFAULT_CHARSET"
+EOF
+
+else
+  echo "$ac_t""Latin-1" 1>&4
+  cat >> confdefs.h <<\EOF
+#define DEFAULT_CHARSET "Latin-1"
+EOF
+
+fi
+
+echo $ac_n "checking if malloc debugging is wanted""... $ac_c" 1>&4
+# Check whether --with-dmalloc or --without-dmalloc was given.
+withval="$with_dmalloc"
+if test -n "$withval"; then
+  if test "$withval" = yes; then
+  echo "$ac_t""yes" 1>&4
+  cat >> confdefs.h <<\EOF
+#define WITH_DMALLOC 1
+EOF
+
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  echo "$ac_t""no" 1>&4
+fi
+else
+  echo "$ac_t""no" 1>&4
+fi
+
+
+trap '' 1 2 15
+if test -w $cache_file; then
+echo "updating cache $cache_file"
+cat > $cache_file <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# Ultrix sh set writes to stderr and can't be redirected directly.
+(set) 2>&1 |
+  sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p" \
+  >> $cache_file
+else
+echo "not updating unwritable cache $cache_file"
+fi
+
+trap 'rm -fr conftest* confdefs* core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#!/bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.1"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr Makefile config.h conftest*; exit 1' 1 2 15
+
+# Protect against being on the right side of a sed subst in config.status. 
+sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; 
+ s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@PRODUCT@%$PRODUCT%g
+s%@VERSION@%$VERSION%g
+s%@AWK@%$AWK%g
+s%@CC@%$CC%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@RANLIB@%$RANLIB%g
+s%@CPP@%$CPP%g
+s%@U@%$U%g
+s%@ANSI2KNR@%$ANSI2KNR%g
+s%@LEX@%$LEX%g
+s%@LEXLIB@%$LEXLIB%g
+
+CEOF
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust relative srcdir, etc. for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/$ac_dir"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file
+fi; done
+rm -f conftest.subs
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+CONFIG_HEADERS=${CONFIG_HEADERS-"config.h"}
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  cp $ac_given_srcdir/$ac_file_in conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status. 
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+# Maximum number of lines to put in a single here document.
+ac_max_here_lines=12
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+
+test -z "$CONFIG_HEADERS" || date > stamp-h
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..7a0cc5a
--- /dev/null
@@ -0,0 +1,49 @@
+# Configure template for GNU recode.
+# Copyright (C) 1994 Free Software Foundation, Inc.
+# Process this file with autoconf to produce a configure script.
+
+AC_INIT(recode.c)
+AC_CONFIG_HEADER(config.h)
+AC_ARG_PROGRAM
+
+PRODUCT=recode
+VERSION=3.4
+AC_DEFINE_UNQUOTED(PRODUCT, "$PRODUCT")
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
+AC_SUBST(PRODUCT)
+AC_SUBST(VERSION)
+
+AC_PROG_AWK
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_RANLIB
+
+AC_AIX
+AC_ISC_POSIX
+AC_MINIX
+fp_C_PROTOTYPES
+AC_C_CONST
+
+AC_PROG_LEX
+test "$LEX" = flex || AC_WARN(flex not found, so do not modify .l files)
+
+AC_HEADER_STDC
+AC_CHECK_HEADERS(limits.h string.h)
+AC_TYPE_SIGNAL
+
+AC_CHECK_FUNCS(dup2 pipe popen rename strerror)
+AC_FUNC_VPRINTF
+
+AC_MSG_CHECKING(the default charset)
+if test -n "$DEFAULT_CHARSET"; then
+  AC_MSG_RESULT($DEFAULT_CHARSET)
+  AC_DEFINE_UNQUOTED(DEFAULT_CHARSET, "$DEFAULT_CHARSET")
+else
+  AC_MSG_RESULT(Latin-1)
+  AC_DEFINE(DEFAULT_CHARSET, "Latin-1")
+fi
+
+fp_WITH_DMALLOC
+
+AC_OUTPUT(Makefile,
+[test -z "$CONFIG_HEADERS" || date > stamp-h])
diff --git a/dosfn b/dosfn
new file mode 100755 (executable)
index 0000000..84774f0
--- /dev/null
+++ b/dosfn
@@ -0,0 +1,99 @@
+#!/usr/bin/perl -s
+eval "exec /usr/bin/perl -s -S $0 $*"
+    if $running_under_some_shell;
+
+# Turn the given filenames into MSDOS filenames by renaming them.
+# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# Usage: $0 [-tcc] [FILE]...
+
+if ($ARGV[0] eq "-v")
+{
+    $verbose = 1;
+    shift @ARGV;
+}
+
+while ($oldname = shift @ARGV)
+{
+    $newname = &dosfn ($oldname);
+    if ($newname ne $oldname)
+    {
+       warn "Renaming `$oldname' to `$newname'\n" if $verbose;
+       rename ($oldname, $newname)
+           || warn "WARNING: Could not rename `$oldname' to `$newname'\n";
+    }
+}
+
+# Turn the argument into an MSDOS file name.
+# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# Predefine $tcc if necessary.
+
+sub dosfn
+{
+    local ($whole, $prefix, $name, $ext);
+
+    $whole = $_[0];
+    $whole =~ y/A-Z/a-z/;
+
+    # Change any beginning period with an underline.
+
+    $whole =~ s/^\./_/;
+
+    # Change all periods except the last with underlines.
+
+    while ($whole =~ /(.*)\.(.*)\.(.*)/)
+    {
+       $whole = "$1_$2.$3";
+    }
+
+    # If no period at all, let flow characters after the 8th into the
+    # the extension.
+
+    if ($whole =~ /^(.*\/)?([^.\/]+)$/)
+    {
+       ($prefix, $name, $ext) = ($1, $2, "");
+       if (length ($name) > 8)
+       {
+           $ext = substr ($name, 8);
+           $name = substr ($name, 0, 8);
+           $ext = substr ($ext, 0, 3) if length ($ext) > 3;
+           return "$prefix$name.$ext";
+       }
+       return "$prefix$name";
+    }
+
+    # There is only one period, truncate to 8 characters before it and
+    # to 3 characters after it.
+
+    if ($whole =~ /^(.*\/)?([^.\/]+)\.([^.\/]+)$/)
+    {
+       ($prefix, $name, $ext) = ($1, $2, $3);
+       $name = substr ($name, 0, 8) if length ($name) > 8;
+       if ($ext eq "a" && $tcc)
+       {
+           $ext = "lib";
+       }
+       elsif ($ext eq "o" && $tcc)
+       {
+           $ext = "obj";
+       }
+       elsif ($ext eq "texi" || $ext eq "texinfo")
+       {
+           $ext = "ti";
+       }
+       elsif (length ($ext) > 3)
+       {
+           $ext = substr ($ext, 0, 3);
+       }
+       return "$prefix$name.$ext";
+    }
+
+    # This should not happen.
+
+    warn "Error in dosfn.pl for \`$_[0]'\n";
+    return $_[0];
+}
+
diff --git a/ebcdic.c b/ebcdic.c
new file mode 100644 (file)
index 0000000..2f5088a
--- /dev/null
+++ b/ebcdic.c
@@ -0,0 +1,189 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#define ASCII "ASCII"
+/* Previously: #define ASCII "ASCII-BS" */
+
+#include "recode.h"
+
+static unsigned char const ascii_to_ebcdic[256] =
+  {
+      0,   1,   2,   3,  55,  45,  46,  47,     /*   0 -   7 */
+     22,   5,  37,  11,  12,  13,  14,  15,     /*   8 -  15 */
+     16,  17,  18,  19,  60,  61,  50,  38,     /*  16 -  23 */
+     24,  25,  63,  39,  28,  29,  30,  31,     /*  24 -  31 */
+     64,  79, 127, 123,  91, 108,  80, 125,     /*  32 -  39 */
+     77,  93,  92,  78, 107,  96,  75,  97,     /*  40 -  47 */
+    240, 241, 242, 243, 244, 245, 246, 247,     /*  48 -  55 */
+    248, 249, 122,  94,  76, 126, 110, 111,     /*  56 -  63 */
+    124, 193, 194, 195, 196, 197, 198, 199,     /*  64 -  71 */
+    200, 201, 209, 210, 211, 212, 213, 214,     /*  72 -  79 */
+    215, 216, 217, 226, 227, 228, 229, 230,     /*  80 -  87 */
+    231, 232, 233,  74, 224,  90,  95, 109,     /*  88 -  95 */
+    121, 129, 130, 131, 132, 133, 134, 135,     /*  96 - 103 */
+    136, 137, 145, 146, 147, 148, 149, 150,     /* 104 - 111 */
+    151, 152, 153, 162, 163, 164, 165, 166,     /* 112 - 119 */
+    167, 168, 169, 192, 106, 208, 161,   7,     /* 120 - 127 */
+     32,  33,  34,  35,  36,  21,   6,  23,     /* 128 - 135 */
+     40,  41,  42,  43,  44,   9,  10,  27,     /* 136 - 143 */
+     48,  49,  26,  51,  52,  53,  54,   8,     /* 144 - 151 */
+     56,  57,  58,  59,   4,  20,  62, 225,     /* 152 - 159 */
+     65,  66,  67,  68,  69,  70,  71,  72,     /* 160 - 167 */
+     73,  81,  82,  83,  84,  85,  86,  87,     /* 168 - 175 */
+     88,  89,  98,  99, 100, 101, 102, 103,     /* 176 - 183 */
+    104, 105, 112, 113, 114, 115, 116, 117,     /* 184 - 191 */
+    118, 119, 120, 128, 138, 139, 140, 141,     /* 192 - 199 */
+    142, 143, 144, 154, 155, 156, 157, 158,     /* 200 - 207 */
+    159, 160, 170, 171, 172, 173, 174, 175,     /* 208 - 215 */
+    176, 177, 178, 179, 180, 181, 182, 183,     /* 216 - 223 */
+    184, 185, 186, 187, 188, 189, 190, 191,     /* 224 - 231 */
+    202, 203, 204, 205, 206, 207, 218, 219,     /* 232 - 239 */
+    220, 221, 222, 223, 234, 235, 236, 237,     /* 240 - 247 */
+    238, 239, 250, 251, 252, 253, 254, 255,     /* 248 - 255 */
+  };
+
+static unsigned char const ascii_to_ebcdic_ccc[256] =
+  {
+      0,   1,   2,   3,  55,  45,  46,  47,     /*   0 -   7 */
+     22,   5,  37,  11,  12,  13,  14,  15,     /*   8 -  15 */
+     16,  17,  18,  19,  60,  61,  50,  38,     /*  16 -  23 */
+     24,  25,  63,  39,  28,  29,  30,  31,     /*  24 -  31 */
+     64,  90, 127, 123,  91, 108,  80, 125,     /*  32 -  39 */
+     77,  93,  92,  78, 107,  96,  75,  97,     /*  40 -  47 */
+    240, 241, 242, 243, 244, 245, 246, 247,     /*  48 -  55 */
+    248, 249, 122,  94,  76, 126, 110, 111,     /*  56 -  63 */
+    124, 193, 194, 195, 196, 197, 198, 199,     /*  64 -  71 */
+    200, 201, 209, 210, 211, 212, 213, 214,     /*  72 -  79 */
+    215, 216, 217, 226, 227, 228, 229, 230,     /*  80 -  87 */
+    231, 232, 233,  74, 224,  79,  95, 109,     /*  88 -  95 */
+    121, 129, 130, 131, 132, 133, 134, 135,     /*  96 - 103 */
+    136, 137, 145, 146, 147, 148, 149, 150,     /* 104 - 111 */
+    151, 152, 153, 162, 163, 164, 165, 166,     /* 112 - 119 */
+    167, 168, 169, 192, 106, 208, 161,   7,     /* 120 - 127 */
+      4,   6,   8,   9,  10,  20,  21,  23,     /* 128 - 135 */
+     26,  27, 138, 139, 140, 141, 142, 143,     /* 136 - 143 */
+     32,  33,  34,  35,  36,  40,  41,  42,     /* 144 - 151 */
+     43,  44, 154, 155, 156, 157, 158, 159,     /* 152 - 159 */
+     48,  49,  51,  52,  53,  54,  56,  57,     /* 160 - 167 */
+     58,  59, 170, 171, 172, 173, 174, 175,     /* 168 - 175 */
+    176, 177, 178, 179, 180, 181, 182, 183,     /* 176 - 183 */
+    184, 185, 186, 187, 188, 189, 190, 191,     /* 184 - 191 */
+    128,  65,  66,  67,  68,  69,  70,  71,     /* 192 - 199 */
+     72,  73, 202, 203, 204, 205, 206, 207,     /* 200 - 207 */
+    144,  81,  82,  83,  84,  85,  86,  87,     /* 208 - 215 */
+     88,  89, 218, 219, 220, 221, 222, 223,     /* 216 - 223 */
+    160, 225,  98,  99, 100, 101, 102, 103,     /* 224 - 231 */
+    104, 105, 234, 235, 236, 237, 238, 239,     /* 232 - 239 */
+    112, 113, 114, 115, 116, 117, 118, 119,     /* 240 - 247 */
+    120,  62, 250, 251, 252, 253, 254, 255,     /* 248 - 255 */
+  };
+
+/* This is almost identical to GNU dd's "ibm" table.  In dd's "ibm"
+   table, both 91 and 213 recode to 173, both 93 and 229 recode to 189,
+   and no character recodes to 74 or 106.  I suspect two errors in there.
+   So, I arbitrarily choose to recode 213 by 74 and 229 by 106.  */
+
+static unsigned char const ascii_to_ebcdic_ibm[256] =
+  {
+      0,   1,   2,   3,  55,  45,  46,  47,     /*   0 -   7 */
+     22,   5,  37,  11,  12,  13,  14,  15,     /*   8 -  15 */
+     16,  17,  18,  19,  60,  61,  50,  38,     /*  16 -  23 */
+     24,  25,  63,  39,  28,  29,  30,  31,     /*  24 -  31 */
+     64,  90, 127, 123,  91, 108,  80, 125,     /*  32 -  39 */
+     77,  93,  92,  78, 107,  96,  75,  97,     /*  40 -  47 */
+    240, 241, 242, 243, 244, 245, 246, 247,     /*  48 -  55 */
+    248, 249, 122,  94,  76, 126, 110, 111,     /*  56 -  63 */
+    124, 193, 194, 195, 196, 197, 198, 199,     /*  64 -  71 */
+    200, 201, 209, 210, 211, 212, 213, 214,     /*  72 -  79 */
+    215, 216, 217, 226, 227, 228, 229, 230,     /*  80 -  87 */
+    231, 232, 233, 173, 224, 189,  95, 109,     /*  88 -  95 */
+    121, 129, 130, 131, 132, 133, 134, 135,     /*  96 - 103 */
+    136, 137, 145, 146, 147, 148, 149, 150,     /* 104 - 111 */
+    151, 152, 153, 162, 163, 164, 165, 166,     /* 112 - 119 */
+    167, 168, 169, 192,  79, 208, 161,   7,     /* 120 - 127 */
+     32,  33,  34,  35,  36,  21,   6,  23,     /* 128 - 135 */
+     40,  41,  42,  43,  44,   9,  10,  27,     /* 136 - 143 */
+     48,  49,  26,  51,  52,  53,  54,   8,     /* 144 - 151 */
+     56,  57,  58,  59,   4,  20,  62, 225,     /* 152 - 159 */
+     65,  66,  67,  68,  69,  70,  71,  72,     /* 160 - 167 */
+     73,  81,  82,  83,  84,  85,  86,  87,     /* 168 - 175 */
+     88,  89,  98,  99, 100, 101, 102, 103,     /* 176 - 183 */
+    104, 105, 112, 113, 114, 115, 116, 117,     /* 184 - 191 */
+    118, 119, 120, 128, 138, 139, 140, 141,     /* 192 - 199 */
+    142, 143, 144, 154, 155, 156, 157, 158,     /* 200 - 207 */
+    159, 160, 170, 171, 172,  74, 174, 175,     /* 208 - 215 */
+    176, 177, 178, 179, 180, 181, 182, 183,     /* 216 - 223 */
+    184, 185, 186, 187, 188, 106, 190, 191,     /* 224 - 231 */
+    202, 203, 204, 205, 206, 207, 218, 219,     /* 232 - 239 */
+    220, 221, 222, 223, 234, 235, 236, 237,     /* 240 - 247 */
+    238, 239, 250, 251, 252, 253, 254, 255,     /* 248 - 255 */
+  };
+
+static void
+init_ascii_ebcdic (STEP *step)
+{
+  step->one_to_one = ascii_to_ebcdic;
+}
+
+static void
+init_ebcdic_ascii (STEP *step)
+{
+  step->one_to_one = invert_table (ascii_to_ebcdic);
+}
+
+static void
+init_ascii_ebcdic_ccc (STEP *step)
+{
+  step->one_to_one = ascii_to_ebcdic_ccc;
+}
+
+static void
+init_ebcdic_ccc_ascii (STEP *step)
+{
+  step->one_to_one = invert_table (ascii_to_ebcdic_ccc);
+}
+
+static void
+init_ascii_ebcdic_ibm (STEP *step)
+{
+  step->one_to_one = ascii_to_ebcdic_ibm;
+}
+
+static void
+init_ebcdic_ibm_ascii (STEP *step)
+{
+  step->one_to_one = invert_table (ascii_to_ebcdic_ibm);
+}
+
+void
+module_ebcdic (void)
+{
+  declare_step (ASCII, "EBCDIC", REVERSIBLE, init_ascii_ebcdic,
+               file_one_to_one);
+  declare_step ("EBCDIC", ASCII, REVERSIBLE, init_ebcdic_ascii,
+               file_one_to_one);
+  declare_step (ASCII, "EBCDIC-CCC", REVERSIBLE, init_ascii_ebcdic_ccc,
+               file_one_to_one);
+  declare_step ("EBCDIC-CCC", ASCII, REVERSIBLE, init_ebcdic_ccc_ascii,
+               file_one_to_one);
+  declare_step (ASCII, "EBCDIC-IBM", REVERSIBLE, init_ascii_ebcdic_ibm,
+               file_one_to_one);
+  declare_step ("EBCDIC-IBM", ASCII, REVERSIBLE, init_ebcdic_ibm_ascii,
+               file_one_to_one);
+}
diff --git a/error.c b/error.c
new file mode 100644 (file)
index 0000000..19c2ba8
--- /dev/null
+++ b/error.c
@@ -0,0 +1,119 @@
+/* error.c -- error handler for noninteractive utilities
+   Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if HAVE_VPRINTF || HAVE_DOPRNT
+# if __STDC__
+#  include <stdarg.h>
+#  define VA_START(args, lastarg) va_start(args, lastarg)
+# else
+#  include <varargs.h>
+#  define VA_START(args, lastarg) va_start(args)
+# endif
+#else
+# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
+# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
+#endif
+
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <string.h>
+#else
+void exit ();
+#endif
+
+/* If NULL, error will flush stdout, then print on stderr the program
+   name, a colon and a space.  Otherwise, error will call this
+   function without parameters instead.  */
+void (*error_print_progname) () = NULL;
+
+/* The calling program should define program_name and set it to the
+   name of the executing program.  */
+extern char *program_name;
+
+#if HAVE_STRERROR
+char *strerror ();
+#else
+static char *
+private_strerror (errnum)
+     int errnum;
+{
+  extern char *sys_errlist[];
+  extern int sys_nerr;
+
+  if (errnum > 0 && errnum <= sys_nerr)
+    return sys_errlist[errnum];
+  return "Unknown system error";
+}
+#define strerror private_strerror
+#endif
+
+/* Print the program name and error message MESSAGE, which is a printf-style
+   format string with optional args.
+   If ERRNUM is nonzero, print its corresponding system error message.
+   Exit with status STATUS if it is nonzero.  */
+/* VARARGS */
+
+void
+#if defined(VA_START) && __STDC__
+error (int status, int errnum, const char *message, ...)
+#else
+error (status, errnum, message, va_alist)
+     int status;
+     int errnum;
+     char *message;
+     va_dcl
+#endif
+{
+#ifdef VA_START
+  va_list args;
+#endif
+
+  if (error_print_progname)
+    (*error_print_progname) ();
+  else
+    {
+      fflush (stdout);
+      fprintf (stderr, "%s: ", program_name);
+    }
+
+#ifdef VA_START
+  VA_START (args, message);
+# if HAVE_VPRINTF
+  vfprintf (stderr, message, args);
+# else
+  _doprnt (message, args, stderr);
+# endif
+  va_end (args);
+#else
+  fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif
+
+  if (errnum)
+    fprintf (stderr, ": %s", strerror (errnum));
+  putc ('\n', stderr);
+  fflush (stderr);
+  if (status)
+    exit (status);
+}
diff --git a/flat.c b/flat.c
new file mode 100644 (file)
index 0000000..1e22b88
--- /dev/null
+++ b/flat.c
@@ -0,0 +1,98 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+static int
+file_ascii_flat (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int input_char;              /* current character */
+  int temp_char;               /* look ahead character */
+
+  input_char = getc (input_file);
+  while (1)
+    switch (input_char)
+      {
+      case EOF:
+       return 0;
+
+      case '\n':
+      case '\t':
+       putc (input_char, output_file);
+       input_char = getc (input_file);
+       break;
+
+      case '\b':
+       input_char = getc (input_file);
+       switch (input_char)
+         {
+         case '\'':
+         case '`':
+         case '^':
+         case '"':
+         case '~':
+         case ',':
+         case '_':
+           input_char = getc (input_file);
+           break;
+
+         default:
+           putc ('\b', output_file);
+         }
+       break;
+
+      case '\'':
+      case '`':
+      case '^':
+      case '"':
+      case '~':
+      case ',':
+      case '_':
+       temp_char = getc (input_file);
+       if (temp_char == '\b')
+         input_char = getc (input_file);
+       else
+         {
+           putc (input_char, output_file);
+           input_char = temp_char;
+         }
+       break;
+
+      default:
+       if (input_char & (1 << 7))
+         {
+           putc ('M', output_file);
+           putc ('-', output_file);
+           input_char &= ~(~0 << 7);
+         }
+       if (input_char < ' ' || input_char == ~(~0 << 7))
+         {
+           putc ('^', output_file);
+           input_char ^= (1 << 6);
+         }
+       putc (input_char, output_file);
+       input_char = getc (input_file);
+      }
+}
+
+void
+module_flat (void)
+{
+  declare_step ("ASCII-BS", "flat", MANY_TO_MANY, NULL, file_ascii_flat);
+}
diff --git a/getopt.c b/getopt.c
new file mode 100644 (file)
index 0000000..43c0a6a
--- /dev/null
+++ b/getopt.c
@@ -0,0 +1,748 @@
+/* Getopt for GNU.
+   NOTE: getopt is now part of the C library, so if you don't know what
+   "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+   before changing it!
+
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94
+       Free Software Foundation, Inc.
+
+   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, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+\f
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
+   Ditto for AIX 3.2 and <stdlib.h>.  */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if !defined (__STDC__) || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+#include <stdlib.h>
+#endif /* GNU C library.  */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+   but it behaves differently for the user, since it allows the user
+   to intersperse the options with the other arguments.
+
+   As `getopt' works, it permutes the elements of ARGV so that,
+   when it is done, all the options precede everything else.  Thus
+   all application programs are extended to handle flexible argument order.
+
+   Setting the environment variable POSIXLY_CORRECT disables permutation.
+   Then the behavior is completely standard.
+
+   GNU application programs can use a third alternative mode in which
+   they can distinguish the relative order of options and other arguments.  */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+char *optarg = NULL;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+/* XXX 1003.2 says this must be 1 before any call.  */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+   in which the last option character we returned was found.
+   This allows us to pick up the scan where we left off.
+
+   If this is zero, or a null string, it means resume the scan
+   by advancing to the next ARGV-element.  */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+   for unrecognized options.  */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+   This must be initialized on some systems to avoid linking in the
+   system's own getopt implementation.  */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+   If the caller did not specify anything,
+   the default is REQUIRE_ORDER if the environment variable
+   POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+   REQUIRE_ORDER means don't recognize them as options;
+   stop option processing when the first non-option is seen.
+   This is what Unix does.
+   This mode of operation is selected by either setting the environment
+   variable POSIXLY_CORRECT, or using `+' as the first character
+   of the list of option characters.
+
+   PERMUTE is the default.  We permute the contents of ARGV as we scan,
+   so that eventually all the non-options are at the end.  This allows options
+   to be given in any order, even with programs that were not written to
+   expect this.
+
+   RETURN_IN_ORDER is an option available to programs that were written
+   to expect options and other ARGV-elements in any order and that care about
+   the ordering of the two.  We describe each non-option ARGV-element
+   as if it were the argument of an option with character code 1.
+   Using `-' as the first character of the list of option characters
+   selects this mode of operation.
+
+   The special argument `--' forces an end of option-scanning regardless
+   of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
+   `--' can cause `getopt' to return EOF with `optind' != ARGC.  */
+
+static enum
+{
+  REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+/* Value of POSIXLY_CORRECT environment variable.  */
+static char *posixly_correct;
+\f
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+   because there are many ways it can cause trouble.
+   On some systems, it contains special magic macros that don't work
+   in GCC.  */
+#include <string.h>
+#define        my_index        strchr
+#else
+
+/* Avoid depending on library functions or files
+   whose names are inconsistent.  */
+
+char *getenv ();
+
+static char *
+my_index (str, chr)
+     const char *str;
+     int chr;
+{
+  while (*str)
+    {
+      if (*str == chr)
+       return (char *) str;
+      str++;
+    }
+  return 0;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
+   That was relevant to code that was here before.  */
+#if !defined (__STDC__) || !__STDC__
+/* gcc with -traditional declares the built-in strlen to return int,
+   and has done so at least since version 2.4.5. -- rms.  */
+extern int strlen (const char *);
+#endif /* not __STDC__ */
+#endif /* __GNUC__ */
+
+#endif /* not __GNU_LIBRARY__ */
+\f
+/* Handle permutation of arguments.  */
+
+/* Describe the part of ARGV that contains non-options that have
+   been skipped.  `first_nonopt' is the index in ARGV of the first of them;
+   `last_nonopt' is the index after the last of them.  */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+   One subsequence is elements [first_nonopt,last_nonopt)
+   which contains all the non-options that have been skipped so far.
+   The other is elements [last_nonopt,optind), which contains all
+   the options processed since those non-options were skipped.
+
+   `first_nonopt' and `last_nonopt' are relocated so that they describe
+   the new indices of the non-options in ARGV after they are moved.  */
+
+static void
+exchange (argv)
+     char **argv;
+{
+  int bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+       {
+         /* Bottom segment is the short one.  */
+         int len = middle - bottom;
+         register int i;
+
+         /* Swap it with the top part of the top segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[top - (middle - bottom) + i];
+             argv[top - (middle - bottom) + i] = tem;
+           }
+         /* Exclude the moved bottom segment from further swapping.  */
+         top -= len;
+       }
+      else
+       {
+         /* Top segment is the short one.  */
+         int len = top - middle;
+         register int i;
+
+         /* Swap it with the bottom part of the bottom segment.  */
+         for (i = 0; i < len; i++)
+           {
+             tem = argv[bottom + i];
+             argv[bottom + i] = argv[middle + i];
+             argv[middle + i] = tem;
+           }
+         /* Exclude the moved top segment from further swapping.  */
+         bottom += len;
+       }
+    }
+
+  /* Update records for the slots the non-options now occupy.  */
+
+  first_nonopt += (optind - last_nonopt);
+  last_nonopt = optind;
+}
+
+/* Initialize the internal data when the first call is made.  */
+
+static const char *
+_getopt_initialize (optstring)
+     const char *optstring;
+{
+  /* Start processing options with ARGV-element 1 (since ARGV-element 0
+     is the program name); the sequence of previously skipped
+     non-option ARGV-elements is empty.  */
+
+  first_nonopt = last_nonopt = optind = 1;
+
+  nextchar = NULL;
+
+  posixly_correct = getenv ("POSIXLY_CORRECT");
+
+  /* Determine how to handle the ordering of options and nonoptions.  */
+
+  if (optstring[0] == '-')
+    {
+      ordering = RETURN_IN_ORDER;
+      ++optstring;
+    }
+  else if (optstring[0] == '+')
+    {
+      ordering = REQUIRE_ORDER;
+      ++optstring;
+    }
+  else if (posixly_correct != NULL)
+    ordering = REQUIRE_ORDER;
+  else
+    ordering = PERMUTE;
+
+  return optstring;
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+   given in OPTSTRING.
+
+   If an element of ARGV starts with '-', and is not exactly "-" or "--",
+   then it is an option element.  The characters of this element
+   (aside from the initial '-') are option characters.  If `getopt'
+   is called repeatedly, it returns successively each of the option characters
+   from each of the option elements.
+
+   If `getopt' finds another option character, it returns that character,
+   updating `optind' and `nextchar' so that the next call to `getopt' can
+   resume the scan with the following option character or ARGV-element.
+
+   If there are no more option characters, `getopt' returns `EOF'.
+   Then `optind' is the index in ARGV of the first ARGV-element
+   that is not an option.  (The ARGV-elements have been permuted
+   so that those that are not options now come last.)
+
+   OPTSTRING is a string containing the legitimate option characters.
+   If an option character is seen that is not listed in OPTSTRING,
+   return '?' after printing an error message.  If you set `opterr' to
+   zero, the error message is suppressed but we still return '?'.
+
+   If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+   so the following text in the same ARGV-element, or the text of the following
+   ARGV-element, is returned in `optarg'.  Two colons mean an option that
+   wants an optional arg; if there is text in the current ARGV-element,
+   it is returned in `optarg', otherwise `optarg' is set to zero.
+
+   If OPTSTRING starts with `-' or `+', it requests different methods of
+   handling the non-option ARGV-elements.
+   See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+   Long-named options begin with `--' instead of `-'.
+   Their names may be abbreviated as long as the abbreviation is unique
+   or is an exact match for some defined option.  If they have an
+   argument, it follows the option name in the same ARGV-element, separated
+   from the option name by a `=', or else the in next ARGV-element.
+   When `getopt' finds a long-named option, it returns 0 if that option's
+   `flag' field is nonzero, the value of the option's `val' field
+   if the `flag' field is zero.
+
+   The elements of ARGV aren't really const, because we permute them.
+   But we pretend they're const in the prototype to be compatible
+   with other systems.
+
+   LONGOPTS is a vector of `struct option' terminated by an
+   element containing a name which is zero.
+
+   LONGIND returns the index in LONGOPT of the long-named option found.
+   It is only valid when a long-named option has been found by the most
+   recent call.
+
+   If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+   long-named options.  */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+     const struct option *longopts;
+     int *longind;
+     int long_only;
+{
+  optarg = NULL;
+
+  if (optind == 0)
+    optstring = _getopt_initialize (optstring);
+
+  if (nextchar == NULL || *nextchar == '\0')
+    {
+      /* Advance to the next ARGV-element.  */
+
+      if (ordering == PERMUTE)
+       {
+         /* If we have just processed some options following some non-options,
+            exchange them so that the options come first.  */
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (last_nonopt != optind)
+           first_nonopt = optind;
+
+         /* Skip any additional non-options
+            and extend the range of non-options previously skipped.  */
+
+         while (optind < argc
+                && (argv[optind][0] != '-' || argv[optind][1] == '\0'))
+           optind++;
+         last_nonopt = optind;
+       }
+
+      /* The special ARGV-element `--' means premature end of options.
+        Skip it like a null option,
+        then exchange with previous non-options as if it were an option,
+        then skip everything else like a non-option.  */
+
+      if (optind != argc && !strcmp (argv[optind], "--"))
+       {
+         optind++;
+
+         if (first_nonopt != last_nonopt && last_nonopt != optind)
+           exchange ((char **) argv);
+         else if (first_nonopt == last_nonopt)
+           first_nonopt = optind;
+         last_nonopt = argc;
+
+         optind = argc;
+       }
+
+      /* If we have done all the ARGV-elements, stop the scan
+        and back over any non-options that we skipped and permuted.  */
+
+      if (optind == argc)
+       {
+         /* Set the next-arg-index to point at the non-options
+            that we previously skipped, so the caller will digest them.  */
+         if (first_nonopt != last_nonopt)
+           optind = first_nonopt;
+         return EOF;
+       }
+
+      /* If we have come to a non-option and did not permute it,
+        either stop the scan or describe it to the caller and pass it by.  */
+
+      if ((argv[optind][0] != '-' || argv[optind][1] == '\0'))
+       {
+         if (ordering == REQUIRE_ORDER)
+           return EOF;
+         optarg = argv[optind++];
+         return 1;
+       }
+
+      /* We have found another option-ARGV-element.
+        Skip the initial punctuation.  */
+
+      nextchar = (argv[optind] + 1
+                 + (longopts != NULL && argv[optind][1] == '-'));
+    }
+
+  /* Decode the current option-ARGV-element.  */
+
+  /* Check whether the ARGV-element is a long option.
+
+     If long_only and the ARGV-element has the form "-f", where f is
+     a valid short option, don't consider it an abbreviated form of
+     a long option that starts with f.  Otherwise there would be no
+     way to give the -f short option.
+
+     On the other hand, if there's a long option "fubar" and
+     the ARGV-element is "-fu", do consider that an abbreviation of
+     the long option, just like "--fu", and not "-f" with arg "u".
+
+     This distinction seems to be the most useful approach.  */
+
+  if (longopts != NULL
+      && (argv[optind][1] == '-'
+         || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
+    {
+      char *nameend;
+      const struct option *p;
+      const struct option *pfound = NULL;
+      int exact = 0;
+      int ambig = 0;
+      int indfound;
+      int option_index;
+
+      for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
+       /* Do nothing.  */ ;
+
+      /* Test all long options for either exact match
+        or abbreviated matches.  */
+      for (p = longopts, option_index = 0; p->name; p++, option_index++)
+       if (!strncmp (p->name, nextchar, nameend - nextchar))
+         {
+           if (nameend - nextchar == strlen (p->name))
+             {
+               /* Exact match found.  */
+               pfound = p;
+               indfound = option_index;
+               exact = 1;
+               break;
+             }
+           else if (pfound == NULL)
+             {
+               /* First nonexact match found.  */
+               pfound = p;
+               indfound = option_index;
+             }
+           else
+             /* Second or later nonexact match found.  */
+             ambig = 1;
+         }
+
+      if (ambig && !exact)
+       {
+         if (opterr)
+           fprintf (stderr, "%s: option `%s' is ambiguous\n",
+                    argv[0], argv[optind]);
+         nextchar += strlen (nextchar);
+         optind++;
+         return '?';
+       }
+
+      if (pfound != NULL)
+       {
+         option_index = indfound;
+         optind++;
+         if (*nameend)
+           {
+             /* Don't test has_arg with >, because some C compilers don't
+                allow it to be used on enums.  */
+             if (pfound->has_arg)
+               optarg = nameend + 1;
+             else
+               {
+                 if (opterr)
+                   {
+                     if (argv[optind - 1][1] == '-')
+                       /* --option */
+                       fprintf (stderr,
+                                "%s: option `--%s' doesn't allow an argument\n",
+                                argv[0], pfound->name);
+                     else
+                       /* +option or -option */
+                       fprintf (stderr,
+                            "%s: option `%c%s' doesn't allow an argument\n",
+                            argv[0], argv[optind - 1][0], pfound->name);
+                   }
+                 nextchar += strlen (nextchar);
+                 return '?';
+               }
+           }
+         else if (pfound->has_arg == 1)
+           {
+             if (optind < argc)
+               optarg = argv[optind++];
+             else
+               {
+                 if (opterr)
+                   fprintf (stderr, "%s: option `%s' requires an argument\n",
+                            argv[0], argv[optind - 1]);
+                 nextchar += strlen (nextchar);
+                 return optstring[0] == ':' ? ':' : '?';
+               }
+           }
+         nextchar += strlen (nextchar);
+         if (longind != NULL)
+           *longind = option_index;
+         if (pfound->flag)
+           {
+             *(pfound->flag) = pfound->val;
+             return 0;
+           }
+         return pfound->val;
+       }
+
+      /* Can't find it as a long option.  If this is not getopt_long_only,
+        or the option starts with '--' or is not a valid short
+        option, then it's an error.
+        Otherwise interpret it as a short option.  */
+      if (!long_only || argv[optind][1] == '-'
+         || my_index (optstring, *nextchar) == NULL)
+       {
+         if (opterr)
+           {
+             if (argv[optind][1] == '-')
+               /* --option */
+               fprintf (stderr, "%s: unrecognized option `--%s'\n",
+                        argv[0], nextchar);
+             else
+               /* +option or -option */
+               fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+                        argv[0], argv[optind][0], nextchar);
+           }
+         nextchar = (char *) "";
+         optind++;
+         return '?';
+       }
+    }
+
+  /* Look at and handle the next short option-character.  */
+
+  {
+    char c = *nextchar++;
+    char *temp = my_index (optstring, c);
+
+    /* Increment `optind' when we start to process its last character.  */
+    if (*nextchar == '\0')
+      ++optind;
+
+    if (temp == NULL || c == ':')
+      {
+       if (opterr)
+         {
+           if (posixly_correct)
+             /* 1003.2 specifies the format of this message.  */
+             fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+           else
+             fprintf (stderr, "%s: invalid option -- %c\n", argv[0], c);
+         }
+       optopt = c;
+       return '?';
+      }
+    if (temp[1] == ':')
+      {
+       if (temp[2] == ':')
+         {
+           /* This is an option that accepts an argument optionally.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               optind++;
+             }
+           else
+             optarg = NULL;
+           nextchar = NULL;
+         }
+       else
+         {
+           /* This is an option that requires an argument.  */
+           if (*nextchar != '\0')
+             {
+               optarg = nextchar;
+               /* If we end this ARGV-element by taking the rest as an arg,
+                  we must advance to the next element now.  */
+               optind++;
+             }
+           else if (optind == argc)
+             {
+               if (opterr)
+                 {
+                   /* 1003.2 specifies the format of this message.  */
+                   fprintf (stderr, "%s: option requires an argument -- %c\n",
+                            argv[0], c);
+                 }
+               optopt = c;
+               if (optstring[0] == ':')
+                 c = ':';
+               else
+                 c = '?';
+             }
+           else
+             /* We already incremented `optind' once;
+                increment it again when taking next ARGV-elt as argument.  */
+             optarg = argv[optind++];
+           nextchar = NULL;
+         }
+      }
+    return c;
+  }
+}
+
+int
+getopt (argc, argv, optstring)
+     int argc;
+     char *const *argv;
+     const char *optstring;
+{
+  return _getopt_internal (argc, argv, optstring,
+                          (const struct option *) 0,
+                          (int *) 0,
+                          0);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__.  */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+   the above definition of `getopt'.  */
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+
+      c = getopt (argc, argv, "abc:d:0123456789");
+      if (c == EOF)
+       break;
+
+      switch (c)
+       {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/getopt.h b/getopt.h
new file mode 100644 (file)
index 0000000..4ac33b7
--- /dev/null
+++ b/getopt.h
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+   Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
+
+   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, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized.  */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if defined (__STDC__) && __STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define        no_argument             0
+#define required_argument      1
+#define optional_argument      2
+
+#if defined (__STDC__) && __STDC__
+#ifdef __GNU_LIBRARY__
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind,
+                            int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/getopt1.c b/getopt1.c
new file mode 100644 (file)
index 0000000..4580211
--- /dev/null
+++ b/getopt1.c
@@ -0,0 +1,180 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+   Copyright (C) 1987, 88, 89, 90, 91, 92, 1993, 1994
+       Free Software Foundation, Inc.
+
+   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, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+\f
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "getopt.h"
+
+#if !defined (__STDC__) || !__STDC__
+/* This is a separate conditional since some stdc systems
+   reject `defined (const)'.  */
+#ifndef const
+#define const
+#endif
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+   actually compiling the library itself.  This code is part of the GNU C
+   Library, but also included in many other GNU distributions.  Compiling
+   and linking in this code is a waste when using the GNU C library
+   (especially if it is a shared library).  Rather than having every GNU
+   program understand `configure --with-gnu-libc' and omit the object files,
+   it is simpler to just do this in the source for each such file.  */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+   to get __GNU_LIBRARY__ defined.  */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#else
+char *getenv ();
+#endif
+
+#ifndef        NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+   If an option that starts with '-' (not '--') doesn't match a long option,
+   but does match a short option, it is parsed as a short option
+   instead.  */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+     int argc;
+     char *const *argv;
+     const char *options;
+     const struct option *long_options;
+     int *opt_index;
+{
+  return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* _LIBC or not __GNU_LIBRARY__.  */
+\f
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+     int argc;
+     char **argv;
+{
+  int c;
+  int digit_optind = 0;
+
+  while (1)
+    {
+      int this_option_optind = optind ? optind : 1;
+      int option_index = 0;
+      static struct option long_options[] =
+      {
+       {"add", 1, 0, 0},
+       {"append", 0, 0, 0},
+       {"delete", 1, 0, 0},
+       {"verbose", 0, 0, 0},
+       {"create", 0, 0, 0},
+       {"file", 1, 0, 0},
+       {0, 0, 0, 0}
+      };
+
+      c = getopt_long (argc, argv, "abc:d:0123456789",
+                      long_options, &option_index);
+      if (c == EOF)
+       break;
+
+      switch (c)
+       {
+       case 0:
+         printf ("option %s", long_options[option_index].name);
+         if (optarg)
+           printf (" with arg %s", optarg);
+         printf ("\n");
+         break;
+
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+         if (digit_optind != 0 && digit_optind != this_option_optind)
+           printf ("digits occur in two different argv-elements.\n");
+         digit_optind = this_option_optind;
+         printf ("option %c\n", c);
+         break;
+
+       case 'a':
+         printf ("option a\n");
+         break;
+
+       case 'b':
+         printf ("option b\n");
+         break;
+
+       case 'c':
+         printf ("option c with value `%s'\n", optarg);
+         break;
+
+       case 'd':
+         printf ("option d with value `%s'\n", optarg);
+         break;
+
+       case '?':
+         break;
+
+       default:
+         printf ("?? getopt returned character code 0%o ??\n", c);
+       }
+    }
+
+  if (optind < argc)
+    {
+      printf ("non-option ARGV-elements: ");
+      while (optind < argc)
+       printf ("%s ", argv[optind++]);
+      printf ("\n");
+    }
+
+  exit (0);
+}
+
+#endif /* TEST */
diff --git a/htmllat1.l b/htmllat1.l
new file mode 100644 (file)
index 0000000..a34a372
--- /dev/null
@@ -0,0 +1,102 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* Step name: html_latin1.  */
+
+%%
+
+&amp;          { if (diacritics_only) ECHO; else output (38); }
+&lt;           { if (diacritics_only) ECHO; else output (60); }
+&gt;           { if (diacritics_only) ECHO; else output (62); }
+
+&Agrave;       { output (192); }
+&Aacute;       { output (193); }
+&Acircu;       { output (194); }
+&Atilde;       { output (195); }
+&Adiaer;       { output (196); }
+&Aring;                { output (197); }
+&AE;           { output (198); }
+&Ccedil;       { output (199); }
+&Egrave;       { output (200); }
+&Eacute;       { output (201); }
+&Ecircu;       { output (202); }
+&Ediaer;       { output (203); }
+&Igrave;       { output (204); }
+&Iacute;       { output (205); }
+&Icircu;       { output (206); }
+&Idiaer;       { output (207); }
+&ETH;          { output (208); }
+&Ntilde;       { output (209); }
+&Ograve;       { output (210); }
+&Oacute;       { output (211); }
+&Ocircu;       { output (212); }
+&Otilde;       { output (213); }
+&Odiaer;       { output (214); }
+&MULT;         { output (215); }
+&Ostroke;      { output (216); }
+&Ugrave;       { output (217); }
+&Uacute;       { output (218); }
+&Ucircu;       { output (219); }
+&Udiaer;       { output (220); }
+&Yacute;       { output (221); }
+&THORN;                { output (222); }
+&ssharp;       { output (223); }
+&agrave;       { output (224); }
+&aacute;       { output (225); }
+&acircu;       { output (226); }
+&atilde;       { output (227); }
+&adiaer;       { output (228); }
+&aring;                { output (229); }
+&ae;           { output (230); }
+&ccedil;       { output (231); }
+&egrave;       { output (232); }
+&eacute;       { output (233); }
+&ecircu;       { output (234); }
+&ediaer;       { output (235); }
+&igrave;       { output (236); }
+&iacute;       { output (237); }
+&icircu;       { output (238); }
+&idiaer;       { output (239); }
+&eth;          { output (240); }
+&ntilde;       { output (241); }
+&ograve;       { output (242); }
+&oacute;       { output (243); }
+&ocircu;       { output (244); }
+&otilde;       { output (245); }
+&odiaer;       { output (246); }
+&DIVIS;                { output (247); }
+&ostroke;      { output (248); }
+&ugrave;       { output (249); }
+&uacute;       { output (250); }
+&ucircu;       { output (251); }
+&udiaer;       { output (252); }
+&yacute;       { output (253); }
+&thorn;                { output (254); }
+&ydiaer;       { output (255); }
+
+%%
+
+void
+module_html_latin1 (void)
+{
+  declare_step ("HTML", "latin1", MANY_TO_ONE, NULL, file_html_latin1);
+
+  declare_alias ("WWW", "HTML");
+  declare_alias ("w3", "HTML");
+}
diff --git a/ibmpc.c b/ibmpc.c
new file mode 100644 (file)
index 0000000..dbcaff9
--- /dev/null
+++ b/ibmpc.c
@@ -0,0 +1,323 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+#define DOS_EOF 26             /* old end of file */
+#define DOS_CR 13              /* carriage return */
+#define DOS_LF 10              /* line feed */
+
+/* Correspondance for IBM PC ruler graphics characters into ASCII graphics
+   approximations.  The current principles are:
+
+   - Single horizontal rulers are made up of dashes.
+   - Double horizontal rulers are made up of equal signs.
+   - Both single and double vertical are made up with `|'.
+   - Both upper corners are rounded down with periods.
+   - Lower corners are rounded up with grave/acute accent on left/right.
+   - Other crossing rulers are approximated with plus signs, with exceptions
+     for double horizontal ruler crossings but not at corners: they are
+     equal signs inside a table, and `|' at left or right margin.
+*/
+
+unsigned char convert_rulers[48] =
+  {
+    '#',                       /* 176 */
+    '#',                       /* 177 */
+    '#',                       /* 178 */
+    '|',                       /* 179 */
+    '+',                       /* 180 */
+    '|',                       /* 181 */
+    '+',                       /* 182 */
+    '.',                       /* 183 */
+    '.',                       /* 184 */
+    '|',                       /* 185 */
+    '|',                       /* 186 */
+    '.',                       /* 187 */
+    '\'',                      /* 188 */
+    '\'',                      /* 189 */
+    '\'',                      /* 190 */
+    '.',                       /* 191 */
+    '`',                       /* 192 */
+    '+',                       /* 193 */
+    '+',                       /* 194 */
+    '+',                       /* 195 */
+    '-',                       /* 196 */
+    '+',                       /* 197 */
+    '|',                       /* 198 */
+    '+',                       /* 199 */
+    '`',                       /* 200 */
+    '.',                       /* 201 */
+    '=',                       /* 202 */
+    '=',                       /* 203 */
+    '|',                       /* 204 */
+    '=',                       /* 205 */
+    '=',                       /* 206 */
+    '=',                       /* 207 */
+    '+',                       /* 208 */
+    '=',                       /* 209 */
+    '+',                       /* 210 */
+    '`',                       /* 211 */
+    '`',                       /* 212 */
+    '.',                       /* 213 */
+    '.',                       /* 214 */
+    '+',                       /* 215 */
+    '=',                       /* 216 */
+    '\'',                      /* 217 */
+    '.',                       /* 218 */
+    '#',                       /* 219 */
+    '#',                       /* 220 */
+    '#',                       /* 221 */
+    '#',                       /* 222 */
+    '#',                       /* 223 */
+  };
+
+/* Data for IBM PC to ISO Latin-1 code conversions.  */
+
+static KNOWN_PAIR known_pairs[] =
+  {
+    { 20, 182},                        /* pilcrow sign */
+    { 21, 167},                        /* section sign */
+
+    {128, 199},                        /* capital letter C with cedilla */
+    {129, 252},                        /* small letter u with diaeresis */
+    {130, 233},                        /* small letter e with acute accent */
+    {131, 226},                        /* small letter a with circumflex accent */
+    {132, 228},                        /* small letter a with diaeresis */
+    {133, 224},                        /* small letter a with grave accent */
+    {134, 229},                        /* small letter a with ring above */
+    {135, 231},                        /* small letter c with cedilla */
+    {136, 234},                        /* small letter e with circumflex accent */
+    {137, 235},                        /* small letter e with diaeresis */
+    {138, 232},                        /* small letter e with grave accent */
+    {139, 239},                        /* small letter i with diaeresis */
+    {140, 238},                        /* small letter i with circumflex accent */
+    {141, 236},                        /* small letter i with grave accent */
+    {142, 196},                        /* capital letter A with diaeresis */
+    {143, 197},                        /* capital letter A with ring above */
+    {144, 201},                        /* capital letter E with acute accent */
+    {145, 230},                        /* small ligature a with e */
+    {146, 198},                        /* capital ligature A with E */
+    {147, 244},                        /* small letter o with circumblex accent */
+    {148, 246},                        /* small letter o with diaeresis */
+    {149, 242},                        /* small letter o with grave accent */
+    {150, 251},                        /* small letter u with circumflex accent */
+    {151, 249},                        /* small letter u with grave accent */
+    {152, 255},                        /* small letter y with diaeresis */
+    {153, 214},                        /* capital letter O with diaeresis */
+    {154, 220},                        /* capital letter U with diaeresis */
+    {155, 162},                        /* cent sign */
+    {156, 163},                        /* pound sign */
+    {157, 165},                        /* yen sign */
+
+    {160, 225},                        /* small letter a with acute accent */
+    {161, 237},                        /* small letter i with acute accent */
+    {162, 243},                        /* small letter o with acute accent */
+    {163, 250},                        /* small letter u with acute accent */
+    {164, 241},                        /* small letter n with tilde */
+    {165, 209},                        /* capital letter N with tilde */
+    {166, 170},                        /* feminine ordinal indicator */
+    {167, 186},                        /* masculine ordinal indicator */
+    {168, 191},                        /* inverted question mark */
+
+    {170, 172},                        /* not sign */
+    {171, 189},                        /* vulgar fraction one half */
+    {172, 188},                        /* vulgar fraction one quarter */
+    {173, 161},                        /* inverted exclamation mark */
+    {174, 171},                        /* left angle quotation mark */
+    {175, 187},                        /* right angle quotation mark */
+
+    {225, 223},                        /* small german letter sharp s */
+
+    {230, 181},                        /* small Greek letter mu micro sign */
+
+    {241, 177},                        /* plus-minus sign */
+
+    {246, 247},                        /* division sign */
+
+    {248, 176},                        /* degree sign */
+
+    {250, 183},                        /* middle dot */
+
+    {253, 178},                        /* superscript two */
+
+    {255, 160},                        /* no-break space */
+  };
+#define NUMBER_OF_PAIRS (sizeof (known_pairs) / sizeof (KNOWN_PAIR))
+
+static int
+file_latin1_ibmpc (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int reversible;              /* reversibility of recoding */
+  const unsigned char *table;  /* one to one conversion table */
+  const char *const *table2;   /* one to many conversion table */
+  int input_char;              /* current character */
+
+  reversible = 1;
+  if (strict_mapping)
+    {
+      table2 = step->one_to_many;
+      while (input_char = getc (input_file), input_char != EOF)
+       if (input_char == '\n')
+         {
+           putc (DOS_CR, output_file);
+           putc (DOS_LF, output_file);
+         }
+       else if (table2[input_char])
+         putc (*table2[input_char], output_file);
+       else
+         reversible = 0;
+    }
+  else
+    {
+      table = step->one_to_one;
+      while (input_char = getc (input_file), input_char != EOF)
+       if (input_char == '\n')
+         {
+           putc (DOS_CR, output_file);
+           putc (DOS_LF, output_file);
+         }
+       else
+         putc (table[input_char], output_file);
+    }
+  return reversible;
+}
+
+static int
+file_ibmpc_latin1 (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int reversible;              /* reversibility of recoding */
+  const unsigned char *table;  /* one to one conversion table */
+  const char *const *table2;   /* one to many conversion table */
+  int input_char;              /* current character */
+
+  reversible = 1;
+  if (strict_mapping)
+    {
+      table2 = step->one_to_many;
+      input_char = getc (input_file);
+      while (1)
+       switch (input_char)
+         {
+         case EOF:
+           return reversible;
+
+         case DOS_EOF:
+           return 0;
+
+         case DOS_CR:
+           input_char = getc (input_file);
+           if (input_char == DOS_LF)
+             {
+               putc ('\n', output_file);
+               input_char = getc (input_file);
+             }
+           else if (table2[DOS_CR])
+             putc (*table2[DOS_CR], output_file);
+           else
+             reversible = 0;
+           break;
+
+         case DOS_LF:
+           reversible = 0;
+           /* Fall through.  */
+
+         default:
+           if (table2[input_char])
+             putc (*table2[input_char], output_file);
+           else
+             reversible = 0;
+           input_char = getc (input_file);
+         }
+    }
+  else
+    {
+      table = step->one_to_one;
+      input_char = getc (input_file);
+      while (1)
+       switch (input_char)
+         {
+         case EOF:
+           return reversible;
+
+         case DOS_EOF:
+           return 0;
+
+         case DOS_CR:
+           input_char = getc (input_file);
+           if (input_char == DOS_LF)
+             {
+               putc ('\n', output_file);
+               input_char = getc (input_file);
+             }
+           else
+             putc (table[DOS_CR], output_file);
+           break;
+
+         case DOS_LF:
+           reversible = 0;
+           /* Fall through.  */
+
+         default:
+           putc (table[input_char], output_file);
+           input_char = getc (input_file);
+         }
+    }
+}
+
+static void
+init_latin1_ibmpc (STEP *step)
+{
+  complete_pairs (step, 1, known_pairs, NUMBER_OF_PAIRS, 1);
+  step->file_recode = file_latin1_ibmpc;
+}
+
+static void
+init_ibmpc_latin1 (STEP *step)
+{
+  unsigned char *table;
+
+  complete_pairs (step, 1, known_pairs, NUMBER_OF_PAIRS, 0);
+  step->file_recode = file_ibmpc_latin1;
+
+  /* FIXME: Allow ascii_graphics even with strict_mapping.  Reported by
+     David E. A. Wilson <david@osiris.cs.uow.edu.au>.  */
+
+  if (ascii_graphics)
+    {
+      table = (unsigned char *) xmalloc (256);
+      memcpy (table, step->one_to_one, 256);
+      memcpy (table + 176, convert_rulers, 48);
+      free ((void *) step->one_to_one);
+      step->one_to_one = table;
+    }
+}
+
+void
+module_ibmpc (void)
+{
+  declare_step ("Latin-1", "IBM-PC", ONE_TO_MANY, init_latin1_ibmpc, NULL);
+  declare_step ("IBM-PC", "Latin-1",
+               strict_mapping ? MANY_TO_MANY : MANY_TO_ONE,
+               init_ibmpc_latin1, NULL);
+
+#if 0
+  declare_alias ("IBM-PC", "ibm437");
+#endif
+}
diff --git a/iconqnx.c b/iconqnx.c
new file mode 100644 (file)
index 0000000..36e5d9c
--- /dev/null
+++ b/iconqnx.c
@@ -0,0 +1,228 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+#define DOS_CR 13              /* carriage return */
+#define DOS_LF 10              /* line feed */
+#define DOS_EOF 26             /* old end of file */
+
+#define ESCAPE 25              /* escape for diacritic application */
+#define ENDLINE 30             /* end-line code for QNX */
+
+#define TRANSLATE_AND_BREAK(c2, c3) \
+  putc (ESCAPE, output_file); \
+  putc (c2, output_file); \
+  putc (c3, output_file); \
+  input_char = getc (input_file); \
+  break;
+
+static int
+file_ibmpc_iconqnx (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int reversible;              /* reversibility of recoding */
+  int input_char;
+
+  reversible = 1;
+  input_char = getc (input_file);
+  while (1)
+    switch (input_char)
+      {
+      case EOF:
+       return reversible;
+
+      case DOS_EOF:
+       return 0;
+
+      case 133: TRANSLATE_AND_BREAK ('A', 'a');
+      case 138: TRANSLATE_AND_BREAK ('A', 'e');
+      case 151: TRANSLATE_AND_BREAK ('A', 'u');
+      case 130: TRANSLATE_AND_BREAK ('B', 'e');
+      case 144: TRANSLATE_AND_BREAK ('B', 'E');
+      case 131: TRANSLATE_AND_BREAK ('C', 'a');
+      case 136: TRANSLATE_AND_BREAK ('C', 'e');
+      case 140: TRANSLATE_AND_BREAK ('C', 'i');
+      case 147: TRANSLATE_AND_BREAK ('C', 'o');
+      case 150: TRANSLATE_AND_BREAK ('C', 'u');
+      case 137: TRANSLATE_AND_BREAK ('H', 'e');
+      case 139: TRANSLATE_AND_BREAK ('H', 'i');
+      case 129: TRANSLATE_AND_BREAK ('H', 'u');
+      case 135: TRANSLATE_AND_BREAK ('K', 'c');
+      case 128: TRANSLATE_AND_BREAK ('K', 'C');
+
+      case DOS_CR:
+       input_char = getc (input_file);
+       if (input_char == DOS_LF)
+         {
+           putc (ENDLINE, output_file);
+           input_char = getc (input_file);
+         }
+       else
+         putc (DOS_CR, output_file);
+       break;
+
+      case ENDLINE:
+      case ESCAPE:
+       reversible = 0;
+       /* Fall through.  */
+
+      default:
+       putc (input_char, output_file);
+       input_char = getc (input_file);
+      }
+}
+
+static int
+file_iconqnx_ibmpc (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int reversible;              /* reversibility of recoding */
+  int input_char;              /* current character */
+
+  reversible = 1;
+  input_char = getc (input_file);
+  while (1)
+    switch (input_char)
+      {
+      case EOF:
+       return reversible;
+
+      case ENDLINE:
+       putc (DOS_CR, output_file);
+       putc (DOS_LF, output_file);
+       input_char = getc (input_file);
+       break;
+
+      case DOS_CR:
+       input_char = getc (input_file);
+       if (input_char == DOS_LF)
+         reversible = 0;
+       putc (DOS_CR, output_file);
+       break;
+
+      case ESCAPE:
+       input_char = getc (input_file);
+       switch (input_char)
+         {
+         case 'A':
+           input_char = getc (input_file);
+           switch (input_char)
+             {
+             case 'a': input_char = 133; break;
+             case 'e': input_char = 138; break;
+             case 'u': input_char = 151; break;
+
+             default:
+               reversible = 0;
+               putc (ESCAPE, output_file);
+               putc ('A', output_file);
+               if (input_char == EOF)
+                 return 0;
+             }
+           break;
+
+         case 'B':
+           input_char = getc (input_file);
+           switch (input_char)
+             {
+             case 'e': input_char = 130; break;
+             case 'E': input_char = 144; break;
+
+             default:
+               reversible = 0;
+               putc (ESCAPE, output_file);
+               putc ('B', output_file);
+               if (input_char == EOF)
+                 return 0;
+             }
+           break;
+
+         case 'C':
+           input_char = getc (input_file);
+           switch (input_char)
+             {
+             case 'a': input_char = 131; break;
+             case 'e': input_char = 136; break;
+             case 'i': input_char = 140; break;
+             case 'o': input_char = 147; break;
+             case 'u': input_char = 150; break;
+
+             default:
+               reversible = 0;
+               putc (ESCAPE, output_file);
+               putc ('C', output_file);
+               if (input_char == EOF)
+                 return 0;
+             }
+           break;
+
+         case 'H':
+           input_char = getc (input_file);
+           switch (input_char)
+             {
+             case 'e': input_char = 137; break;
+             case 'i': input_char = 139; break;
+             case 'u': input_char = 129; break;
+
+             default:
+               reversible = 0;
+               putc (ESCAPE, output_file);
+               putc ('H', output_file);
+               if (input_char == EOF)
+                 return 0;
+             }
+           break;
+
+         case 'K':
+           input_char = getc (input_file);
+           switch (input_char)
+             {
+             case 'c': input_char = 135; break;
+             case 'C': input_char = 128; break;
+
+             default:
+               reversible = 0;
+               putc (ESCAPE, output_file);
+               putc ('K', output_file);
+               if (input_char == EOF)
+                 return 0;
+             }
+           break;
+
+         default:
+           reversible = 0;
+           putc (ESCAPE, output_file);
+           if (input_char == EOF)
+             return 0;
+         }
+       /* Fall through.  */
+
+      default:
+       putc (input_char, output_file);
+       input_char = getc (input_file);
+      }
+}
+
+void
+module_iconqnx (void)
+{
+  declare_step ("IBM-PC", "Icon-QNX", MANY_TO_MANY, NULL, file_ibmpc_iconqnx);
+  declare_step ("Icon-QNX", "IBM-PC", MANY_TO_MANY, NULL, file_iconqnx_ibmpc);
+
+  declare_alias ("QNX", "Icon-QNX");
+}
diff --git a/initstep.h b/initstep.h
new file mode 100644 (file)
index 0000000..1cd8178
--- /dev/null
@@ -0,0 +1,19 @@
+  module_charset1 ();
+  module_charset2 ();
+  module_applemac ();
+  module_atarist ();
+  module_bangbang ();
+  module_cdcnos ();
+  module_ebcdic ();
+  module_flat ();
+  module_ibmpc ();
+  module_iconqnx ();
+  module_latin1_ascii ();
+  module_latin1_html ();
+  module_latin1_latex ();
+  module_latin1_texte ();
+  module_next ();
+  module_ascii_latin1 ();
+  module_html_latin1 ();
+  module_latex_latin1 ();
+  module_texte_latin1 ();
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..ab74c88
--- /dev/null
@@ -0,0 +1,238 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+tranformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/lat1asci.c b/lat1asci.c
new file mode 100644 (file)
index 0000000..3382d4d
--- /dev/null
@@ -0,0 +1,182 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+static const char *const translation_table[128] =
+  {
+    NULL,                      /* 128 */
+    NULL,                      /* 129 */
+    NULL,                      /* 130 */
+    NULL,                      /* 131 */
+    NULL,                      /* 132 */
+    NULL,                      /* 133 */
+    NULL,                      /* 134 */
+    NULL,                      /* 135 */
+    NULL,                      /* 136 */
+    NULL,                      /* 137 */
+    NULL,                      /* 138 */
+    NULL,                      /* 139 */
+    NULL,                      /* 140 */
+    NULL,                      /* 141 */
+    NULL,                      /* 142 */
+    NULL,                      /* 143 */
+    NULL,                      /* 144 */
+    NULL,                      /* 145 */
+    NULL,                      /* 146 */
+    NULL,                      /* 147 */
+    NULL,                      /* 148 */
+    NULL,                      /* 149 */
+    NULL,                      /* 150 */
+    NULL,                      /* 151 */
+    NULL,                      /* 152 */
+    NULL,                      /* 153 */
+    NULL,                      /* 154 */
+    NULL,                      /* 155 */
+    NULL,                      /* 156 */
+    NULL,                      /* 157 */
+    NULL,                      /* 158 */
+    NULL,                      /* 159 */
+
+    " ",                       /* 160 no-break space */
+    NULL,                      /* 161 inverted exclamation mark */
+    NULL,                      /* 162 cent sign */
+    NULL,                      /* 163 pound sign */
+    NULL,                      /* 164 currency sign */
+    NULL,                      /* 165 yen sign */
+    NULL,                      /* 166 broken bar */
+    NULL,                      /* 167 paragraph sign, section sign */
+    NULL,                      /* 168 diaeresis */
+    NULL,                      /* 169 copyright sign */
+    NULL,                      /* 170 feminine ordinal indicator */
+    "<\b\"",                   /* 171 left angle quotation mark */
+    NULL,                      /* 172 not sign */
+    NULL,                      /* 173 soft hyphen */
+    NULL,                      /* 174 registered trade mark sign */
+    NULL,                      /* 175 macron */
+    NULL,                      /* 176 degree sign */
+    NULL,                      /* 177 plus-minus sign */
+    NULL,                      /* 178 superscript two */
+    NULL,                      /* 179 superscript three */
+    NULL,                      /* 180 acute accent */
+    NULL,                      /* 181 small greek mu, micro sign */
+    NULL,                      /* 182 pilcrow sign */
+    NULL,                      /* 183 middle dot */
+    NULL,                      /* 184 cedilla */
+    NULL,                      /* 185 superscript one */
+    NULL,                      /* 186 masculine ordinal indicator */
+    ">\b\"",                   /* 187 right angle quotation mark */
+    NULL,                      /* 188 vulgar fraction one quarter */
+    NULL,                      /* 189 vulgar fraction one half */
+    NULL,                      /* 190 vulgar fraction three quarters */
+    NULL,                      /* 191 inverted question mark */
+    "`\bA",                    /* 192 capital A with grave accent */
+    "'\bA",                    /* 193 capital A with acute accent */
+    "^\bA",                    /* 194 capital A with circumflex accent */
+    "~\bA",                    /* 195 capital A with tilde */
+    "\"\bA",                   /* 196 capital A diaeresis */
+    NULL,                      /* 197 capital A with ring above */
+    NULL,                      /* 198 capital diphthong A with E */
+    ",\bC",                    /* 199 capital C with cedilla */
+    "`\bE",                    /* 200 capital E with grave accent */
+    "'\bE",                    /* 201 capital E with acute accent */
+    "^\bE",                    /* 202 capital E with circumflex accent */
+    "\"\bE",                   /* 203 capital E with diaeresis */
+    "`\bI",                    /* 204 capital I with grave accent */
+    "'\bI",                    /* 205 capital I with acute accent */
+    "^\bI",                    /* 206 capital I with circumflex accent */
+    "\"\bI",                   /* 207 capital I with diaeresis */
+    NULL,                      /* 208 capital icelandic ETH */
+    "~\bN",                    /* 209 capital N with tilde */
+    "`\bO",                    /* 210 capital O with grave accent */
+    "'\bO",                    /* 211 capital O with acute accent */
+    "^\bO",                    /* 212 capital O with circumflex accent */
+    "~\bO",                    /* 213 capital O with tilde */
+    "\"\bO",                   /* 214 capital O with diaeresis */
+    NULL,                      /* 215 multiplication sign */
+    "/\bO",                    /* 216 capital O with oblique stroke */
+    "`\bU",                    /* 217 capital U with grave accent */
+    "'\bU",                    /* 218 capital U with acute accent */
+    "^\bU",                    /* 219 capital U with circumflex accent */
+    "\"\bU",                   /* 220 capital U with diaeresis */
+    "'\bY",                    /* 221 capital Y with acute accent */
+    NULL,                      /* 222 capital icelandic THORN */
+    "\"\bs",                   /* 223 small german sharp s */
+    "`\ba",                    /* 224 small a with grave accent */
+    "'\ba",                    /* 225 small a with acute accent */
+    "^\ba",                    /* 226 small a with circumflex accent */
+    "~\ba",                    /* 227 small a with tilde */
+    "\"\ba",                   /* 228 small a with diaeresis */
+    NULL,                      /* 229 small a with ring above */
+    NULL,                      /* 230 small diphthong a with e */
+    ",\bc",                    /* 231 small c with cedilla */
+    "`\be",                    /* 232 small e with grave accent */
+    "'\be",                    /* 233 small e with acute accent */
+    "^\be",                    /* 234 small e with circumflex accent */
+    "\"\be",                   /* 235 small e with diaeresis */
+    "`\bi",                    /* 236 small i with grave accent */
+    "'\bi",                    /* 237 small i with acute accent */
+    "^\bi",                    /* 238 small i with circumflex accent */
+    "\"\bi",                   /* 239 small i with diaeresis */
+    NULL,                      /* 240 small icelandic eth */
+    "~\bn",                    /* 241 small n with tilde */
+    "`\bo",                    /* 242 small o with grave accent */
+    "'\bo",                    /* 243 small o with acute accent */
+    "^\bo",                    /* 244 small o with circumflex accent */
+    "~\bo",                    /* 245 small o with tilde */
+    "\"\bo",                   /* 246 small o with diaeresis */
+    NULL,                      /* 247 division sign */
+    "/\bo",                    /* 248 small o with oblique stroke */
+    "`\bu",                    /* 249 small u with grave accent */
+    "'\bu",                    /* 250 small u with acute accent */
+    "^\bu",                    /* 251 small u with circumflex accent */
+    "\"\bu",                   /* 252 small u with diaeresis */
+    "'\by",                    /* 253 small y with acute accent */
+    NULL,                      /* 254 small icelandic thorn */
+    "\"\by",                   /* 255 small y with diaeresis */
+  };
+
+static void
+init_latin1_ascii (STEP *step)
+{
+  const char **table;
+  char *pool;
+  int counter;
+
+  table = (const char **) xmalloc (256 * sizeof (char *) + 256);
+  pool = (char *) (table + 256);
+
+  for (counter = 0; counter < 128; counter++)
+    {
+      table[counter] = pool;
+      *pool++ = counter;
+      *pool++ = '\0';
+    }
+  for (; counter < 256; counter++)
+    table[counter] = translation_table[counter - 128];
+
+  step->one_to_many = table;
+}
+
+void
+module_latin1_ascii (void)
+{
+  declare_step ("Latin-1", "ASCII-BS", ONE_TO_MANY, init_latin1_ascii,
+               file_one_to_many);
+}
diff --git a/lat1html.c b/lat1html.c
new file mode 100644 (file)
index 0000000..99ad623
--- /dev/null
@@ -0,0 +1,142 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+struct translation
+  {
+    int code;                  /* code being translated */
+    const char *string;                /* translation string */
+  };
+
+static struct translation diacritic_translations [] =
+  {
+    {192, "&Agrave;"},
+    {193, "&Aacute;"},
+    {194, "&Acircu;"},
+    {195, "&Atilde;"},
+    {196, "&Adiaer;"},
+    {197, "&Aring;"},
+    {198, "&AE;"},
+    {199, "&Ccedil;"},
+    {200, "&Egrave;"},
+    {201, "&Eacute;"},
+    {202, "&Ecircu;"},
+    {203, "&Ediaer;"},
+    {204, "&Igrave;"},
+    {205, "&Iacute;"},
+    {206, "&Icircu;"},
+    {207, "&Idiaer;"},
+    {208, "&ETH;"},
+    {209, "&Ntilde;"},
+    {210, "&Ograve;"},
+    {211, "&Oacute;"},
+    {212, "&Ocircu;"},
+    {213, "&Otilde;"},
+    {214, "&Odiaer;"},
+    {215, "&MULT;"},
+    {216, "&Ostroke;"},
+    {217, "&Ugrave;"},
+    {218, "&Uacute;"},
+    {219, "&Ucircu;"},
+    {220, "&Udiaer;"},
+    {221, "&Yacute;"},
+    {222, "&THORN;"},
+    {223, "&ssharp;"},
+    {224, "&agrave;"},
+    {225, "&aacute;"},
+    {226, "&acircu;"},
+    {227, "&atilde;"},
+    {228, "&adiaer;"},
+    {229, "&aring;"},
+    {230, "&ae;"},
+    {231, "&ccedil;"},
+    {232, "&egrave;"},
+    {233, "&eacute;"},
+    {234, "&ecircu;"},
+    {235, "&ediaer;"},
+    {236, "&igrave;"},
+    {237, "&iacute;"},
+    {238, "&icircu;"},
+    {239, "&idiaer;"},
+    {240, "&eth;"},
+    {241, "&ntilde;"},
+    {242, "&ograve;"},
+    {243, "&oacute;"},
+    {244, "&ocircu;"},
+    {245, "&otilde;"},
+    {246, "&odiaer;"},
+    {247, "&DIVIS;"},
+    {248, "&ostroke;"},
+    {249, "&ugrave;"},
+    {250, "&uacute;"},
+    {251, "&ucircu;"},
+    {252, "&udiaer;"},
+    {253, "&yacute;"},
+    {254, "&thorn;"},
+    {255, "&ydiaer;"},
+    {0, NULL}
+  };
+
+static struct translation const other_translations [] =
+  {
+    {38, "&amp;"},
+    {60, "&lt;"},
+    {62, "&gt;"},
+    {0, NULL}
+  };
+
+static void
+init_latin1_html (STEP *step)
+{
+  char *pool;
+  const char **table;
+  int counter;
+  struct translation const *cursor;
+
+  table = (const char **) xmalloc (256 * sizeof (char *) + 256);
+  pool = (char *) (table + 256);
+
+  for (counter = 0; counter < 128; counter++)
+    {
+      pool[2 * counter] = counter;
+      pool[2 * counter + 1] = '\0';
+      table[counter] = pool + 2 * counter;
+    }
+  for (counter = 128; counter < 256; counter++)
+    table[counter] = NULL;
+  for (cursor = diacritic_translations; cursor->code; cursor++)
+    table[cursor->code] = cursor->string;
+
+  if (!diacritics_only)
+    for (cursor = other_translations; cursor->code; cursor++)
+      table[cursor->code] = cursor->string;
+
+  step->one_to_many = table;
+}
+
+void
+module_latin1_html (void)
+{
+  declare_step ("latin1", "HTML", ONE_TO_MANY, init_latin1_html,
+               file_one_to_many);
+
+  declare_alias ("WWW", "HTML");
+  declare_alias ("w3", "HTML");
+}
diff --git a/lat1ltex.c b/lat1ltex.c
new file mode 100644 (file)
index 0000000..e08347b
--- /dev/null
@@ -0,0 +1,162 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+struct translation
+  {
+    int code;                  /* code being translated */
+    const char *string;                /* translation string */
+  };
+
+static struct translation const diacritic_translations [] =
+  {
+    {192, "\\`A"},             /* capital A with grave accent */
+    {193, "\\'A"},             /* capital A with acute accent */
+    {194, "\\^A"},             /* capital A with circumflex accent */
+    {195, "\\~A"},             /* capital A with tilde */
+    {196, "\\\"A"},            /* capital A diaeresis */
+    {197, "\\AA{}"},           /* capital A with ring above */
+    {198, "\\AE{}"},           /* capital diphthong A with E */
+    {199, "\\c{C}"},           /* capital C with cedilla */
+    {200, "\\`E"},             /* capital E with grave accent */
+    {201, "\\'E"},             /* capital E with acute accent */
+    {202, "\\^E"},             /* capital E with circumflex accent */
+    {203, "\\\"E"},            /* capital E with diaeresis */
+    {204, "\\`I"},             /* capital I with grave accent */
+    {205, "\\'I"},             /* capital I with acute accent */
+    {206, "\\^I"},             /* capital I with circumflex accent */
+    {207, "\\\"I"},            /* capital I with diaeresis */
+    {209, "\\~N"},             /* capital N with tilde */
+    {210, "\\`O"},             /* capital O with grave accent */
+    {211, "\\'O"},             /* capital O with acute accent */
+    {212, "\\^O"},             /* capital O with circumflex accent */
+    {213, "\\~O"},             /* capital O with tilde */
+    {214, "\\\"O"},            /* capital O with diaeresis */
+    {216, "\\O{}"},            /* capital O with oblique stroke */
+    {217, "\\`U"},             /* capital U with grave accent */
+    {218, "\\'U"},             /* capital U with acute accent */
+    {219, "\\^U"},             /* capital U with circumflex accent */
+    {220, "\\\"U"},            /* capital U with diaeresis */
+    {221, "\\'Y"},             /* capital Y with acute accent */
+    {223, "\\ss{}"},           /* small german sharp s */
+    {224, "\\`a"},             /* small a with grave accent */
+    {225, "\\'a"},             /* small a with acute accent */
+    {226, "\\^a"},             /* small a with circumflex accent */
+    {227, "\\~a"},             /* small a with tilde */
+    {228, "\\\"a"},            /* small a with diaeresis */
+    {229, "\\aa{}"},           /* small a with ring above */
+    {230, "\\ae{}"},           /* small diphthong a with e */
+    {231, "\\c{c}"},           /* small c with cedilla */
+    {232, "\\`e"},             /* small e with grave accent */
+    {233, "\\'e"},             /* small e with acute accent */
+    {234, "\\^e"},             /* small e with circumflex accent */
+    {235, "\\\"e"},            /* small e with diaeresis */
+    {236, "\\`{\\i}"},         /* small i with grave accent */
+    {237, "\\'{\\i}"},         /* small i with acute accent */
+    {238, "\\^{\\i}"},         /* small i with circumflex accent */
+    {239, "\\\"{\\i}"},                /* small i with diaeresis */
+    {241, "\\~n"},             /* small n with tilde */
+    {242, "\\`o"},             /* small o with grave accent */
+    {243, "\\'o"},             /* small o with acute accent */
+    {244, "\\^o"},             /* small o with circumflex accent */
+    {245, "\\~o"},             /* small o with tilde */
+    {246, "\\\"o"},            /* small o with diaeresis */
+    {248, "\\o{}"},            /* small o with oblique stroke */
+    {249, "\\`u"},             /* small u with grave accent */
+    {250, "\\'u"},             /* small u with acute accent */
+    {251, "\\^u"},             /* small u with circumflex accent */
+    {252, "\\\"u"},            /* small u with diaeresis */
+    {253, "\\'y"},             /* small y with acute accent */
+    {255, "\\\"y"},            /* small y with diaeresis */
+    {0, NULL}
+  };
+
+static struct translation const other_translations [] =
+  {
+    { 35, "\\#"},
+    { 36, "\\$"},
+    { 37, "\\%"},
+    { 38, "\\&"},
+    { 92, "\\backslash{}"},
+    { 95, "\\_"},
+    {123, "\\{"},
+    {125, "\\}"},
+    {160, "~"},                        /* no-break space */
+    {161, "!'"},               /* inverted exclamation mark */
+    {167, "\\S{}"},            /* paragraph sign, section sign */
+    {168, "\\\"{}"},           /* diaeresis */
+    {171, "``"},               /* left angle quotation mark */
+    {172, "\\neg{}"},          /* not sign */
+    {173, "\\-"},              /* soft hyphen */
+    {176, "\\mbox{$^\\circ$}"}, /* degree sign */
+    {177, "\\mbox{$\\pm$}"},   /* plus-minus sign */
+    {178, "\\mbox{$^2$}"},     /* superscript two */
+    {179, "\\mbox{$^3$}"},     /* superscript three */
+    {180, "\\'{}"},            /* acute accent */
+    {181, "\\mbox{$\\mu$}"},   /* small greek mu, micro sign */
+    {183, "\\cdotp"},          /* middle dot */
+    {184, "\\,{}"},            /* cedilla */
+    {185, "\\mbox{$^1$}"},     /* superscript one */
+    {187, "''"},               /* right angle quotation mark */
+    {188, "\\frac1/4{}"},      /* vulgar fraction one quarter */
+    {189, "\\frac1/2{}"},      /* vulgar fraction one half */
+    {190, "\\frac3/4{}"},      /* vulgar fraction three quarters */
+    {191, "?'"},               /* inverted question mark */
+    {0, NULL}
+  };
+
+static void
+init_latin1_latex (STEP *step)
+{
+  char *pool;
+  const char **table;
+  int counter;
+  struct translation const *cursor;
+
+  table = (const char **) xmalloc (256 * sizeof (char *) + 256);
+  pool = (char *) (table + 256);
+
+  for (counter = 0; counter < 128; counter++)
+    {
+      table[counter] = pool;
+      *pool++ = counter;
+      *pool++ = '\0';
+    }
+  for (counter = 128; counter < 256; counter++)
+    table[counter] = NULL;
+  for (cursor = diacritic_translations; cursor->code; cursor++)
+    table[cursor->code] = cursor->string;
+
+  if (!diacritics_only)
+    for (cursor = other_translations; cursor->code; cursor++)
+      table[cursor->code] = cursor->string;
+
+  step->one_to_many = table;
+}
+
+void
+module_latin1_latex (void)
+{
+  declare_step ("Latin-1", "LaTeX", ONE_TO_MANY, init_latin1_latex,
+               file_one_to_many);
+
+  declare_alias ("TeX", "LaTeX");
+  declare_alias ("ltex", "LaTeX");
+}
diff --git a/lat1txte.c b/lat1txte.c
new file mode 100644 (file)
index 0000000..645790b
--- /dev/null
@@ -0,0 +1,212 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+static const char *const translation_table[128] =
+  {
+    NULL,                      /* 128 */
+    NULL,                      /* 129 */
+    NULL,                      /* 130 */
+    NULL,                      /* 131 */
+    NULL,                      /* 132 */
+    NULL,                      /* 133 */
+    NULL,                      /* 134 */
+    NULL,                      /* 135 */
+    NULL,                      /* 136 */
+    NULL,                      /* 137 */
+    NULL,                      /* 138 */
+    NULL,                      /* 139 */
+    NULL,                      /* 140 */
+    NULL,                      /* 141 */
+    NULL,                      /* 142 */
+    NULL,                      /* 143 */
+    NULL,                      /* 144 */
+    NULL,                      /* 145 */
+    NULL,                      /* 146 */
+    NULL,                      /* 147 */
+    NULL,                      /* 148 */
+    NULL,                      /* 149 */
+    NULL,                      /* 150 */
+    NULL,                      /* 151 */
+    NULL,                      /* 152 */
+    NULL,                      /* 153 */
+    NULL,                      /* 154 */
+    NULL,                      /* 155 */
+    NULL,                      /* 156 */
+    NULL,                      /* 157 */
+    NULL,                      /* 158 */
+    NULL,                      /* 159 */
+
+    " ",                       /* 160 no-break space */
+    NULL,                      /* 161 inverted exclamation mark */
+    NULL,                      /* 162 cent sign */
+    NULL,                      /* 163 pound sign */
+    NULL,                      /* 164 currency sign */
+    NULL,                      /* 165 yen sign */
+    NULL,                      /* 166 broken bar */
+    NULL,                      /* 167 paragraph sign, section sign */
+    NULL,                      /* 168 diaeresis */
+    NULL,                      /* 169 copyright sign */
+    NULL,                      /* 170 feminine ordinal indicator */
+    "``",                      /* 171 left angle quotation mark */
+    NULL,                      /* 172 not sign */
+    NULL,                      /* 173 soft hyphen */
+    NULL,                      /* 174 registered trade mark sign */
+    NULL,                      /* 175 macron */
+    NULL,                      /* 176 degree sign */
+    NULL,                      /* 177 plus-minus sign */
+    NULL,                      /* 178 superscript two */
+    NULL,                      /* 179 superscript three */
+    NULL,                      /* 180 acute accent */
+    NULL,                      /* 181 small greek mu, micro sign */
+    NULL,                      /* 182 pilcrow sign */
+    NULL,                      /* 183 middle dot */
+    NULL,                      /* 184 cedilla */
+    NULL,                      /* 185 superscript one */
+    NULL,                      /* 186 masculine ordinal indicator */
+    "''",                      /* 187 right angle quotation mark */
+    NULL,                      /* 188 vulgar fraction one quarter */
+    NULL,                      /* 189 vulgar fraction one half */
+    NULL,                      /* 190 vulgar fraction three quarters */
+    NULL,                      /* 191 inverted question mark */
+    "A`",                      /* 192 capital A with grave accent */
+    NULL,                      /* 193 capital A with acute accent */
+    "A^",                      /* 194 capital A with circumflex accent */
+    NULL,                      /* 195 capital A with tilde */
+    "A\"",                     /* 196 capital A diaeresis */
+    NULL,                      /* 197 capital A with ring above */
+    NULL,                      /* 198 capital diphthong A with E */
+    "C,",                      /* 199 capital C with cedilla */
+    "E`",                      /* 200 capital E with grave accent */
+    "E\'",                     /* 201 capital E with acute accent */
+    "E^",                      /* 202 capital E with circumflex accent */
+    "E\"",                     /* 203 capital E with diaeresis */
+    NULL,                      /* 204 capital I with grave accent */
+    NULL,                      /* 205 capital I with acute accent */
+    "I^",                      /* 206 capital I with circumflex accent */
+    "I\"",                     /* 207 capital I with diaeresis */
+    NULL,                      /* 208 capital icelandic ETH */
+    NULL,                      /* 209 capital N with tilde */
+    "O`",                      /* 210 capital O with grave accent */
+    NULL,                      /* 211 capital O with acute accent */
+    "O^",                      /* 212 capital O with circumflex accent */
+    NULL,                      /* 213 capital O with tilde */
+    "O\"",                     /* 214 capital O with diaeresis */
+    NULL,                      /* 215 multiplication sign */
+    NULL,                      /* 216 capital O with oblique stroke */
+    "U`",                      /* 217 capital U with grave accent */
+    NULL,                      /* 218 capital U with acute accent */
+    "U^",                      /* 219 capital U with circumflex accent */
+    "U\"",                     /* 220 capital U with diaeresis */
+    NULL,                      /* 221 capital Y with acute accent */
+    NULL,                      /* 222 capital icelandic THORN */
+    NULL,                      /* 223 small german sharp s */
+    "a`",                      /* 224 small a with grave accent */
+    NULL,                      /* 225 small a with acute accent */
+    "a^",                      /* 226 small a with circumflex accent */
+    NULL,                      /* 227 small a with tilde */
+    "a\"",                     /* 228 small a with diaeresis */
+    NULL,                      /* 229 small a with ring above */
+    NULL,                      /* 230 small diphthong a with e */
+    "c,",                      /* 231 small c with cedilla */
+    "e`",                      /* 232 small e with grave accent */
+    "e\'",                     /* 233 small e with acute accent */
+    "e^",                      /* 234 small e with circumflex accent */
+    "e\"",                     /* 235 small e with diaeresis */
+    NULL,                      /* 236 small i with grave accent */
+    NULL,                      /* 237 small i with acute accent */
+    "i^",                      /* 238 small i with circumflex accent */
+    "i\"",                     /* 239 small i with diaeresis */
+    NULL,                      /* 240 small icelandic eth */
+    NULL,                      /* 241 small n with tilde */
+    "o`",                      /* 242 small o with grave accent */
+    NULL,                      /* 243 small o with acute accent */
+    "o^",                      /* 244 small o with circumflex accent */
+    NULL,                      /* 245 small o with tilde */
+    "o\"",                     /* 246 small o with diaeresis */
+    NULL,                      /* 247 division sign */
+    NULL,                      /* 248 small o with oblique stroke */
+    "u`",                      /* 249 small u with grave accent */
+    NULL,                      /* 250 small u with acute accent */
+    "u^",                      /* 251 small u with circumflex accent */
+    "u\"",                     /* 252 small u with diaeresis */
+    NULL,                      /* 253 small y with acute accent */
+    NULL,                      /* 254 small icelandic thorn */
+    NULL,                      /* 255 small y with diaeresis */
+  };
+
+static void
+init_latin1_texte (STEP *step)
+{
+  int rewritten;               /* number of rewritten translations */
+  const char **table;          /* allocated structure, including pool */
+  char *pool;                  /* cursor in character pool */
+  int counter;                 /* general purpose counter */
+
+  /* The algorithm for proper processing of -c option depends on the fact
+     that quotes to be changed in colons are exactly those, in strings
+     from translation_table, which are in second position while the
+     string is two characters in length.  This is sufficient for now.  */
+
+  rewritten = 0;
+  if (diaeresis_char != '"')
+    for (counter = 128; counter < 256; counter++)
+      if (translation_table[counter - 128]
+         && translation_table[counter - 128][1] == '"'
+         && translation_table[counter - 128][2] == '\0')
+       rewritten++;
+
+  table = (const char **) xmalloc (sizeof (char *) * 256
+                                  + 2 * 128
+                                  + 3 * rewritten);
+  pool = (char *) (table + 256);
+
+  for (counter = 0; counter < 128; counter++)
+    {
+      table[counter] = pool;
+      *pool++ = counter;
+      *pool++ = '\0';
+    }
+
+  for (; counter < 256; counter++)
+    if (diaeresis_char != '"'
+       && translation_table[counter - 128]
+       && translation_table[counter - 128][1] == '"'
+       && translation_table[counter - 128][2] == '\0')
+      {
+       table[counter] = pool;
+       *pool++ = translation_table[counter - 128][0];
+       *pool++ = diaeresis_char;
+       *pool++ = '\0';
+      }
+    else
+      table[counter] = translation_table[counter - 128];
+
+  step->one_to_many = table;
+}
+
+void
+module_latin1_texte (void)
+{
+  declare_step ("Latin-1", "Texte", ONE_TO_MANY, init_latin1_texte,
+               file_one_to_many);
+
+  declare_alias ("txte", "Texte");
+}
diff --git a/ltexlat1.l b/ltexlat1.l
new file mode 100644 (file)
index 0000000..0b500e6
--- /dev/null
@@ -0,0 +1,140 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* Step name: latex_latin1.  */
+
+Letter                 [a-zA-Z]
+Braces                 [ \t]*(\{\})?
+
+%%
+
+\\"#"                  { if (diacritics_only) ECHO; else output ('#'); }
+\\"$"                  { if (diacritics_only) ECHO; else output ('$'); }
+\\"%"                  { if (diacritics_only) ECHO; else output ('%'); }
+\\"&"                  { if (diacritics_only) ECHO; else output ('&'); }
+\\"_"                  { if (diacritics_only) ECHO; else output ('_'); }
+\\"{"                  { if (diacritics_only) ECHO; else output ('{'); }
+\\"}"                  { if (diacritics_only) ECHO; else output ('}'); }
+
+\\backslash{Braces}    { if (diacritics_only) ECHO; else output ('\\'); }
+"~"                    { if (diacritics_only) ECHO; else output (160); }
+"!'"                   { if (diacritics_only) ECHO; else output (161); }
+
+\\S{Braces}            { if (diacritics_only) ECHO; else output (167); }
+\\\"                   { if (diacritics_only) ECHO; else output (168); }
+
+"``"                   { if (diacritics_only) ECHO; else output (171); }
+\\neg{Braces}          { if (diacritics_only) ECHO; else output (172); }
+\\"-"                  { if (diacritics_only) ECHO; else output (173); }
+
+\\mbox"{$^\\circ$}"    { if (diacritics_only) ECHO; else output (176); }
+\\mbox"{$\\pm$}"       { if (diacritics_only) ECHO; else output (177); }
+\\mbox"{$^2$}"         { if (diacritics_only) ECHO; else output (178); }
+\\mbox"{$^3$}"         { if (diacritics_only) ECHO; else output (179); }
+\\"'"                  { if (diacritics_only) ECHO; else output (180); }
+\\mbox"{$\\mu$}"       { if (diacritics_only) ECHO; else output (181); }
+
+\\cdotp                        { if (diacritics_only) ECHO; else output (183); }
+\\","                  { if (diacritics_only) ECHO; else output (184); }
+\\mbox"{$^1$}"         { if (diacritics_only) ECHO; else output (185); }
+
+"''"                   { if (diacritics_only) ECHO; else output (187); }
+\\frac"1/4"{Braces}    { if (diacritics_only) ECHO; else output (188); }
+\\frac"1/2"{Braces}    { if (diacritics_only) ECHO; else output (189); }
+\\frac"3/4"{Braces}    { if (diacritics_only) ECHO; else output (190); }
+"?'"                   { if (diacritics_only) ECHO; else output (191); }
+
+\\"`"A|\\"`{A}"                        { output (192); }
+\\"'"A|\\"'{A}"                        { output (193); }
+\\"^"A|\\"^{A}"                        { output (194); }
+\\"~"A|\\"~{A}"                        { output (195); }
+\\\"A|\\\""{A}"                        { output (196); }
+\\AA{Braces}                   { output (197); }
+\\AE{Braces}                   { output (198); }
+\\c[ \t]+C|\\c"{C}"            { output (199); }
+\\"`"E|\\"`{E}"                        { output (200); }
+\\"'"E|\\"'{E}"                        { output (201); }
+\\"^"E|\\"^{E}"                        { output (202); }
+\\\"E|\\\""{E}"                        { output (203); }
+\\"`"I|\\"`{I}"                        { output (204); }
+\\"'"I|\\"'{I}"                        { output (205); }
+\\"^"I|\\"^{I}"                        { output (206); }
+\\\"I|\\\""{I}"                        { output (207); }
+       
+\\"~"N|\\"~{N}"                        { output (209); }
+\\"`"O|\\"`{O}"                        { output (210); }
+\\"'"O|\\"'{O}"                        { output (211); }
+\\"^"O|\\"^{O}"                        { output (212); }
+\\"~"O|\\"~{O}"                        { output (213); }
+\\\"O|\\\""{O}"                        { output (214); }
+       
+\\O{Braces}                    { output (216); }
+\\"`"U|\\"`{U}"                        { output (217); }
+\\"'"U|\\"'{U}"                        { output (218); }
+\\"^"U|\\"^{U}"                        { output (219); }
+\\\"U|\\\""{U}"                        { output (220); }
+\\"'"Y|\\"'{Y}"                        { output (221); }
+       
+\\ss{Braces}                   { output (223); }
+\\"`"a|\\"`{a}"                        { output (224); }
+\\"'"a|\\"'{a}"                        { output (225); }
+\\"^"a|\\"^{a}"                        { output (226); }
+\\"~"a|\\"~{a}"                        { output (227); }
+\\\"a|\\\""{a}"                        { output (228); }
+\\aa{Braces}                   { output (229); }
+\\ae{Braces}                   { output (230); }
+\\c[ \t]+c|\\c"{c}"            { output (231); }
+\\"`"e|\\"`{e}"                        { output (232); }
+\\"'"e|\\"'{e}"                        { output (233); }
+\\"^"e|\\"^{e}"                        { output (234); }
+\\\"e|\\\""{e}"                        { output (235); }
+\\"`"\\i{Braces}|\\"`{\\i}"    { output (236); }
+\\"'"\\i{Braces}|\\"'{\\i}"    { output (237); }
+\\"^"\\i{Braces}|\\"^{\\i}"    { output (238); }
+\\\"\\i{Braces}|\\\""{\\i}"    { output (239); }
+
+\\"~"n|\\"~{n}"                        { output (241); }
+\\"`"o|\\"`{o}"                        { output (242); }
+\\"'"o|\\"'{o}"                        { output (243); }
+\\"^"o|\\"^{o}"                        { output (244); }
+\\"~"o|\\"~{o}"                        { output (245); }
+\\\"o|\\\""{o}"                        { output (246); }
+       
+\\o{Braces}                    { output (248); }
+\\"`"u|\\"`{u}"                        { output (249); }
+\\"'"u|\\"'{u}"                        { output (250); }
+\\"^"u|\\"^{u}"                        { output (251); }
+\\\"u|\\\""{u}"                        { output (252); }
+\\"'"y|\\"'{y}"                        { output (253); }
+       
+\\\"y|\\\""{y}"                        { output (255); }
+
+\\[`'^"]\\i{Letter}*{Braces}   { ECHO; }
+\\{Letter}+{Braces}            { ECHO; }
+
+%%
+
+void
+module_latex_latin1 (void)
+{
+  declare_step ("LaTeX", "Latin-1", MANY_TO_ONE, NULL, file_latex_latin1);
+
+  declare_alias ("TeX", "LaTeX");
+  declare_alias ("ltex", "LaTeX");
+}
diff --git a/merged.c b/merged.c
new file mode 100644 (file)
index 0000000..64b02eb
--- /dev/null
+++ b/merged.c
@@ -0,0 +1,3201 @@
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /home/daffy/u0/vern/flex/flex-2.4.7/RCS/flex.skl,v 1.2 94/08/03 11:13:24 vern Exp $
+ */
+
+#define FLEX_SCANNER
+
+#include <stdio.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#ifdef __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+
+#ifdef __TURBOC__
+#define YY_USE_CONST
+#endif
+
+
+#ifndef YY_USE_CONST
+#ifndef const
+#define const
+#endif
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.
+ */
+#define YY_START ((yy_start - 1) / 2)
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file".  Now included
+ * only for backward compatibility with previous versions of flex.
+ */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+       extern int yywrap YY_PROTO(( void ));
+#ifdef __cplusplus
+       }
+#endif
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       int yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+void yyrestart YY_PROTO(( FILE *input_file ));
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+static void yy_push_state YY_PROTO(( int new_state ));
+static void yy_pop_state YY_PROTO(( void ));
+static int yy_top_state YY_PROTO(( void ));
+
+static void *yy_flex_alloc YY_PROTO(( unsigned int ));
+static void *yy_flex_realloc YY_PROTO(( void *, unsigned int ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define INITIAL 0
+#define ascii_latin1 1
+#define html_latin1 2
+#define latex_latin1 3
+#define texte_latin1 4
+typedef unsigned char YY_CHAR;
+typedef int yy_state_type;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+extern char *yytext;
+#define yytext_ptr yytext
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, const char *, int ));
+#endif
+
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( const char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yyleng = yy_cp - yy_bp; \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_END_OF_BUFFER 274
+static const short int yy_accept[977] =
+    {   0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+      274,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  132,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  133,  148,  152,  135,  124,  125,  126,  127,  143,
+      146,  138,  212,  212,  175,  134,    0,  128,    0,  212,
+      212,  212,  212,  212,  212,  204,  212,  129,  130,    0,
+      136,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  214,    0,  216,  215,    0,    0,  226,  227,  223,
+        0,  236,  235,    0,    0,  242,  241,    0,  248,  247,
+      213,    0,  219,  218,    0,    0,  232,  233,  229,    0,
+      239,  238,    0,  245,  244,    0,  251,  250,    1,    2,
+        7,   12,   16,   22,   27,   34,   39,   43,   49,   29,
+
+       54,   56,    4,   10,   14,   19,   25,   28,   31,   37,
+       41,   46,   52,   55,    8,   35,   23,   50,    5,    3,
+        6,   11,    9,   15,   13,   17,   20,   18,   21,   26,
+       24,   32,   38,   42,   47,   53,   30,   36,   40,   45,
+       51,   33,   44,   48,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  157,  164,  168,  174,  179,    0,  186,  193,  203,
+      208,  210,    0,  154,  162,  166,  171,  177,  180,    0,
+      183,  191,  200,  206,  209,    0,  212,  158,  159,    0,
+      175,    0,  134,    0,  155,  163,  167,  172,  178,    0,
+      184,  192,  201,  207,    0,  153,  161,  165,  170,  176,
+        0,  182,  190,  199,  205,    0,  187,  188,  212,  212,
+      212,    0,  212,  212,  212,  204,    0,  181,  156,  169,
+      173,  185,  198,  202,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+      217,  221,  228,  225,  237,    0,  243,  249,  220,  222,
+      234,  231,  240,  246,  252,   66,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       98,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,   59,    0,    0,    0,    0,   58,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  197,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  195,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,  158,    0,  159,
+        0,  212,  175,  134,  196,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  194,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  187,    0,  188,    0,
+      212,  160,  189,  212,    0,    0,  212,  212,  137,  204,
+      181,    0,    0,    0,    0,    0,    0,    0,  261,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  224,    0,  230,    0,
+        0,    0,    0,    0,    0,    0,    0,   76,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,   57,    0,    0,    0,    0,    0,
+        0,    0,  108,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  197,  211,    0,    0,  195,    0,    0,  158,
+      159,  196,    0,    0,  194,    0,    0,  187,  188,  212,
+      212,  212,  212,  137,    0,  181,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  263,    0,    0,  267,    0,
+        0,    0,    0,    0,  266,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+        0,   83,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,  211,    0,  197,  197,  195,
+      195,  196,  196,  194,  194,  212,  145,    0,    0,    0,
+      137,    0,    0,    0,    0,    0,    0,    0,  272,    0,
+        0,    0,    0,    0,    0,  269,    0,    0,    0,    0,
+        0,   65,    0,    0,  115,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+
+       90,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       97,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,  122,
+        0,    0,    0,    0,    0,    0,  211,  212,    0,    0,
+        0,  255,    0,    0,  271,  254,    0,    0,    0,    0,
+      265,    0,    0,    0,  270,   61,   62,   64,   60,   63,
+       67,   69,   70,   71,   68,   73,   74,   75,   72,   77,
+       79,   80,   82,   78,    0,   81,   86,   87,   88,   85,
+       89,   93,   94,   96,   92,   95,   99,  101,  102,  103,
+      100,  105,  106,  107,  104,  109,  111,  112,  114,  110,
+
+        0,  113,   91,  118,  119,  120,  117,  121,  123,  212,
+      150,  149,  151,    0,    0,    0,    0,  262,    0,  258,
+        0,    0,    0,    0,   84,  116,  212,  150,    0,  149,
+        0,  151,    0,    0,    0,    0,    0,    0,    0,  256,
+        0,    0,  264,  268,    0,    0,  131,  150,  149,  151,
+        0,    0,    0,    0,    0,    0,  253,  257,  259,  260,
+      131,    0,    0,    0,  147,  141,  142,    0,  131,  144,
+      140,    0,    0,    0,  139,    0
+    } ;
+
+static const int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    2,    3,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    3,    4,    5,    6,    7,    8,    9,   10,    1,
+        1,    1,    1,   11,   12,    1,   13,    1,   14,   15,
+       16,   17,    1,    1,    1,    1,    1,   18,   19,   20,
+        1,   21,   22,    1,   23,   24,   25,   26,   27,   28,
+       29,   30,   31,   32,   28,   33,   34,   35,   36,   28,
+       28,   37,   38,   39,   40,   41,   28,   28,   42,   28,
+        1,   43,    1,   44,   45,   46,   47,   48,   49,   50,
+
+       51,   52,   53,   54,   55,   32,   56,   57,   58,   59,
+       60,   61,   28,   62,   63,   64,   65,   66,   28,   67,
+       68,   28,   69,    1,   70,   71,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static const int yy_meta[72] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    1,    1,    1,    1,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    2,    1,
+        1
+    } ;
+
+static const short int yy_base[990] =
+    {   0,
+        0,    0,    0,    0, 1309, 1308,    2,   48,  119,    0,
+     1316, 1319, 1313, 1312, 1311, 1310, 1309, 1308, 1307, 1306,
+     1305, 1304, 1303, 1302, 1301, 1300, 1299, 1298, 1297, 1296,
+     1295, 1294, 1293, 1292, 1291, 1290, 1289, 1288,  168, 1279,
+     1278, 1277,  232, 1240, 1319,  281, 1275,   10, 1273,   56,
+       32, 1273,   57,   62,    0, 1236,   67, 1270,   72,  204,
+      208,  304,  331,  377,    4,   21, 1275, 1274,  313, 1267,
+      201,  328, 1206,  351,  337, 1266,  378,  400,  402, 1264,
+      406,  410, 1203,  448, 1268,  425,    4,  330,  417, 1223,
+     1240,  433,   39, 1230, 1205,   46, 1238,  290, 1220,  438,
+
+     1217,  448, 1201,  326, 1200, 1199,  457, 1199, 1207,  464,
+       37, 1319, 1319, 1319,  499, 1319, 1319, 1319, 1319,  546,
+     1319, 1319,  365,    0,   14,   29,  593, 1319,  640,  487,
+      446,  352,   35,  436,  318,   36,  460, 1319, 1319,  501,
+     1319,   57, 1209,  145,  134, 1199, 1211, 1198,  149,  158,
+     1189, 1319,    0, 1319, 1319,  518,    0, 1245, 1319, 1319,
+        0, 1319, 1319,  206,    0, 1319, 1319,    0, 1319, 1319,
+     1319,    0, 1319, 1319,  540,    0, 1244, 1319, 1319,    0,
+     1319, 1319,    0, 1319, 1319,    0, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1234, 1203, 1196, 1195, 1187, 1193,
+     1192, 1195, 1204, 1214, 1194, 1187, 1186, 1178, 1190, 1183,
+     1182, 1174, 1202, 1179, 1184, 1177, 1176, 1168, 1165, 1173,
+     1191, 1177, 1170, 1169, 1161, 1173, 1172, 1165, 1164, 1199,
+     1155, 1155, 1160, 1159, 1162, 1163, 1156, 1155, 1147, 1154,
+     1188, 1157, 1150, 1149, 1141, 1183, 1146, 1151, 1144, 1143,
+
+     1135, 1132, 1140, 1140, 1133, 1143, 1136, 1135, 1127, 1139,
+     1132, 1319, 1319, 1319, 1319, 1319, 1131, 1319, 1319, 1319,
+     1319, 1319,  687, 1319, 1319, 1319, 1319, 1319, 1319, 1130,
+     1319, 1319, 1319, 1319, 1319,  733,   38,  246,  248, 1114,
+      272, 1113,  311, 1112, 1319, 1319, 1319, 1319, 1319, 1126,
+     1319, 1319, 1319, 1319,  594, 1319, 1319, 1319, 1319, 1319,
+     1125, 1319, 1319, 1319, 1319,  595,  324,  357,  459,  506,
+      456,  300,  471,  530,  474,  407, 1109,  475, 1319, 1319,
+     1319, 1319, 1319, 1319,  549,  548, 1130, 1114, 1117, 1122,
+     1115, 1126, 1117, 1116, 1115, 1109,   59,  168, 1121, 1111,
+
+     1319, 1319, 1319, 1156, 1319,  276, 1319, 1319, 1319, 1319,
+     1319, 1155, 1319, 1319, 1319, 1319, 1099, 1101, 1115, 1114,
+     1101, 1102, 1108, 1126, 1137, 1090, 1092, 1106, 1105, 1086,
+     1088, 1102, 1101, 1108, 1089, 1080, 1082, 1096, 1095, 1079,
+     1083, 1102, 1073, 1075, 1089, 1088, 1069, 1068, 1070, 1084,
+     1319, 1083, 1110, 1069, 1070, 1076, 1060, 1062, 1076, 1075,
+     1102, 1319, 1055, 1057, 1071, 1070, 1319, 1059, 1050, 1052,
+     1066, 1065, 1049, 1053, 1062, 1046, 1042, 1044, 1058, 1057,
+     1038, 1055,  529, 1031, 1030, 1029, 1028, 1027, 1041, 1025,
+     1024, 1023, 1022, 1021,  544, 1020, 1019, 1018, 1017, 1016,
+
+     1015, 1029, 1013, 1012, 1011, 1010, 1009,  554, 1008,  559,
+     1007, 1319, 1319, 1319,  578, 1006, 1005, 1004, 1003, 1002,
+     1016, 1000,  999,  998,  997,  588,  996,  995,  994,  993,
+      992, 1006,  990,  989,  988,  987,  592,  986,  599,  985,
+      600, 1319, 1319,  601,  984,  983,  624,  629,  609, 1319,
+      616,  982,  981,  980,  979,  978,  977,  976, 1319,  980,
+      989,  996,  982,  976,  171,  975,  986,   25,  308,  973,
+      380,  972,  989,  988,  979,  986, 1319,  574, 1319,  968,
+      982,  979,  963,  975,  977,  971,  987, 1319,  960,  974,
+      971,  955,  956,  970,  967,  951,  997,  965,  950,  964,
+
+      961,  945,  950,  959,  973,  943,  957,  954,  938,  939,
+      938,  952,  949,  933, 1319,  945,  947,  941,  931,  945,
+      942,  926, 1319,  927,  941,  938,  922,  937,  922,  936,
+      933,  917,  922,  931,  918,  920,  914,  928,  925,  909,
+      910,  922,  646,  647,  902,  901,  648,  900,  899, 1319,
+     1319,  663,  898,  897,  671,  896,  895, 1319, 1319,  672,
+      676,  674,  679,  681,  894, 1319,  912,  909,  906,  909,
+      908,  911,  902,  589,  891, 1319,  899,  899, 1319,  891,
+      897,  896,  634,  895, 1319,  898,  883,  885,  895,  926,
+      893,  886,  923,  890,  875,  877,  887,  886,  871,  873,
+
+      883, 1319,  882,  881,  866,  868,  878,  872,  876,  907,
+      874,  859,  861,  871,  870,  869,  854,  856,  866,  897,
+      864,  857,  862,  847,  849,  859,  858,  843,  845,  855,
+      854,  853,  838,  840,  850,  844,  848,  837,  878,  845,
+      830,  832,  842,  841,  829,  689,  820, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319,  692,  694,  876,  875,    9,
+     1319,  676,  822,  833,  681,  684,  830,  831, 1319,  832,
+      835,  701,  834,  827,  826, 1319,  702,  859,  858,  857,
+      856, 1319,  855,  854, 1319,  853,  852,  851,  850,  849,
+      848,  847,  846,  845,  844,  843,  842,  841,  808,  839,
+
+     1319,  838,  837,  836,  835,  834,  833,  832,  831,  830,
+     1319,  829,  828,  827,  826,  825,  824,  823,  822,  821,
+      820,  819,  818,  817,  816,  815,  782,  813,  812, 1319,
+      811,  810,  809,  800,  799,  797, 1319,  710,  534,  798,
+      660, 1319,  763,  748, 1319, 1319,  703,  746,  706,  754,
+     1319,    9,  133,  155, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319,  215, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+     1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,
+
+      227, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319,  709,
+      698,  719,  722,  345,  767,  721,  265, 1319,  273, 1319,
+      724,  726,  295,  312, 1319, 1319,  733,  725,  371,  730,
+      387,  743,  398,  410,  441,  496,  538,  545,  522, 1319,
+      748,  772, 1319, 1319,  787,  790,  748, 1319, 1319, 1319,
+      567,  603,  573,  578,  594,  617, 1319, 1319, 1319, 1319,
+      751,  689,  692,  695, 1319, 1319, 1319,  706, 1319, 1319,
+     1319,  721,  764,  704, 1319, 1319,  820,  822,  782,  783,
+      786,  793,  794,  797,  800,  801,  803,  804,  824
+    } ;
+
+static const short int yy_def[990] =
+    {   0,
+      977,  977,  977,    3,  977,  977,  977,  977,  976,    9,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,   46,  976,  976,  976,
+      976,  976,  976,  976,   46,   46,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  978,  978,  978,  978,  976,  976,  976,  978,
+      978,  978,  978,  978,  978,  978,  978,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  979,  976,  976,  976,  980,  976,  976,  976,
+      981,  976,  976,  976,  982,  976,  976,  983,  976,  976,
+      976,  984,  976,  976,  976,  985,  976,  976,  976,  986,
+      976,  976,  987,  976,  976,  988,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  978,  978,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  978,  978,  978,  976,
+      978,  976,  978,  978,  978,  976,  976,  978,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  989,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  989,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  989,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  989,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      978,  976,  976,  978,  976,  976,  978,  978,  978,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  989,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  978,
+      978,  978,  978,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  978,  978,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  978,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  978,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  978,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  978,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,    0,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976
+    } ;
+
+static const short int yy_nxt[1391] =
+    {   0,
+      976,  976,  337,  976,   13,   40,  976,  976,  202,   14,
+       15,   41,   16,  214,  153,  841,  341,  976,  976,   17,
+       18,  976,   19,   42,   20,  976,   21,  153,  215,  676,
+       22,  343,  976,  976,   23,   24,  161,  337,  376,   25,
+      337,   26,  676,   27,   43,   28,   29,   44,   30,  161,
+       31,   40,  216,  154,   32,  155,  217,   41,   33,   34,
+      157,  165,   35,  922,   36,  158,  168,   37,  340,   42,
+       38,  172,   45,  157,  165,  162,  176,  163,  512,  168,
+      218,  177,  342,  310,  172,  259,  311,  260,  261,  176,
+       43,  262,  265,   44,  266,  267,  373,  344,  268,  159,
+
+      166,  160,  167,  340,  377,  169,  340,  170,  269,  270,
+      173,  386,  174,  571,  387,  178,  572,  179,   45,   46,
+       46,   46,   46,   46,   46,   46,   46,   46,   47,   46,
+       46,   46,   46,   46,   46,   46,   46,   46,   46,   46,
+       46,   48,   12,   49,   12,   50,   12,   12,   12,   51,
+       52,   52,   12,   12,   53,   12,   12,   52,   54,   12,
+       12,   46,   55,   46,   56,   57,   12,   58,   12,   59,
+       12,   12,   12,   60,   12,   52,   12,   12,   61,   12,
+       12,   12,   52,   62,   12,   12,   12,   46,   46,   46,
+       89,  389,   90,   91,   92,  397,  392,  923,   93,  390,
+
+      393,   94,   95,   96,  391,  192,   97,   98,  180,   99,
+      204,  399,  183,  398,  100,  573,  101,  400,  102,  924,
+      103,  180,  104,  672,  105,  183,  106,  107,  406,  574,
+      108,  109,  110,  925,  673,  111,  115,  116,  117,  118,
+      119,  120,  121,  122,  222,  926,  223,  181,  508,  182,
+      510,  184,  406,  185,  123,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,  124,  125,  124,  126,
+      124,  124,  124,  124,  341,  127,  128,  129,  130,  131,
+      132,  124,  124,  133,  124,  124,  124,  124,  124,  134,
+      135,  136,  124,  124,  137,  124,  124,  124,  124,  124,
+
+      138,  139,  140,  142,  143,  144,  578,  145,  186,  146,
+      147,  148,  677,  343,  509,  941,  511,  191,  149,  150,
+      337,  186,  203,  942,  545,  677,  537,  142,  143,  144,
+      578,  151,  193,  146,  147,  148,  272,  205,  273,  274,
+      342,  195,  275,  149,  150,  945,  207,  187,  546,  188,
+      189,  190,  221,  191,  370,  194,  219,  192,  220,  539,
+      206,  193,  946,  217,  226,  229,  194,  337,  375,  512,
+      195,  224,  292,  225,  293,  294,  242,  196,  295,  344,
+      230,  197,  231,  221,  679,  198,  340,  338,  243,  244,
+      199,  339,  538,  200,  227,  201,  228,  679,  202,  203,
+
+      219,  371,  934,  204,  222,  935,  196,  205,  224,  376,
+      197,  209,  206,  227,  198,  210,  207,  230,  208,  211,
+      372,  229,  220,  209,  232,  540,  223,  210,  233,  201,
+      225,  211,  234,  340,  213,  228,  212,  235,  337,  231,
+      948,  213,  236,  245,  214,  232,  237,  237,  337,  233,
+      238,  238,  199,  234,  239,  239,  949,  212,  337,  240,
+      218,  337,  337,  246,  241,  247,  248,  950,  236,  249,
+      241,  254,  242,  337,  951,  377,  337,  551,  250,  255,
+      251,  256,  257,  374,  277,  258,  278,  279,  280,  337,
+      281,  235,  369,  240,  286,  282,  287,  288,  952,  283,
+
+      289,  284,  953,  298,  340,  299,  300,  541,  370,  301,
+      306,  290,  307,  308,  340,  544,  309,  547,  244,  302,
+      303,  312,  378,  379,  340,  313,  549,  340,  340,  314,
+      542,  643,  337,  367,  315,  380,  381,  368,  316,  340,
+      402,  317,  340,  552,  954,  318,  647,  382,  911,  319,
+      912,  955,  559,  402,  543,  340,  508,  402,  320,  383,
+      384,  510,  410,  321,  402,  559,  322,  323,  324,  385,
+      956,  553,  325,  963,  340,  410,  326,  402,  685,  410,
+      652,  327,  402,  554,  555,  328,  410,  329,  330,  548,
+      655,  685,  331,  769,  537,  556,  332,  645,  340,  410,
+
+      560,  539,  337,  337,  410,  333,  769,  557,  558,  964,
+      334,  664,  648,  335,  336,  345,  516,  527,  551,  346,
+      517,  528,  509,  347,  518,  529,  337,  511,  348,  519,
+      530,  337,  349,  520,  531,  350,  521,  532,  776,  351,
+      522,  533,  965,  352,  523,  534,  653,  966,  643,  746,
+      647,  776,  353,  524,  535,  660,  656,  354,  525,  536,
+      538,  355,  356,  967,  661,  652,  357,  540,  340,  340,
+      358,  968,  662,  655,  337,  359,  337,  665,  337,  360,
+      842,  337,  361,  664,  552,  845,  362,  758,  846,  759,
+      363,  746,  340,  842,  337,  663,  337,  340,  845,  364,
+
+      928,  846,  914,  915,  365,  851,  855,  918,  366,  484,
+      920,  337,  337,  485,  645,  747,  648,  486,  851,  855,
+      918,  930,  487,  920,  932,  940,  488,  928,  943,  489,
+      944,  653,  930,  490,  756,  337,  757,  491,  940,  656,
+      340,  943,  340,  944,  340,  932,  492,  760,  838,  665,
+      961,  493,  957,  961,  494,  496,  910,  747,  969,  497,
+      340,  970,  340,  498,  971,  957,  929,  972,  499,  973,
+      974,  927,  500,  975,  501,  502,  958,  340,  340,  503,
+      936,  937,  938,  504,  401,  403,  947,  931,  405,  958,
+      933,  959,  505,  929,  960,  407,  408,  506,  931,  409,
+
+      507,  340,  411,  413,  959,  414,  415,  960,  921,  939,
+      919,  933,  917,  916,  913,  909,  962,  908,  907,  962,
+       12,   12,   12,  124,  124,  644,  644,  906,  905,  904,
+      903,  902,  901,  900,  899,  898,  897,  896,  895,  894,
+      893,  892,  891,  890,  889,  888,  887,  886,  885,  884,
+      883,  882,  881,  880,  879,  878,  877,  876,  875,  874,
+      873,  872,  871,  870,  869,  868,  867,  866,  865,  864,
+      863,  862,  861,  860,  859,  858,  857,  856,  854,  853,
+      852,  850,  849,  848,  847,  844,  843,  840,  839,  837,
+      836,  835,  834,  833,  832,  831,  830,  829,  828,  827,
+
+      826,  825,  824,  823,  822,  821,  820,  819,  818,  817,
+      816,  815,  814,  813,  812,  811,  810,  809,  808,  807,
+      806,  805,  804,  803,  802,  801,  800,  799,  798,  797,
+      796,  795,  794,  793,  792,  791,  790,  789,  788,  787,
+      786,  785,  784,  783,  782,  781,  780,  779,  778,  777,
+      775,  774,  773,  772,  771,  770,  768,  767,  766,  765,
+      764,  763,  762,  761,  755,  754,  753,  752,  751,  750,
+      749,  748,  745,  744,  743,  742,  741,  740,  739,  738,
+      737,  736,  735,  734,  733,  732,  731,  730,  729,  728,
+      727,  726,  725,  724,  723,  722,  721,  720,  719,  718,
+
+      717,  716,  715,  714,  713,  712,  711,  710,  709,  708,
+      707,  706,  705,  704,  703,  702,  701,  700,  699,  698,
+      697,  696,  695,  694,  693,  692,  691,  690,  689,  688,
+      687,  686,  684,  683,  682,  681,  680,  678,  675,  674,
+      671,  670,  669,  668,  667,  384,  383,  382,  381,  380,
+      379,  666,  543,  542,  659,  658,  365,  364,  363,  362,
+      657,  360,  359,  358,  357,  356,  354,  353,  352,  351,
+      654,  349,  348,  347,  346,  345,  651,  650,  335,  334,
+      333,  332,  331,  649,  329,  328,  327,  326,  325,  324,
+      322,  321,  320,  319,  318,  646,  316,  315,  314,  313,
+
+      312,  642,  641,  640,  639,  638,  637,  636,  635,  634,
+      633,  632,  631,  630,  629,  628,  627,  626,  625,  624,
+      623,  622,  621,  620,  619,  618,  617,  616,  615,  614,
+      613,  612,  611,  610,  609,  608,  607,  606,  605,  604,
+      603,  602,  601,  600,  599,  598,  597,  596,  595,  594,
+      593,  592,  591,  590,  589,  588,  587,  586,  585,  584,
+      583,  582,  581,  580,  579,  577,  576,  575,  570,  569,
+      568,  567,  566,  565,  564,  563,  562,  561,  550,  526,
+      515,  514,  513,  512,  495,  483,  482,  481,  480,  479,
+      478,  477,  476,  475,  474,  473,  472,  471,  470,  469,
+
+      468,  467,  466,  465,  464,  463,  462,  461,  460,  459,
+      458,  457,  456,  455,  454,  453,  452,  451,  450,  449,
+      448,  447,  446,  445,  444,  443,  442,  441,  440,  439,
+      438,  437,  436,  435,  434,  433,  432,  431,  430,  429,
+      428,  427,  426,  425,  424,  423,  422,  421,  420,  419,
+      418,  417,  416,  412,  404,  393,  396,  395,  394,  388,
+      305,  304,  297,  296,  291,  285,  276,  271,  264,  263,
+      253,  252,  200,  243,  216,  208,  226,  215,  190,  189,
+      175,  171,  164,  156,  152,  141,  114,  113,  112,   88,
+       87,   86,   85,   84,   83,   82,   81,   80,   79,   78,
+
+       77,   76,   75,   74,   73,   72,   71,   70,   69,   68,
+       67,   66,   65,   64,   63,  976,   39,   39,   11,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976
+    } ;
+
+static const short int yy_chk[1391] =
+    {   0,
+        0,    0,  124,    0,    3,    7,    0,    0,   87,    3,
+        3,    7,    3,   87,   48,  760,  125,    0,    0,    3,
+        3,    0,    3,    7,    3,    0,    3,   48,   65,  568,
+        3,  126,    0,    0,    3,    3,   51,  133,  136,    3,
+      337,    3,  568,    3,    7,    3,    3,    7,    3,   51,
+        3,    8,   65,   48,    3,   48,   66,    8,    3,    3,
+       50,   53,    3,  852,    3,   50,   54,    3,  124,    8,
+        3,   57,    7,   50,   53,   51,   59,   51,  760,   54,
+       66,   59,  125,  111,   57,   93,  111,   93,   93,   59,
+        8,   93,   96,    8,   96,   96,  133,  126,   96,   50,
+
+       53,   50,   53,  133,  136,   54,  337,   54,   96,   96,
+       57,  142,   57,  397,  142,   59,  397,   59,    8,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+       39,  144,   39,   39,   39,  149,  145,  853,   39,  144,
+
+      145,   39,   39,   39,  144,   71,   39,   39,   60,   39,
+       71,  150,   61,  149,   39,  398,   39,  150,   39,  854,
+       39,   60,   39,  565,   39,   61,   39,   39,  164,  398,
+       39,   39,   39,  875,  565,   39,   43,   43,   43,   43,
+       43,   43,   43,   43,   71,  901,   71,   60,  338,   60,
+      339,   61,  164,   61,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,  341,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+
+       43,   43,   43,   46,   46,   46,  406,   46,   62,   46,
+       46,   46,  569,  343,  338,  917,  339,   69,   46,   46,
+      135,   62,   69,  919,  372,  569,  367,   46,   46,   46,
+      406,   46,   72,   46,   46,   46,   98,   72,   98,   98,
+      341,   75,   98,   46,   46,  923,   75,   62,  372,   62,
+       63,   63,   88,   63,  132,   74,   69,   63,   69,  368,
+       74,   63,  924,   74,   88,   88,   63,  123,  135,  372,
+       63,   72,  104,   72,  104,  104,   88,   63,  104,  343,
+       75,   63,   75,   69,  571,   63,  135,  123,   88,   88,
+       63,  123,  367,   63,   74,   63,   74,  571,   63,   64,
+
+       77,  132,  914,   64,   77,  914,   79,   64,   77,  376,
+       81,   79,   64,   77,   82,   81,   64,   77,   64,   82,
+      132,   74,   78,   64,   77,  368,   78,   64,   77,   86,
+       78,   64,   77,  123,   86,   78,   64,   77,  134,   78,
+      929,   64,   77,   89,   64,   79,   78,   79,  131,   81,
+       78,   81,   84,   82,   78,   82,  931,   84,  371,   78,
+       84,  369,  137,   89,   78,   89,   89,  933,   86,   89,
+       86,   92,   79,  373,  934,  376,  375,  378,   89,   92,
+       89,   92,   92,  134,  100,   92,  100,  100,  100,  130,
+      100,   84,  131,   84,  102,  100,  102,  102,  935,  100,
+
+      102,  100,  936,  107,  134,  107,  107,  369,  370,  107,
+      110,  102,  110,  110,  131,  371,  110,  373,   84,  107,
+      107,  115,  137,  140,  371,  115,  375,  369,  137,  115,
+      370,  483,  374,  130,  115,  140,  140,  130,  115,  373,
+      156,  115,  375,  378,  937,  115,  495,  140,  839,  115,
+      839,  938,  386,  156,  370,  130,  508,  156,  115,  140,
+      140,  510,  175,  115,  156,  386,  115,  115,  120,  140,
+      939,  385,  120,  951,  370,  175,  120,  156,  578,  175,
+      515,  120,  156,  385,  385,  120,  175,  120,  120,  374,
+      526,  578,  120,  674,  537,  385,  120,  483,  374,  175,
+
+      386,  539,  541,  544,  175,  120,  674,  385,  385,  952,
+      120,  549,  495,  120,  120,  127,  355,  366,  551,  127,
+      355,  366,  508,  127,  355,  366,  547,  510,  127,  355,
+      366,  548,  127,  355,  366,  127,  355,  366,  683,  127,
+      355,  366,  953,  127,  355,  366,  515,  954,  643,  644,
+      647,  683,  127,  355,  366,  541,  526,  127,  355,  366,
+      537,  127,  129,  955,  544,  652,  129,  539,  541,  544,
+      129,  956,  547,  655,  660,  129,  662,  549,  661,  129,
+      762,  663,  129,  664,  551,  765,  129,  662,  766,  662,
+      129,  746,  547,  762,  756,  548,  757,  548,  765,  129,
+
+      911,  766,  841,  841,  129,  772,  777,  847,  129,  323,
+      849,  910,  838,  323,  643,  644,  647,  323,  772,  777,
+      847,  912,  323,  849,  913,  916,  323,  928,  921,  323,
+      922,  652,  930,  323,  660,  927,  661,  323,  916,  655,
+      660,  921,  662,  922,  661,  932,  323,  663,  756,  664,
+      947,  323,  941,  961,  323,  336,  838,  746,  962,  336,
+      756,  963,  757,  336,  964,  941,  911,  968,  336,  972,
+      973,  910,  336,  974,  336,  336,  942,  910,  838,  336,
+      915,  915,  915,  336,  979,  980,  927,  912,  981,  942,
+      913,  945,  336,  928,  946,  982,  983,  336,  930,  984,
+
+      336,  927,  985,  986,  945,  987,  988,  946,  850,  915,
+      848,  932,  844,  843,  840,  836,  947,  835,  834,  961,
+      977,  977,  977,  978,  978,  989,  989,  833,  832,  831,
+      829,  828,  827,  826,  825,  824,  823,  822,  821,  820,
+      819,  818,  817,  816,  815,  814,  813,  812,  810,  809,
+      808,  807,  806,  805,  804,  803,  802,  800,  799,  798,
+      797,  796,  795,  794,  793,  792,  791,  790,  789,  788,
+      787,  786,  784,  783,  781,  780,  779,  778,  775,  774,
+      773,  771,  770,  768,  767,  764,  763,  759,  758,  747,
+      745,  744,  743,  742,  741,  740,  739,  738,  737,  736,
+
+      735,  734,  733,  732,  731,  730,  729,  728,  727,  726,
+      725,  724,  723,  722,  721,  720,  719,  718,  717,  716,
+      715,  714,  713,  712,  711,  710,  709,  708,  707,  706,
+      705,  704,  703,  701,  700,  699,  698,  697,  696,  695,
+      694,  693,  692,  691,  690,  689,  688,  687,  686,  684,
+      682,  681,  680,  678,  677,  675,  673,  672,  671,  670,
+      669,  668,  667,  665,  657,  656,  654,  653,  649,  648,
+      646,  645,  642,  641,  640,  639,  638,  637,  636,  635,
+      634,  633,  632,  631,  630,  629,  628,  627,  626,  625,
+      624,  622,  621,  620,  619,  618,  617,  616,  614,  613,
+
+      612,  611,  610,  609,  608,  607,  606,  605,  604,  603,
+      602,  601,  600,  599,  598,  597,  596,  595,  594,  593,
+      592,  591,  590,  589,  587,  586,  585,  584,  583,  582,
+      581,  580,  576,  575,  574,  573,  572,  570,  567,  566,
+      564,  563,  562,  561,  560,  558,  557,  556,  555,  554,
+      553,  552,  546,  545,  540,  538,  536,  535,  534,  533,
+      532,  531,  530,  529,  528,  527,  525,  524,  523,  522,
+      521,  520,  519,  518,  517,  516,  511,  509,  507,  506,
+      505,  504,  503,  502,  501,  500,  499,  498,  497,  496,
+      494,  493,  492,  491,  490,  489,  488,  487,  486,  485,
+
+      484,  482,  481,  480,  479,  478,  477,  476,  475,  474,
+      473,  472,  471,  470,  469,  468,  466,  465,  464,  463,
+      461,  460,  459,  458,  457,  456,  455,  454,  453,  452,
+      450,  449,  448,  447,  446,  445,  444,  443,  442,  441,
+      440,  439,  438,  437,  436,  435,  434,  433,  432,  431,
+      430,  429,  428,  427,  426,  425,  424,  423,  422,  421,
+      420,  419,  418,  417,  412,  404,  400,  399,  396,  395,
+      394,  393,  392,  391,  390,  389,  388,  387,  377,  361,
+      350,  344,  342,  340,  330,  317,  311,  310,  309,  308,
+      307,  306,  305,  304,  303,  302,  301,  300,  299,  298,
+
+      297,  296,  295,  294,  293,  292,  291,  290,  289,  288,
+      287,  286,  285,  284,  283,  282,  281,  280,  279,  278,
+      277,  276,  275,  274,  273,  272,  271,  270,  269,  268,
+      267,  266,  265,  264,  263,  262,  261,  260,  259,  258,
+      257,  256,  255,  254,  253,  252,  251,  250,  249,  248,
+      247,  246,  245,  177,  158,  151,  148,  147,  146,  143,
+      109,  108,  106,  105,  103,  101,   99,   97,   95,   94,
+       91,   90,   85,   83,   80,   76,   73,   70,   68,   67,
+       58,   56,   52,   49,   47,   44,   42,   41,   40,   38,
+       37,   36,   35,   34,   33,   32,   31,   30,   29,   28,
+
+       27,   26,   25,   24,   23,   22,   21,   20,   19,   18,
+       17,   16,   15,   14,   13,   11,    6,    5,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976,
+      976,  976,  976,  976,  976,  976,  976,  976,  976,  976
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+char *yytext;
+/* This file is generated automatically by mergelex.awk.  */
+#include "recode.h"
+#ifdef USE_FPUTC
+#define output(ch) fputc (ch, yyout)
+#else
+#define output(ch) putc (ch, yyout)
+#endif
+void texte_latin1_diaeresis _((void));
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = getc( yyin ); \
+               result = c == EOF ? 0 : 1; \
+               buf[0] = (char) c; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp, *yy_bp;
+       register int yy_act;
+
+
+
+       if ( yy_init )
+               {
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( yy_current_buffer )
+                       yy_init_buffer( yy_current_buffer, yyin );
+               else
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+
+               yy_init = 0;
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 977 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 1319 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(ascii_latin1):
+case YY_STATE_EOF(html_latin1):
+case YY_STATE_EOF(latex_latin1):
+case YY_STATE_EOF(texte_latin1):
+{ return 1; }
+       YY_BREAK
+case 1:
+YY_USER_ACTION
+{ output (171); }
+       YY_BREAK
+case 2:
+YY_USER_ACTION
+{ output (187); }
+       YY_BREAK
+case 3:
+YY_USER_ACTION
+{ output (192); }
+       YY_BREAK
+case 4:
+YY_USER_ACTION
+{ output (193); }
+       YY_BREAK
+case 5:
+YY_USER_ACTION
+{ output (194); }
+       YY_BREAK
+case 6:
+YY_USER_ACTION
+{ output (195); }
+       YY_BREAK
+case 7:
+YY_USER_ACTION
+{ output (196); }
+       YY_BREAK
+case 8:
+YY_USER_ACTION
+{ output (199); }
+       YY_BREAK
+case 9:
+YY_USER_ACTION
+{ output (200); }
+       YY_BREAK
+case 10:
+YY_USER_ACTION
+{ output (201); }
+       YY_BREAK
+case 11:
+YY_USER_ACTION
+{ output (202); }
+       YY_BREAK
+case 12:
+YY_USER_ACTION
+{ output (203); }
+       YY_BREAK
+case 13:
+YY_USER_ACTION
+{ output (204); }
+       YY_BREAK
+case 14:
+YY_USER_ACTION
+{ output (205); }
+       YY_BREAK
+case 15:
+YY_USER_ACTION
+{ output (206); }
+       YY_BREAK
+case 16:
+YY_USER_ACTION
+{ output (207); }
+       YY_BREAK
+case 17:
+YY_USER_ACTION
+{ output (209); }
+       YY_BREAK
+case 18:
+YY_USER_ACTION
+{ output (210); }
+       YY_BREAK
+case 19:
+YY_USER_ACTION
+{ output (211); }
+       YY_BREAK
+case 20:
+YY_USER_ACTION
+{ output (212); }
+       YY_BREAK
+case 21:
+YY_USER_ACTION
+{ output (213); }
+       YY_BREAK
+case 22:
+YY_USER_ACTION
+{ output (214); }
+       YY_BREAK
+case 23:
+YY_USER_ACTION
+{ output (216); }
+       YY_BREAK
+case 24:
+YY_USER_ACTION
+{ output (217); }
+       YY_BREAK
+case 25:
+YY_USER_ACTION
+{ output (218); }
+       YY_BREAK
+case 26:
+YY_USER_ACTION
+{ output (219); }
+       YY_BREAK
+case 27:
+YY_USER_ACTION
+{ output (220); }
+       YY_BREAK
+case 28:
+YY_USER_ACTION
+{ output (221); }
+       YY_BREAK
+case 29:
+YY_USER_ACTION
+{ output (223); }
+       YY_BREAK
+case 30:
+YY_USER_ACTION
+{ output (224); }
+       YY_BREAK
+case 31:
+YY_USER_ACTION
+{ output (225); }
+       YY_BREAK
+case 32:
+YY_USER_ACTION
+{ output (226); }
+       YY_BREAK
+case 33:
+YY_USER_ACTION
+{ output (227); }
+       YY_BREAK
+case 34:
+YY_USER_ACTION
+{ output (228); }
+       YY_BREAK
+case 35:
+YY_USER_ACTION
+{ output (231); }
+       YY_BREAK
+case 36:
+YY_USER_ACTION
+{ output (232); }
+       YY_BREAK
+case 37:
+YY_USER_ACTION
+{ output (233); }
+       YY_BREAK
+case 38:
+YY_USER_ACTION
+{ output (234); }
+       YY_BREAK
+case 39:
+YY_USER_ACTION
+{ output (235); }
+       YY_BREAK
+case 40:
+YY_USER_ACTION
+{ output (236); }
+       YY_BREAK
+case 41:
+YY_USER_ACTION
+{ output (237); }
+       YY_BREAK
+case 42:
+YY_USER_ACTION
+{ output (238); }
+       YY_BREAK
+case 43:
+YY_USER_ACTION
+{ output (239); }
+       YY_BREAK
+case 44:
+YY_USER_ACTION
+{ output (241); }
+       YY_BREAK
+case 45:
+YY_USER_ACTION
+{ output (242); }
+       YY_BREAK
+case 46:
+YY_USER_ACTION
+{ output (243); }
+       YY_BREAK
+case 47:
+YY_USER_ACTION
+{ output (244); }
+       YY_BREAK
+case 48:
+YY_USER_ACTION
+{ output (245); }
+       YY_BREAK
+case 49:
+YY_USER_ACTION
+{ output (246); }
+       YY_BREAK
+case 50:
+YY_USER_ACTION
+{ output (248); }
+       YY_BREAK
+case 51:
+YY_USER_ACTION
+{ output (249); }
+       YY_BREAK
+case 52:
+YY_USER_ACTION
+{ output (250); }
+       YY_BREAK
+case 53:
+YY_USER_ACTION
+{ output (251); }
+       YY_BREAK
+case 54:
+YY_USER_ACTION
+{ output (252); }
+       YY_BREAK
+case 55:
+YY_USER_ACTION
+{ output (253); }
+       YY_BREAK
+case 56:
+YY_USER_ACTION
+{ output (255); }
+       YY_BREAK
+case 57:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (38); }
+       YY_BREAK
+case 58:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (60); }
+       YY_BREAK
+case 59:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (62); }
+       YY_BREAK
+case 60:
+YY_USER_ACTION
+{ output (192); }
+       YY_BREAK
+case 61:
+YY_USER_ACTION
+{ output (193); }
+       YY_BREAK
+case 62:
+YY_USER_ACTION
+{ output (194); }
+       YY_BREAK
+case 63:
+YY_USER_ACTION
+{ output (195); }
+       YY_BREAK
+case 64:
+YY_USER_ACTION
+{ output (196); }
+       YY_BREAK
+case 65:
+YY_USER_ACTION
+{ output (197); }
+       YY_BREAK
+case 66:
+YY_USER_ACTION
+{ output (198); }
+       YY_BREAK
+case 67:
+YY_USER_ACTION
+{ output (199); }
+       YY_BREAK
+case 68:
+YY_USER_ACTION
+{ output (200); }
+       YY_BREAK
+case 69:
+YY_USER_ACTION
+{ output (201); }
+       YY_BREAK
+case 70:
+YY_USER_ACTION
+{ output (202); }
+       YY_BREAK
+case 71:
+YY_USER_ACTION
+{ output (203); }
+       YY_BREAK
+case 72:
+YY_USER_ACTION
+{ output (204); }
+       YY_BREAK
+case 73:
+YY_USER_ACTION
+{ output (205); }
+       YY_BREAK
+case 74:
+YY_USER_ACTION
+{ output (206); }
+       YY_BREAK
+case 75:
+YY_USER_ACTION
+{ output (207); }
+       YY_BREAK
+case 76:
+YY_USER_ACTION
+{ output (208); }
+       YY_BREAK
+case 77:
+YY_USER_ACTION
+{ output (209); }
+       YY_BREAK
+case 78:
+YY_USER_ACTION
+{ output (210); }
+       YY_BREAK
+case 79:
+YY_USER_ACTION
+{ output (211); }
+       YY_BREAK
+case 80:
+YY_USER_ACTION
+{ output (212); }
+       YY_BREAK
+case 81:
+YY_USER_ACTION
+{ output (213); }
+       YY_BREAK
+case 82:
+YY_USER_ACTION
+{ output (214); }
+       YY_BREAK
+case 83:
+YY_USER_ACTION
+{ output (215); }
+       YY_BREAK
+case 84:
+YY_USER_ACTION
+{ output (216); }
+       YY_BREAK
+case 85:
+YY_USER_ACTION
+{ output (217); }
+       YY_BREAK
+case 86:
+YY_USER_ACTION
+{ output (218); }
+       YY_BREAK
+case 87:
+YY_USER_ACTION
+{ output (219); }
+       YY_BREAK
+case 88:
+YY_USER_ACTION
+{ output (220); }
+       YY_BREAK
+case 89:
+YY_USER_ACTION
+{ output (221); }
+       YY_BREAK
+case 90:
+YY_USER_ACTION
+{ output (222); }
+       YY_BREAK
+case 91:
+YY_USER_ACTION
+{ output (223); }
+       YY_BREAK
+case 92:
+YY_USER_ACTION
+{ output (224); }
+       YY_BREAK
+case 93:
+YY_USER_ACTION
+{ output (225); }
+       YY_BREAK
+case 94:
+YY_USER_ACTION
+{ output (226); }
+       YY_BREAK
+case 95:
+YY_USER_ACTION
+{ output (227); }
+       YY_BREAK
+case 96:
+YY_USER_ACTION
+{ output (228); }
+       YY_BREAK
+case 97:
+YY_USER_ACTION
+{ output (229); }
+       YY_BREAK
+case 98:
+YY_USER_ACTION
+{ output (230); }
+       YY_BREAK
+case 99:
+YY_USER_ACTION
+{ output (231); }
+       YY_BREAK
+case 100:
+YY_USER_ACTION
+{ output (232); }
+       YY_BREAK
+case 101:
+YY_USER_ACTION
+{ output (233); }
+       YY_BREAK
+case 102:
+YY_USER_ACTION
+{ output (234); }
+       YY_BREAK
+case 103:
+YY_USER_ACTION
+{ output (235); }
+       YY_BREAK
+case 104:
+YY_USER_ACTION
+{ output (236); }
+       YY_BREAK
+case 105:
+YY_USER_ACTION
+{ output (237); }
+       YY_BREAK
+case 106:
+YY_USER_ACTION
+{ output (238); }
+       YY_BREAK
+case 107:
+YY_USER_ACTION
+{ output (239); }
+       YY_BREAK
+case 108:
+YY_USER_ACTION
+{ output (240); }
+       YY_BREAK
+case 109:
+YY_USER_ACTION
+{ output (241); }
+       YY_BREAK
+case 110:
+YY_USER_ACTION
+{ output (242); }
+       YY_BREAK
+case 111:
+YY_USER_ACTION
+{ output (243); }
+       YY_BREAK
+case 112:
+YY_USER_ACTION
+{ output (244); }
+       YY_BREAK
+case 113:
+YY_USER_ACTION
+{ output (245); }
+       YY_BREAK
+case 114:
+YY_USER_ACTION
+{ output (246); }
+       YY_BREAK
+case 115:
+YY_USER_ACTION
+{ output (247); }
+       YY_BREAK
+case 116:
+YY_USER_ACTION
+{ output (248); }
+       YY_BREAK
+case 117:
+YY_USER_ACTION
+{ output (249); }
+       YY_BREAK
+case 118:
+YY_USER_ACTION
+{ output (250); }
+       YY_BREAK
+case 119:
+YY_USER_ACTION
+{ output (251); }
+       YY_BREAK
+case 120:
+YY_USER_ACTION
+{ output (252); }
+       YY_BREAK
+case 121:
+YY_USER_ACTION
+{ output (253); }
+       YY_BREAK
+case 122:
+YY_USER_ACTION
+{ output (254); }
+       YY_BREAK
+case 123:
+YY_USER_ACTION
+{ output (255); }
+       YY_BREAK
+case 124:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('#'); }
+       YY_BREAK
+case 125:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('$'); }
+       YY_BREAK
+case 126:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('%'); }
+       YY_BREAK
+case 127:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('&'); }
+       YY_BREAK
+case 128:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('_'); }
+       YY_BREAK
+case 129:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('{'); }
+       YY_BREAK
+case 130:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('}'); }
+       YY_BREAK
+case 131:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output ('\\'); }
+       YY_BREAK
+case 132:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (160); }
+       YY_BREAK
+case 133:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (161); }
+       YY_BREAK
+case 134:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (167); }
+       YY_BREAK
+case 135:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (168); }
+       YY_BREAK
+case 136:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (171); }
+       YY_BREAK
+case 137:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (172); }
+       YY_BREAK
+case 138:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (173); }
+       YY_BREAK
+case 139:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (176); }
+       YY_BREAK
+case 140:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (177); }
+       YY_BREAK
+case 141:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (178); }
+       YY_BREAK
+case 142:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (179); }
+       YY_BREAK
+case 143:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (180); }
+       YY_BREAK
+case 144:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (181); }
+       YY_BREAK
+case 145:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (183); }
+       YY_BREAK
+case 146:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (184); }
+       YY_BREAK
+case 147:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (185); }
+       YY_BREAK
+case 148:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (187); }
+       YY_BREAK
+case 149:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (188); }
+       YY_BREAK
+case 150:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (189); }
+       YY_BREAK
+case 151:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (190); }
+       YY_BREAK
+case 152:
+YY_USER_ACTION
+{ if (diacritics_only) ECHO; else output (191); }
+       YY_BREAK
+case 153:
+YY_USER_ACTION
+{ output (192); }
+       YY_BREAK
+case 154:
+YY_USER_ACTION
+{ output (193); }
+       YY_BREAK
+case 155:
+YY_USER_ACTION
+{ output (194); }
+       YY_BREAK
+case 156:
+YY_USER_ACTION
+{ output (195); }
+       YY_BREAK
+case 157:
+YY_USER_ACTION
+{ output (196); }
+       YY_BREAK
+case 158:
+YY_USER_ACTION
+{ output (197); }
+       YY_BREAK
+case 159:
+YY_USER_ACTION
+{ output (198); }
+       YY_BREAK
+case 160:
+YY_USER_ACTION
+{ output (199); }
+       YY_BREAK
+case 161:
+YY_USER_ACTION
+{ output (200); }
+       YY_BREAK
+case 162:
+YY_USER_ACTION
+{ output (201); }
+       YY_BREAK
+case 163:
+YY_USER_ACTION
+{ output (202); }
+       YY_BREAK
+case 164:
+YY_USER_ACTION
+{ output (203); }
+       YY_BREAK
+case 165:
+YY_USER_ACTION
+{ output (204); }
+       YY_BREAK
+case 166:
+YY_USER_ACTION
+{ output (205); }
+       YY_BREAK
+case 167:
+YY_USER_ACTION
+{ output (206); }
+       YY_BREAK
+case 168:
+YY_USER_ACTION
+{ output (207); }
+       YY_BREAK
+case 169:
+YY_USER_ACTION
+{ output (209); }
+       YY_BREAK
+case 170:
+YY_USER_ACTION
+{ output (210); }
+       YY_BREAK
+case 171:
+YY_USER_ACTION
+{ output (211); }
+       YY_BREAK
+case 172:
+YY_USER_ACTION
+{ output (212); }
+       YY_BREAK
+case 173:
+YY_USER_ACTION
+{ output (213); }
+       YY_BREAK
+case 174:
+YY_USER_ACTION
+{ output (214); }
+       YY_BREAK
+case 175:
+YY_USER_ACTION
+{ output (216); }
+       YY_BREAK
+case 176:
+YY_USER_ACTION
+{ output (217); }
+       YY_BREAK
+case 177:
+YY_USER_ACTION
+{ output (218); }
+       YY_BREAK
+case 178:
+YY_USER_ACTION
+{ output (219); }
+       YY_BREAK
+case 179:
+YY_USER_ACTION
+{ output (220); }
+       YY_BREAK
+case 180:
+YY_USER_ACTION
+{ output (221); }
+       YY_BREAK
+case 181:
+YY_USER_ACTION
+{ output (223); }
+       YY_BREAK
+case 182:
+YY_USER_ACTION
+{ output (224); }
+       YY_BREAK
+case 183:
+YY_USER_ACTION
+{ output (225); }
+       YY_BREAK
+case 184:
+YY_USER_ACTION
+{ output (226); }
+       YY_BREAK
+case 185:
+YY_USER_ACTION
+{ output (227); }
+       YY_BREAK
+case 186:
+YY_USER_ACTION
+{ output (228); }
+       YY_BREAK
+case 187:
+YY_USER_ACTION
+{ output (229); }
+       YY_BREAK
+case 188:
+YY_USER_ACTION
+{ output (230); }
+       YY_BREAK
+case 189:
+YY_USER_ACTION
+{ output (231); }
+       YY_BREAK
+case 190:
+YY_USER_ACTION
+{ output (232); }
+       YY_BREAK
+case 191:
+YY_USER_ACTION
+{ output (233); }
+       YY_BREAK
+case 192:
+YY_USER_ACTION
+{ output (234); }
+       YY_BREAK
+case 193:
+YY_USER_ACTION
+{ output (235); }
+       YY_BREAK
+case 194:
+YY_USER_ACTION
+{ output (236); }
+       YY_BREAK
+case 195:
+YY_USER_ACTION
+{ output (237); }
+       YY_BREAK
+case 196:
+YY_USER_ACTION
+{ output (238); }
+       YY_BREAK
+case 197:
+YY_USER_ACTION
+{ output (239); }
+       YY_BREAK
+case 198:
+YY_USER_ACTION
+{ output (241); }
+       YY_BREAK
+case 199:
+YY_USER_ACTION
+{ output (242); }
+       YY_BREAK
+case 200:
+YY_USER_ACTION
+{ output (243); }
+       YY_BREAK
+case 201:
+YY_USER_ACTION
+{ output (244); }
+       YY_BREAK
+case 202:
+YY_USER_ACTION
+{ output (245); }
+       YY_BREAK
+case 203:
+YY_USER_ACTION
+{ output (246); }
+       YY_BREAK
+case 204:
+YY_USER_ACTION
+{ output (248); }
+       YY_BREAK
+case 205:
+YY_USER_ACTION
+{ output (249); }
+       YY_BREAK
+case 206:
+YY_USER_ACTION
+{ output (250); }
+       YY_BREAK
+case 207:
+YY_USER_ACTION
+{ output (251); }
+       YY_BREAK
+case 208:
+YY_USER_ACTION
+{ output (252); }
+       YY_BREAK
+case 209:
+YY_USER_ACTION
+{ output (253); }
+       YY_BREAK
+case 210:
+YY_USER_ACTION
+{ output (255); }
+       YY_BREAK
+case 211:
+YY_USER_ACTION
+{ ECHO; }
+       YY_BREAK
+case 212:
+YY_USER_ACTION
+{ ECHO; }
+       YY_BREAK
+case 213:
+YY_USER_ACTION
+{ output (171); }
+       YY_BREAK
+case 214:
+YY_USER_ACTION
+{ output (187); }
+       YY_BREAK
+case 215:
+YY_USER_ACTION
+{ output (192); }
+       YY_BREAK
+case 216:
+YY_USER_ACTION
+{ output (194); }
+       YY_BREAK
+case 217:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (196);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 218:
+YY_USER_ACTION
+{ output (224); }
+       YY_BREAK
+case 219:
+YY_USER_ACTION
+{ output (226); }
+       YY_BREAK
+case 220:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (228);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 221:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ output (199); }
+       YY_BREAK
+case 222:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ output (231); }
+       YY_BREAK
+case 223:
+YY_USER_ACTION
+{ output (200); }
+       YY_BREAK
+case 224:
+YY_USER_ACTION
+{ output (201); output (187); }
+       YY_BREAK
+case 225:
+YY_USER_ACTION
+{ output ('E'); output (187); }
+       YY_BREAK
+case 226:
+YY_USER_ACTION
+{ output (201); }
+       YY_BREAK
+case 227:
+YY_USER_ACTION
+{ output (202); }
+       YY_BREAK
+case 228:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (203);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 229:
+YY_USER_ACTION
+{ output (232); }
+       YY_BREAK
+case 230:
+YY_USER_ACTION
+{ output (233); output (187); }
+       YY_BREAK
+case 231:
+YY_USER_ACTION
+{ output ('e'); output (187); }
+       YY_BREAK
+case 232:
+YY_USER_ACTION
+{ output (233); }
+       YY_BREAK
+case 233:
+YY_USER_ACTION
+{ output (234); }
+       YY_BREAK
+case 234:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (235);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 235:
+YY_USER_ACTION
+{ output (204); }
+       YY_BREAK
+case 236:
+YY_USER_ACTION
+{ output (206); }
+       YY_BREAK
+case 237:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (207);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 238:
+YY_USER_ACTION
+{ output (236); }
+       YY_BREAK
+case 239:
+YY_USER_ACTION
+{ output (238); }
+       YY_BREAK
+case 240:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (239);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 241:
+YY_USER_ACTION
+{ output (210); }
+       YY_BREAK
+case 242:
+YY_USER_ACTION
+{ output (212); }
+       YY_BREAK
+case 243:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (214);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 244:
+YY_USER_ACTION
+{ output (242); }
+       YY_BREAK
+case 245:
+YY_USER_ACTION
+{ output (244); }
+       YY_BREAK
+case 246:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (246);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 247:
+YY_USER_ACTION
+{ output (217); }
+       YY_BREAK
+case 248:
+YY_USER_ACTION
+{ output (219); }
+       YY_BREAK
+case 249:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (220);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 250:
+YY_USER_ACTION
+{ output (249); }
+       YY_BREAK
+case 251:
+YY_USER_ACTION
+{ output (251); }
+       YY_BREAK
+case 252:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp = yy_bp + 2;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_USER_ACTION
+{ if (yytext[1] == diaeresis_char)
+                           output (252);
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 253:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 254:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 255:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 256:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 257:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 258:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 259:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 260:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 261:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 262:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 263:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 264:
+YY_USER_ACTION
+{ if (yytext[4] == diaeresis_char)
+                           texte_latin1_diaeresis ();
+                         else
+                           ECHO;
+                       }
+       YY_BREAK
+case 265:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 266:
+YY_USER_ACTION
+{ ECHO; }
+       YY_BREAK
+case 267:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 268:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 269:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 270:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 271:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 272:
+YY_USER_ACTION
+{ texte_latin1_diaeresis (); }
+       YY_BREAK
+case 273:
+YY_USER_ACTION
+ECHO;
+       YY_BREAK
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = yy_cp - yytext_ptr - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                                                       yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr - 1; /* copy prev. char, too */
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a singled characater, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = yy_c_buf_p - yytext_ptr;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset = yy_c_buf_p - b->yy_ch_buf;
+
+                       b->yy_buf_size *= 2;
+                       b->yy_ch_buf = (char *)
+                               yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                b->yy_buf_size );
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move - YY_MORE_ADJ == 1 )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       /* yytext begins at the second character in yy_ch_buf; the first
+        * character is the one which preceded it before reading in the latest
+        * buffer; it needs to be kept around in case it's a newline, so
+        * yy_get_previous_state() will have with '^' rules active.
+        */
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[1];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 977 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 977 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 976);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += dest - source;
+               yy_bp += dest - source;
+               yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       if ( yy_cp > yy_bp && yy_cp[-1] == '\n' )
+               yy_cp[-2] = '\n';
+
+       *--yy_cp = (char) c;
+
+
+       /* Note: the formal parameter *must* be called "yy_bp" for this
+        * macro to now work correctly.
+        */
+       YY_DO_BEFORE_ACTION; /* set up yytext again */
+       }
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       yytext_ptr = yy_c_buf_p;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               {
+                                               yy_c_buf_p =
+                                               yytext_ptr + YY_MORE_ADJ;
+                                               return EOF;
+                                               }
+
+                                       YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+                                       break;
+
+                               case EOB_ACT_LAST_MATCH:
+#ifdef __cplusplus
+                                       YY_FATAL_ERROR(
+                                       "unexpected last match in yyinput()" );
+#else
+                                       YY_FATAL_ERROR(
+                                       "unexpected last match in input()" );
+#endif
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+       return c;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       yy_flex_free( (void *) b->yy_ch_buf );
+       yy_flex_free( (void *) b );
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+       {
+       b->yy_input_file = file;
+
+       /* We put in the '\n' and start reading from [1] so that an
+        * initial match-at-newline will be true.
+        */
+
+       b->yy_ch_buf[0] = '\n';
+       b->yy_n_chars = 1;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[1];
+
+       b->yy_is_interactive = file ? isatty( fileno(file) ) : 0;
+
+       b->yy_fill_buffer = 1;
+
+       b->yy_buffer_status = YY_BUFFER_NEW;
+       }
+
+
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               int new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+
+
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+
+
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( const char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( 1 );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n - YY_MORE_ADJ; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, const char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+const char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( unsigned int size )
+#else
+static void *yy_flex_alloc( size )
+unsigned int size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, unsigned int size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+unsigned int size;
+#endif
+       {
+       return (void *) realloc( ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+
+#ifndef yywrap
+int
+yywrap (void)
+{
+  return 1;
+}
+#endif /* not yywrap */
+
+static int
+file_ascii_latin1 (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  yy_init = 1;
+  yyin = input_file;
+  yyout = output_file;
+  BEGIN ascii_latin1;
+  return yylex ();
+}
+
+void
+module_ascii_latin1 (void)
+{
+  declare_step ("ASCII-BS", "Latin-1", MANY_TO_ONE, NULL, file_ascii_latin1);
+}
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+
+static int
+file_html_latin1 (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  yy_init = 1;
+  yyin = input_file;
+  yyout = output_file;
+  BEGIN html_latin1;
+  return yylex ();
+}
+
+void
+module_html_latin1 (void)
+{
+  declare_step ("HTML", "latin1", MANY_TO_ONE, NULL, file_html_latin1);
+
+  declare_alias ("WWW", "HTML");
+  declare_alias ("w3", "HTML");
+}
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+
+static int
+file_latex_latin1 (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  yy_init = 1;
+  yyin = input_file;
+  yyout = output_file;
+  BEGIN latex_latin1;
+  return yylex ();
+}
+
+void
+module_latex_latin1 (void)
+{
+  declare_step ("LaTeX", "Latin-1", MANY_TO_ONE, NULL, file_latex_latin1);
+
+  declare_alias ("TeX", "LaTeX");
+  declare_alias ("ltex", "LaTeX");
+}
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1989.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+
+static int
+file_texte_latin1 (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  yy_init = 1;
+  yyin = input_file;
+  yyout = output_file;
+  BEGIN texte_latin1;
+  return yylex ();
+}
+
+void
+texte_latin1_diaeresis (void)
+{
+  int counter;
+
+  for (counter = 0; counter < yyleng; counter++)
+    if (yytext[counter+1] == diaeresis_char)
+      {
+       switch (yytext[counter])
+         {
+
+           /* The next "case 'A'" line once triggered a `NULL in input'
+              diagnostic in flex.  This astonishing bug has been hard to
+              isolate, so I'll leave this comment around for a while.  */
+
+         case 'A': output (196); break;
+         case 'E': output (203); break;
+         case 'I': output (207); break;
+         case 'O': output (214); break;
+         case 'U': output (220); break;
+         case 'a': output (228); break;
+         case 'e': output (235); break;
+         case 'i': output (239); break;
+         case 'o': output (246); break;
+         case 'u': output (252); break;
+         case 'y': output (255); break;
+         default:  output (yytext[counter]);
+         }
+       counter++;
+      }
+    else
+      output (yytext[counter]);
+}
+
+void
+module_texte_latin1 (void)
+{
+  declare_step ("Texte", "Latin-1", MANY_TO_ONE, NULL, file_texte_latin1);
+
+  declare_alias ("txte", "Texte");
+}
diff --git a/mergelex.awk b/mergelex.awk
new file mode 100644 (file)
index 0000000..7677498
--- /dev/null
@@ -0,0 +1,194 @@
+# Conversion of files between different charsets and usages.
+# Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1990.
+#
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# This awk script merges several lex sources intended for GNU recode.
+
+# At beginning, one temporary file is initialized for each section.
+
+BEGIN {
+  SECTION1 = "merged1.tmp"
+  SECTION2 = "merged2.tmp"
+  SECTION3 = "merged3.tmp"
+
+  print "/* This file is generated automatically by mergelex.awk.  */"
+
+  print ""                                             >SECTION1
+  print "%{"                                           >SECTION1
+  print "#include \"recode.h\""                                >SECTION1
+  print "#ifdef USE_FPUTC"                             >SECTION1
+  print "#define output(ch) fputc (ch, yyout)"         >SECTION1
+  print "#else"                                                >SECTION1
+  print "#define output(ch) putc (ch, yyout)"          >SECTION1
+  print "#endif"                                       >SECTION1
+  print "%}"                                           >SECTION1
+
+  print "%%"                                           >SECTION2
+  print "<<EOF>>                       { return 1; }"  >SECTION2
+
+  print "%%"                                           >SECTION3
+  print ""                                             >SECTION3
+  print "#ifndef yywrap"                               >SECTION3
+  print "int"                                          >SECTION3
+  print "yywrap (void)"                                        >SECTION3
+  print "{"                                            >SECTION3
+  print "  return 1;"                                  >SECTION3
+  print "}"                                            >SECTION3
+  print "#endif /* not yywrap */"                      >SECTION3
+}
+
+# A `/* Step name: NAME.  */' line indicates the start of a new file.
+# Generate an interface routine.  The step name is saved for broketed
+# prefixes in rules.
+
+$1 == "/*" && $2 == "Step" && $3 == "name:" && $5 == "*/" {
+  section = 1
+  step_name = $4
+  sub (".$", "", step_name)
+  print ""                                             >SECTION3
+  print "static int"                                   >SECTION3
+  print "file_" step_name " (const STEP *step, " \
+       "FILE *input_file, FILE *output_file)"          >SECTION3
+  print "{"                                            >SECTION3
+  print "  yy_init = 1;"                               >SECTION3
+  print "  yyin = input_file;"                         >SECTION3
+  print "  yyout = output_file;"                       >SECTION3
+  print "  BEGIN " step_name ";"                       >SECTION3
+  print "  return yylex ();"                           >SECTION3
+  print "}"                                            >SECTION3
+  next
+}
+
+# Remove block C comments in section 1, except the very first.  It is
+# assumed that, when a /* comment starts in column 1, there is no code
+# following the closing */ on its line.  Also, remove all white lines.
+
+/^\/\*/ && section == 1 {
+  while (!match ($0, /\*\//)) {
+    if (!comment_done) {
+      print
+    }
+    getline
+  }
+  if (!comment_done) {
+    print
+  }
+  comment_done = 1
+  next
+}
+
+/^[    ]*$/ && section == 1 {
+  next
+}
+
+# A %% in column 1 signals the beginning of lex rules.
+
+/^%%/ && section == 1 {
+  print "%x " step_name                                        >SECTION1
+  section = 2
+  print ""                                             >SECTION2
+  next
+}
+
+# A %{ comment in column 1 signals the start of a C code section ended
+# by a %} line.
+
+/^%\{/ {
+  c_code = 1
+  print ""                                             >SECTION1
+  print                                                        >SECTION1
+  next
+}
+
+/^%\}/ {
+  print                                                        >SECTION1
+  print ""                                             >SECTION1
+  c_code = 0
+  next
+}
+
+c_code {
+  print                                                        >SECTION1
+  next
+}
+
+# Section 1 declarations are studied and copied, once each.
+# Conflicting declaractions are reported at beginning of output.
+
+/^[^   ]/ && section == 1 {
+  if ($1 in rules) {
+    if ($0 != rules[$1]) {
+      print "** Conflicting definition: " $0
+    }
+  }
+  else {
+    rules[$1] = $0
+    print                                              >SECTION1
+  }
+  next
+}
+
+# In section 2, every non-empty line which does not start with white
+# space has to be a lex rule, which is then prefixed by a start name
+# derived from the step name.  However, a %% in column 1 starts
+# section 3, which contains pure C code, which is copied verbatim.
+
+/^$/ && section == 2 {
+  print                                                        >SECTION2
+  next
+}
+
+/^[    ]/ && section == 2 {
+  print                                                        >SECTION2
+  next
+}
+
+/^%%/ && section == 2 {
+  section = 3
+  next
+}
+
+section == 2 {
+  print "<" step_name ">" $0                           >SECTION2
+  next
+}
+
+section == 3 {
+  print                                                        >SECTION3
+  next
+}
+
+# At end, all three temporary files are reread and output, followed by
+# the generated interfaces: one routine for each step name.
+
+END {
+  close (SECTION1)
+  while (getline <SECTION1)
+    print
+  close (SECTION1)
+
+  close (SECTION2)
+  while (getline <SECTION2)
+    print
+  close (SECTION2)
+
+  close (SECTION3)
+  while (getline <SECTION3)
+    print
+  close (SECTION3)
+}
+
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755 (executable)
index 0000000..91f6d04
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do 
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d in ${1+"$@"} ; do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+        mkdir "$pathcomp" || errstatus=$?
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/next.c b/next.c
new file mode 100644 (file)
index 0000000..f3b59b6
--- /dev/null
+++ b/next.c
@@ -0,0 +1,58 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1993.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+/* RFC 1345 style description for NeXTSTEP (non official).  */
+
+/* In the following table, these codes are not represented:
+
+       Dec Oct     Character
+
+       169 251     single quote
+       172 254     gouillemot single left
+       173 255     gouillemot single right
+       184 270     single quote base
+       185 271     double qoute base
+
+   Keld also write:
+   
+   * f2 (florin) was introduced after RFC1345, and it was done according
+   to an official answer from ISO/IEC JTC1/SC2/WG2 to the Danish ballot
+   on DIS.2 10646.
+   
+   * '" (double acute accent) is the same as hungarian umlaut.  */
+
+static DOUBLE_TABLE table =
+  {
+    "NUSHSXEXETEQAKBLBSHTLFVTFFCRSOSIDLD1D2D3D4NKSYEBCNEMSBECFSGSRSUS",
+    "SP! \" NbDO% & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? ",
+    "AtA B C D E F G H I J K L M N O P Q R S T U V W X Y Z <(//)>'>_ ",
+    "'!a b c d e f g h i j k l m n o p q r s t u v w x y z (!!!!)'?DT",
+    "NSA!A'A>A?A:AAC,E!E'E>E:I!I'I>I:D-N?O!O'O>O?O:U!U'U>U:Y'THMy*X-:",
+    "Co!ICtPd/fYef2SECu  \"6<<    fiflRg-N/-/=.MBBPISb    \"9>>.3%0NO?I",
+    "1S'!'''>'?'m'('.':2S'0',3S'\"';'<-M+-141234a!a'a>a?a:aac,e!e'e>e:",
+    "i!AEi'-ai>i:d-n?L/O/OE-oo!o'o>o?o:aeu!u'u>i.u:y'l/o/oessthy:    ",
+  };
+
+void
+module_next (void)
+{
+  declare_double_step (&table, "NeXT", 2);
+}
diff --git a/pathmax.h b/pathmax.h
new file mode 100644 (file)
index 0000000..00fb0b5
--- /dev/null
+++ b/pathmax.h
@@ -0,0 +1,53 @@
+/* Define PATH_MAX somehow.  Requires sys/types.h.
+   Copyright (C) 1992 Free Software Foundation, Inc.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _PATHMAX_H
+#define _PATHMAX_H
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+   PATH_MAX but might cause redefinition warnings when sys/param.h is
+   later included (as on MORE/BSD 4.3).  */
+#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__))
+#include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+#define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined(PATH_MAX) && defined(_PC_PATH_MAX)
+#define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been.  */
+#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN)
+#include <sys/param.h>
+#endif
+
+#if !defined(PATH_MAX) && defined(MAXPATHLEN)
+#define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+#define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+#endif /* _PATHMAX_H */
diff --git a/recode.c b/recode.c
new file mode 100644 (file)
index 0000000..1b194d6
--- /dev/null
+++ b/recode.c
@@ -0,0 +1,2861 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1990.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "recode.h"
+
+/* Maximum number of single step methods.  */
+#define MAX_SINGLE_STEPS 300
+
+/* Maximum length of a conversion sequence.  */
+#define MAX_SEQUENCE 12
+\f
+/* Global declarations and definitions.  */
+
+#include <ctype.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <setjmp.h>
+#include <signal.h>
+#ifndef RETSIGTYPE
+#define RETSIGTYPE void
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#define strchr index
+#define strrchr rindex
+#endif
+
+#ifdef MSDOS
+#define MSDOS_or_OS2 1
+#include <dir.h>
+#define unlink dummy1
+#include <io.h>
+#undef unlink
+#include <fcntl.h>
+#endif
+
+#ifdef OS2
+#define MSDOS_or_OS2 1
+#include <io.h>
+#include <fcntl.h>
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+#include "getopt.h"
+
+/* tmpnam/tmpname/mktemp/tmpfile and the associate logic has been the
+   main portability headache of GNU recode :-(.
+   
+   People reported that tmpname does not exist everywhere.  On OS/2,
+   recode aborts if the prefix has more than five characters.
+   
+   tmpnam seems to exist everywhere so far.  But NeXT's tmpnam() is such
+   that, if called many times in succession, it will always return the
+   same value.  One has to really open a file with the returned name
+   first, for the next call to tmpnam() to return a different value.  I
+   can manage it for a single invocation of recode, but using two recode
+   invocations connected with a shell pipe, on the NeXT, creates a race
+   by which both copies may call tmpnam() in parallel, then getting the
+   same value, and will consequently open the same temporary file.
+   
+   Noah Friedman <friedman@gnu.ai.mit.edu> suggests opening the file with
+   O_EXCL, and when the open presumably fails, call tmpnam again, or try
+   the mktemp routine in the GNU C library...maybe that will work better.
+   
+   Michael I Bushnell <mib@gnu.ai.mit.edu> suggests always using tmpfile,
+   which opens the file too, using the O_EXCL option to open.
+   
+   I'm trying this last suggestion, rewinding instead of closing.
+   Someone reported, a long while ago, that rewind did not work on his
+   system, so I reverted to opening and closing the temporary files all
+   the time.  I lost the precise references for this problem.  In any
+   case, I'm reusing rewind with tmpfile, now.  Hopefully, someone will
+   tell me if this creates a problem somewhere!  */
+
+/* The previous round used tmpnam(3).  This one tries tmpfile(3).  */
+/* #define USE_TMPNAM 1 */
+#define USE_TMPFILE 1
+
+#ifdef USE_TMPNAM
+/* Guarantee some value for L_tmpnam.  */
+#ifdef MSDOS
+
+#define L_tmpnam 13
+
+#else /* not MSDOS */
+
+char *tmpnam ();
+
+#ifndef L_tmpnam
+#include "pathmax.h"
+#define L_tmpnam PATH_MAX
+#endif
+
+#endif /* not MSDOS */
+#endif /* USE_TMPNAM */
+
+#ifdef USE_TMPFILE
+
+FILE *tmpfile _((void));
+
+#endif /* USE_TMPFILE */
+
+#ifdef WITH_DMALLOC
+#include <dmalloc.h>
+#endif
+
+#ifdef MSDOS
+/* Increase stack size, so init_recode_rfc1345 works.  */
+extern unsigned _stklen = 10000U;
+#endif
+\f
+/* Variables.  */
+
+const char *const copyright_string = "\
+This program is free software; you can redistribute it and/or modify\n\
+it under the terms of the GNU General Public License as published by\n\
+the Free Software Foundation; either version 2, or (at your option)\n\
+any later version.\n\
+\n\
+This program is distributed in the hope that it will be useful,\n\
+but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\
+GNU General Public License for more details.\n\
+\n\
+You should have received a copy of the GNU General Public License\n\
+along with this program; if not, write to the Free Software\n\
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n";
+
+/* The name this program was run with. */
+const char *program_path;
+const char *program_name;
+
+/* If non-zero, display usage information and exit.  */
+static int show_help = 0;
+
+/* If non-zero, print the version on standard output and exit.  */
+static int show_version = 0;
+
+/* If non-zero, show a list of one or all known charsets, then exit.  */
+static int show_charsets = 0;
+
+/* If non-zero, show a restricted list of charsets.  */
+static int show_restricted_charsets = 0;
+
+/* Indicates the format for showing only one charset.  */
+enum list_format list_format = NO_FORMAT;
+
+/* If non-zero, merely explore all recoding paths, report and exit.  */
+static int auto_check_mode = 0;
+
+/* If non-zero, produce C code for initializing the conversion and exit.  */
+static int make_header_mode = 0;
+
+/* Table name in generated C code.  */
+static const char *header_name = NULL;
+
+/* If the recoding yields some problems in reversibility in some file,
+   this file replacement is denied and it is left unrecoded or, if recode
+   is used as a mere filter, the recoding is interrupted.  The following
+   option forces the recoding to run to completion and the replacement to
+   be done even if the recoding is not reversible.  */
+int force_option = 0;
+
+/* This option prevents recode from automatically completing charsets.  */
+int strict_mapping = 0;
+
+/* This option merely inhibits messages about non-reversible recodings, but
+   it does not prevent recodings to be aborted or exit status to be set.  */
+static int quiet_mode = 0;
+
+/* By selecting the following option, the program will echo to stderr the
+   sequence of elementary recoding steps which will be taken to effect
+   the requested recoding.  */
+int verbose_option = 0;
+
+/* When a file is recoded over itself, precautions are taken to move the
+   timestamps of the original file into the recoded file, so to make the
+   recoding the most transparent possible to make, and other tools.
+   However, selecting the following option inhibit the timestamps handling,
+   thus effectively `touching' the file.  */
+int touch_option = 0;
+
+/* In `texte' charset, some countries use double quotes to mark diaeresis,
+   while other countries prefer colons.  The following variable contains the
+   diaeresis character for `texte' charset.  Nominally set to a double
+   quote, it can be forced to a colon by an option on recode command.  */
+char diaeresis_char = '"';
+
+/* For `latex' charset, it is often convenient to recode the diacritics
+   only, while letting other LaTeX code using backslashes unrecoded.
+   In the other charset, one can edit text as well as LaTeX directives.  */
+int diacritics_only = 0;
+
+/* For `ibmpc' charset, characters 176 to 223 are use to draw boxes.
+   If this variable is set, while getting out of `ibmpc', ASCII
+   characters are selected so to approximate these boxes.  */
+int ascii_graphics = 0;
+
+/* The following charset name will be ignored, if given.  */
+static const char *ignored_name = NULL;
+
+/* Unabridged names of BEFORE and AFTER charsets, even if still aliases.
+   These are used for naming the array in produced C code.  */
+static const char *before_full_name;
+static const char *after_full_name;
+
+/* Ordinals of list, BEFORE and AFTER charset.  */
+static CHARSET *list_charset;
+static CHARSET *before_charset;
+static CHARSET *after_charset;
+
+/* Flag telling usage that we are decoding charsets.  */
+int decoding_charset_flag = 0;
+
+/* Tells how various passes will be interconnected.  */
+enum sequence_strategy
+  {
+    STRATEGY_UNDECIDED,                /* sequencing strategy is undecided yet */
+    SEQUENCE_WITH_FILES,       /* do not fork, use intermediate files */
+    SEQUENCE_WITH_POPEN,       /* use `popen(3)' to fork processes */
+    SEQUENCE_WITH_PIPE         /* fork processes connected with `pipe(2)' */
+  };
+enum sequence_strategy sequence_strategy = STRATEGY_UNDECIDED;
+
+/* Known single steps.  */
+
+STEP single_step_array[MAX_SINGLE_STEPS];
+int number_of_single_steps;    /* number of announced single steps */
+
+const unsigned char *one_to_same; /* identity recoding */
+
+CHARSET *rfc1345;              /* special RFC 1345 charset value */
+
+/* Array stating the sequence of conversions.  */
+const STEP *sequence[MAX_SEQUENCE];
+int length_of_sequence;
+\f
+/* Signal handling.  */
+
+/*-----------------.
+| Signal handler.  |
+`-----------------*/
+
+static jmp_buf signal_label;   /* where to jump when signal received */
+static int interrupted = 0;    /* set when some signal has been received */
+
+static RETSIGTYPE
+signal_handler (int number)
+{
+  interrupted = 1;
+  signal (number, signal_handler);
+}
+
+/*------------------------------------------------------------------------.
+| Prepare to handle signals, intercept willingful requests for stopping.  |
+`------------------------------------------------------------------------*/
+
+static void
+setup_signals (void)
+{
+  signal (SIGPIPE, signal_handler);
+#if 0
+  signal (SIGINT, signal_handler);
+  signal (SIGTERM, signal_handler);
+#endif
+}
+\f
+/* Quality handling.  */
+
+/*---------------------------------------.
+| Return a string describing a quality.         |
+`---------------------------------------*/
+
+const char *
+quality_to_string (QUALITY quality)
+{
+  switch (quality)
+    {
+    default:
+      abort ();
+
+    case REVERSIBLE:
+      return "reversible";
+
+    case ONE_TO_ONE:
+      return "one to one";
+
+    case MANY_TO_ONE:
+      return "many to one";
+
+    case ONE_TO_MANY:
+      return "one to many";
+
+    case MANY_TO_MANY:
+      return "many to many";
+    }
+}
+
+/*-------------------------------------------------------------------------.
+| Return the quality of a step obtained by merging two others steps, given |
+| their respective qualities FIRST and SECOND.                            |
+`-------------------------------------------------------------------------*/
+
+QUALITY 
+merge_qualities (QUALITY first, QUALITY second)
+{
+  switch (first)
+    {
+    default:
+      abort ();
+      
+    case REVERSIBLE:
+      return second;
+
+    case ONE_TO_ONE:
+      switch (second)
+       {
+       case REVERSIBLE:
+       case ONE_TO_ONE:
+         return ONE_TO_ONE;
+
+       case MANY_TO_ONE:
+       case ONE_TO_MANY:
+       case MANY_TO_MANY:
+         return second;
+       }
+
+    case MANY_TO_ONE:
+      switch (second)
+       {
+       case REVERSIBLE:
+       case ONE_TO_ONE:
+       case MANY_TO_ONE:
+         return MANY_TO_ONE;
+
+       case ONE_TO_MANY:
+       case MANY_TO_MANY:
+         return MANY_TO_MANY;
+       }
+
+    case ONE_TO_MANY:
+      switch (second)
+       {
+       case REVERSIBLE:
+       case ONE_TO_ONE:
+       case ONE_TO_MANY:
+         return ONE_TO_MANY;
+
+       case MANY_TO_ONE:
+       case MANY_TO_MANY:
+         return MANY_TO_MANY;
+       }
+
+    case MANY_TO_MANY:
+      return MANY_TO_MANY;
+    }
+}
+\f
+/* Charset handling.  */
+
+/*----------------------------------------------------.
+| Decode the BEFORE:AFTER argument, given in STRING.  |
+`----------------------------------------------------*/
+
+static void
+decode_before_after (const char *string)
+{
+  char *before;
+  char *after;
+  char *in;
+  char *out;
+
+  /* Split the BEFORE:AFTER keyword at the colon.  A backslash can escape
+     a colon in both charsets.  */
+
+  before = xstrdup (string);
+  after = NULL;
+  out = before;
+
+  for (in = before; *in; in++)
+    if (*in == ':' && !after)
+      {
+       *out++ = '\0';
+       after = out;
+      }
+    else
+      {
+       if (*in == '\\' && *(in + 1))
+         in++;
+       *out++ = *in;
+      }
+  *out = '\0';
+
+  if (!after)
+    usage (EXIT_FAILURE);
+
+  /* Decode both charsets.  */
+
+  before_full_name = clean_charset_name (before);
+  before_charset = find_charset (before_full_name);
+
+  after_full_name = clean_charset_name (after);
+  after_charset = find_charset (after_full_name);
+
+  /* Free the work area.  */
+
+  free (before);
+}
+\f
+/* Single step handling.  */
+
+/*-------------------------------------------------------------------------.
+| Allocate and initialize a new single step, save for the before and after |
+| charsets and quality.                                                           |
+`-------------------------------------------------------------------------*/
+
+static STEP *
+new_single_step (void)
+{
+  STEP *step;
+
+  if (number_of_single_steps == MAX_SINGLE_STEPS)
+    error (EXIT_FAILURE, 0, "MAX_SINGLE_STEPS is too small");
+
+  step = single_step_array + number_of_single_steps++;
+  step->init_recode = NULL;
+  step->file_recode = NULL;
+  step->one_to_one = NULL;
+  step->one_to_many = NULL;
+
+  return step;
+}
+  
+/*------------------------------------------------------------------------.
+| Create and initialize a new single step for recoding between START_NAME |
+| and GOAL_NAME, which are given as strings, give it a recoding QUALITY,  |
+| also saving an INIT_RECODE and a FILE_RECODE functions.                |
+`------------------------------------------------------------------------*/
+
+/* If not __STDC__, do not write prototypes for functionnal parameters,
+   because ansi2knr does not clean them.  */
+
+#if __STDC__
+void
+declare_step (const char *before_name, const char *after_name, QUALITY quality,
+             void (*init_recode) (STEP *),
+             int (*file_recode) (const STEP *, FILE *, FILE *))
+#else
+void
+declare_step (const char *before_name, const char *after_name, QUALITY quality,
+             void (*init_recode) (),
+             int (*file_recode) ())
+#endif
+{
+  STEP *step;
+
+  step = new_single_step ();
+  step->before = find_charset (before_name);
+  step->after = find_charset (after_name);
+  step->quality = quality;
+  step->init_recode = init_recode;
+  step->file_recode = file_recode;
+}
+
+/*------------------------------------------------------------------.
+| Create a one to one table which is the inverse of the given one.  |
+`------------------------------------------------------------------*/
+
+unsigned char *
+invert_table (const unsigned char *table)
+{
+  unsigned char flag[256];
+  unsigned char *result;
+  int table_error;
+  int counter;
+
+  result = (unsigned char *) xmalloc (256);
+  memset (flag, 0, 256);
+  table_error = 0;
+
+  for (counter = 0; counter < 256; counter++)
+    {
+      if (flag[table[counter]])
+       {
+         error (0, 0, "Codes %3d and %3d both recode to %3d",
+                result[table[counter]], counter, table[counter]);
+         table_error = 1;
+       }
+      else
+       {
+         result[table[counter]] = counter;
+         flag[table[counter]] = 1;
+       }
+    }
+  if (table_error)
+    {
+      for (counter = 0; counter < 256; counter++)
+       if (!flag[counter])
+         error (0, 0, "No character recodes to %3d", counter);
+      error (EXIT_FAILURE, 0, "Cannot invert given one-to-one table");
+    }
+  return result;
+}
+
+/*-------------------------------------------------------------------------.
+| Complete a STEP descriptor by a constructed recoding array for 256 chars |
+| and the adequate recoding routine.  If FIRST_HALF_IMPLIED is not zero,   |
+| default the unconstrained characters of the first 128 to the identity           |
+| mapping.  Use an KNOWN_PAIRS array of NUMBER_OF_PAIRS constraints.  If   |
+| REVERSE is not zero, use right_table instead of left_table.             |
+`-------------------------------------------------------------------------*/
+
+void
+complete_pairs (STEP *step, int first_half_implied,
+               const KNOWN_PAIR *known_pairs, int number_of_pairs,
+               int reverse)
+{
+  unsigned char left_flag[256];
+  unsigned char right_flag[256];
+  unsigned char left_table[256];
+  unsigned char right_table[256];
+  int table_error;
+
+  unsigned char *flag;
+  unsigned char *table;
+  const char **table2;
+  char *cursor;
+  unsigned char left;
+  unsigned char right;
+  unsigned char search;
+  int counter;
+  int used;
+
+  /* Init tables with zeroes.  */
+
+  memset (left_flag, 0, 256);
+  memset (right_flag, 0, 256);
+  table_error = 0;
+
+  /* Establish known data.  */
+
+  for (counter = 0; counter < number_of_pairs; counter++)
+    {
+      left = known_pairs[counter].left;
+      right = known_pairs[counter].right;
+
+      /* Set one known correspondance.  */
+
+      if (left_flag[left])
+       {
+         if (!table_error)
+           {
+             error (0, 0, "Following diagnostics for `%s' to `%s'",
+                    step->before->name, step->after->name);
+             table_error = 1;
+           }
+         error (0, 0, "Pair no. %d: { %3d, %3d } conflicts with { %3d, %3d }",
+                counter, left, right, left, left_table[left]);
+       }
+      else if (right_flag[right])
+       {
+         if (!table_error)
+           {
+             error (0, 0, "Following diagnostics for `%s' to `%s'",
+                    step->before->name, step->after->name);
+             table_error = 1;
+           }
+         error (0, 0, "Pair no. %d: { %3d, %3d } conflicts with { %3d, %3d }",
+                counter, left, right, right_table[right], right);
+       }
+      else
+       {
+         left_flag[left] = 1;
+         left_table[left] = right;
+         right_flag[right] = 1;
+         right_table[right] = left;
+       }
+    }
+
+  /* Set all the implied correspondances.  */
+
+  if (first_half_implied)
+    for (counter = 0; counter < 128; counter++)
+      if (!left_flag[counter] && !right_flag[counter])
+       {
+         left_flag[counter] = 1;
+         left_table[counter] = counter;
+         right_flag[counter] = 1;
+         right_table[counter] = counter;
+       }
+
+  if (strict_mapping)
+    {
+
+      /* If the recoding is strict, prepare a one to many table, each
+        entry being NULL or a string of a single character.  */
+
+      /* Select the proper table.  */
+
+      if (reverse)
+       {
+         flag = right_flag;
+         table = right_table;
+       }
+      else
+       {
+         flag = left_flag;
+         table = left_table;
+       }
+
+      /* Allocate everything in one blow, so it will be freed likewise.  */
+
+      used = 0;
+      for (counter = 0; counter < 256; counter++)
+       if (flag[counter])
+         used++;
+
+      table2 = (const char **) xmalloc (256 * sizeof (char *) + 2 * used);
+      cursor = (char *) (table2 + 256);
+
+      /* Construct the table and the strings in parallel.  */
+
+      for (counter = 0; counter < 256; counter++)
+       if (flag[counter])
+         {
+           table2[counter] = cursor;
+           *cursor++ = table[counter];
+           *cursor++ = '\0';
+         }
+       else
+         table2[counter] = NULL;
+
+      /* Save a one to many recoding table.  */
+
+      step->file_recode = file_one_to_many;
+      step->one_to_many = table2;
+    }
+  else
+    {
+
+      /* If the recoding is not strict, compute a reversible one to one
+        table.  */
+
+      if (table_error)
+       error (EXIT_FAILURE, 0,
+              "Cannot complete table from set of known pairs");
+
+      /* Close the table with small permutation cycles.  */
+
+      for (counter = 0; counter < 256; counter++)
+       if (!right_flag[counter])
+         {
+           search = counter;
+           while (left_flag[search])
+             search = left_table[search];
+           left_flag[search] = 1;
+           left_table[search] = counter;
+           right_flag[counter] = 1;
+           right_table[counter] = search;
+         }
+
+      /* Save a copy of the proper table.  */
+
+      step->file_recode = file_one_to_one;
+      table = (unsigned char *) xmalloc (256);
+      memcpy (table, reverse ? right_table : left_table, 256);
+      step->one_to_one = table;
+    }
+}
+
+/*----------------------------------------.
+| Initialize all collected single steps.  |
+`----------------------------------------*/
+
+void
+register_all_modules (void)
+{
+  STEP *step;
+  int counter;
+  unsigned char *table;
+
+  table = (unsigned char *) xmalloc (256);
+  for (counter = 0; counter < 256; counter++)
+    table[counter] = counter;
+  one_to_same = table;
+
+  prepare_charset_initialization ();
+  number_of_single_steps = 0;
+
+  rfc1345 = find_charset ("RFC 1345");
+  declare_alias (".", "RFC 1345");
+  declare_alias ("ASCII", "ANSI_X3.4-1968");
+  declare_alias ("BS", "ASCII-BS");
+  declare_alias ("Latin-1", "ISO_8859-1:1987");
+
+  /* Needed for compatibility with recode version 3.2.  */
+  declare_alias ("lat1", "Latin-1");
+
+#include "initstep.h"
+
+  for (step = single_step_array;
+       step < single_step_array + number_of_single_steps;
+       step++)
+
+    if (step->file_recode == file_one_to_one
+       && step->one_to_one == one_to_same)
+
+      step->conversion_cost = 0;
+
+    else
+      switch (step->quality)
+       {
+       case REVERSIBLE:
+         step->conversion_cost = 2;
+         break;
+
+       case ONE_TO_ONE:
+         step->conversion_cost = 30;
+         break;
+
+       case MANY_TO_ONE:
+         step->conversion_cost = 10;
+         break;
+
+       case ONE_TO_MANY:
+         step->conversion_cost = 40;
+         break;
+
+       case MANY_TO_MANY:
+         step->conversion_cost = 50;
+         break;
+       }
+
+  /* For all RFC 1345 participating steps, halve the cost since they
+     come in pair.  */
+
+  for (counter = 0; counter < number_of_single_steps; counter++)
+    if (single_step_array[counter].before == rfc1345
+       || single_step_array[counter].after == rfc1345)
+      single_step_array[counter].conversion_cost /= 2;
+}
+
+/*-------------------------------------------------------------------------.
+| Produce a C include file representing the recoding, on standard output.  |
+`-------------------------------------------------------------------------*/
+
+static void
+output_header_file (void)
+{
+  const STEP *step;            /* step being analysed */
+  int column;                  /* column counter */
+  char *name;                  /* constructed name */
+  char *cursor;                        /* cursor in constructed name */
+  const char *cursor2;         /* cursor to study strings */
+  int counter;                 /* general purpose counter */
+
+  /* This function is called only when the recoding sequence contains a
+     single step, so it is safe to use sequence[0] for the step.  */
+
+  step = sequence[0];
+
+  /* Print the header of the header file.  */
+
+  printf ("/* Conversion table from `%s' charset to `%s' charset.\n",
+         before_full_name, after_full_name);
+  printf ("   Generated mechanically by GNU %s %s.\n", PRODUCT, VERSION);
+  printf ("\n");
+  switch (sequence[0]->quality)
+    {
+    case REVERSIBLE:
+      printf ("   The recoding should be reversible.\n");
+      break;
+
+    case ONE_TO_ONE:
+      printf ("   The recoding might not be reversible.\n");
+      break;
+
+    case MANY_TO_ONE:
+      printf ("   Programming is needed to handle multichar input.\n");
+      break;
+
+    case ONE_TO_MANY:
+      printf ("   Each input char transforms into an output string.\n");
+      break;
+
+    case MANY_TO_MANY:
+      printf ("   Each input char transforms into an output string,\n");
+      printf ("   programming is needed to handle multichar input.\n");
+      break;
+    }
+  printf ("*/\n");
+  printf ("\n");
+
+  /* Construct the name of the resulting table.  */
+
+  if (header_name)
+    name = xstrdup (header_name);
+  else
+    {
+      name = (char *) xmalloc (strlen (before_full_name) + sizeof "_to_"
+                              + strlen (after_full_name));
+      strcpy (name, before_full_name);
+      strcat (name, "_to_");
+      strcat (name, after_full_name);
+    }
+
+  /* Ensure the table name contains only valid characters for a C
+     identifier.  */
+
+  for (cursor = name; *cursor; cursor++)
+    if (*cursor != '_'
+       && (*cursor < 'a' || *cursor > 'z')
+       && (*cursor < 'A' || *cursor > 'Z')
+       && (*cursor < '0' || *cursor > '9'))
+      *cursor = '_';
+
+  /* Produce the recoding table in the correct format.  */
+
+  if (step->one_to_one)
+    {
+
+      /* Produce a one to one recoding table.  */
+
+      printf ("unsigned char const %s[256] =\n", name);
+      printf ("  {\n");
+      for (counter = 0; counter < 256; counter++)
+       {
+         printf ("%s%3d,", counter % 8 == 0 ? "    " : " ",
+                  step->one_to_one[counter]);
+         if (counter % 8 == 7)
+           printf ("\t/* %3d - %3d */\n", counter - 7, counter);
+       }
+      printf ("  };\n");
+    }
+
+  else if (step->one_to_many)
+    {
+
+      /* Produce a one to many recoding table.  */
+
+      printf ("const char *%s[256] =\n", name);
+      printf ("  {\n");
+      for (counter = 0; counter < 256; counter++)
+       {
+         printf ("    ");
+         column = 4;
+         if (step->one_to_many[counter])
+           {
+             printf ("\"");
+             column++;
+             for (cursor2 = step->one_to_many[counter]; *cursor2; cursor2++)
+               switch (*cursor2)
+                 {
+                 case ' ':
+                   printf (" ");
+                   column++;
+                   break;
+
+                 case '\b':
+                   printf ("\\b");
+                   column += 2;
+                   break;
+
+                 case '\t':
+                   printf ("\\t");
+                   column += 2;
+                   break;
+
+                 case '\n':
+                   printf ("\\n");
+                   column += 2;
+                   break;
+
+                 case '"':
+                   printf ("\\\"");
+                   column += 2;
+                   break;
+
+                 case '\\':
+                   printf ("\\\\");
+                   column += 2;
+                   break;
+
+                 default:
+                   if (isprint (*cursor2))
+                     {
+                       printf ("%c", *cursor2);
+                       column++;
+                     }
+                   else
+                     {
+                       printf ("\\%0.3o", *(const unsigned char *) cursor2);
+                       column += 4;
+                     }
+                 }
+             printf ("\"");
+             column++;
+           }
+         else
+           {
+             printf ("0");
+             column++;
+           }
+         printf (",");
+         column++;
+         while (column < 32)
+           {
+             printf ("\t");
+             column += 8 - column % 8;
+           }
+         printf ("/* %3d */\n", counter);
+       }
+      printf ("  };\n");
+    }
+
+  else
+    error (EXIT_FAILURE, 0, "No table to print");
+
+  free (name);
+}
+\f
+/* Double step handling (for RFC 1345).  */
+
+/*-----------------------------------------------------------------------.
+| Associate a double TABLE with charset NAME, part of the RFC 1345 fully |
+| connected set.  Each entry in table uses SIZE characters.             |
+`-----------------------------------------------------------------------*/
+
+void
+declare_double_step (DOUBLE_TABLE *table, const char *name, int size)
+{
+  CHARSET *charset;
+  STEP *step;
+
+  charset = find_charset (name);
+  charset->table = table;
+  charset->size = size;
+
+  step = new_single_step ();
+  step->before = charset;
+  step->after = rfc1345;
+  step->quality = strict_mapping ? ONE_TO_MANY : REVERSIBLE;
+  step->init_recode = NULL;
+  step->file_recode = NULL;
+
+  step = new_single_step ();
+  step->before = rfc1345;
+  step->after = charset;
+  step->quality = strict_mapping ? ONE_TO_MANY : REVERSIBLE;
+  step->init_recode = NULL;
+  step->file_recode = NULL;
+}
+
+/*---------------------------------------------------------------.
+| Order two struct item's lexicographically of their key value.         |
+`---------------------------------------------------------------*/
+
+struct item
+  {
+    const char *key;           /* RFC 1345 short mnemonic name */
+    int code;                  /* corresponding charset code (0..255) */
+  };
+
+static int
+compare_struct_item (const void *void_first, const void *void_second)
+{
+  return strcmp (((const struct item *) void_first)->key,
+                ((const struct item *) void_second)->key);
+}
+
+/*------------------------------------------------------------------------.
+| Complete the initialization of a double step which just has been merged |
+| into a single STEP.  Establish known pairings by comparing keys between |
+| the before and after charsets.                                         |
+`------------------------------------------------------------------------*/
+
+void
+init_recode_rfc1345 (STEP *step)
+{
+  struct side
+    {
+      CHARSET *charset;                /* charset */
+      struct item item[256];   /* array of binding items */
+      int number_of_items;     /* number of binding items in array */
+    };
+
+  char pool[2 * 256 * 6];      /* character pool */
+  DOUBLE_TABLE *table;         /* RFC 1345 table */
+  struct side side_array[2];   /* information for each side */
+  struct side *side;           /* cursor into side_array */
+  int reversed;                        /* if both sides reversed */
+  const char *in;              /* cursor in double table strings */
+  char *out;                   /* cursor in character pool */
+  int code;                    /* character code */
+  int row_counter;             /* double table row counter */
+  int position_counter;                /* double table column counter */
+  int counter;                 /* counter for characters */
+  struct item *item_cursor;    /* cursor in arrays of binding items */
+  struct item *left;           /* left binding items cursor */
+  struct item *left_limit;     /* limit value for left */
+  struct item *right;          /* right binding items cursor */
+  struct item *right_limit;    /* limit value for right */
+  KNOWN_PAIR pair_array[256];  /* obtained pairings */
+  KNOWN_PAIR *pair_cursor;     /* cursor in array of pairings */
+  int value;                   /* result of lexicographical comparison */
+
+  /* For ensuring reversibility, known pairs should be computed the same
+     way regardless of the direction of recoding.  This canonalization is
+     ensured through the charset values, which are increasing along the
+     initialization order.  This should also reflect the charset order in
+     rfc1345.txt.  */
+
+  if (step->before < step->after)
+    {
+      side_array[0].charset = step->before;
+      side_array[1].charset = step->after;
+      reversed = 0;
+    }
+  else
+    {
+      side_array[0].charset = step->after;
+      side_array[1].charset = step->before;
+      reversed = 1;
+    }
+
+  out = pool;
+  for (side = side_array; side < side_array + 2; side++)
+    {
+
+      /* Move the string values out of the double table, while constructing
+        the array of binding items for the charset.  */
+
+      table = side->charset->table;
+      item_cursor = side->item;
+      code = 0;
+
+      for (row_counter = 0; row_counter < 8; row_counter++)
+       if (in = (*table)[row_counter], in)
+         for (position_counter = 0; position_counter < 32; position_counter++)
+           {
+             if (*in == ' ')
+               in += side->charset->size;
+             else
+               {
+
+                 /* Establish a new binding item.  */
+
+                 item_cursor->code = code;
+                 item_cursor->key = out;
+                 item_cursor++;
+
+                 /* Copy out the value to the character pool, and terminate it
+                    with a NULL.  */
+
+                 for (counter = 0; counter < side->charset->size; counter++)
+                   if (*in == ' ')
+                     in++;
+                   else
+                     *out++ = *in++;
+                 *out++ = '\0';
+               }
+             code++;
+           }
+       else
+         code += 32;
+
+      side->number_of_items = item_cursor - side->item;
+    }
+
+  /* Sort both arrays of binding items into lexicographical order.  The
+     taken time, which is O(n.log(n)), is gained back when the further
+     pairing is completed in a time which is linear instead of quadratic.  */
+
+  qsort (side_array[0].item, side_array[0].number_of_items,
+        sizeof (struct item), compare_struct_item);
+  qsort (side_array[1].item, side_array[1].number_of_items,
+        sizeof (struct item), compare_struct_item);
+
+  /* Scan both arrays of binding items simultaneously, saving as pairs
+     those codes having the same key.  */
+
+  left = side_array[0].item;
+  left_limit = left + side_array[0].number_of_items;
+  right = side_array[1].item;
+  right_limit = right + side_array[1].number_of_items;
+  pair_cursor = pair_array;
+
+  while (left < left_limit && right < right_limit)
+    {
+      value = strcmp (left->key, right->key);
+      if (value < 0)
+       left++;
+      else if (value > 0)
+       right++;
+      else
+       {
+         pair_cursor->left = (left++)->code;
+         pair_cursor->right = (right++)->code;
+         pair_cursor++;
+       }
+    }
+
+  /* Complete the recoding table out of this.  */
+
+  complete_pairs (step, 0, pair_array, pair_cursor - pair_array, reversed);
+}
+\f
+/* Step sequence handling.  */
+
+#define UNREACHABLE    30000           /* No way for this conversion */
+
+/*-------------------------------------------------------.
+| Explain what recoding step sequence has been planned.         |
+`-------------------------------------------------------*/
+
+static void
+echo_sequence (void)
+{
+  const char *last;            /* last name printed */
+  const char *name;            /* name being printed */
+  QUALITY quality;             /* cumulative quality */
+  int counter;                 /* index into sequence */
+
+  if (length_of_sequence < 0)
+    fprintf (stderr, "UNACHIEVABLE recoding!\n");
+  else if (length_of_sequence == 0)
+    fprintf (stderr, "Mere copy for the trivial recoding\n");
+  else
+    {
+      quality = REVERSIBLE;
+      last = NULL;
+      for (counter = 0; counter < length_of_sequence; counter++)
+       {
+         name = sequence[counter]->before->name;
+         if (counter == 0)
+           fprintf (stderr, "%s", name);
+         else if (name != last)
+           fprintf (stderr, "/%s", name);
+
+         name = sequence[counter]->after->name;
+         fprintf (stderr, " -> %s", name);
+
+         quality = merge_qualities (quality, sequence[counter]->quality);
+         last = name;
+       }
+      fprintf (stderr, " (%s)\n", quality_to_string (quality));
+    }
+}
+
+/*----------------------------------------------------------.
+| Find a sequence of single steps to achieve a conversion.  |
+`----------------------------------------------------------*/
+
+static void
+find_sequence (CHARSET *before, CHARSET *after)
+{
+  struct search
+    {
+      STEP *step;              /* step who will bring us nearer to after */
+      int cost;                        /* cost from here through after */
+    };
+  struct search *search_array; /* critical path search tree */
+  struct search *search;       /* item in search_array for charset */
+  STEP *step;                  /* cursor in possible single_steps */
+  int cost;                    /* cost under consideration */
+  int modified;                        /* != 0 if modified since last iteration */
+  CHARSET *charset;            /* charset while reconstructing sequence */
+
+  search_array
+    = (struct search *) xmalloc (number_of_charsets * sizeof (struct search));
+
+  /* Initialize the search for an economical route, looking our way
+     backward from the after towards the before.  */
+
+  for (search = search_array;
+       search < search_array + number_of_charsets;
+       search++)
+    {
+      search->step = NULL;
+      search->cost = UNREACHABLE;
+    }
+  search_array[after - charset_array].cost = 0;
+
+  modified = 1;
+  while (modified)
+    {
+      modified = 0;
+      for (step = single_step_array;
+          step < single_step_array + number_of_single_steps;
+          step++)
+       if (!step->before->ignore)
+         {
+           cost = search_array[step->after - charset_array].cost;
+           if (cost != UNREACHABLE)
+             {
+               cost += step->conversion_cost;
+               search = search_array + (step->before - charset_array);
+               if (cost < search->cost)
+                 {
+                   search->step = step;
+                   search->cost = cost;
+                   modified = 1;
+                 }
+             }
+         }
+    }
+
+  if (search_array[before - charset_array].cost == UNREACHABLE)
+    {
+      
+      /* If no path has been found, return with a negative length.  */
+
+      length_of_sequence = -1;
+    }
+  else
+    {
+
+      /* Save the retained best path in the sequence array.  While doing so,
+        simplify out any single step which merely copies.  Also execute the
+        delayed initialization for those steps which registered one.  */
+
+      length_of_sequence = 0;
+      for (charset = before; charset != after; charset = step->after)
+       {
+         step = search_array[charset - charset_array].step;
+         if (step->file_recode != file_one_to_one
+             || step->one_to_one != one_to_same)
+           {
+             if (length_of_sequence == MAX_SEQUENCE)
+               error (EXIT_FAILURE, 0, "MAX_SEQUENCE is too small");
+             sequence[length_of_sequence++] = step;
+             if (step->init_recode)
+               {
+                 (*step->init_recode) (step);
+                 step->init_recode = NULL;
+               }
+           }
+       }
+    }
+
+  /* Tell what has been decided, for the user.  */
+
+  if (verbose_option)
+    echo_sequence ();
+
+  free (search_array);
+}
+
+/*-------------------------------------------------------------------------.
+| Return 0 if STEP cannot be easily simplified.  Return 1 if it is an all  |
+| table driven ONE_TO_ONE recoding.  Return 2 if it is an all table driven |
+| ONE_TO_MANY recoding.  If making headers, accept more easily that a step |
+| is simplifyable, just looking at tables and ignoring preset functions.   |
+`-------------------------------------------------------------------------*/
+
+static int
+simplify_type (const STEP *step)
+{
+  if (step->one_to_one
+      && (make_header_mode || step->file_recode == file_one_to_one))
+    return 1;
+
+  if (step->one_to_many
+      && (make_header_mode || step->file_recode == file_one_to_many))
+    return 2;
+
+  return 0;
+}
+
+/*---------------------------------------------------------------------.
+| Optimize a sequence of single steps by creating new single steps, if |
+| this can be done by merging adjacent steps which are simple enough.  |
+`---------------------------------------------------------------------*/
+
+static void
+simplify_sequence (void)
+{
+  int saved_steps;             /* number of saved steps */
+  int in;                      /* ordinal of next studied sequence step */
+  int out;                     /* ordinal of next output sequence step */
+  STEP *step;                  /* new single step being constructed */
+  unsigned char *accum;                /* one_to_one accumulated recoding */
+  const char **string;         /* one_to_many recoding */
+  unsigned char temp[256];     /* temporary value for accum array */
+  int counter;                 /* all purpose counter */
+
+  saved_steps = 0;
+
+  /* See if there are some RFC 1345 double steps to merge.  */
+
+  in = 0;
+  out = 0;
+
+  while (in < length_of_sequence)
+    if (in < length_of_sequence - 1
+       && sequence[in]->after == rfc1345
+       && sequence[in+1]->before == rfc1345)
+      {
+
+       /* Produce a new single step for the double step.  */
+
+       step = new_single_step ();
+       step->before = sequence[in]->before;
+       step->after = sequence[in+1]->after;
+       step->quality = merge_qualities (sequence[in]->quality,
+                                        sequence[in+1]->quality);
+       step->init_recode = init_recode_rfc1345;
+       step->file_recode = file_one_to_one;
+
+       in += 2;
+       saved_steps++;
+
+       /* Initialize the new single step, so it can be later merged with
+          others.  */
+
+       (*step->init_recode) (step);
+       step->init_recode = NULL;
+
+       sequence[out++] = step;
+      }
+    else if (sequence[in]->before == rfc1345)
+      error (EXIT_FAILURE, 0, "You may not explicitely recode from RFC 1345");
+    else if (sequence[in]->after == rfc1345)
+      {
+
+       /* Produce a new single step for the double step.  */
+
+       step = new_single_step ();
+       step->before = sequence[in]->before;
+       step->after = sequence[in]->after;
+       step->quality = ONE_TO_MANY;
+
+       in++;
+
+       /* Initialize the new single step, so it can be later merged with
+          others.  */
+
+       init_table_for_rfc1345 (step);
+       step->file_recode = file_one_to_many;
+
+       sequence[out++] = step;
+      }
+    else
+      sequence[out++] = sequence[in++];
+
+  length_of_sequence = out;
+
+  /* Recopy the sequence array over itself, while merging subsequences of
+     one or more consecutive one-to-one recodings, including an optional
+     final one-to-many recoding.  */
+
+  in = 0;
+  out = 0;
+  while (in < length_of_sequence)
+    if (in < length_of_sequence - 1
+       && simplify_type (sequence[in]) == 1
+       && simplify_type (sequence[in+1]) > 0)
+      {
+
+       /* Construct a new single step, and initialize a cumulative
+          one-to-one recoding with the identity permutation.  */
+
+       accum = (unsigned char *) xmalloc (256);
+       for (counter = 0; counter < 256; counter++)
+         accum[counter] = counter;
+
+       step = new_single_step ();
+       step->before = sequence[in]->before;
+       step->quality = REVERSIBLE;
+
+       /* Merge in all consecutive one-to-one recodings.  */
+
+       while (in < length_of_sequence && simplify_type (sequence[in]) == 1)
+         {
+           for (counter = 0; counter < 256; counter++)
+             temp[counter] = sequence[in]->one_to_one[accum[counter]];
+           for (counter = 0; counter < 256; counter++)
+             accum[counter] = temp[counter];
+           step->after = sequence[in]->after;
+           step->quality
+             = merge_qualities (step->quality, sequence[in]->quality);
+           in++;
+           saved_steps++;
+         }
+
+       /* Check for a possible one-to-many recoding.  */
+
+       if (in < length_of_sequence && simplify_type (sequence[in]) == 2)
+         {
+
+           /* Merge in the one-to-many recoding, and make the new single
+              step be a one-to-many recoding.  */
+
+           string = (const char **) xmalloc (256 * sizeof (char *));
+           for (counter = 0; counter < 256; counter++)
+             string[counter] = sequence[in]->one_to_many[accum[counter]];
+           free (accum);
+           step->one_to_many = string;
+           step->file_recode = file_one_to_many;
+           step->after = sequence[in]->after;
+           step->quality
+             = merge_qualities (step->quality, sequence[in]->quality);
+           in++;
+           saved_steps++;
+         }
+       else
+         {
+
+           /* Make the new single step be a one-to-one recoding.  */
+
+           step->one_to_one = accum;
+           step->file_recode = file_one_to_one;
+         }
+
+       /* Save the newly created step.  */
+
+       sequence[out++] = step;
+      }
+    else
+      sequence[out++] = sequence[in++];
+
+  length_of_sequence = out;
+
+  /* Delete a remaining single step, if it happens to be the identity
+     one-to-one recoding.  */
+
+  if (length_of_sequence == 1 && simplify_type (sequence[0]) == 1
+      && memcmp (sequence[0]->one_to_one, one_to_same, 256) == 0)
+    {
+      length_of_sequence = 0;
+      saved_steps++;
+    }
+
+  /* Save the resulting sequence length, and tell the user if something
+     changed.  */
+
+  if (saved_steps > 0 && verbose_option)
+    {
+      fprintf (stderr, "Simplified to: ");
+      echo_sequence ();
+    }
+}
+\f
+/* Recoding execution control.  */
+
+/*--------------.
+| Copy a file.  |
+`--------------*/
+
+/* This should be rewritten to be a lot faster.  */
+
+static void
+file_copy (FILE *input_file, FILE *output_file)
+{
+  int input_char;              /* current character */
+
+  while (input_char = getc (input_file), input_char != EOF)
+    putc (input_char, output_file);
+}
+
+/*----------------------------------------------------------------------.
+| Recode a file using a one-to-one recoding table.  Returns zero if the |
+| recoding has been interrupted because of a reversibility problem.     |
+`----------------------------------------------------------------------*/
+
+int
+file_one_to_one (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  const unsigned char *table;  /* conversion table */
+  int input_char;              /* current character */
+
+  table = step->one_to_one;
+  while (input_char = getc (input_file), input_char != EOF)
+    putc (table[input_char], output_file);
+
+  return 1;
+}
+
+/*-----------------------------------------------------------------------.
+| Recode a file using a one-to-many recoding table.  Returns zero if the |
+| recoding has been found to be non reversible.                                 |
+`-----------------------------------------------------------------------*/
+
+int
+file_one_to_many (const STEP *step, FILE *input_file, FILE *output_file)
+{
+  int reversible;              /* reversibility of recoding */
+  const char *const *table;    /* conversion table */
+  int input_char;              /* current character */
+  const char *output_string;   /* translated characters */
+
+  /* Copy the file through the one to many recoding table.  */
+
+  reversible = 1;
+  table = step->one_to_many;
+  while (input_char = getc (input_file), input_char != EOF)
+    if (output_string = table[input_char], output_string)
+      while (*output_string)
+       {
+         putc (*output_string, output_file);
+         output_string++;
+       }
+    else
+      reversible = 0;
+
+  return reversible;
+}
+
+/*-------------------------------------------------------------------------.
+| Execute the conversion sequence, using several passes with two          |
+| alternating intermediate files.  This routine assumes at least one      |
+| needed recoding step.  Returns zero if the recoding has been found to be |
+| non-reversible.                                                         |
+`-------------------------------------------------------------------------*/
+
+static int
+execute_pass_sequence (const char *input_name, const char *output_name)
+{
+  int sequence_index;          /* index into sequence */
+  const STEP *step;            /* pointer to step */
+  FILE *input_file;            /* input file to recoding step */
+  FILE *output_file;           /* output file from recoding step */
+  int reversible;              /* reversibility of recoding */
+#ifdef USE_TMPNAM
+  char *temp_input_name;       /* step input file name */
+  char *temp_output_name;      /* step output file name */
+  char temp_name_1[L_tmpnam];  /* one temporary file name */
+  char temp_name_2[L_tmpnam];  /* another temporary file name */
+  char *exchange_temp;         /* for exchanging temporary names */
+#endif
+
+#ifdef USE_TMPNAM
+
+  /* Choose names for intermediate files.  Use "" for delaying them.  */
+
+#ifdef MSDOS_or_OS2
+  strcpy (temp_name_1, "recodex1.tmp");
+  strcpy (temp_name_2, "recodex2.tmp");
+#else
+  temp_name_1[0] = '\0';
+  temp_name_2[0] = '\0';
+#endif
+  temp_input_name = temp_name_1;
+  temp_output_name = temp_name_2;
+
+#endif /* USE_TMPNAM */
+
+  /* Execute one pass for each step of the sequence.  */
+
+  reversible = 1;
+  for (sequence_index = 0;
+       sequence_index < length_of_sequence;
+       sequence_index++)
+    {
+
+      /* Select the input file for this step.  */
+
+      if (sequence_index == 0)
+       {
+         if (!input_name)
+           input_file = stdin;
+         else if (input_file = fopen (input_name, "r"), input_file == NULL)
+           error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+                  __FILE__, __LINE__, input_name);
+       }
+      else
+       {
+#ifdef USE_TMPNAM
+         if (input_file = fopen (temp_input_name, "r"), input_file == NULL)
+           error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+                  __FILE__, __LINE__, temp_input_name);
+#endif
+
+#ifdef USE_TMPFILE
+         rewind (input_file);
+#endif
+       }
+
+      /* Select the output file for this step.  */
+
+      if (sequence_index == length_of_sequence - 1)
+       {
+         if (!output_name)
+           output_file = stdout;
+         else if (output_file = fopen (output_name, "w"), output_file == NULL)
+           error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+                  __FILE__, __LINE__, output_name);
+       }
+      else
+       {
+#ifdef USE_TMPNAM
+#ifdef MSDOS_or_OS2
+         if (*temp_output_name == '\0')
+           tmpnam (temp_output_name);
+#endif
+         if (output_file = fopen (temp_output_name, "w"), output_file == NULL)
+           error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+                  __FILE__, __LINE__, temp_output_name);
+#endif
+
+#ifdef USE_TMPFILE
+         if (output_file = tmpfile (), output_file == NULL)
+           error (EXIT_FAILURE, errno, "%s:%d: tmpfile ()",
+                  __FILE__, __LINE__);
+#endif
+       }
+
+      /* Execute one recoding step.  */
+
+      step = sequence[sequence_index];
+      if (!(*step->file_recode) (step, input_file, output_file))
+       reversible = 0;
+
+      /* Close the input file, unlink it if it was temporary.  */
+
+      if (sequence_index == 0)
+       {
+         if (input_name)
+           fclose (input_file);
+       }
+      else
+       {
+         fclose (input_file);
+#ifdef USE_TMPNAM
+         unlink (temp_input_name);
+#endif
+       }
+
+      /* Close the output file and prepare for subsequent step.  */
+
+      if (sequence_index == length_of_sequence - 1)
+       {
+         if (output_name)
+           fclose (output_file);
+       }
+      else
+       {
+#ifdef USE_TMPNAM
+         fclose (output_file);
+
+         exchange_temp = temp_input_name;
+         temp_input_name = temp_output_name;
+         temp_output_name = exchange_temp;
+#endif
+
+#ifdef USE_TMPFILE
+         input_file = output_file;
+#endif
+       }
+    }
+  return reversible;
+}
+
+/*-------------------------------------------------------------------------.
+| Execute the conversion sequence, using a chain of invocations of the    |
+| program through popen.  This routine assumes that more than one recoding |
+| step is needed.  Returns zero if the recoding has been found to be      |
+| non-reversible.                                                         |
+`-------------------------------------------------------------------------*/
+
+#ifdef HAVE_POPEN
+
+static int
+execute_popen_sequence (const char *input_name, const char *output_name)
+{
+  const STEP *step;            /* current step */
+  FILE *input_file;            /* input file to recoding step */
+  FILE *output_file;           /* output file from recoding step */
+  char popen_command[80];      /* to receive command string */
+  int reversible;              /* reversibility of recoding */
+
+  /* Construct a `recode' command for all recoding steps but the first.  */
+
+  strcpy (popen_command, program_path);
+  if (diaeresis_char)
+    strcat (popen_command, " -c");
+  if (diacritics_only)
+    strcat (popen_command, " -d");
+  if (force_option)
+    strcat (popen_command, " -f");
+  strcat (popen_command, " -o -q ");
+  strcat (popen_command, clean_charset_name (sequence[1]->before->name));
+  strcat (popen_command, ":");
+  strcat (popen_command,
+         clean_charset_name (sequence[length_of_sequence-1]->after->name));
+  if (output_name)
+    {
+      strcat (popen_command, " >");
+      strcat (popen_command, output_name);
+    }
+
+  /* Execute the first recoding step.  */
+
+  if (!input_name)
+    input_file = stdin;
+  else if (input_file = fopen (input_name, "r"), input_file == NULL)
+    error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+          __FILE__, __LINE__, input_name);
+
+  if (output_file = popen (popen_command, "w"), output_file == NULL)
+    error (EXIT_FAILURE, errno, "%s:%d: popen (%s)",
+          __FILE__, __LINE__, popen_command);
+
+  step = sequence[0];
+  reversible = (*step->file_recode) (step, input_file, output_file);
+
+  if (input_name)
+    fclose (input_file);
+
+  /* Return the proper status.  */
+
+  if (pclose (output_file) != 0)
+    reversible = 0;
+
+  return reversible;
+}
+
+#endif /* HAVE_POPEN */
+
+#ifdef HAVE_PIPE
+
+#ifndef HAVE_DUP2
+
+/*------------------------------------------------------------------------.
+| Duplicate the OLD_FD file descriptor into NEW_FD, closing NEW_FD first  |
+| if it is used.  This implementation presumes both OLD_FD and NEW_FD are |
+| valid file descriptors.                                                |
+`------------------------------------------------------------------------*/
+
+/* Overall idea taken from GNU Emacs 18.55 dup2 (), in src/sysdep.c.  */
+
+#include <sys/fcntl.h>
+
+#ifndef F_DUPFD
+
+static int
+dup2_recursive (int old_fd, int new_fd)
+{
+  int fd;
+
+  /* Attempt to dup OLD_FD to NEW_FD.  If not successful, call dup2
+     recursively, filling the file descriptor table until NEW_FD is
+     reached.  Then close all the spurious file descriptors we created.  */
+
+  if (fd = dup (old_fd) && fd != new_fd)
+    if (fd < 0 || dup2_recursive (old_fd, new_fd) < 0 || close (fd) < 0)
+      return 0;
+
+  return 1;
+}
+
+#endif /* not F_DUPFD */
+
+static int
+dup2 (int old_fd, int new_fd)
+{
+
+  /* If OLD_FD or NEW_FD were not valid file descriptors, dup2 should
+     ideally return -1 with errno set to EBADF.  This is not checked.  */
+
+  if (old_fd != new_fd)
+    {
+      close (new_fd);
+
+#ifdef F_DUPFD
+      if (fcntl (old_fd, F_DUPFD, new_fd) != new_fd)
+       return -1;
+#else
+      if (!dup2_recursive (old_fd, new_fd))
+       return -1;
+#endif
+    }
+  return new_fd;
+}
+
+#endif /* not HAVE_DUP2 */
+
+/*-------------------------------------------------------------------------.
+| Execute the conversion sequence, forking the program many times for all  |
+| elementary steps, interconnecting them with pipes.  This routine assumes |
+| that more than one recoding step is needed.  Returns zero if the        |
+| recoding has been found to be non-reversible.                                   |
+`-------------------------------------------------------------------------*/
+
+#if 1
+
+/* This is no good.  The main process might open too many files for one
+   thing.  All of it should work almost the same way
+   execute_popen_sequence does, creating children from left to right,
+   instead of all children to a single parent right to left.  */
+
+static int
+execute_pipe_sequence (const char *input_name, const char *output_name)
+{
+  int sequence_index;          /* index into sequence */
+  const STEP *step;            /* pointer into single_steps */
+
+  FILE *input_file;            /* input file to recoding step */
+  FILE *output_file;           /* output file from recoding step */
+  int pipe_pair[2];            /* pair of file descriptors for a pipe */
+  int child_process;           /* child process number, zero if child */
+  int wait_status;             /* status returned by wait() */
+  int reversible;              /* reversibility of recoding */
+
+  /* Prepare the final output file.  */
+
+  if (!output_name)
+    output_file = stdout;
+  else if (output_file = fopen (output_name, "w"), output_file == NULL)
+    error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+          __FILE__, __LINE__, output_name);
+
+  /* Create all subprocesses, from the last to the first, and
+     interconnect them.  */
+
+  reversible = 1;
+  for (sequence_index = length_of_sequence - 1;
+       sequence_index > 0;
+       sequence_index--)
+    {
+      if (pipe (pipe_pair) < 0)
+       error (EXIT_FAILURE, errno, "%s:%d: pipe ()",
+              __FILE__, __LINE__);
+      if (child_process = fork (), child_process < 0)
+       error (EXIT_FAILURE, errno, "%s:%d: fork ()",
+              __FILE__, __LINE__);
+      if (child_process == 0)
+       {
+
+          /* The child executes its recoding step, reading from the pipe
+             and writing to the current output file; then it exits.  */
+
+         if (close (pipe_pair[1]) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: close ()",
+                  __FILE__, __LINE__);
+         if (input_file = fdopen (pipe_pair[0], "r"), input_file == NULL)
+           error (EXIT_FAILURE, errno, "%s:%d: fdopen ()",
+                  __FILE__, __LINE__);
+
+         step = sequence[sequence_index];
+         if (!(*step->file_recode) (step, input_file, output_file))
+           reversible = 0;
+
+         fclose (input_file);
+         if (sequence_index < length_of_sequence - 1 || output_name)
+           fclose (output_file);
+
+         exit (reversible ? EXIT_SUCCESS : EXIT_FAILURE);
+       }
+      else
+       {
+
+          /* The parent redirects the current output file to the pipe.  */
+
+         if (dup2 (pipe_pair[1], fileno (output_file)) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: dup2 ()",
+                  __FILE__, __LINE__);
+         if (close (pipe_pair[0]) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: close ()",
+                  __FILE__, __LINE__);
+         if (close (pipe_pair[1]) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: close ()",
+                  __FILE__, __LINE__);
+       }
+    }
+
+  /* All the children are created, blocked on read.  Now, feed the whole
+     chain of processes with the output of the first recoding step.  */
+
+  if (!input_name)
+    input_file = stdin;
+  else if (input_file = fopen (input_name, "r"), input_file == NULL)
+    error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+          __FILE__, __LINE__, input_name);
+
+  step = sequence[0];
+  if (!(*step->file_recode) (step, input_file, output_file))
+    reversible = 0;
+
+  if (input_name)
+    fclose (input_file);
+
+  fclose (output_file);
+
+  /* Wait on all children, mainly to avoid synchronisation problems on
+     output file contents, but also to reduce the number of zombie
+     processes in case the user recodes many files at once.  */
+
+  while (wait (&wait_status) > 0)
+    {
+
+      /* Diagnose and abort on any abnormally terminating child.  */
+
+      if ((wait_status & ~(~0 << 8)) != 0
+         && (wait_status & ~(~0 << 8)) != SIGPIPE)
+       error (0, 0, "Child process wait status is 0x%0.2x",
+              wait_status);
+
+      /* Check for a non-zero exit from the terminating child.  */
+
+      if (wait_status & ~(~0 << 16))
+       reversible = 0;
+    }
+
+  if (interrupted)
+    reversible = 0;
+
+  return reversible;
+}
+
+#else
+
+static int
+execute_pipe_sequence (const char *input_name, const char *output_name)
+{
+  int sequence_index;          /* index into sequence */
+  const STEP *step;            /* pointer into single_steps */
+
+  FILE *input_file;            /* input file to recoding step */
+  FILE *output_file;           /* output file from recoding step */
+  int pipe_pair[2];            /* pair of file descriptors for a pipe */
+  int child_process;           /* child process number, zero if child */
+  int wait_status;             /* status returned by wait() */
+  int reversible;              /* reversibility of recoding */
+
+  /* Prepare the final files.  */
+
+  if (!input_name)
+    input_file = stdin;
+  else if (input_file = fopen (input_name, "r"), input_file == NULL)
+    error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+          __FILE__, __LINE__, input_name);
+
+  if (!output_name)
+    output_file = stdout;
+  else if (output_file = fopen (output_name, "w"), output_file == NULL)
+    error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+          __FILE__, __LINE__, output_name);
+
+  /* Create all subprocesses, from the first to the last, and
+     interconnect them.  */
+
+  reversible = 1;
+  for (sequence_index = 0;
+       sequence_index < length_of_sequence - 1;
+       sequence_index++)
+    {
+      if (pipe (pipe_pair) < 0)
+       error (EXIT_FAILURE, errno, "%s:%d: pipe ()",
+              __FILE__, __LINE__);
+      if (child_process = fork (), child_process < 0)
+       error (EXIT_FAILURE, errno, "%s:%d: fork ()",
+              __FILE__, __LINE__);
+      if (child_process == 0)
+       {
+          /* The child executes its recoding step, reading from the pipe
+             and writing to the current output file; then it exits.  */
+
+         if (close (pipe_pair[1]) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: close ()",
+                  __FILE__, __LINE__);
+         if (input_file = fdopen (pipe_pair[0], "r"), input_file == NULL)
+           error (EXIT_FAILURE, errno, "%s:%d: fdopen ()",
+                  __FILE__, __LINE__);
+
+         step = sequence[sequence_index];
+         if (!(*step->file_recode) (step, input_file, output_file))
+           reversible = 0;
+
+         fclose (input_file);
+         if (sequence_index < length_of_sequence - 1 || output_name)
+           fclose (output_file);
+
+         exit (reversible ? EXIT_SUCCESS : EXIT_FAILURE);
+       }
+      else
+       {
+
+          /* The parent redirects the current output file to the pipe.  */
+
+         if (dup2 (pipe_pair[1], fileno (output_file)) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: dup2 ()",
+                  __FILE__, __LINE__);
+         if (close (pipe_pair[0]) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: close ()",
+                  __FILE__, __LINE__);
+         if (close (pipe_pair[1]) < 0)
+           error (EXIT_FAILURE, errno, "%s:%d: close ()",
+                  __FILE__, __LINE__);
+       }
+      else
+       {
+         break;
+       }
+    }
+
+  /* All processes execute the following common code, each with its proper
+     value for SEQUENCE_INDEX, CHILD_PROCESS, etc.  */
+
+  /* All the children are created, blocked on read.  Now, feed the whole
+     chain of processes with the output of the first recoding step.  */
+
+  if (!input_name)
+    input_file = stdin;
+  else if (input_file = fopen (input_name, "r"), input_file == NULL)
+    error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+          __FILE__, __LINE__, input_name);
+
+  step = sequence[0];
+  if (!(*step->file_recode) (step, input_file, output_file))
+    reversible = 0;
+
+  if (input_name)
+    fclose (input_file);
+
+  fclose (output_file);
+
+  /* Wait on all children, mainly to avoid synchronisation problems on
+     output file contents, but also to reduce the number of zombie
+     processes in case the user recodes many files at once.  */
+
+  while (wait (&wait_status) > 0)
+    {
+
+      /* Diagnose and abort on any abnormally terminating child.  */
+
+      if ((wait_status & ~(~0 << 8)) != 0
+         && (wait_status & ~(~0 << 8)) != SIGPIPE)
+       error (0, 0, "Child process wait status is 0x%0.2x",
+              wait_status);
+
+      /* Check for a non-zero exit from the terminating child.  */
+
+      if (wait_status & ~(~0 << 16))
+       reversible = 0;
+    }
+
+  if (interrupted)
+    reversible = 0;
+
+  return reversible;
+}
+
+#endif
+
+#endif /* HAVE_PIPE */
+
+/*-------------------------------------------------------------------------.
+| Execute the conversion sequence, using the selected strategy whenever           |
+| more than one conversion step is needed.  If no conversion are needed,   |
+| merely copy the input onto the output.  Returns zero if the recoding has |
+| been found to be non-reversible.                                        |
+`-------------------------------------------------------------------------*/
+
+/* If some sequencing strategies are missing, this routine automatically
+   uses fallback strategies.  */
+
+static int
+execute_sequence (const char *input_name, const char *output_name)
+{
+  FILE *input_file;            /* input file to recoding step */
+  FILE *output_file;           /* output file from recoding step */
+  const STEP *step;            /* current step */
+  int reversible;              /* reversibility of recoding */
+
+#ifdef MSDOS_or_OS2
+  if (!input_name)
+    setmode (fileno (stdin), O_BINARY);
+  if (!output_name)
+    setmode (fileno (stdout), O_BINARY);
+#ifdef __EMX__
+  {
+    extern int _fmode_bin;
+    _fmode_bin = 1;
+  }
+#else
+  _fmode = O_BINARY;
+#endif
+#endif
+
+  if (verbose_option && input_name)
+    {
+      fprintf (stderr, "Recoding %s...", input_name);
+      fflush (stderr);
+    }
+
+  if (length_of_sequence > 1)
+    switch (sequence_strategy)
+      {
+      case STRATEGY_UNDECIDED:
+       error (EXIT_FAILURE, 0, "Internal error - strategy undecided");
+
+      case SEQUENCE_WITH_PIPE:
+#ifdef HAVE_PIPE
+       reversible = execute_pipe_sequence (input_name, output_name);
+       break;
+#endif
+
+      case SEQUENCE_WITH_POPEN:
+#ifdef HAVE_POPEN
+       reversible = execute_popen_sequence (input_name, output_name);
+       break;
+#endif
+
+      case SEQUENCE_WITH_FILES:
+       reversible = execute_pass_sequence (input_name, output_name);
+       break;
+      }
+  else
+    {
+
+      /* This is a single-step recoding a mere copy.  Do it.  */
+
+      if (!input_name)
+       input_file = stdin;
+      else if (input_file = fopen (input_name, "r"), input_file == NULL)
+       error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+              __FILE__, __LINE__, input_name);
+
+      if (!output_name)
+       output_file = stdout;
+      else if (output_file = fopen (output_name, "w"), output_file == NULL)
+       error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+              __FILE__, __LINE__, output_name);
+
+      if (length_of_sequence == 1)
+       {
+         step = sequence[0];
+         reversible = (*step->file_recode) (step, input_file, output_file);
+       }
+      else
+       {
+         file_copy (input_file, output_file);
+         reversible = 1;
+       }
+
+      if (input_name)
+       fclose (input_file);
+      if (output_name)
+       fclose (output_file);
+    }
+
+  if (verbose_option && input_name)
+    {
+      fprintf (stderr, " done\n");
+      fflush (stderr);
+    }
+  return reversible;
+}
+\f
+/* Some special option handling.  */
+
+/*-----------------------------------------------------------------.
+| Print a truncated charset name, with a guaranteed space at end.  |
+`-----------------------------------------------------------------*/
+
+static void
+print_truncated_charset_name (const char *name)
+{
+  char copy[15];
+
+  if ((int) strlen (name) > 14)
+    {
+      memcpy (copy, name, 14);
+      copy[14] = '\0';
+      name = copy;
+    }
+  printf ("%-14s ", name);
+}
+
+/*----------------------------------------------------------------------.
+| Find all possible sequences and report about them.  If CHARSET is not |
+| NULL, limit the study to those recoding starting or ending with the   |
+| given charset.                                                       |
+`----------------------------------------------------------------------*/
+
+static void
+perform_auto_check_one (CHARSET *before, CHARSET *after)
+{
+  int saved_length_of_sequence;
+  int saved_number_of_single_steps;
+  QUALITY quality;
+  const char *quality_string;
+  int counter;
+  STEP *step;
+
+  /* Study what we can do.  */
+
+  find_sequence (before, after);
+  if (length_of_sequence < 0)
+    {
+      if (!ignored_name)
+       {
+         print_truncated_charset_name (before->name);
+         print_truncated_charset_name (after->name);
+         printf ("  UNACHIEVABLE\n");
+       }
+    }
+  else
+    {
+
+      /* Compute the recoding quality.  */
+
+      quality = REVERSIBLE;
+      for (counter = 0; counter < length_of_sequence; counter++)
+       quality = merge_qualities (quality,
+                                  sequence[counter]->quality);
+      quality_string = quality_to_string (quality);
+
+      /* Study what optimization can do.  */
+
+      saved_length_of_sequence = length_of_sequence;
+      saved_number_of_single_steps = number_of_single_steps;
+
+      simplify_sequence ();
+
+      /* Check and report codes which should be aliases.  */
+
+      if (length_of_sequence == 0)
+       quality_string = "ONE to SAME";
+
+      /* Make the report.  */
+
+      print_truncated_charset_name (before->name);
+      print_truncated_charset_name (after->name);
+      printf ("  %-16s", quality_string);
+      printf ("steps: %d", saved_length_of_sequence);
+
+      if (length_of_sequence != saved_length_of_sequence)
+       printf (", %d saved by merging",
+               saved_length_of_sequence - length_of_sequence);
+      printf ("\n");
+
+      /* Unregister and clean up the merged steps.  */
+
+      while (number_of_single_steps > saved_number_of_single_steps)
+       {
+         number_of_single_steps--;
+         step = single_step_array + number_of_single_steps;
+         if (step->one_to_one)
+           free ((void *) step->one_to_one);
+         if (step->one_to_many)
+           free ((void *) step->one_to_many);
+       }
+    }
+}
+
+static void
+perform_auto_check (CHARSET *charset)
+{
+  CHARSET *before;
+  CHARSET *after;
+
+  if (charset->ignore)
+    error (EXIT_FAILURE, 0, "Cannot auto check the ignored charset");
+  if (charset == rfc1345)
+    error (EXIT_FAILURE, 0, "Cannot auto check on %s", charset->name);
+
+  if (charset)
+    {
+      for (before = charset_array;
+          before < charset_array + number_of_charsets;
+          before++)
+       if (!before->ignore && before != charset && before != rfc1345)
+
+           perform_auto_check_one (before, charset);
+
+      for (after = charset_array;
+          after < charset_array + number_of_charsets;
+          after++)
+       if (!after->ignore && after != charset && after != rfc1345)
+
+           perform_auto_check_one (charset, after);
+    }
+  else
+    for (before = charset_array;
+        before < charset_array + number_of_charsets;
+        before++)
+      if (!before->ignore && before != rfc1345)
+
+       for (after = charset_array;
+            after < charset_array + number_of_charsets;
+            after++)
+         if (!after->ignore && after != before && after != rfc1345)
+
+           perform_auto_check_one (before, after);
+}
+\f
+/* Main program.  */
+
+/*-----------------------------------------------.
+| Explain how to use the program, then get out.         |
+`-----------------------------------------------*/
+
+void
+usage (int status)
+{
+  if (status != EXIT_SUCCESS)
+    fprintf (stderr, "Try `%s %s' for more information.\n", program_name,
+            decoding_charset_flag ? "--list" : "--help");
+  else
+    {
+      printf ("GNU %s %s\n", PRODUCT, VERSION);
+      printf ("\
+\n\
+Usage: %s [OPTION]... [CHARSET]\n", program_name);
+      fputs ("\
+Mandatory or optional arguments to long options are mandatory or optional\n\
+for short options too.\n\
+\n\
+  -C, --copyright       display Copyright and copying conditions\n\
+  -a, --auto-check      report about some or all recoding paths, then exit\n\
+  -l, --list[=FORMAT]   list one or all known charsets\n\
+  -k, --known=PAIRS     restrict charsets according to known PAIRS list\n\
+      --help            display this help and exit\n\
+      --version         output version information and exit\n\
+\n\
+FORMAT is a word among decimal, octal, hexadecimal or full (which may be\n\
+abbreviated to one of `dohf'), it defaults to just the canonical name.\n\
+With -k, possible before charsets are listed for the given after CHARSET,\n\
+both being RFC1345 charsets, with PAIRS of the form `BEF1:AFT1,BEF2:AFT2,...\n\
+and BEFs and AFTs being codes.  All codes are given as decimal numbers.\n",
+             stdout);
+      fputs ("\
+Option -l with no FORMAT nor CHARSET list all charsets, also see the Texinfo\n\
+documentation.  My preferred charsets are (each user has preferences):\n\
+\n\
+  ascii-bs   ASCII (7-bit), using backspace to apply diacritics\n\
+  ibmpc      IBM-PC 8-bit characters, with proper newlines\n\
+  latex      LaTeX coding of foreign and diacriticized characters\n\
+  latin1     ISO Latin-1 8-bit extension of ASCII\n\
+  texte      Easy French convention for transmitting email messages\n",
+            stdout);
+      printf ("\
+\n\
+Usage: %s [OPTION]... [BEFORE]:[AFTER] [FILE]...\n", program_name);
+      fputs ("\
+\n\
+  -c, --colons            use colons instead of double quotes for diaeresis\n\
+  -d, --diacritics        limit conversion to diacritics or alike for LaTeX\n\
+  -f, --force             force recodings even if they are not reversible\n\
+                          (BEWARE: in this version, -f is always selected)\n\
+  -g, --graphics          approximate IBMPC rulers by ASCII graphics\n\
+  -h, --header[=NAME]     write C code with table NAME on stdout, then exit\n\
+  -i, --sequence=files    use intermediate files for sequencing passes\n",
+            stdout);
+
+#ifdef HAVE_POPEN
+      fputs ("\
+  -o, --sequence=popen    use popen machinery for sequencing passes\n",
+            stdout);
+#else
+      fputs ("\
+  -o, --sequence=popen    same as -i (on this system)\n",
+            stdout);
+#endif
+
+#ifdef HAVE_PIPE
+      fputs ("\
+  -p, --sequence=pipe     use pipe machinery for sequencing passes\n",
+            stdout);
+#else
+      fputs ("\
+  -p, --sequence=pipe     same as -o (on this system)\n",
+            stdout);
+#endif
+
+      fputs ("\
+  -q, --quiet, --silent   inhibit messages about irreversible recodings\n\
+  -s, --strict            use strict mappings, even loose characters\n\
+  -t, --touch             touch the recoded files after replacement\n\
+  -v, --verbose           explain sequence of steps and report progress\n\
+  -x, --ignore=CHARSET    ignore CHARSET while choosing a recoding path\n\
+\n\
+If none of -i, -o and -p are given, presume -p if no FILE, else -i.\n\
+Each FILE is recoded over itself, destroying the original.  If no\n\
+FILE is specified, then act as a filter and recode stdin to stdout.\n",
+            stdout);
+      printf ("\
+BEFORE and AFTER both default to `%s' when needed.\n", DEFAULT_CHARSET);
+    }
+  exit (status);
+}
+
+/*----------------------------------------------------------------------.
+| Main program.  Decode ARGC arguments passed through the ARGV array of |
+| strings, then launch execution.                                      |
+`----------------------------------------------------------------------*/
+
+/* Long options equivalences.  */
+static const struct option long_options[] =
+{
+  {"auto-check", no_argument, NULL, 'a'},
+  {"colons", no_argument, NULL, 'c'},
+  {"copyright", no_argument, NULL, 'C'},
+  {"diacritics", no_argument, NULL, 'd'},
+  {"force", no_argument, NULL, 'f'},
+  {"header", optional_argument, NULL, 'h'},
+  {"help", no_argument, &show_help, 1},
+  {"ignore", required_argument, NULL, 'x'},
+  {"list", optional_argument, NULL, 'l'},
+  {"quiet", no_argument, NULL, 'q'},
+  {"sequence", required_argument, NULL, '\n'},
+  {"silent", no_argument, NULL, 'q'},
+  {"strict", no_argument, NULL, 's'},
+  {"touch", no_argument, NULL, 't'},
+  {"verbose", no_argument, NULL, 'v'},
+  {"version", no_argument, &show_version, 1},
+  {0, 0, 0, 0},
+};
+
+static const char *const format_strings[] =
+  {
+    "decimal",
+    "octal",
+    "hexadecimal",
+    "full",
+    NULL,
+  };
+
+static const char *const sequence_strings[] =
+  {
+    "files",
+    "popen",
+    "pipe",
+    NULL,
+  };
+
+int
+main (int argc, char *const *argv)
+{
+  extern int optind;           /* index of argument */
+  int option_char;             /* option character */
+  int reversible;              /* reversibility of all recodings */
+  const char *input_name;      /* input file name */
+  char output_name[200];       /* output file name */
+  FILE *file;                  /* file to check or stat */
+#ifdef MSDOS
+  struct ftime stamp_stat;     /* input file time stamps */
+#else /* not MSDOS */
+  struct stat stamp_stat;      /* input file time stamps */
+  time_t stamp_utime[2];       /* recoded file time stamps */
+#endif /* not MSDOS */
+  char *cursor;                        /* all purpose cursor */
+
+  /* Decode command options.  */
+
+  program_path = argv[0];
+  program_name = strrchr (program_path, '/');
+  program_name = program_name ? program_name + 1 : program_path;
+
+  if (argc == 1)
+    usage (EXIT_SUCCESS);
+
+  while (option_char = getopt_long (argc, argv, "aCcdfgh::ik:l::opqstvx:",
+                                   long_options, NULL),
+        option_char != EOF)
+    switch (option_char)
+      {
+      default:
+       usage (EXIT_FAILURE);
+
+      case '\0':
+       break;
+
+      case '\n':
+       switch (argmatch (optarg, sequence_strings))
+         {
+         case -2:
+           error (0, 0, "Ambiguous sequence `%s'", optarg);
+           usage (EXIT_FAILURE);
+
+         case -1:
+           error (0, 0, "Unknown sequence `%s'", optarg);
+           usage (EXIT_FAILURE);
+
+         case 0:
+           sequence_strategy = SEQUENCE_WITH_FILES;
+           break;
+
+         case 1:
+           sequence_strategy = SEQUENCE_WITH_POPEN;
+           break;
+
+         case 2:
+           sequence_strategy = SEQUENCE_WITH_PIPE;
+           break;
+         }
+       break;
+
+      case 'a':
+       auto_check_mode = 1;
+       break;
+
+      case 'C':
+       fprintf (stderr, "%s", copyright_string);
+       exit (EXIT_SUCCESS);
+
+      case 'c':
+       diaeresis_char = ':';
+       break;
+
+      case 'd':
+       diacritics_only = 1;
+       break;
+
+      case 'f':
+       force_option = 1;
+       break;
+
+      case 'g':
+       ascii_graphics = 1;
+       break;
+
+      case 'h':
+       make_header_mode = 1;
+       header_name = optarg;
+       break;
+
+      case 'i':
+       sequence_strategy = SEQUENCE_WITH_FILES;
+       break;
+
+      case 'k':
+       decode_known_pairs (optarg);
+       show_restricted_charsets = 1;
+       break;
+
+      case 'l':
+       show_charsets = 1;
+       if (optarg)
+         switch (argmatch (optarg, format_strings))
+           {
+           case -2:
+             error (0, 0, "Ambiguous format `%s'", optarg);
+             usage (EXIT_FAILURE);
+
+           case -1:
+             error (0, 0, "Unknown format `%s'", optarg);
+             usage (EXIT_FAILURE);
+
+           case 0:
+             list_format = DECIMAL_FORMAT;
+             break;
+
+           case 1:
+             list_format = OCTAL_FORMAT;
+             break;
+
+           case 2:
+             list_format = HEXADECIMAL_FORMAT;
+             break;
+
+           case 3:
+             list_format = FULL_FORMAT;
+             break;
+           }
+       break;
+
+      case 'o':
+       sequence_strategy = SEQUENCE_WITH_POPEN;
+       break;
+
+      case 'p':
+       sequence_strategy = SEQUENCE_WITH_PIPE;
+       break;
+
+      case 'q':
+       quiet_mode = 1;
+       break;
+
+      case 's':
+       strict_mapping = 1;
+       break;
+
+      case 't':
+       touch_option = 1;
+       break;
+
+      case 'v':
+       verbose_option = 1;
+       break;
+
+      case 'x':
+       ignored_name = optarg;
+       break;
+      }
+
+  if (ascii_graphics && strict_mapping)
+    {
+      error (0, 0, "Currently, -s is ignored when -g is selected");
+      strict_mapping = 0;
+    }
+
+  if (ascii_graphics || strict_mapping)
+    force_option = 1;
+
+  /* Process trivial options.  */
+
+  if (show_version)
+    {
+      printf ("GNU %s %s\n", PRODUCT, VERSION);
+      exit (EXIT_SUCCESS);
+    }
+
+  if (show_help)
+    usage (EXIT_SUCCESS);
+
+  /* Register all modules, then set the ignored charset.  */
+
+  register_all_modules ();
+  make_argmatch_array ();
+
+  if (ignored_name)
+    find_charset (clean_charset_name (ignored_name))->ignore = 1;
+
+  /* Process auto check option.  */
+
+  if (auto_check_mode)
+    {
+      if (optind + 1 < argc)
+       usage (EXIT_FAILURE);
+
+      /* Accept a possible charset.  */
+
+      if (optind < argc)
+       perform_auto_check (find_charset (clean_charset_name (argv[optind])));
+      else
+       perform_auto_check (NULL);
+      exit (EXIT_SUCCESS);
+    }
+
+  /* Process charset listing options.  */
+
+  if (show_charsets || show_restricted_charsets)
+    {
+      if (optind + 1 < argc)
+       usage (EXIT_FAILURE);
+
+      /* Select a possible charset and a default format.  */
+
+      if (optind < argc)
+       list_charset = find_charset (clean_charset_name (argv[optind]));
+      else if (list_format != NO_FORMAT || show_restricted_charsets)
+       list_charset = find_charset (clean_charset_name (NULL));
+      else
+       list_charset = NULL;
+
+      /* List the charset(s) appropriately.  */
+      
+      if (show_restricted_charsets)
+       list_all_charsets (list_charset);
+      else if (list_charset)
+       if (list_format == FULL_FORMAT)
+         list_full_charset (list_charset);
+       else
+         list_concise_charset (list_charset);
+      else
+       list_all_charsets (NULL);
+
+      /* Then get out.  */
+
+      exit (EXIT_SUCCESS);
+    }
+
+  /* Decode the BEFORE:AFTER argument.  */
+
+  if (optind + 1 > argc)
+    usage (EXIT_FAILURE);
+
+  decode_before_after (argv[optind++]);
+
+  /* Establish the sequence of recoding steps.  */
+
+  length_of_sequence = 0;
+  find_sequence (before_charset, after_charset);
+  if (length_of_sequence < 0)
+    error (EXIT_FAILURE, 0, "No way to recode from %s to %s",
+          before_charset->name, after_charset->name);
+
+  simplify_sequence ();
+
+  /* If we merely want C code, do it and get out.  */
+
+  if (make_header_mode)
+    {
+      if (length_of_sequence == 0)
+       error (EXIT_FAILURE, 0, "Recoding is trivial, not worth a table");
+      if (length_of_sequence > 1
+         || !(sequence[0]->one_to_one || sequence[0]->one_to_many))
+       error (EXIT_FAILURE, 0, "Recoding is too complex for a mere table");
+
+      output_header_file ();
+      exit (EXIT_SUCCESS);
+    }
+
+  /* If the recoding might be not reversible, do not proceed further without
+     --force option.  */
+
+  /* DO IT!  */
+
+  /* If there is no input file, act as a filter.  Else, recode all files
+     over themselves.  */
+
+  setup_signals ();
+
+  if (optind < argc)
+    {
+
+      /* When reading and writing files, unless the user selected otherwise,
+        avoid forking and use intermediate files.  */
+
+      if (sequence_strategy == STRATEGY_UNDECIDED)
+       sequence_strategy = SEQUENCE_WITH_FILES;
+
+      /* In case files are recoded over themselves and there is no
+         recoding step at all, do not even try to touch the files.  */
+
+      reversible = 1;
+      if (length_of_sequence > 0)
+
+       /* Process files, one at a time.  */
+
+       for (; optind < argc; optind++)
+         {
+           input_name = argv[optind];
+
+           /* Check if the file can be read and rewritten.  */
+
+           if (file = fopen (input_name, "r+"), file == NULL)
+             error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+                    __FILE__, __LINE__, input_name);
+
+           /* Save the input file time stamp.  */
+
+           if (!touch_option)
+             {
+#ifdef MSDOS
+               getftime (fileno (file), &stamp_stat);
+#else
+               fstat (fileno (file), &stamp_stat);
+#endif
+             }
+
+           fclose (file);
+
+           /* Choose an output file in the same directory.  */
+
+#ifdef MSDOS_or_OS2
+
+           strcpy (output_name, input_name);
+           for (cursor = output_name + strlen (output_name);
+                cursor > output_name && cursor[-1] != '/'
+                && cursor[-1] != '\\' && cursor[-1] != ':';
+                cursor--)
+             ;
+           strcpy (cursor, "recodeXX.TMP");
+
+#else /* not MSDOS_or_OS2 */
+
+           strcpy (output_name, input_name);
+           for (cursor = output_name + strlen (output_name);
+                cursor > output_name && cursor[-1] != '/';
+                cursor--)
+             ;
+           sprintf (cursor, "rec%d.tmp", getpid ());
+
+#endif /* not MSDOS_or_OS2 */
+
+           /* Recode the file.  */
+
+           if (!execute_sequence (input_name, output_name))
+             {
+               reversible = 0;
+               if (!quiet_mode)
+                 error (0, 0, "%s: Recoding is not reversible", input_name);
+             }
+
+           /* Move the new file over the original.  */
+
+           if (unlink (input_name) < 0)
+             error (EXIT_FAILURE, errno, "%s:%d: unlink (%s)",
+                    __FILE__, __LINE__, input_name);
+#ifdef HAVE_RENAME
+           if (rename (output_name, input_name) < 0)
+             error (EXIT_FAILURE, errno, "%s:%d: rename (%s, %s)",
+                    __FILE__, __LINE__, output_name, input_name);
+#else
+           if (link (output_name, input_name) < 0)
+             error (EXIT_FAILURE, errno, "%s:%d: link (%s, %s)",
+                    __FILE__, __LINE__, output_name, input_name);
+           if (unlink (output_name) < 0)
+             error (EXIT_FAILURE, errno, "%s:%d: unlink (%s)",
+                    __FILE__, __LINE__, output_name);
+#endif
+
+           /* Adjust the time stamp for the new file.  */
+
+           if (!touch_option)
+             {
+#ifdef MSDOS
+               file = fopen (input_name, "r");
+               if (file == NULL)
+                 error (EXIT_FAILURE, errno, "%s:%d: fopen (%s)",
+                        __FILE__, __LINE__, input_name);
+               setftime (fileno (file), &stamp_stat);
+               fclose (file);
+#else
+               stamp_utime[0] = stamp_stat.st_atime;
+               stamp_utime[1] = stamp_stat.st_mtime;
+               utime (input_name, stamp_utime);
+#endif
+             }
+         }
+    }
+  else
+    {
+
+      /* When reading stdin and writing stdout, unless the user selected
+         otherwise, fork processes interconnected with pipes.  */
+
+      if (sequence_strategy == STRATEGY_UNDECIDED)
+       sequence_strategy = SEQUENCE_WITH_PIPE;
+
+      if (!execute_sequence (NULL, NULL))
+       {
+         reversible = 0;
+         if (!quiet_mode)
+           error (0, 0, "Recoding is not reversible");
+       }
+    }
+
+  /* Exit with an appropriate status.  */
+
+  exit ((force_option || reversible) ? EXIT_SUCCESS : EXIT_FAILURE);
+}
diff --git a/recode.h b/recode.h
new file mode 100644 (file)
index 0000000..2658aab
--- /dev/null
+++ b/recode.h
@@ -0,0 +1,168 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1988.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#if STDC_HEADERS
+# include <stdlib.h>
+#endif
+
+#if DIFF_HASH
+# ifdef HAVE_LIMITS_H
+#  include <limits.h>
+# endif
+# ifndef CHAR_BIT
+#  define CHAR_BIT 8
+# endif
+#endif
+
+/* Some systems do not define EXIT_*, even with STDC_HEADERS.  */
+#ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE 1
+#endif
+
+#if __STDC__
+# define _(Args) Args
+#else
+# define _(Args) ()
+#endif
+
+void *xmalloc _((int));
+char *xstrdup _((const char *));
+int argmatch _((const char *, const char *const *));
+void error _((int, int, const char *, ...));
+
+/* Description of a charset.  */
+
+typedef const char* DOUBLE_TABLE[8];
+
+typedef struct charset CHARSET;
+
+struct charset
+  {
+    const char *name;          /* main name */
+    int ignore;                        /* non zero if should be ignored */
+    DOUBLE_TABLE *table;       /* double table for RFC 1345 */
+    int size;                  /* size of each DOUBLE_TABLE entry */
+  };
+
+/* Description of a single step of recoding.  */
+
+typedef enum quality QUALITY;
+
+enum quality
+  {
+    REVERSIBLE,                        /* reversible one to one recoding */
+    ONE_TO_ONE,                        /* one character to one */
+    ONE_TO_MAYBE,              /* one character to none or one */
+    ONE_TO_MANY,               /* one character to none, one or many */
+    MANY_TO_ONE,               /* one or many characters to one */
+    MANY_TO_MANY               /* one or many characters to one or many */
+  };
+
+typedef struct step STEP;
+
+struct step
+  {
+    CHARSET *before;           /* charset before conversion */
+    CHARSET *after;            /* charset after conversion */
+    QUALITY quality;           /* recoding quality */
+    void (*init_recode) _((STEP *));
+    int (*file_recode) _((const STEP *, FILE *, FILE *));
+    const unsigned char *one_to_one; /* recoding array of 256 chars */
+    const char *const *one_to_many; /* recoding array of 256 strings */
+    int conversion_cost;       /* cost for this single step only */
+  };
+
+typedef struct known_pair KNOWN_PAIR;
+
+struct known_pair
+  {
+    unsigned char left;                /* first character in pair */
+    unsigned char right;       /* second character in pair */
+  };
+
+/* Description of list formats.  */
+
+enum list_format
+  {
+    NO_FORMAT,                 /* format not decided yet */
+    DECIMAL_FORMAT,            /* concise tabular list using decimal */
+    OCTAL_FORMAT,              /* concise tabular list using octal */
+    HEXADECIMAL_FORMAT,                /* concise tabular list using hexadecimal */
+    FULL_FORMAT                        /* full list, one character per line */
+  };
+
+/* recode.c.  */
+
+extern int ascii_graphics;
+extern char diaeresis_char;
+extern int diacritics_only;
+extern int strict_mapping;
+extern enum list_format list_format;
+
+extern int decoding_charset_flag;
+extern const unsigned char *one_to_same;
+extern CHARSET *rfc1345;
+
+void usage _((int));
+const char *quality_to_string _((QUALITY));
+QUALITY merge_qualities _((QUALITY, QUALITY));
+void declare_step _((const char *, const char *, QUALITY, void (*) (STEP *),
+                    int (*) (const STEP *, FILE *, FILE *)));
+void declare_double_step _((DOUBLE_TABLE *, const char *, int));
+unsigned char *invert_table _((const unsigned char *));
+void complete_pairs _((STEP *, int, const KNOWN_PAIR *, int, int));
+int file_one_to_one _((const STEP *, FILE *, FILE *));
+int file_one_to_many _((const STEP *, FILE *, FILE *));
+
+/* charname.c.  */
+
+char *symbol_to_charname _((const char *));
+
+/* charset.c.  */
+
+extern CHARSET charset_array[];
+extern int number_of_charsets;
+
+void decode_known_pairs _((const char *));
+void prepare_charset_initialization _((void));
+CHARSET *find_charset _((const char *));
+void declare_alias _((const char *, const char *));
+void make_argmatch_array _((void));
+const char *clean_charset_name _((const char *));
+
+void list_all_charsets _((CHARSET *));
+void init_table_for_rfc1345 _((STEP *));
+void list_concise_charset _((CHARSET *));
+void list_full_charset _((CHARSET *));
+
+/* Debugging the memory allocator.  */
+
+#if WITH_DMALLOC
+# define DMALLOC_FUNC_CHECK
+# include <dmalloc.h>
+#endif
diff --git a/recode.info b/recode.info
new file mode 100644 (file)
index 0000000..73b7dd6
--- /dev/null
@@ -0,0 +1,1949 @@
+This is Info file recode.info, produced by Makeinfo-1.55 from the input
+file recode.texi.
+
+START-INFO-DIR-ENTRY
+* recode: (recode).     Conversion between character sets and usages.
+END-INFO-DIR-ENTRY
+
+   This file documents the `recode' command, which has the purpose of
+converting files between various character sets and usages.
+
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+
+   Permission is granted to make and distribute verbatim copies of this
+manual provided the copyright notice and this permission notice are
+preserved on all copies.
+
+   Permission is granted to copy and distribute modified versions of
+this manual under the conditions for verbatim copying, provided that
+the entire resulting derived work is distributed under the terms of a
+permission notice identical to this one.
+
+   Permission is granted to copy and distribute translations of this
+manual into another language, under the above conditions for modified
+versions, except that this permission notice may be stated in a
+translation approved by the Foundation.
+
+\1f
+File: recode.info,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
+
+GNU `recode'
+************
+
+   `recode' converts files between character sets and usages.  When
+exact transliterations are not possible, it may get rid of the offending
+characters or fall back on approximations.  This program recognizes or
+produces nearly 150 different character sets and is able to
+transliterate files between almost any pair.  Most RFC 1345 character
+sets are supported.
+
+   The current `recode' release is 3.4.
+
+* Menu:
+
+* Introduction::        What is the purpose of this program
+* Invoking recode::     How to use this program
+* Reversibility::       Reversibility issues
+* RFC 1345 charsets::   Charsets from RFC 1345
+* ISO charsets::        Charsets based on ASCII
+* IBM charsets::        Charsets based on IBM
+* CDC charsets::        Charsets based on CDC
+* Micro charsets::      Non-IBM micro-computer charsets
+* Other charsets::      Some other charsets
+* Internals::           Internal aspects
+
+ -- The Detailed Node Listing --
+
+What is the purpose of this program
+
+* Overview::            Overview of charsets
+* Contributing::        Contributions and bug reports
+
+Charsets based on ASCII
+
+* ASCII::               Usual ASCII
+* ISO 8859-1 charset::  ASCII extended by Latin Alphabets
+* ASCII-BS::            ASCII 7-bits, BS to overstrike
+* flat::                ASCII without diacritics nor underline
+
+Charsets based on IBM
+
+* EBCDIC::              EBCDIC codes
+* IBM-PC::              IBM's PC code
+* Icon-QNX::            Unisys' ICON code
+
+Charsets based on CDC
+
+* Display Code::        Control Data's Display Code
+* CDC-NOS::             ASCII 6/12 from NOS
+* Bang-Bang::           ASCII "bang bang"
+
+Non-IBM micro-computer charsets
+
+* Apple-Mac::           Apple's Macintosh code
+* AtariST::             Atari ST code
+* NeXT::                NeXT international code
+
+Some other charsets
+
+* LaTeX::               ASCII with LaTeX codes
+* Texte::               ASCII with easy French conventions
+* HTML::                World Wide Web representations
+
+ASCII with easy French conventions
+
+* Diacritics::          Diacritics
+* Ending diaeresis::    List of words ending with diaeresis
+
+Internal aspects
+
+* Main flow::           Overall organization
+* New charsets::        Adding new charsets
+
+\1f
+File: recode.info,  Node: Introduction,  Next: Invoking recode,  Prev: Top,  Up: Top
+
+What is the purpose of this program
+***********************************
+
+   This `recode' program has the purpose of converting files between
+various character sets and usages.  When exact transliterations are not
+possible, as it is often the case, the program may get rid of the
+offending characters or fall back on approximations.
+
+   Let us coin the term "charset" to represent, without distinction, a
+character set "per se" or a particular usage of a character set.  This
+program recognizes or produces around 150 such charsets.  Since it can
+convert each charset to almost any other one, many thousands of
+different conversions are possible.
+
+   This tool pays special attention to superimposition of diacritics for
+French representation.  This orientation is mostly historical, it does
+not impair the usefulness, generality or extensibility of the program.
+
+* Menu:
+
+* Overview::            Overview of charsets
+* Contributing::        Contributions and bug reports
+
+\1f
+File: recode.info,  Node: Overview,  Next: Contributing,  Prev: Introduction,  Up: Introduction
+
+Overview of charsets
+====================
+
+   Recoding is currently possible between most of the charsets
+described in RFC 1345.  *Note RFC 1345 charsets::.
+
+   Recode also handles some charsets in more specialized ways.  These
+are:
+
+   * usual 7-bit ASCII: without any diacritics, or else: using
+     backspace for overstriking; Unisys' ICON convention; TeX/LaTeX
+     coding; easy French conventions for electronic mail;
+
+   * 8-bit extensions to ASCII: ISO Latin-1, Atari ST code, IBM's code
+     for the PC, Apple's code for the Macintosh, NeXT code;
+
+   * 6-bit escaped ASCII based on CDC display code: 6/12 code from NOS;
+     bang-bang code from Universit'e de Montr'eal;
+
+   * non-ASCII codes: three flavors of EBCDIC.
+
+   The recent introduction of RFC 1345 in GNU `recode' has brought with
+it a few charsets having the functionality of older ones, but yet being
+different in subtle ways.  The effects have not been fully investigated
+yet, so for now, clashes are avoided, the old and new charsets are kept
+well separate.  For example, wizards would be interested in comparing
+the output of these two commands:
+
+     recode -vh IBM-PC:Apple-Mac
+     recode -vh IBM437:macintosh
+
+The first command uses only charsets prior to RFC 1345 introduction.
+Both methods give different recodings, the first also properly recodes
+end of lines.  These differences are annoying, the fuzziness will have
+to be explained and settle down one day.
+
+\1f
+File: recode.info,  Node: Contributing,  Prev: Overview,  Up: Introduction
+
+Contributions and bug reports
+=============================
+
+   Even being the `recode' author and current maintainer, I am no
+specialist in charset standards.  I only made `recode' along the years
+to solve my own needs, but felt it was applicable for the needs of
+others.  Some GNU people liked the program structure and suggested to
+make it more widely available.  I rely on GNU users judgment for what
+is best to be done next.
+
+   Properly protecting GNU `recode' about possible copyright fights is
+a pain for me and for contributors, but we cannot avoid addressing the
+issue in the long run.  Besides, the Free Software Foundation, which
+mandates the GNU project, is very sensible to this matter.  GNU
+standards require that I be cautious before looking at copyrighted code.
+The safest and simplest way for me is to gather ideas and reprogram them
+anew, even if this might slow me down considerably.  For contributions
+going beyond a few lines of code here and there, the FSF definitely
+requires employer disclaimers and copyright assignments in writing.
+
+   Many users contributed to GNU `recode' already, I am grateful to
+them for their interest and involvement.  Some suggestions can be
+integrated quickly while some others have to be delayed, I have to draw
+a line somewhere when time comes to make a new release, about what would
+go in it and what would go in the next.  Also, when you contribute
+something to `recode', *please* explain what it is about.  Do not take
+for granted that I know those charsets which are familiar to you.  Your
+explanations could well find their way into this documentation, too.
+
+   Mail suggestions, documentation errors and bug reports to
+`bug-gnu-utils@prep.ai.mit.edu' or, if you prefer, directly to Francois
+Pinard `pinard@iro.umontreal.ca'.  Do not be afraid to report details,
+because this program is the mere aggregation of hundreds of details.
+
+\1f
+File: recode.info,  Node: Invoking recode,  Next: Reversibility,  Prev: Introduction,  Up: Top
+
+How to use this program
+***********************
+
+   The general format of the program call is one of:
+
+     recode [OPTION]... [CHARSET]
+     recode [OPTION]... [BEFORE]:[AFTER] [FILE]...
+
+   The second form is the common case.  Each FILE will be read assuming
+it is coded with charset BEFORE, it will be recoded over itself so to
+use the charset AFTER.  If there is no such FILE, the program rather
+acts as a filter and recode standard input to standard output.
+
+   The available options are:
+
+`-C'
+`--copyright'
+     Given this option, all other parameters and options are ignored.
+     The program prints briefly the Copyright and copying conditions.
+     See the file `COPYING' in the distribution for full statement of
+     the Copyright and copying conditions.
+
+`-a'
+`--auto-check'
+     In this special mode, `recode' diagnostics itself by analyzing
+     connectivity of the various charsets and reporting on standard
+     output.  No file will be recoded.
+
+     There might be one non-option argument, in which case it is
+     interpreted as a charset name, possibly abbreviated to any non
+     ambiguous prefix.  `recode' will then study all recodings having
+     the given charset as a starting or ending point.  If there is no
+     such non-option argument, `recode' will study *all* possible
+     recodings.
+
+     For each possible pair of different charsets, it prints on standard
+     output how many single steps are needed for achieving the recoding
+     and how many can be saved by step merging.  If a recoding cannot
+     be done, the word `UNACHIEVABLE' is printed instead.  However,
+     this special line is completely suppressed if option `-x'
+     specified some charset to ignore.
+
+     The option `-hNAME' affects the resulting output, because there
+     are more merging rules when this option is in effect.  Other
+     options affect the result: `-d', `-g' and, notably, `-s'.
+
+     There was a time, in GNU `recode' development, when this option was
+     reasonably interesting.  With the greater number of handled
+     charsets, it became inordinately slow, taking on the order of one
+     hour of wall clock time, while generating a great deal of output.
+     This option is not practical anymore when used without a charset
+     parameter.  However, it can be made slightly more usable, together
+     with option `-x.', which effectively disables most RFC 1345
+     charsets from the report.
+
+`-c'
+`--colons'
+     With `Texte' Easy French conventions, use the column `:' instead
+     of the double-quote `"' for marking diaeresis.  *Note Texte::.
+
+`-d'
+`--diacritics'
+     While converting to or from one of `HTML' or `LaTeX' charset,
+     limit conversion to diacritics only.  This is particularly useful
+     when people write what would be valid `HTML', TeX or LaTeX files,
+     if only they were using provided sequences for applying diacritics
+     instead of using the diacriticized characters directly from the
+     underlying character set.
+
+     While converting to `HTML' or `LaTeX' charset, this option assumes
+     that non-diacriticized special characters are properly coded or
+     protected, so `recode' will transmit them literally.  While
+     converting the other way, this option prevents all attempts at
+     recognizing coded or protected versions of non-diacriticized
+     special characters of the other charset.  *Note HTML::.  *Note
+     LaTeX::.
+
+`-f'
+`--force'
+     It is planned that some future version of `recode' will protect
+     you against recoding a file irreversibly over itself.  However,
+     please keep vividly in mind that this protection is not yet active
+     in `recode'.  When the protection will be enforced, option `-f'
+     will become mandatory for a file to be replaced by some recoding
+     of its contents, if such conversion is loosing information.  For
+     now, `recode' acts as if option `-f' was always selected.
+
+     In preparation for the time this option will become mandatory, you
+     may start using `-f' right away in scripts calling `recode', when
+     you know this is the reasonnable thing to do.
+
+`-g'
+`--graphics'
+     This option is only meaningful while getting *out* of the `IBM-PC'
+     charset.  In this charset, characters 176 to 223 are used for
+     constructing rulers and boxes, using simple or double horizontal or
+     vertical lines.  This option forces the automatic selection of
+     ASCII characters for approximating these rulers and boxes, at cost
+     of making the transformation irreversible.  Option `-g' implies
+     `-f'.
+
+`-h[NAME]'
+`--header[=NAME]'
+     Instead of recoding files, `recode' writes a C source file on
+     standard output and exits.  This source is meant to be included in
+     a regular C program: its purpose is to declare and initialize an
+     array, named NAME, which represents the requested recoding.  If
+     NAME is not specified, then it defaults to `BEFORE_to_AFTER',
+     where BEFORE is the starting charset and AFTER is the goal charset.
+
+     Even if `recode' tries its best, this option does not always
+     succeed in producing the requested C table.  It will however,
+     provided the recoding can be internally represented by only one
+     step after the optimization phase, and if this merged step conveys
+     a one-to-one or a one-to-many explicit table.  But this is all
+     fairly technical.  Better try and see!
+
+     Beware that other options might affect the produced C tables,
+     these are: `-d', `-g' and, particularly, `-s'.
+
+`-i'
+`--sequence=files'
+     When the recoding requires a combination of two or more elementary
+     recoding steps, this option forces many passes over the data, using
+     intermediate files between passes.  This is the default behavior
+     when files are recoded over themselves.  If this option is
+     selected in filter mode, that is, when the program reads standard
+     input and writes standard output, it might take longer for
+     programs further down the pipe chain to start receiving some
+     recoded data.
+
+`-l[FORMAT]'
+`--list[=FORMAT]'
+     This option asks for information about all charsets, or about one
+     particular charset.  No file will be recoded.
+
+     If there is no non-option arguments, `recode' ignores the FORMAT
+     value of the option, it writes a sorted list of charset names on
+     standard output, one per line.  When a charset name have aliases
+     or synonyms, they follow the true charset name on its line,
+     presented in lexicographical order from left to right.  This list
+     is over one hundred lines.  It is best used with `grep', as in:
+
+          recode -l | grep greek
+
+     There might be one non-option argument, in which case it is
+     interpreted as a charset name, possibly abbreviated to any non
+     ambiguous prefix.  This particular usage of the `-l' option is
+     obeyed *only* for charsets having an RFC 1345 style internal
+     description.  Even if most charsets have this property, some do
+     not, then option `-l' cannot be used to detail these particular
+     charsets.  For knowing if a particular charset can be listed this
+     way, you should merely try and see if this works.  The FORMAT
+     value of the option is a keyword from the following list.
+     Keywords may be abbreviated by dropping suffix letters, and even
+     reduced to the first letter only:
+
+    `decimal'
+          This format asks for the production on standard output of a
+          concise tabular display of the charset, in which character
+          code values are expressed in decimal.
+
+    `octal'
+          This format uses octal instead of decimal in the concise
+          tabular display of the charset.
+
+    `hexadecimal'
+          This format uses hexadecimal instead of decimal in the
+          concise tabular display of the charset.
+
+    `full'
+          This format requests an extensive display of the charset on
+          standard output, using one line per character showing its
+          decimal, hexadecimal and octal code values, and also a
+          descriptive comment which is indeed the 10646 character name.
+
+     When option `-l' is used together with a CHARSET argument, the
+     FORMAT defaults to `decimal'.
+
+`-o'
+`--sequence=popen'
+     When the recoding requires a combination of two or more elementary
+     recoding steps, this option forces the creation of a chain of
+     program instances initiated through the `popen(3)' library call,
+     all operating in parallel.  In filter mode, costing the overhead
+     of multiple program initializations, recoded data will be
+     available soon after the program starts, even if many elementary
+     recoding steps are required.
+
+     If, at installation time, the `popen(3)' call is said to be
+     unavailable, selecting option `-o' is equivalent to selecting
+     option `-i'.
+
+`-p'
+`--sequence=pipe'
+     When the recoding requires a combination of two or more elementary
+     recoding steps, this option forces the program to fork itself into
+     a few copies interconnected with pipes, using the `pipe(2)' system
+     call.  All copies of the program operate in parallel.  This method
+     is similar to the method used through option `-o', but is more
+     efficient because the program initializes only once.  This is the
+     default behavior in filter mode.  If this option is used when
+     files are recoded over themselves, this should also save disk
+     space because some temporary files might not be needed, at cost of
+     more system overhead.
+
+     If, at installation time, the `pipe(2)' call is said to be
+     unavailable, selecting option `-p' is equivalent to selecting
+     option `-o'.  If both `pipe(2)' and `popen(3)' are unavailable,
+     selecting option `-p' is equivalent to selecting option `-i'.
+
+`-q'
+`--quiet'
+`--silent'
+     This option has the sole purpose of inhibiting diagnostic messages
+     about irreversible recodings.
+
+     This option is set automatically for the children processes, when
+     recode splits itself in many collaborating copies.  Doing so, the
+     diagnostic is issued only once by the parent.  See options `-o'
+     and `-p'.
+
+`-s'
+`--strict'
+     By using this option, the user requests that `recode' be very
+     strict while recoding a file, merely loosing in the transformation
+     any character which is not explicitly mapped from a charset to
+     another.  This option renders the recoding less likely reversible,
+     so it also implies option `-f'.  Also *Note Reversibility::.
+
+`-t'
+`--touch'
+     The *touch* option is meaningful only when files are recoded over
+     themselves.  Without it, the time-stamps associated with files are
+     preserved, to reflect the fact that changing the code of a file
+     does not really alter its informational contents.  When the user
+     wants the recoded files to be time-stamped at the recoding time,
+     this option inhibits the automatic protection of the time-stamps.
+
+`-v'
+`--verbose'
+     Before doing any recoding, the program will first print on `stderr'
+     the list of all intermediate charsets planned for recoding,
+     starting with the BEFORE charset and ending with the AFTER charset.
+     It also prints an indication of the recoding quality, as one of
+     the word `reversible', `one to one', `one to many', `many to one'
+     or `many to many'.
+
+     This information will appear once or twice.  It is shown a second
+     time only when the optimization and step merging phase succeeds in
+     creating a new single step.
+
+     This option also has a second effect.  The program will print on
+     `stderr' one message per FILE recoded, so to let the user informed
+     of the progress of its command.
+
+     An easy way to know beforehand the sequence or quality of a
+     recoding is by using the command such as:
+
+          recode -v BEFORE:AFTER < /dev/null
+
+     using the fact that, *so far* in `recode', an empty input file
+     produces an empty output file.
+
+`-x=CHARSET'
+`--ignore=CHARSET'
+     This option tells the program to ignore any recoding path through
+     the specified CHARSET, so disabling any single step using this
+     charset as a start or end point.  This may be used when the user
+     wants to force `recode' in using an alternate recoding path.
+
+     CHARSET may be abbreviated to any unambiguous prefix.  For
+     convenience, the value `.' is an alias for `RFC 1345', so the
+     option `-x.' effectively disables *all* RFC 1345 tables at once.
+
+`--help'
+     The program merely prints a page of help on standard output, and
+     exits without doing any recoding.
+
+`--version'
+     The program merely prints its version numbers on standard output,
+     and exits without doing anything else.
+
+   The BEFORE:AFTER argument specifies the start charset and the goal
+charset.  The allowable values for BEFORE or AFTER are described in the
+remainder of this document.  Charsets may have predefined alternate
+names, or aliases, which are equally acceptable.
+
+   In the BEFORE:AFTER argument only, a backslash may be used to quote
+the next character of a charset name.  This might be useful for
+preventing a colon to be mistakenly interpreted as the separator between
+BEFORE and AFTER.  Rather, the colon could be omitted, because while
+recognizing a charset name or alias, GNU `recode' ignores all
+characters besides letters and digits.  There is also no distinction
+between upper and lower case.  Charset names or aliases may always be
+abbreviated to any unambiguous prefix.
+
+   One or both of the BEFORE or AFTER keywords may be omitted, but the
+colon which separates them cannot.  An omitted keyword implies the
+usual or default code in usage on the system where this program is
+installed.  Usually, this default code is `Latin-1' for UNIX systems or
+`IBM-PC' for MS-DOS machines.
+
+\1f
+File: recode.info,  Node: Reversibility,  Next: RFC 1345 charsets,  Prev: Invoking recode,  Up: Top
+
+Reversibility issues
+********************
+
+   Even if GNU `recode' tries hard at keeping the recodings reversible,
+you should not develop an unconditional confidence in its ability to do
+so.  You *ought* to keep only reasonable expectations about reverse
+recodings.  In particular, consider:
+
+   * Most transformations are fully reversible for all inputs, but
+     loose this property whenever `-s' is specified.
+
+   * A few transformations are not meant to be reversible, by design.
+
+   * Reversibility sometimes depends on actual file contents and cannot
+     be ascertained beforehand, without reading the file.
+
+   * Reversibility is never absolute across successive versions of this
+     program.  Even correcting a small bug in a mapping could induce
+     slight discrepancies later.
+
+   * Reversibility is easily lost by merging.  This is best explained
+     through an example.  If you reversibly recode a file from charset
+     `A' to charset `B', then you reversibly recode the result from
+     charset `B' to charset `C', you cannot expect to recover the
+     original file by merely recoding from charset `C' directly to
+     charset `A'.  You will instead have to recode from charset `C'
+     back to charset `B', and only then from charset `B' to charset `A'.
+
+   * Faulty files create a particular problem.  Consider an example,
+     recoding from `IBM-PC' to `Latin-1'.  End of lines are represented
+     as `\r\n' in `IBM-PC' and as `\n' in `Latin-1'.  There is no way
+     by which a faulty `IBM-PC' file containing a `\n' not preceded by
+     `\r' be translated into a `Latin-1' file, and then back.
+
+   * There is another difficulty arising from code equivalences.  For
+     example, in a `LaTeX' charset file, the string `\^\i{}' could be
+     recoded back and forth through another charset and become
+     `\^{\i}'.  Even if the resulting file is equivalent to the
+     original one, it is not identical.
+
+   Unless option `-s' is used, `recode' automatically tries to fill
+mappings with invented correspondences, often making them fully
+reversible.  This filling is not made at random.  The algorithm tries to
+stick to the identity mapping and, when this is not possible, it prefers
+generating many small permutation cycles, each involving only a few
+codes.
+
+   For example, here is how IBM-PC code 186 gets translated to control-U
+in Latin-1.  Control-U is 21.  Code 21 is the IBM-PC section sign,
+which is 167 in Latin-1.  `recode' cannot reciprocate 167 to 21,
+because 167 is the masculine ordinal indicator on IBM PC's, which is
+186 in Latin-1.  Code 186 in IBM PC's has no Latin-1 equivalent; by
+assigning back to 21, `recode' closes this short permutation loop.
+
+   As a consequence of this map filling, `recode' may sometimes produce
+*funny* characters.  They may look annoying, they are nevertheless
+helpful when one changes his/her mind and wants to revert to the prior
+recoding.  If you cannot stand these, use option `-s', which asks for a
+very strict recoding.
+
+   This map filling sometimes has another surprising consequence.  In
+some cases, `recode' seems to copy a file without recoding it.  But in
+fact, it does.  As an illuminating example, consider you requested:
+
+     recode l1:us < File-Latin1 > File-ASCII
+     cmp File-Latin1 File-ASCII
+
+then `cmp' will not report any difference.  This is quite normal.
+Latin-1 gets correctly recoded to ASCII for charsets commonalities
+(which are the first 128 characters, in this case).  The remaining last
+128 Latin-1 characters have no ASCII correspondent.  Instead of loosing
+them, recode elects to map them to unspecified characters of ASCII, so
+making the recoding reversible.  The simplest way of achieving this is
+merely to keep those last 128 characters unchanged.  The overall effect
+is copying the file verbatim.
+
+   If you feel this behavior is too generous and if you do not wish to
+care about reversibility, simply use option `-s'.  By doing so,
+`recode' will strictly map only those Latin-1 characters which have an
+ASCII equivalent, and will merely drop those which do not.  Then, there
+is more chance that you will observe a difference between the input and
+the output file.
+
+\1f
+File: recode.info,  Node: RFC 1345 charsets,  Next: ISO charsets,  Prev: Reversibility,  Up: Top
+
+Charsets from RFC 1345
+**********************
+
+   In the GNU `recode' distribution, there is a copy of RFC 1345:
+
+     "Character Mnemonics & Character Sets", K. Simonsen, Request for
+     Comments no. 1345, Network Working Group, June 1992.
+
+   This document is also available by anonymous ftp at `nic.ddn.mil' in
+directory `rfc' as file `rfc1345.txt'.  This report defines many
+character mnemonics and character sets.
+
+   GNU `recode' implements most of RFC 1345, however:
+
+  1. It does not recognize 16-bits charsets: `GB_2312-80',
+     `JIS_C6226-1978', `JIS_C6226-1983', `JIS_X0212-1990' and
+     `KS_C_5601-1987'.
+
+  2. It does not recognize those charsets which combine two characters
+     for representing a third: `ANSI_X3.110-1983', `ISO_6937-2-add',
+     `T.101-G2', `T.61-8bit', `iso-ir-90' and `videotex-suppl'.
+
+  3. It interprets the charset `isoir91' as `NATS-DANO' (alias
+     `iso-ir-9-1'), *not* as `JIS_C6229-1984-a' (alias `iso-ir-91').
+     So better avoid using these two alias names.
+
+  4. It interprets the charset `isoir92' as `NATS-DANO-ADD' (alias
+     `iso-ir-9-2'), *not* as `JIS_C6229-1984-b' (alias `iso-ir-92').
+     So better avoid using these two alias names.
+
+  5. It ignores all about code overloading, but still processes
+     correctly the remainder of `dk-us' and `us-dk'.
+
+
+   Keld Simonsen `keld@dkuug.dk' did most of RFC 1345 himself, with
+some funding from Danish Standards and Nordic standards (INSTA) project.
+He also did the character set design work, with substantial input from
+Olle Jaernefors.  Keld typed in almost all of the tables, some have been
+contributed.  A number of people have checked the tables in various
+ways.  The RFC lists a number of people who helped.
+
+   Internally, RFC 1345 associates which each character an unambiguous
+mnemonic of (usually) one or two characters, taken from ISO 646, a
+minimal set of 83 characters.  The charset made up by these mnemonics is
+available in `recode' under the name `RFC 1345', with `.' being
+accepted as a short alias.
+
+   Even if the mnemonics are unambiguous taken separately, strings made
+up by concatenating these mnemonics are ambiguous and cannot be safely
+interpreted.  So `recode' only allows converting *to* RFC 1345, never
+from it.  However, special machinery in the program allows for
+converting *through* RFC 1345, when RFC 1345 is neither the initial nor
+the final charset of the conversion sequence.
+
+   Recoding directly to `.' has the main goal of letting the user
+examine foreign charsets.  We cannot do much, mechanically, with the
+result.  For increased readability, as a matter of convenience, `SP' is
+left as a single space and `LF' becomes a newline.
+
+`ANSI_X3.4-1968'
+     `ANSI_X3.4-1986', `ASCII', `IBM367', `ISO646-US',
+     `ISO_646.irv:1991', `US-ASCII', `cp367', `iso-ir-6' and `us' are
+     aliases for this charset.  source: ECMA registry
+
+`ASMO_449'
+     `ISO_9036', `arabic7' and `iso-ir-89' are aliases for this charset.
+     source: ECMA registry
+
+`BS_4730'
+     `ISO646-GB', `gb', `iso-ir-4' and `uk' are aliases for this
+     charset.  source: ECMA registry
+
+`BS_viewdata'
+     `iso-ir-47' is an alias for this charset.  source: ECMA registry
+
+`CSA_Z243.4-1985-1'
+     `ISO646-CA', `ca', `csa7-1' and `iso-ir-121' are aliases for this
+     charset.  source: ECMA registry
+
+`CSA_Z243.4-1985-2'
+     `ISO646-CA2', `csa7-2' and `iso-ir-122' are aliases for this
+     charset.  source: ECMA registry
+
+`CSA_Z243.4-1985-gr'
+     `iso-ir-123' is an alias for this charset.  source: ECMA registry
+
+`CSN_369103'
+     `iso-ir-139' is an alias for this charset.  source: ECMA registry
+
+`DEC-MCS'
+     `dec' is an alias for this charset.  VAX/VMS User's Manual, Order
+     Number: AI-Y517A-TE, April 1986.
+
+`DIN_66003'
+     `ISO646-DE', `de' and `iso-ir-21' are aliases for this charset.
+     source: ECMA registry
+
+`DS_2089'
+     `DS2089', `ISO646-DK' and `dk' are aliases for this charset.
+     source: Danish Standard, DS 2089, February 1974
+
+`EBCDIC-AT-DE'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-AT-DE-A'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-CA-FR'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-DK-NO'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-DK-NO-A'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-ES'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-ES-A'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-ES-S'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-FI-SE'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-FI-SE-A'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-FR'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-IT'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-PT'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-UK'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`EBCDIC-US'
+     source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+
+`ECMA-cyrillic'
+     `iso-ir-111' is an alias for this charset.  source: ECMA registry
+
+`ES'
+     `ISO646-ES' and `iso-ir-17' are aliases for this charset.  source:
+     ECMA registry
+
+`ES2'
+     `ISO646-ES2' and `iso-ir-85' are aliases for this charset.
+     source: ECMA registry
+
+`GB_1988-80'
+     `ISO646-CN', `cn' and `iso-ir-57' are aliases for this charset.
+     source: ECMA registry
+
+`GOST_19768-74'
+     `ST_SEV_358-88' and `iso-ir-153' are aliases for this charset.
+     source: ECMA registry
+
+`IBM037'
+     `cp037', `ebcdic-cp-ca', `ebcdic-cp-nl', `ebcdic-cp-us' and
+     `ebcdic-cp-wt' are aliases for this charset.  source: IBM NLS RM
+     Vol2 SE09-8002-01, March 1990
+
+`IBM038'
+     `EBCDIC-INT' and `cp038' are aliases for this charset.  source:
+     IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+`IBM1026'
+     `CP1026' is an alias for this charset.  source: IBM NLS RM Vol2
+     SE09-8002-01, March 1990
+
+`IBM273'
+     `CP273' is an alias for this charset.  source: IBM NLS RM Vol2
+     SE09-8002-01, March 1990
+
+`IBM274'
+     `CP274' and `EBCDIC-BE' are aliases for this charset.  source: IBM
+     3174 Character Set Ref, GA27-3831-02, March 1990
+
+`IBM275'
+     `EBCDIC-BR' and `cp275' are aliases for this charset.  source: IBM
+     NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM277'
+     `EBCDIC-CP-DK' and `EBCDIC-CP-NO' are aliases for this charset.
+     source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM278'
+     `CP278', `ebcdic-cp-fi' and `ebcdic-cp-se' are aliases for this
+     charset.  source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM280'
+     `CP280' and `ebcdic-cp-it' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM281'
+     `EBCDIC-JP-E' and `cp281' are aliases for this charset.  source:
+     IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+`IBM284'
+     `CP284' and `ebcdic-cp-es' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM285'
+     `CP285' and `ebcdic-cp-gb' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM290'
+     `EBCDIC-JP-kana' and `cp290' are aliases for this charset.
+     source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+`IBM297'
+     `cp297' and `ebcdic-cp-fr' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM420'
+     `cp420' and `ebcdic-cp-ar1' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990 IBM NLS RM p 11-11
+
+`IBM423'
+     `cp423' and `ebcdic-cp-gr' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM424'
+     `cp424' and `ebcdic-cp-he' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM437'
+     `437' and `cp437' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM500'
+     `CP500', `ebcdic-cp-be' and `ebcdic-cp-ch' are aliases for this
+     charset.  source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM850'
+     `850' and `cp850' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM851'
+     `851' and `cp851' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM852'
+     `852' and `cp852' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM855'
+     `855' and `cp855' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM857'
+     `857' and `cp857' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM860'
+     `860' and `cp860' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM861'
+     `861', `cp-is' and `cp861' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM862'
+     `862' and `cp862' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM863'
+     `863' and `cp863' are aliases for this charset.  source: IBM
+     Keyboard layouts and code pages, PN 07G4586 June 1991
+
+`IBM864'
+     `cp864' is an alias for this charset.  source: IBM Keyboard
+     layouts and code pages, PN 07G4586 June 1991
+
+`IBM865'
+     `865' and `cp865' are aliases for this charset.  source: IBM DOS
+     3.3 Ref (Abridged), 94X9575 (Feb 1987)
+
+`IBM868'
+     `CP868' and `cp-ar' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM869'
+     `869', `cp-gr' and `cp869' are aliases for this charset.  source:
+     IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+
+`IBM870'
+     `CP870', `ebcdic-cp-roece' and `ebcdic-cp-yu' are aliases for this
+     charset.  source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM871'
+     `CP871' and `ebcdic-cp-is' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM880'
+     `EBCDIC-Cyrillic' and `cp880' are aliases for this charset.
+     source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IBM891'
+     `cp891' is an alias for this charset.  source: IBM NLS RM Vol2
+     SE09-8002-01, March 1990
+
+`IBM903'
+     `cp903' is an alias for this charset.  source: IBM NLS RM Vol2
+     SE09-8002-01, March 1990
+
+`IBM904'
+     `904' and `cp904' are aliases for this charset.  source: IBM NLS
+     RM Vol2 SE09-8002-01, March 1990
+
+`IBM905'
+     `CP905' and `ebcdic-cp-tr' are aliases for this charset.  source:
+     IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+
+`IBM918'
+     `CP918' and `ebcdic-cp-ar2' are aliases for this charset.  source:
+     IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+`IEC_P27-1'
+     `iso-ir-143' is an alias for this charset.  source: ECMA registry
+
+`INIS'
+     `iso-ir-49' is an alias for this charset.  source: ECMA registry
+
+`INIS-8'
+     `iso-ir-50' is an alias for this charset.  source: ECMA registry
+
+`INIS-cyrillic'
+     `iso-ir-51' is an alias for this charset.  source: ECMA registry
+
+`INVARIANT'
+`ISO_10367-box'
+     `iso-ir-155' is an alias for this charset.  source: ECMA registry
+
+`ISO_2033-1983'
+     `e13b' and `iso-ir-98' are aliases for this charset.  source: ECMA
+     registry
+
+`ISO_5427'
+     `iso-ir-37' is an alias for this charset.  source: ECMA registry
+
+`ISO_5427:1981'
+     `iso-ir-54' is an alias for this charset.  source: ECMA registry
+
+`ISO_5428:1980'
+     `iso-ir-55' is an alias for this charset.  source: ECMA registry
+
+`ISO_646.basic:1983'
+     `ref' is an alias for this charset.  source: ECMA registry
+
+`ISO_646.irv:1983'
+     `irv' and `iso-ir-2' are aliases for this charset.  source: ECMA
+     registry
+
+`ISO_6937-2-25'
+     `iso-ir-152' is an alias for this charset.  source: ECMA registry
+
+`ISO_8859-1:1987'
+     `CP819', `IBM819', `ISO-8859-1', `ISO_8859-1', `iso-ir-100', `l1'
+     and `latin1' are aliases for this charset.  source: ECMA registry
+
+`ISO_8859-2:1987'
+     `ISO-8859-2', `ISO_8859-2', `iso-ir-101', `l2' and `latin2' are
+     aliases for this charset.  source: ECMA registry
+
+`ISO_8859-3:1988'
+     `ISO-8859-3', `ISO_8859-3', `iso-ir-109', `l3' and `latin3' are
+     aliases for this charset.  source: ECMA registry
+
+`ISO_8859-4:1988'
+     `ISO-8859-4', `ISO_8859-4', `iso-ir-110', `l4' and `latin4' are
+     aliases for this charset.  source: ECMA registry
+
+`ISO_8859-5:1988'
+     `ISO-8859-5', `ISO_8859-5', `cyrillic' and `iso-ir-144' are
+     aliases for this charset.  source: ECMA registry
+
+`ISO_8859-6:1987'
+     `ASMO-708', `ECMA-114', `ISO-8859-6', `ISO_8859-6', `arabic' and
+     `iso-ir-127' are aliases for this charset.  source: ECMA registry
+
+`ISO_8859-7:1987'
+     `ECMA-118', `ELOT_928', `ISO-8859-7', `ISO_8859-7', `greek',
+     `greek8' and `iso-ir-126' are aliases for this charset.  source:
+     ECMA registry
+
+`ISO_8859-8:1988'
+     `ISO-8859-8', `ISO_8859-8', `hebrew' and `iso-ir-138' are aliases
+     for this charset.  source: ECMA registry
+
+`ISO_8859-9:1989'
+     `ISO-8859-9', `ISO_8859-9', `iso-ir-148', `l5' and `latin5' are
+     aliases for this charset.  source: ECMA registry
+
+`ISO_8859-supp'
+     `iso-ir-154' and `latin1-2-5' are aliases for this charset.
+     source: ECMA registry
+
+`IT'
+     `ISO646-IT' and `iso-ir-15' are aliases for this charset.  source:
+     ECMA registry
+
+`JIS_C6220-1969-jp'
+     `JIS_C6220-1969', `iso-ir-13', `katakana' and `x0201-7' are
+     aliases for this charset.  source: ECMA registry
+
+`JIS_C6220-1969-ro'
+     `ISO646-JP', `iso-ir-14' and `jp' are aliases for this charset.
+     source: ECMA registry
+
+`JIS_C6229-1984-a'
+     `jp-ocr-a' is an alias for this charset.  source: ECMA registry
+
+`JIS_C6229-1984-b'
+     `ISO646-JP-OCR-B' and `jp-ocr-b' are aliases for this charset.
+     source: ECMA registry
+
+`JIS_C6229-1984-b-add'
+     `iso-ir-93' and `jp-ocr-b-add' are aliases for this charset.
+     source: ECMA registry
+
+`JIS_C6229-1984-hand'
+     `iso-ir-94' and `jp-ocr-hand' are aliases for this charset.
+     source: ECMA registry
+
+`JIS_C6229-1984-hand-add'
+     `iso-ir-95' and `jp-ocr-hand-add' are aliases for this charset.
+     source: ECMA registry
+
+`JIS_C6229-1984-kana'
+     `iso-ir-96' is an alias for this charset.  source: ECMA registry
+
+`JIS_X0201'
+     `X0201' is an alias for this charset.
+
+`JUS_I.B1.002'
+     `ISO646-YU', `iso-ir-141', `js' and `yu' are aliases for this
+     charset.  source: ECMA registry
+
+`JUS_I.B1.003-mac'
+     `iso-ir-147' and `macedonian' are aliases for this charset.
+     source: ECMA registry
+
+`JUS_I.B1.003-serb'
+     `iso-ir-146' and `serbian' are aliases for this charset.  source:
+     ECMA registry
+
+`KSC5636'
+     `ISO646-KR' is an alias for this charset.
+
+`Latin-greek-1'
+     `iso-ir-27' is an alias for this charset.  source: ECMA registry
+
+`MSZ_7795.3'
+     `ISO646-HU', `hu' and `iso-ir-86' are aliases for this charset.
+     source: ECMA registry
+
+`NATS-DANO'
+     `iso-ir-9-1' is an alias for this charset.  source: ECMA registry
+
+`NATS-DANO-ADD'
+     `iso-ir-9-2' is an alias for this charset.  source: ECMA registry
+
+`NATS-SEFI'
+     `iso-ir-8-1' is an alias for this charset.  source: ECMA registry
+
+`NATS-SEFI-ADD'
+     `iso-ir-8-2' is an alias for this charset.  source: ECMA registry
+
+`NC_NC00-10:81'
+     `ISO646-CU', `cuba' and `iso-ir-151' are aliases for this charset.
+     source: ECMA registry
+
+`NF_Z_62-010'
+     `ISO646-FR', `fr' and `iso-ir-69' are aliases for this charset.
+     source: ECMA registry
+
+`NF_Z_62-010_(1973)'
+     `ISO646-FR1' and `iso-ir-25' are aliases for this charset.
+     source: ECMA registry
+
+`NS_4551-1'
+     `ISO646-NO', `iso-ir-60' and `no' are aliases for this charset.
+     source: ECMA registry
+
+`NS_4551-2'
+     `ISO646-NO2', `iso-ir-61' and `no2' are aliases for this charset.
+     source: ECMA registry
+
+`PT'
+     `ISO646-PT' and `iso-ir-16' are aliases for this charset.  source:
+     ECMA registry
+
+`PT2'
+     `ISO646-PT2' and `iso-ir-84' are aliases for this charset.
+     source: ECMA registry
+
+`SEN_850200_B'
+     `FI', `ISO646-FI', `ISO646-SE', `iso-ir-10' and `se' are aliases
+     for this charset.  source: ECMA registry
+
+`SEN_850200_C'
+     `ISO646-SE2', `iso-ir-11' and `se2' are aliases for this charset.
+     source: ECMA registry
+
+`T.61-7bit'
+     `iso-ir-102' is an alias for this charset.  source: ECMA registry
+
+`dk-us'
+`greek-ccitt'
+     `iso-ir-150' is an alias for this charset.  source: ECMA registry
+
+`greek7'
+     `iso-ir-88' is an alias for this charset.  source: ECMA registry
+
+`greek7-old'
+     `iso-ir-18' is an alias for this charset.  source: ECMA registry
+
+`hp-roman8'
+     `r8' and `roman8' are aliases for this charset.  source: LaserJet
+     IIP Printer User's Manual, HP part no 33471-90901, Hewlet-Packard,
+     June 1989.
+
+`latin-greek'
+     `iso-ir-19' is an alias for this charset.  source: ECMA registry
+
+`latin-lap'
+     `iso-ir-158' and `lap' are aliases for this charset.  source: ECMA
+     registry
+
+`latin6'
+     `iso-ir-157' and `l6' are aliases for this charset.  source: ECMA
+     registry
+
+`macintosh'
+     `mac' is an alias for this charset.  source: The Unicode Standard
+     ver1.0, ISBN 0-201-56788-1, Oct 1991
+
+`us-dk'
+     for compatibility with ASCII
+
+\1f
+File: recode.info,  Node: ISO charsets,  Next: IBM charsets,  Prev: RFC 1345 charsets,  Up: Top
+
+Charsets based on ASCII
+***********************
+
+* Menu:
+
+* ASCII::               Usual ASCII
+* ISO 8859-1 charset::  ASCII extended by Latin Alphabets
+* ASCII-BS::            ASCII 7-bits, BS to overstrike
+* flat::                ASCII without diacritics nor underline
+
+\1f
+File: recode.info,  Node: ASCII,  Next: ISO 8859-1 charset,  Prev: ISO charsets,  Up: ISO charsets
+
+Usual ASCII
+===========
+
+   This charset is available in `recode' under the name `ASCII'.  In
+fact, it's true name is `ANSI_X3.4-1968' as per RFC 1345, accepted
+aliases being `ANSI_X3.4-1986', `ASCII', `IBM367', `ISO646-US',
+`ISO_646.irv:1991', `US-ASCII', `cp367', `iso-ir-6' and `us'.  The
+shortest way of specifying it in `recode' is `us'.
+
+   This documentation used to include ASCII tables.  They have been
+removed since `recode' can now recreate these (and a lot of others)
+easily:
+
+     recode -lf us                   for commented ASCII
+     recode -ld us                   for concise decimal table
+     recode -lo us                   for concise octal table
+     recode -lh us                   for concise hexadecimal table
+
+\1f
+File: recode.info,  Node: ISO 8859-1 charset,  Next: ASCII-BS,  Prev: ASCII,  Up: ISO charsets
+
+ASCII extended by Latin Alphabets
+=================================
+
+   This charset is available in `recode' under the name `Latin-1'.  In
+fact, it's true name is `ISO_8859-1:1987' as per RFC 1345, accepted
+aliases being `CP819', `IBM819', `ISO-8859-1', `ISO_8859-1',
+`iso-ir-100', `l1' and `Latin-1'.  The shortest way of specifying it in
+`recode' is `l1'.
+
+   This charset corresponds to the ISO Latin Alphabet 1.  It is an
+eight-bit code which coincides with ASCII for the lower half.
+
+   This documentation used to include Latin-1 tables.  They have been
+removed since `recode' can now recreate these (and a lot of others)
+easily:
+
+     recode -lf l1                   for commented ISO Latin-1
+     recode -ld l1                   for concise decimal table
+     recode -lo l1                   for concise octal table
+     recode -lh l1                   for concise hexadecimal table
+
+   The following from `lasko@video.dec.com' (Tim Lasko), with no date.
+
+     ISO Latin-1, or more completely ISO Latin Alphabet No 1, is now an
+     international standard as of February 1987 (IS 8859, Part 1).  For
+     those American USEnet'rs that care, the 8-bit ASCII standard,
+     which is essentially the same code, is going through the final
+     administrative processes prior to publication.
+
+     ISO Latin-1 (IS 8859/1) is actually one of an entire family of
+     eight-bit one-byte character sets, all having ASCII on the left
+     hand side, and with varying repertoires on the right hand side:
+
+  1. Latin Alphabet No 1 (caters to Western Europe - now approved).
+
+  2. Latin Alphabet No 2 (caters to Eastern Europe - now approved).
+
+  3. Latin Alphabet No 3 (caters to SE Europe + others - in draft
+     ballot).
+
+  4. Latin Alphabet No 4 (caters to Northern Europe - in draft ballot).
+
+  5. Latin-Cyrillic alphabet (right half all Cyrillic - processing
+     currently suspended pending USSR input).
+
+  6. Latin-Arabic alphabet (right half all Arabic - now approved).
+
+  7. Latin-Greek alphabet (right half Greek + symbols - in draft
+     ballot).
+
+  8. Latin-Hebrew alphabet (right half Hebrew + symbols - proposed).
+
+\1f
+File: recode.info,  Node: ASCII-BS,  Next: flat,  Prev: ISO 8859-1 charset,  Up: ISO charsets
+
+ASCII 7-bits, BS to overstrike
+==============================
+
+   This charset is available in `recode' under the name `ASCII-BS',
+with `BS' as an acceptable alias.
+
+   The file is straight ASCII, seven bits only.  According to the
+definition of ASCII: diacritics are applied by a sequence of three
+characters: the letter, one BS, the diacritic mark.  We deviate
+slightly from this by exchanging the diacritic mark and the letter so,
+on a screen device, the diacritic will disappear and let the letter
+alone.  At recognition time, both methods are acceptable.
+
+   The French quotes are coded by the sequences: `< BS "' or `" BS <'
+for the opening quote and `> BS "' or `" BS >' for the closing quote.
+This artificial convention was inherited in straight `ASCII-BS' from
+habits around `Bang-Bang' entry, and is not well known.  But we decided
+to stick to it so that `ASCII-BS' charset will not loose French quotes.
+
+   The `ASCII-BS' charset is independent of `ASCII', and different.
+The following examples demonstrate this, knowing at advance that `!2'
+is the `Bang-Bang' way of representing an `e' with an acute accent.
+Compare:
+
+     % echo \!2 | recode -v bang:us | od -bc
+     Bang-Bang -> ISO_8859-1:1987 -> RFC 1345 -> ANSI_X3.4-1968 (many to one)
+     Simplified to: Bang-Bang -> ISO_8859-1:1987 -> ANSI_X3.4-1968 (many to one)
+     0000000 351 012
+             351  \n
+     0000002
+
+with:
+
+     % echo \!2 | recode -v bang:bs | od -bc
+     Bang-Bang -> ISO_8859-1:1987 -> ASCII-BS (many to many)
+     0000000 047 010 145 012
+               '  \b   e  \n
+     0000004
+
+   In the first case, the `e' with an acute accent is merely
+transmitted by the `Latin-1:ASCII' mapping, not having a special
+recoding rule for it.  In the `Latin-1:ASCII-BS' case, the acute accent
+is applied over the `e' with a backspace: diacriticized characters have
+special rules.  For the `ASCII-BS' charset, reversibility is still
+possible, but there might be difficult cases.
+
+\1f
+File: recode.info,  Node: flat,  Prev: ASCII-BS,  Up: ISO charsets
+
+ASCII without diacritics nor underline
+======================================
+
+   This charset is available in `recode' under the name `flat'.
+
+   This code is ASCII expunged of all diacritics and underlines, as
+long as they are applied using three character sequences, with BS in the
+middle.  Also, despite slightly unrelated, each control character is
+represented by a sequence of two or three graphic characters.  The
+newline character, however, keeps its functionality and is not
+represented.
+
+   Note that charset `flat' is a terminal charset.  We can convert *to*
+`flat', but not *from* it.
+
+\1f
+File: recode.info,  Node: IBM charsets,  Next: CDC charsets,  Prev: ISO charsets,  Up: Top
+
+Charsets based on IBM
+*********************
+
+* Menu:
+
+* EBCDIC::              EBCDIC codes
+* IBM-PC::              IBM's PC code
+* Icon-QNX::            Unisys' ICON code
+
+\1f
+File: recode.info,  Node: EBCDIC,  Next: IBM-PC,  Prev: IBM charsets,  Up: IBM charsets
+
+EBCDIC code
+===========
+
+   This charset is the IBM's external binary coded decimal for
+interchange coding.  This is an eight bits code.  The following three
+variants were implemented in GNU `recode' independently of RFC 1345:
+
+`EBCDIC'
+     GNU `recode' `us:ebcdic' conversion is identical to GNU `dd'
+     `ebcdic' conversion, and `recode' `ebcdic:us' conversion is
+     identical to GNU `dd' `ascii' conversion.  This charset also
+     represents the way Control Data Corporation relates EBCDIC to
+     8-bits ASCII.
+
+`EBCDIC-CCC'
+     GNU `recode' `us:ebcdic-ccc' or `ebcdic-ccc:us' conversions
+     represent the way Concurrent Computer Corporation (formerly Perkin
+     Elmer) relates EBCDIC to 8-bits ASCII.
+
+`EBCDIC-IBM'
+     GNU `recode' `us:ebcdic-ibm' conversion is *almost* identical to
+     GNU `dd' `ibm' conversion.  Given the exact `dd' `ibm' conversion
+     table, `recode' once said:
+
+          Codes  91 and 213 both recode to 173
+          Codes  93 and 229 both recode to 189
+          No character recodes to  74
+          No character recodes to 106
+
+     So I arbitrarily chose to recode 213 by 74 and 229 by 106.  This
+     makes the `EBCDIC-IBM' recoding reversible, but this is not
+     necessarily the best correction.  In any case, I believe GNU `dd'
+     should be corrected, and preferably, GNU `dd' and GNU `recode'
+     should agree on the same correction.  So, this table may change
+     once again.
+
+   RFC 1345 brings in `recode' 15 other EBCDIC charsets, and 21 other
+charsets having EBCDIC in at least one of their alias names.  You can
+get a list of all these by executing:
+
+     recode -l | grep ebcdic
+
+\1f
+File: recode.info,  Node: IBM-PC,  Next: Icon-QNX,  Prev: EBCDIC,  Up: IBM charsets
+
+IBM's PC code
+=============
+
+   This charset is available in `recode' under the name `IBM-PC'.
+There are a few discrepancies between this charset and the very similar
+RFC 1345 charset `ibm437', which have not been analyzed yet, so the
+charsets are being kept separate for now.  This might change in the
+future.
+
+   The file was obtained or is aimed towards a PC microcomputer from
+IBM or any compatible.  This is an eight-bit code.
+
+\1f
+File: recode.info,  Node: Icon-QNX,  Prev: IBM-PC,  Up: IBM charsets
+
+Unisys' ICON code
+=================
+
+   This charset is available in `recode' under the name `Icon-QNX',
+with `QNX' as an acceptable alias.
+
+   The file is using Unisys' Icon way to represent diacritics with code
+25 escape sequences, under the system QNX.  This is a seven-bit code,
+even if eight-bit codes can flow through as part of IBM-PC charset.
+
+\1f
+File: recode.info,  Node: CDC charsets,  Next: Micro charsets,  Prev: IBM charsets,  Up: Top
+
+Charsets based on CDC
+*********************
+
+* Menu:
+
+* Display Code::        Control Data's Display Code
+* CDC-NOS::             ASCII 6/12 from NOS
+* Bang-Bang::           ASCII "bang bang"
+
+\1f
+File: recode.info,  Node: Display Code,  Next: CDC-NOS,  Prev: CDC charsets,  Up: CDC charsets
+
+Control Data's Display Code
+===========================
+
+   This code is not available in `recode', but repeated here for
+reference.  This is a 6-bit code used on CDC mainframes.
+
+     Octal display code to graphic       Octal display code to octal ASCII
+     
+     00  :    20  P    40  5   60  #     00 072  20 120  40 065  60 043
+     01  A    21  Q    41  6   61  [     01 101  21 121  41 066  61 133
+     02  B    22  R    42  7   62  ]     02 102  22 122  42 067  62 135
+     03  C    23  S    43  8   63  %     03 103  23 123  43 070  63 045
+     04  D    24  T    44  9   64  "     04 104  24 124  44 071  64 042
+     05  E    25  U    45  +   65  _     05 105  25 125  45 053  65 137
+     06  F    26  V    46  -   66  !     06 106  26 126  46 055  66 041
+     07  G    27  W    47  *   67  &     07 107  27 127  47 052  67 046
+     10  H    30  X    50  /   70  '     10 110  30 130  50 057  70 047
+     11  I    31  Y    51  (   71  ?     11 111  31 131  51 050  71 077
+     12  J    32  Z    52  )   72  <     12 112  32 132  52 051  72 074
+     13  K    33  0    53  $   73  >     13 113  33 060  53 044  73 076
+     14  L    34  1    54  =   74  @     14 114  34 061  54 075  74 100
+     15  M    35  2    55      75  \     15 115  35 062  55 040  75 134
+     16  N    36  3    56  ,   76  ^     16 116  36 063  56 054  76 136
+     17  O    37  4    57  .   77  ;     17 117  37 064  57 056  77 073
+
+\1f
+File: recode.info,  Node: CDC-NOS,  Next: Bang-Bang,  Prev: Display Code,  Up: CDC charsets
+
+ASCII 6/12 from NOS
+===================
+
+   This charset is available in `recode' under the name `CDC-NOS', with
+`NOS' as an acceptable alias.
+
+   This is one of the charset in use on CDC Cyber NOS systems to
+represent ASCII, sometimes named "NOS 6/12" code for coding ASCII.
+This code is also known as "caret ASCII".  It is based on a six bits
+character set in which small letters and control characters are coded
+using a `^' escape and, sometimes, a `@' escape.
+
+   The routines given here presume that the six bits code is already
+expressed in ASCII by the communication channel, with embedded ASCII
+`^' and `@' escapes.
+
+   Here is a table showing which characters are being used to encode
+each ASCII character.
+
+     000  ^5  020  ^#  040     060  0  100 @A  120  P  140  @G  160  ^P
+     001  ^6  021  ^[  041  !  061  1  101  A  121  Q  141  ^A  161  ^Q
+     002  ^7  022  ^]  042  "  062  2  102  B  122  R  142  ^B  162  ^R
+     003  ^8  023  ^%  043  #  063  3  103  C  123  S  143  ^C  163  ^S
+     004  ^9  024  ^"  044  $  064  4  104  D  124  T  144  ^D  164  ^T
+     005  ^+  025  ^_  045  %  065  5  105  E  125  U  145  ^E  165  ^U
+     006  ^-  026  ^!  046  &  066  6  106  F  126  V  146  ^F  166  ^V
+     007  ^*  027  ^&  047  '  067  7  107  G  127  W  147  ^G  167  ^W
+     010  ^/  030  ^'  050  (  070  8  110  H  130  X  150  ^H  170  ^X
+     011  ^(  031  ^?  051  )  071  9  111  I  131  Y  151  ^I  171  ^Y
+     012  ^)  032  ^<  052  *  072 @D  112  J  132  Z  152  ^J  172  ^Z
+     013  ^$  033  ^>  053  +  073  ;  113  K  133  [  153  ^K  173  ^0
+     014  ^=  034  ^@  054  ,  074  <  114  L  134  \  154  ^L  174  ^1
+     015  ^   035  ^\  055  -  075  =  115  M  135  ]  155  ^M  175  ^2
+     016  ^,  036  ^^  056  .  076  >  116  N  136 @B  156  ^N  176  ^3
+     017  ^.  037  ^;  057  /  077  ?  117  O  137  _  157  ^O  177  ^4
+
+\1f
+File: recode.info,  Node: Bang-Bang,  Prev: CDC-NOS,  Up: CDC charsets
+
+ASCII "bang bang"
+=================
+
+   This charset is available in `recode' under the name `Bang-Bang'.
+
+   This is the local code in use on Cybers at Universite de Montreal,
+which grave and serious people there prefer to name "ASCII code
+display".  This code is also known as "Bang-bang".  It is based on a
+six bits character set in which capitals, French diacritics and a few
+others are coded using an `!' escape followed by a single character, and
+control characters using a double `!' escape followed by a single
+character.
+
+   The routines given here presume that the six bits code is already
+expressed in ASCII by the communication channel, with embedded ASCII `!'
+escapes.
+
+   Here is a table showing which characters are being used to encode
+each ASCII character.
+
+     000 !!@  020 !!P  040    060 0  100 @   120 !P  140 !@ 160 P
+     001 !!A  021 !!Q  041 !" 061 1  101 !A  121 !Q  141 A  161 Q
+     002 !!B  022 !!R  042 "  062 2  102 !B  122 !R  142 B  162 R
+     003 !!C  023 !!S  043 #  063 3  103 !C  123 !S  143 C  163 S
+     004 !!D  024 !!T  044 $  064 4  104 !D  124 !T  144 D  164 T
+     005 !!E  025 !!U  045 %  065 5  105 !E  125 !U  145 E  165 U
+     006 !!F  026 !!V  046 &  066 6  106 !F  126 !V  146 F  166 V
+     007 !!G  027 !!W  047 '  067 7  107 !G  127 !W  147 G  167 W
+     010 !!H  030 !!X  050 (  070 8  110 !H  130 !X  150 H  170 X
+     011 !!I  031 !!Y  051 )  071 9  111 !I  131 !Y  151 I  171 Y
+     012 !!J  032 !!Z  052 *  072 :  112 !J  132 !Z  152 J  172 Z
+     013 !!K  033 !![  053 +  073 ;  113 !K  133 [   153 K  173 ![
+     014 !!L  034 !!\  054 ,  074 <  114 !L  134 \   154 L  174 !\
+     015 !!M  035 !!]  055 -  075 =  115 !M  135 ]   155 M  175 !]
+     016 !!N  036 !!^  056 .  076 >  116 !N  136 ^   156 N  176 !^
+     017 !!O  037 !!_  057 /  077 ?  117 !O  137 _   157 O  177 !_
+
+\1f
+File: recode.info,  Node: Micro charsets,  Next: Other charsets,  Prev: CDC charsets,  Up: Top
+
+Non-IBM micro-computer charsets
+*******************************
+
+* Menu:
+
+* Apple-Mac::           Apple's Macintosh code
+* AtariST::             Atari ST code
+* NeXT::                NeXT international code
+
+\1f
+File: recode.info,  Node: Apple-Mac,  Next: AtariST,  Prev: Micro charsets,  Up: Micro charsets
+
+Apple's Macintosh code
+======================
+
+   This charset is available in `recode' under the name `Apple-Mac'.
+There are a few discrepancies between this charset and the very similar
+RFC 1345 charset `macintosh', which have not been analyzed yet, so the
+charsets are being kept separate for now.  This might change in the
+future.
+
+   The file has been obtained or is aimed to a Macintosh micro-computer
+from Apple.  This is an eight bit code.  The file is the data fork only.
+
+\1f
+File: recode.info,  Node: AtariST,  Next: NeXT,  Prev: Apple-Mac,  Up: Micro charsets
+
+Atari ST code
+=============
+
+   This charset is available in `recode' under the name `AtariST'.
+
+   This is the character set used on the Atari ST/TT/Falcon.  This is
+similar to `IBM-PC', but differs in some details (includes some more
+accented characters, the graphic characters are mostly replaced by
+hebrew characters, and there is a true German sharp s different from
+Greek beta).
+
+   About the end-of-line conversions: the canonical end-of-line on the
+Atari is `\r\n', but unlike `IBM-PC', the OS makes no difference
+between text and binary input/output; it is up to the application how
+to interpret the data.  In fact, most of the libraries that come with
+compilers can grok both `\r\n' and `\n' as end of lines.  Many of the
+users who also have access to Unix systems prefer `\n' to ease porting
+Unix utilities.  So, for easing reversibility, `recode' tries to let
+`\r' undisturbed through recodings.
+
+\1f
+File: recode.info,  Node: NeXT,  Prev: AtariST,  Up: Micro charsets
+
+NeXT international code
+=======================
+
+   This charset is available in `recode' under the name `NeXT'.
+
+   The NeXT encoding is an extension to the ISO Latin-1 ASCII encoding
+used by NeXT under the system NeXTSTEP.  It is identical to Latin-1 for
+the positions 0-127.  In the position 128-255, NeXT added some chars and
+shuffled them around a little bit (for some unknown reason).
+
+\1f
+File: recode.info,  Node: Other charsets,  Next: Internals,  Prev: Micro charsets,  Up: Top
+
+Some other charsets
+*******************
+
+   Even if these charsets were originally added to `recode' for
+handling texts written in French, they find other uses.  We did use them
+lot for writing French diacriticized texts in the past, so `recode'
+knows how to handle these particularly well for French texts.
+
+* Menu:
+
+* LaTeX::               ASCII with LaTeX codes
+* Texte::               ASCII with easy French conventions
+* HTML::                World Wide Web representations
+
+\1f
+File: recode.info,  Node: LaTeX,  Next: Texte,  Prev: Other charsets,  Up: Other charsets
+
+ASCII with LaTeX codes
+======================
+
+   This charset is available in `recode' under the name `LaTeX' and has
+`ltex' as an alias.  It is used for ASCII files coded to be read by
+LaTeX or, in certain cases, by TeX.
+
+   Whenever you recode from another charset to `LaTeX', beware that all
+occurrences of backslashes `\' are usually translated into the string
+`\backslash{}'.  However, in practice, people often use backslashes in
+the other charset for introducing TeX commands, compromising it: it is
+not pure TeX, nor it is pure other charset.  This translation of
+backslashes into `\backslash{}' can be rather inconvenient, it may be
+inhibited through the command option `-d'.
+
+\1f
+File: recode.info,  Node: Texte,  Next: HTML,  Prev: LaTeX,  Up: Other charsets
+
+ASCII with easy French conventions
+==================================
+
+   This charset is available in `recode' under the name `Texte' and has
+`txte' for an alias.
+
+   This charset is a seven bits code, identical to `ASCII-BS', save for
+French diacritics which are noted using a slightly different convention.
+
+   At text entry time, these conventions provide a little speed up.  At
+read time, they slightly improve the readability over a few alternate
+ways of coding diacritics.  Of course, it would better to have a
+specialized keyboard to make direct eight bits entries and fonts for
+immediately displaying eight bit ISO Latin-1 characters.  But not
+everybody is so fortunate.  In several mailing environments, the eight
+bit is often willingfully destroyed.
+
+   Easy French has been in use in France for a while.  I only slightly
+adapted it (the diaeresis option) to make it more comfortable to several
+usages in Qu'ebec originating from Universit'e de Montr'eal.  In fact,
+the main problem for me was not to necessarily to invent Easy French,
+but to recognize the "best" convention to use, (best is not being
+defined, here) and to try to solve the main pitfalls associated with
+the selected convention.
+
+* Menu:
+
+* Diacritics::          Diacritics
+* Ending diaeresis::    List of words ending with diaeresis
+
+\1f
+File: recode.info,  Node: Diacritics,  Next: Ending diaeresis,  Prev: Texte,  Up: Texte
+
+Diacritics
+----------
+
+   French quotes (sometimes called "angle quotes") are noted the same
+way English quotes are noted in TeX, *id est* by ```' and `'''.
+
+   No effort has been put to preserve Latin ligatures (`ae', `oe')
+which are representable in several other charsets.  So, these ligatures
+may be lost through Easy French conventions.
+
+   This is almost the French convention for simplified diacritics entry:
+
+`e''
+     Acute accent
+
+`e`'
+     Grave accent
+
+`e^'
+     Circumflex accent
+
+`e"'
+     Diaeresis
+
+`c,'
+     Cedilla
+
+   In some countries, `:' is used instead of `"' to mark diaeresis.
+`recode' support one convention on a single call, depending on the `-c'
+option of the `recode' command.
+
+   The convention is prone to loosing information, because the diacritic
+meaning overloads some characters that already have other uses.  To
+alleviate this, some knowledge of the French language is boosted into
+the recognition routines.  So, the following subtleties are
+systematically obeyed by the various recognizers.
+
+   * A single quote which follows a `e' does not necessarily means an
+     acute accent if it is followed by a single other one.  For example:
+
+    `e''
+          will give an `e' with an acute accent.
+
+    `e'''
+          will give a simple `e', with a closing quotation mark.
+
+    `e''''
+          will give an `e' with an acute accent, followed by a closing
+          quotation mark.
+
+     There is a problem induced by this convention if there are English
+     quotations with a French text.  In sentences like:
+
+          There's a meeting at Archie's restaurant.
+
+     the single quotes will be mistaken twice for acute accents.  So
+     English contractions and suffix possessives could be mangled.
+
+   * A double quote or colon, depending on `-c' option, which follows a
+     vowel is interpreted as diaeresis only if it is followed by another
+     letter.  But there are in French several words that *end* with a
+     diaeresis, the program also recognizes them.  *Note Ending
+     diaeresis::, for a study of all the problematic cases.
+
+   * A comma which follows a `c' is interpreted as a cedilla only if it
+     is followed by one of the vowels `a', `o' and `u'.
+
+\1f
+File: recode.info,  Node: Ending diaeresis,  Prev: Diacritics,  Up: Texte
+
+List of words ending with diaeresis
+-----------------------------------
+
+   Here is a classification of all cases of a diaeresis at the end of a
+French word:
+
+   * Words ending in "igue"
+
+        - Feminine words without a relative masculine: `besaigue"' and
+          `cigue"'.
+
+        - Feminine words with a relative masculine (1): `aigue"',
+          `ambigue"', `contigue"', `exigue"', `subaigue"' and
+          `suraigue"'.
+
+   * Words not ending in "igue"
+
+        - Ended by "i" (2): `ai"', `congai"', `goi"', `hai"kai"',
+          `inoui"', `sai"', `samurai"', `thai"' and `tokai"'.
+
+        - Ended by "e": `canoe"'.
+
+        - Ended by "u" (3): `Esau"'.
+
+   Notes:
+
+  1. There are supposed to be seven words in this case.  So, one is
+     missing.
+
+  2. Look at one of the following sentences (the second has to be
+     interpreted with the `-c' option):
+
+          "Ai"e!  Voici le proble`me que j'ai"
+          Ai:e!  Voici le proble`me que j'ai:
+
+     There is an ambiguity between an `ai"', the small animal, and the
+     indicative future of *avoir* (first person singular), when followed
+     by what could be a diaeresis mark.  Hopefully, the case is solved
+     by the fact that an apostrophe always precedes the verb and almost
+     never the animal.
+
+  3. I did not pay attention to proper nouns, but this one showed up as
+     being fairly evident.
+
+
+   Just to complete this topic, note that it would be wrong to make a
+rule for all words ending in "igue" as needing a diaerisis.  Here are
+counter-examples: `becfigue', `be`sigue', `bigue', `bordigue',
+`bourdigue', `brigue', `contre-digue', `digue', `d'intrigue',
+`fatigue', `figue', `garrigue', `gigue', `igue', `intrigue', `ligue',
+`prodigue', `sarigue' and `zigue'.
+
+\1f
+File: recode.info,  Node: HTML,  Prev: Texte,  Up: Other charsets
+
+World Wide Web representations
+==============================
+
+   This charset is available in `recode' under the name `HTML' and has
+`w3' and `WWW' for aliases.
+
+   HTML texts used by World Wide Web limit themselves to 7-bit
+characters internally, special sequences beginning with an ampersand
+`&' and ending with a semicolon `;' are used for representing characters
+from Latin-1 having the 8th bit set.
+
+   When you recode from another charset to `HTML', beware that all
+occurrences of ampersands are usually translated into the string
+`&amp;', similarly, left angle brackets `<' are translated into `&lt;'
+and right angle brackets `>' are translated into `&gt;'.  However, in
+practice, people often use ampersands and angle brackets in the other
+charset for introducing HTML commands, compromising it: it is not pure
+HTML, not it is pure other charset.  These three translations can be
+rather inconvenient, they may be specifically inhibited through the
+command option `-d'.
+
+\1f
+File: recode.info,  Node: Internals,  Prev: Other charsets,  Up: Top
+
+Internal aspects
+****************
+
+   Suppose that four elementary steps are selected at path optimization
+time.  Then `recode' will split itself into four different tasks
+interconnected with pipes, logically equivalent to:
+
+     STEP1 <INPUT | STEP2 | STEP3 | STEP4 >OUTPUT
+
+* Menu:
+
+* Main flow::           Overall organization
+* New charsets::        Adding new charsets
+
+\1f
+File: recode.info,  Node: Main flow,  Next: New charsets,  Prev: Internals,  Up: Internals
+
+Overall organization
+====================
+
+   The main driver constructs, while initializing all conversion
+modules, a table giving all the conversion routines available ("single
+step"s) and for each, the starting charset and the ending charset.  If
+we consider these charsets as being the nodes of a directed graph, each
+single step may be considered as oriented arc from one node to the
+other.  A cost is attributed to each arc: for example, a high penalty
+is given to single steps which are prone to loosing characters, a low
+penalty is given to those which need studying more than one input
+character for producing an output character, etc.
+
+   Given a starting code and a goal code, `recode' computes the most
+economical route through the elementary recodings, that is, the best
+sequence of conversions that will transform the input charset into the
+final charset.  To speed up execution, `recode' looks for subsequences
+of conversions which are simple enough to be merged, it then
+dynamically creates new single steps for these mergings.
+
+   A "double step" is a sequence of two single steps, the output of the
+first being the special charset `rfc1345', the input of the second
+single step being also `rfc1345'.  A special machinery dynamically
+produces efficient, reversible, merge-able single steps out of these
+double steps.
+
+   The main part of `recode' is written in C, as are most single steps.
+A few single steps need to recognize sequences of multiple characters,
+they are often better written in `flex'.
+
+\1f
+File: recode.info,  Node: New charsets,  Prev: Main flow,  Up: Internals
+
+Adding new charsets
+===================
+
+   It is easy for a programmer to add a new charset to `recode'.  All
+it requires is making a few functions kept in a single `.c' file,
+adjusting `Makefile.in', and remaking `recode'.
+
+   One of the function should convert from any previous charset to the
+new one.  Any previous charset will do, but try to select it so you
+will not loose too much information while converting.  The other
+function should convert from the new charset to any older one.  You do
+not have to select the same old charset than what you selected for the
+previous routine.  Once again, select any charset for which you will
+not loose too much information while converting.
+
+   If, for any of these two functions, you have to read multiple bytes
+of the old charset before recognizing the character to produce, you
+might prefer programming it in `flex' in a separate `.l' file.
+Prototype your C or `flex' files after one of those which exist
+already, so to keep the sources uniform.  Besides, at `make' time, all
+`.l' files are automatically merged into a single big one by the script
+`mergelex.awk', which requires sources to follow some rules.  Mimetism
+is a simple approach which relieves me of explaining all these rules!
+
+   Each of your source files should have its own initialization
+function, named `module_CHARSET', which is meant to be executed
+quickly, once, prior to any recoding.  It should declare the name of
+your charsets and the single steps (or elementary recodings) you
+provide, by calling `declare_step' one or more times.  Besides the
+charset names, `declare_step' expects a description of the recoding
+quality (see `recode.h') and two functions you also provide.
+
+   The first such function has the purpose of allocating structures,
+preconditioning conversion tables, etc.  It is also the usual way of
+further modifying the `STEP' structure.  This function is executed only
+if and when the single step is retained in an actual recoding sequence.
+If you do not need such delayed initialization, merely use `NULL' for
+the function argument.
+
+   The second function executes the elementary recoding on a whole file.
+There are a few cases when you can spare writing this function:
+
+   * Some single steps do nothing else than a pure copy of the input
+     onto the output, in this case, you can use the predefined function
+     `file_one_to_one', while having a delayed initialization for
+     presetting the `STEP' field `one_to_one' to the predefined value
+     `one_to_same'.
+
+   * Some single steps are driven by a table which recodes one
+     character into another; if the recoding does nothing else, you can
+     use the predefined function `file_one_to_one', while having a
+     delayed initialization for presetting the `STEP' field
+     `one_to_one' with your table.
+
+   * Some single steps are driven by a table which recodes one
+     character into a string; if the recoding does nothing else, you
+     can use the predefined function `file_one_to_many', while having a
+     delayed initialization for presetting the `STEP' field
+     `one_to_many' with your table.
+
+   If you have a recoding table handy in a suitable format but do not
+use one of the predefined recoding functions, it is still a good idea
+to use a delayed initialization to save it anyway, because `recode'
+option `-h' will take advantage of this information when available.
+
+   Finally, edit `Makefile.in' to add the source file name of your
+routines to the `C_STEPS' or `L_STEPS' macro definition, depending on
+the fact your routines is written in C or in `flex'.  For C files only,
+also modify the `STEPOBJS' macro definition.
+
+
+\1f
+Tag Table:
+Node: Top\7f1059
+Node: Introduction\7f3363
+Node: Overview\7f4424
+Node: Contributing\7f5964
+Node: Invoking recode\7f7935
+Node: Reversibility\7f21822
+Node: RFC 1345 charsets\7f26100
+Node: ISO charsets\7f43498
+Node: ASCII\7f43868
+Node: ISO 8859-1 charset\7f44708
+Node: ASCII-BS\7f46933
+Node: flat\7f48990
+Node: IBM charsets\7f49658
+Node: EBCDIC\7f49924
+Node: IBM-PC\7f51659
+Node: Icon-QNX\7f52179
+Node: CDC charsets\7f52603
+Node: Display Code\7f52892
+Node: CDC-NOS\7f54404
+Node: Bang-Bang\7f56369
+Node: Micro charsets\7f58280
+Node: Apple-Mac\7f58586
+Node: AtariST\7f59167
+Node: NeXT\7f60165
+Node: Other charsets\7f60628
+Node: LaTeX\7f61203
+Node: Texte\7f61983
+Node: Diacritics\7f63379
+Node: Ending diaeresis\7f65675
+Node: HTML\7f67497
+Node: Internals\7f68545
+Node: Main flow\7f68992
+Node: New charsets\7f70606
+\1f
+End Tag Table
diff --git a/recode.texi b/recode.texi
new file mode 100644 (file)
index 0000000..b7ade5c
--- /dev/null
@@ -0,0 +1,1520 @@
+\input texinfo
+@c %**start of header
+@setfilename recode.info
+@settitle GNU @code{recode} reference manual
+@finalout
+@c %**end of header
+
+@include version.texi
+
+@ifinfo
+@set Francois Franc,ois
+@end ifinfo
+@tex
+@set Francois Fran\noexpand\ptexc cois
+@end tex
+
+@ifinfo
+@format
+START-INFO-DIR-ENTRY
+* recode: (recode).     Conversion between character sets and usages.
+END-INFO-DIR-ENTRY
+@end format
+@end ifinfo
+
+@ifinfo
+This file documents the @code{recode} command, which has the purpose of
+converting files between various character sets and usages.
+
+Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+@ignore
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
+@end ignore
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end ifinfo
+
+@titlepage
+@title GNU recode, version @value{VERSION}
+@subtitle The character set transliterator
+@subtitle Edition @value{EDITION}, @value{UPDATED}
+@author @value{Francois} Pinard
+
+@page
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1993, 1994 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
+@end titlepage
+
+@ifinfo
+@node Top, Introduction, (dir), (dir)
+@top GNU @code{recode}
+
+@c @item @b{@code{recode}} @value{hfillkludge} (UtilT, SrcCD)
+@c
+@code{recode} converts files between character sets and usages.  When exact
+transliterations are not possible, it may get rid of the offending
+characters or fall back on approximations.  This program recognizes or
+produces nearly 150 different character sets and is able to transliterate
+files between almost any pair.  Most RFC 1345 character sets are supported.
+
+The current @code{recode} release is @value{VERSION}.
+
+@menu
+* Introduction::        What is the purpose of this program
+* Invoking recode::     How to use this program
+* Reversibility::       Reversibility issues
+* RFC 1345 charsets::   Charsets from RFC 1345
+* ISO charsets::        Charsets based on ASCII
+* IBM charsets::        Charsets based on IBM
+* CDC charsets::        Charsets based on CDC
+* Micro charsets::      Non-IBM micro-computer charsets
+* Other charsets::      Some other charsets
+* Internals::           Internal aspects
+
+ --- The Detailed Node Listing ---
+
+What is the purpose of this program
+
+* Overview::            Overview of charsets
+* Contributing::        Contributions and bug reports
+
+Charsets based on ASCII
+
+* ASCII::               Usual ASCII
+* ISO 8859-1 charset::  ASCII extended by Latin Alphabets
+* ASCII-BS::            ASCII 7-bits, @key{BS} to overstrike
+* flat::                ASCII without diacritics nor underline
+
+Charsets based on IBM
+
+* EBCDIC::              EBCDIC codes
+* IBM-PC::              IBM's PC code
+* Icon-QNX::            Unisys' ICON code
+
+Charsets based on CDC
+
+* Display Code::        Control Data's Display Code
+* CDC-NOS::             ASCII 6/12 from NOS
+* Bang-Bang::           ASCII ``bang bang''
+
+Non-IBM micro-computer charsets
+
+* Apple-Mac::           Apple's Macintosh code
+* AtariST::             Atari ST code
+* NeXT::                NeXT international code
+
+Some other charsets
+
+* LaTeX::               ASCII with LaTeX codes
+* Texte::               ASCII with easy French conventions
+* HTML::                World Wide Web representations
+
+ASCII with easy French conventions
+
+* Diacritics::          Diacritics
+* Ending diaeresis::    List of words ending with diaeresis
+
+Internal aspects
+
+* Main flow::           Overall organization
+* New charsets::        Adding new charsets
+@end menu
+
+@end ifinfo
+
+@node Introduction, Invoking recode, Top, Top
+@chapter What is the purpose of this program
+
+This @code{recode} program has the purpose of converting files between
+various character sets and usages.  When exact transliterations are not
+possible, as it is often the case, the program may get rid of the offending
+characters or fall back on approximations.
+
+Let us coin the term @dfn{charset} to represent, without distinction, a
+character set ``per se'' or a particular usage of a character set.  This
+program recognizes or produces around 150 such charsets.  Since it can
+convert each charset to almost any other one, many thousands of
+different conversions are possible.
+
+This tool pays special attention to superimposition of diacritics for
+French representation.  This orientation is mostly historical, it does
+not impair the usefulness, generality or extensibility of the program.
+
+@menu
+* Overview::            Overview of charsets
+* Contributing::        Contributions and bug reports
+@end menu
+
+@node Overview, Contributing, Introduction, Introduction
+@section Overview of charsets
+
+Recoding is currently possible between most of the charsets described in
+RFC 1345.  @xref{RFC 1345 charsets}.
+
+Recode also handles some charsets in more specialized ways.  These are:
+
+@itemize @bullet
+
+@item
+usual 7-bit ASCII: without any diacritics, or else: using backspace for
+overstriking; Unisys' ICON convention; @TeX{}/La@TeX{} coding; easy
+French conventions for electronic mail;
+
+@item
+8-bit extensions to ASCII: ISO Latin-1, Atari ST code, IBM's code for
+the PC, Apple's code for the Macintosh, NeXT code;
+
+@item
+6-bit escaped ASCII based on CDC display code: 6/12 code from NOS;
+bang-bang code from Universit@'e de Montr@'eal;
+
+@item
+non-ASCII codes: three flavors of EBCDIC.
+
+@end itemize
+
+The recent introduction of RFC 1345 in GNU @code{recode} has brought
+with it a few charsets having the functionality of older ones, but yet
+being different in subtle ways.  The effects have not been fully
+investigated yet, so for now, clashes are avoided, the old and new
+charsets are kept well separate.  For example, wizards would be
+interested in comparing the output of these two commands:
+
+@example
+recode -vh IBM-PC:Apple-Mac
+recode -vh IBM437:macintosh
+@end example
+
+@noindent
+The first command uses only charsets prior to RFC 1345 introduction.
+Both methods give different recodings, the first also properly recodes
+end of lines.  These differences are annoying, the fuzziness will have to
+be explained and settle down one day.
+
+@node Contributing,  , Overview, Introduction
+@section Contributions and bug reports
+
+Even being the @code{recode} author and current maintainer, I am no
+specialist in charset standards.  I only made @code{recode} along the
+years to solve my own needs, but felt it was applicable for the needs of
+others.  Some GNU people liked the program structure and suggested to
+make it more widely available.  I rely on GNU users judgment for what
+is best to be done next.
+
+Properly protecting GNU @code{recode} about possible copyright fights is
+a pain for me and for contributors, but we cannot avoid addressing the
+issue in the long run.  Besides, the Free Software Foundation, which
+mandates the GNU project, is very sensible to this matter.  GNU
+standards require that I be cautious before looking at copyrighted code.
+The safest and simplest way for me is to gather ideas and reprogram them
+anew, even if this might slow me down considerably.  For contributions
+going beyond a few lines of code here and there, the FSF definitely
+requires employer disclaimers and copyright assignments in writing.
+
+Many users contributed to GNU @code{recode} already, I am grateful to
+them for their interest and involvement.  Some suggestions can be
+integrated quickly while some others have to be delayed, I have to draw
+a line somewhere when time comes to make a new release, about what would
+go in it and what would go in the next.  Also, when you contribute
+something to @code{recode}, @emph{please} explain what it is about.  Do
+not take for granted that I know those charsets which are familiar to
+you.  Your explanations could well find their way into this
+documentation, too.
+
+Mail suggestions, documentation errors and bug reports to
+@code{bug-gnu-utils@@prep.ai.mit.edu} or, if you prefer, directly to
+Francois Pinard @file{pinard@@iro.umontreal.ca}.  Do not be afraid to
+report details, because this program is the mere aggregation of hundreds
+of details.
+
+@node Invoking recode, Reversibility, Introduction, Top
+@chapter How to use this program
+
+The general format of the program call is one of:
+
+@example
+recode [@var{option}]@dots{} [@var{charset}]
+recode [@var{option}]@dots{} [@var{before}]:[@var{after}] [@var{file}]@dots{}
+@end example
+
+The second form is the common case.  Each @var{file} will be read
+assuming it is coded with charset @var{before}, it will be recoded over
+itself so to use the charset @var{after}.  If there is no such
+@var{file}, the program rather acts as a filter and recode standard
+input to standard output.
+
+The available options are:
+
+@table @code
+
+@item -C
+@itemx --copyright
+Given this option, all other parameters and options are ignored.  The
+program prints briefly the Copyright and copying conditions.  See the
+file @file{COPYING} in the distribution for full statement of the
+Copyright and copying conditions.
+
+@item -a
+@itemx --auto-check
+In this special mode, @code{recode} diagnostics itself by analyzing
+connectivity of the various charsets and reporting on standard output.
+No file will be recoded.
+
+There might be one non-option argument, in which case it is interpreted
+as a charset name, possibly abbreviated to any non ambiguous prefix.
+@code{recode} will then study all recodings having the given charset as
+a starting or ending point.  If there is no such non-option argument,
+@code{recode} will study @emph{all} possible recodings.
+
+For each possible pair of different charsets, it prints on standard
+output how many single steps are needed for achieving the recoding and
+how many can be saved by step merging.  If a recoding cannot be done,
+the word @samp{UNACHIEVABLE} is printed instead.  However, this special
+line is completely suppressed if option @code{-x} specified some charset
+to ignore.
+
+The option @code{-h@var{name}} affects the resulting output, because
+there are more merging rules when this option is in effect.  Other
+options affect the result: @code{-d}, @code{-g} and, notably, @code{-s}.
+
+There was a time, in GNU @code{recode} development, when this option was
+reasonably interesting.  With the greater number of handled charsets,
+it became inordinately slow, taking on the order of one hour of wall
+clock time, while generating a great deal of output.  This option is not
+practical anymore when used without a charset parameter.  However, it
+can be made slightly more usable, together with option @code{-x.}, which
+effectively disables most RFC 1345 charsets from the report.
+
+@item -c
+@itemx --colons
+With @code{Texte} Easy French conventions, use the column @kbd{:}
+instead of the double-quote @kbd{"} for marking diaeresis.
+@xref{Texte}.
+
+@item -d
+@itemx --diacritics
+While converting to or from one of @code{HTML} or @code{LaTeX} charset,
+limit conversion to diacritics only.  This is particularly useful when
+people write what would be valid @code{HTML}, @TeX{} or La@TeX{} files,
+if only they were using provided sequences for applying diacritics
+instead of using the diacriticized characters directly from the
+underlying character set.
+
+While converting to @code{HTML} or @code{LaTeX} charset, this option
+assumes that non-diacriticized special characters are properly coded or
+protected, so @code{recode} will transmit them literally.  While
+converting the other way, this option prevents all attempts at
+recognizing coded or protected versions of non-diacriticized special
+characters of the other charset.  @xref{HTML}.  @xref{LaTeX}.
+
+@item -f
+@itemx --force
+It is planned that some future version of @code{recode} will protect
+you against recoding a file irreversibly over itself.  However,
+please keep vividly in mind that this protection is not yet active
+in @code{recode}.  When the protection will be enforced, option
+@samp{-f} will become mandatory for a file to be replaced by some
+recoding of its contents, if such conversion is loosing information.
+For now, @code{recode} acts as if option @samp{-f} was always selected.
+
+In preparation for the time this option will become mandatory, you
+may start using @samp{-f} right away in scripts calling @code{recode},
+when you know this is the reasonnable thing to do.
+
+@c With this option, irreversible recodings are run to completion,
+@c and @code{recode} does not exit with a non-zero status because of
+@c reversibility matters.  @xref{Reversibility}.
+@c 
+@c Without this option, whenever an irreversible recoding is met,
+@c @code{recode} produces a warning on standard error and aborts the
+@c current recoding.  When there are many files to recode, it then proceeds
+@c with the recoding of the next file.  When the program is merely used as
+@c a filter, standard output will have received a partially recoded copy of
+@c standard input, up to the first irreversible point.  After all
+@c recodings have been done or attempted, and if some recoding has been
+@c aborted, @code{recode} exits with a non-zero status.
+
+@item -g
+@itemx --graphics
+This option is only meaningful while getting @emph{out} of the
+@code{IBM-PC} charset.  In this charset, characters 176 to 223 are used
+for constructing rulers and boxes, using simple or double horizontal or
+vertical lines.  This option forces the automatic selection of ASCII
+characters for approximating these rulers and boxes, at cost of making
+the transformation irreversible.  Option @code{-g} implies @code{-f}.
+
+@item -h[@var{name}]
+@itemx --header[=@var{name}]
+Instead of recoding files, @code{recode} writes a C source file on
+standard output and exits.  This source is meant to be included in a
+regular C program: its purpose is to declare and initialize an array,
+named @var{name}, which represents the requested recoding.  If
+@var{name} is not specified, then it defaults to
+@code{@var{before}_to_@var{after}}, where @var{before} is the starting
+charset and @var{after} is the goal charset.
+
+Even if @code{recode} tries its best, this option does not always
+succeed in producing the requested C table.  It will however, provided
+the recoding can be internally represented by only one step after the
+optimization phase, and if this merged step conveys a one-to-one or a
+one-to-many explicit table.  But this is all fairly technical.  Better
+try and see!
+
+Beware that other options might affect the produced C tables, these are:
+@code{-d}, @code{-g} and, particularly, @code{-s}.
+
+@item -i
+@itemx --sequence=files
+When the recoding requires a combination of two or more elementary
+recoding steps, this option forces many passes over the data, using
+intermediate files between passes.  This is the default behavior when
+files are recoded over themselves.  If this option is selected in filter
+mode, that is, when the program reads standard input and writes standard
+output, it might take longer for programs further down the pipe chain to
+start receiving some recoded data.
+
+@item -l[@var{format}]
+@itemx --list[=@var{format}]
+This option asks for information about all charsets, or about one
+particular charset.  No file will be recoded.
+
+If there is no non-option arguments, @code{recode} ignores the
+@var{format} value of the option, it writes a sorted list of charset
+names on standard output, one per line.  When a charset name have
+aliases or synonyms, they follow the true charset name on its line,
+presented in lexicographical order from left to right.  This list is
+over one hundred lines.  It is best used with @code{grep}, as in:
+
+@example
+recode -l | grep greek
+@end example
+
+There might be one non-option argument, in which case it is interpreted
+as a charset name, possibly abbreviated to any non ambiguous prefix.
+This particular usage of the @code{-l} option is obeyed @emph{only} for
+charsets having an RFC 1345 style internal description.  Even if most
+charsets have this property, some do not, then option @code{-l} cannot
+be used to detail these particular charsets.  For knowing if a
+particular charset can be listed this way, you should merely try and see
+if this works.  The @var{format} value of the option is a keyword from
+the following list.  Keywords may be abbreviated by dropping suffix
+letters, and even reduced to the first letter only:
+
+@table @code
+
+@item decimal
+This format asks for the production on standard output of a concise
+tabular display of the charset, in which character code values are
+expressed in decimal.
+
+@item octal
+This format uses octal instead of decimal in the concise tabular display
+of the charset.
+
+@item hexadecimal
+This format uses hexadecimal instead of decimal in the concise tabular
+display of the charset.
+
+@item full
+This format requests an extensive display of the charset on standard
+output, using one line per character showing its decimal, hexadecimal
+and octal code values, and also a descriptive comment which is indeed
+the 10646 character name.
+
+@end table
+
+When option @code{-l} is used together with a @var{charset} argument,
+the @var{format} defaults to @code{decimal}.
+
+@item -o
+@itemx --sequence=popen
+When the recoding requires a combination of two or more elementary
+recoding steps, this option forces the creation of a chain of program
+instances initiated through the @code{popen(3)} library call, all
+operating in parallel.  In filter mode, costing the overhead of multiple
+program initializations, recoded data will be available soon after the
+program starts, even if many elementary recoding steps are required.
+
+If, at installation time, the @code{popen(3)} call is said to be
+unavailable, selecting option @code{-o} is equivalent to selecting
+option @code{-i}.
+
+@item -p
+@itemx --sequence=pipe
+When the recoding requires a combination of two or more elementary
+recoding steps, this option forces the program to fork itself into a few
+copies interconnected with pipes, using the @code{pipe(2)} system call.
+All copies of the program operate in parallel.  This method is similar
+to the method used through option @code{-o}, but is more efficient
+because the program initializes only once.  This is the default
+behavior in filter mode.  If this option is used when files are recoded
+over themselves, this should also save disk space because some temporary
+files might not be needed, at cost of more system overhead.
+
+If, at installation time, the @code{pipe(2)} call is said to be
+unavailable, selecting option @code{-p} is equivalent to selecting
+option @code{-o}.  If both @code{pipe(2)} and @code{popen(3)} are
+unavailable, selecting option @code{-p} is equivalent to selecting
+option @code{-i}.
+
+@item -q
+@itemx --quiet
+@itemx --silent
+This option has the sole purpose of inhibiting diagnostic messages
+about irreversible recodings.
+
+@c It has no other effect, in particular, it
+@c does @emph{not} prevent recodings to be aborted or @code{recode} to
+@c return a non-zero exit status when irreversible recodings are met.
+
+This option is set automatically for the children processes, when
+recode splits itself in many collaborating copies.  Doing so, the
+diagnostic is issued only once by the parent.  See options @code{-o}
+and @code{-p}.
+
+@item -s
+@itemx --strict
+By using this option, the user requests that @code{recode} be very
+strict while recoding a file, merely loosing in the transformation any
+character which is not explicitly mapped from a charset to another.
+This option renders the recoding less likely reversible, so it also
+implies option @code{-f}.  Also @xref{Reversibility}.
+
+@item -t
+@itemx --touch
+The @emph{touch} option is meaningful only when files are recoded over
+themselves.  Without it, the time-stamps associated with files are
+preserved, to reflect the fact that changing the code of a file does not
+really alter its informational contents.  When the user wants the
+recoded files to be time-stamped at the recoding time, this option
+inhibits the automatic protection of the time-stamps.
+
+@item -v
+@itemx --verbose
+Before doing any recoding, the program will first print on @file{stderr}
+the list of all intermediate charsets planned for recoding, starting
+with the @var{before} charset and ending with the @var{after} charset.
+It also prints an indication of the recoding quality, as one of the word
+@samp{reversible}, @samp{one to one}, @samp{one to many}, @samp{many to
+one} or @samp{many to many}.
+
+This information will appear once or twice.  It is shown a second time
+only when the optimization and step merging phase succeeds in creating a
+new single step.
+
+This option also has a second effect.  The program will print on
+@file{stderr} one message per @var{file} recoded, so to let the user
+informed of the progress of its command.
+
+An easy way to know beforehand the sequence or quality of a recoding is
+by using the command such as:
+
+@example
+recode -v @var{before}:@var{after} < /dev/null
+@end example
+
+@noindent
+using the fact that, @emph{so far} in @code{recode}, an empty input file
+produces an empty output file.
+
+@item -x=@var{charset}
+@itemx --ignore=@var{charset}
+This option tells the program to ignore any recoding path through the
+specified @var{charset}, so disabling any single step using this charset
+as a start or end point.  This may be used when the user wants to force
+@code{recode} in using an alternate recoding path.
+
+@var{charset} may be abbreviated to any unambiguous prefix.  For
+convenience, the value @samp{.} is an alias for @samp{RFC 1345}, so the
+option @code{-x.} effectively disables @emph{all} RFC 1345 tables at
+once.
+
+@item --help
+The program merely prints a page of help on standard output, and exits
+without doing any recoding.
+
+@item --version
+The program merely prints its version numbers on standard output, and
+exits without doing anything else.
+
+@end table
+
+The @var{before}:@var{after} argument specifies the start charset and
+the goal charset.  The allowable values for @var{before} or @var{after}
+are described in the remainder of this document.  Charsets may have
+predefined alternate names, or aliases, which are equally acceptable.
+
+In the @var{before}:@var{after} argument only, a backslash may be used
+to quote the next character of a charset name.  This might be useful for
+preventing a colon to be mistakenly interpreted as the separator between
+@var{before} and @var{after}.  Rather, the colon could be omitted,
+because while recognizing a charset name or alias, GNU @code{recode}
+ignores all characters besides letters and digits.  There is also no
+distinction between upper and lower case.  Charset names or aliases may
+always be abbreviated to any unambiguous prefix.
+
+One or both of the @var{before} or @var{after} keywords may be omitted,
+but the colon which separates them cannot.  An omitted keyword implies
+the usual or default code in usage on the system where this program is
+installed.  Usually, this default code is @code{Latin-1} for UNIX systems
+or @code{IBM-PC} for MS-DOS machines.
+
+@node Reversibility, RFC 1345 charsets, Invoking recode, Top
+@chapter Reversibility issues
+
+Even if GNU @code{recode} tries hard at keeping the recodings
+reversible, you should not develop an unconditional confidence in its
+ability to do so.  You @emph{ought} to keep only reasonable expectations
+about reverse recodings.  In particular, consider:
+
+@itemize @bullet
+
+@item
+Most transformations are fully reversible for all inputs, but loose this
+property whenever @code{-s} is specified.
+
+@item
+A few transformations are not meant to be reversible, by design.
+
+@item
+Reversibility sometimes depends on actual file contents and cannot
+be ascertained beforehand, without reading the file.
+
+@item
+Reversibility is never absolute across successive versions of this
+program.  Even correcting a small bug in a mapping could induce slight
+discrepancies later.
+
+@item
+Reversibility is easily lost by merging.  This is best explained through
+an example.  If you reversibly recode a file from charset @samp{A} to
+charset @samp{B}, then you reversibly recode the result from charset
+@samp{B} to charset @samp{C}, you cannot expect to recover the original
+file by merely recoding from charset @samp{C} directly to charset
+@samp{A}.  You will instead have to recode from charset @samp{C} back to
+charset @samp{B}, and only then from charset @samp{B} to charset
+@samp{A}.
+
+@item
+Faulty files create a particular problem.  Consider an example, recoding
+from @code{IBM-PC} to @code{Latin-1}.  End of lines are represented as
+@samp{\r\n} in @code{IBM-PC} and as @samp{\n} in @code{Latin-1}.  There
+is no way by which a faulty @code{IBM-PC} file containing a @samp{\n}
+not preceded by @samp{\r} be translated into a @code{Latin-1} file, and
+then back.
+
+@item
+There is another difficulty arising from code equivalences.  For
+example, in a @code{LaTeX} charset file, the string @samp{\^\i@{@}}
+could be recoded back and forth through another charset and become
+@samp{\^@{\i@}}.  Even if the resulting file is equivalent to the
+original one, it is not identical.
+
+@end itemize
+
+Unless option @code{-s} is used, @code{recode} automatically tries to
+fill mappings with invented correspondences, often making them fully
+reversible.  This filling is not made at random.  The algorithm tries to
+stick to the identity mapping and, when this is not possible, it prefers
+generating many small permutation cycles, each involving only a few
+codes.
+
+For example, here is how IBM-PC code 186 gets translated to control-U
+in Latin-1.  Control-U is 21.  Code 21 is the IBM-PC section sign,
+which is 167 in Latin-1.  @code{recode} cannot reciprocate 167 to 21,
+because 167 is the masculine ordinal indicator on IBM PC's, which is
+186 in Latin-1.  Code 186 in IBM PC's has no Latin-1 equivalent; by
+assigning back to 21, @code{recode} closes this short permutation loop.
+
+As a consequence of this map filling, @code{recode} may sometimes
+produce @emph{funny} characters.  They may look annoying, they are
+nevertheless helpful when one changes his/her mind and wants to revert
+to the prior recoding.  If you cannot stand these, use option @code{-s},
+which asks for a very strict recoding.
+
+This map filling sometimes has another surprising consequence.  In some
+cases, @code{recode} seems to copy a file without recoding it.  But in
+fact, it does.  As an illuminating example, consider you requested:
+
+@example
+recode l1:us < File-Latin1 > File-ASCII
+cmp File-Latin1 File-ASCII
+@end example
+
+@noindent
+then @code{cmp} will not report any difference.  This is quite normal.
+Latin-1 gets correctly recoded to ASCII for charsets commonalities
+(which are the first 128 characters, in this case).  The remaining last
+128 Latin-1 characters have no ASCII correspondent.  Instead of loosing
+them, recode elects to map them to unspecified characters of ASCII, so
+making the recoding reversible.  The simplest way of achieving this is
+merely to keep those last 128 characters unchanged.  The overall effect
+is copying the file verbatim.
+
+If you feel this behavior is too generous and if you do not wish to
+care about reversibility, simply use option @code{-s}.  By doing so,
+@code{recode} will strictly map only those Latin-1 characters which have
+an ASCII equivalent, and will merely drop those which do not.  Then,
+there is more chance that you will observe a difference between the
+input and the output file.
+
+@node RFC 1345 charsets, ISO charsets, Reversibility, Top
+@chapter Charsets from RFC 1345
+
+In the GNU @code{recode} distribution, there is a copy of RFC 1345:
+
+@quotation
+``Character Mnemonics & Character Sets'', K. Simonsen, Request for
+Comments no. 1345, Network Working Group, June 1992.
+@end quotation
+
+This document is also available by anonymous ftp at @file{nic.ddn.mil}
+in directory @file{rfc} as file @file{rfc1345.txt}.  This report defines
+many character mnemonics and character sets.
+
+GNU @code{recode} implements most of RFC 1345, however:
+
+@enumerate
+@item
+It does not recognize 16-bits charsets: @code{GB_2312-80},
+@code{JIS_C6226-1978}, @code{JIS_C6226-1983}, @code{JIS_X0212-1990} and
+@code{KS_C_5601-1987}.
+
+@item
+It does not recognize those charsets which combine two characters for
+representing a third: @code{ANSI_X3.110-1983}, @code{ISO_6937-2-add},
+@code{T.101-G2}, @code{T.61-8bit}, @code{iso-ir-90} and
+@code{videotex-suppl}.
+
+@item
+It interprets the charset @code{isoir91} as @code{NATS-DANO} (alias
+@code{iso-ir-9-1}), @emph{not} as @code{JIS_C6229-1984-a} (alias
+@code{iso-ir-91}).  So better avoid using these two alias names.
+
+@item
+It interprets the charset @code{isoir92} as @code{NATS-DANO-ADD} (alias
+@code{iso-ir-9-2}), @emph{not} as @code{JIS_C6229-1984-b} (alias
+@code{iso-ir-92}).  So better avoid using these two alias names.
+
+@item
+It ignores all about code overloading, but still processes correctly the
+remainder of @code{dk-us} and @code{us-dk}.
+
+@end enumerate
+
+Keld Simonsen @file{keld@@dkuug.dk} did most of RFC 1345 himself, with
+some funding from Danish Standards and Nordic standards (INSTA) project.
+He also did the character set design work, with substantial input from
+Olle Jaernefors.  Keld typed in almost all of the tables, some have been
+contributed.  A number of people have checked the tables in various
+ways.  The RFC lists a number of people who helped.
+
+Internally, RFC 1345 associates which each character an unambiguous
+mnemonic of (usually) one or two characters, taken from ISO 646, a
+minimal set of 83 characters.  The charset made up by these mnemonics is
+available in @code{recode} under the name @code{RFC 1345}, with @code{.}
+being accepted as a short alias.
+
+Even if the mnemonics are unambiguous taken separately, strings made up
+by concatenating these mnemonics are ambiguous and cannot be safely
+interpreted.  So @code{recode} only allows converting @emph{to} RFC
+1345, never from it.  However, special machinery in the program allows
+for converting @emph{through} RFC 1345, when RFC 1345 is neither the
+initial nor the final charset of the conversion sequence.
+
+Recoding directly to @code{.} has the main goal of letting the user
+examine foreign charsets.  We cannot do much, mechanically, with the
+result.  For increased readability, as a matter of convenience,
+@code{SP} is left as a single space and @code{LF} becomes a newline.
+
+@table @code
+@include charset.texi
+
+@end table
+
+@node ISO charsets, IBM charsets, RFC 1345 charsets, Top
+@chapter Charsets based on ASCII
+
+@menu
+* ASCII::               Usual ASCII
+* ISO 8859-1 charset::  ASCII extended by Latin Alphabets
+* ASCII-BS::            ASCII 7-bits, @key{BS} to overstrike
+* flat::                ASCII without diacritics nor underline
+@end menu
+
+@node ASCII, ISO 8859-1 charset, ISO charsets, ISO charsets
+@section Usual ASCII
+
+This charset is available in @code{recode} under the name @code{ASCII}.
+In fact, it's true name is @code{ANSI_X3.4-1968} as per RFC 1345,
+accepted aliases being @code{ANSI_X3.4-1986}, @code{ASCII},
+@code{IBM367}, @code{ISO646-US}, @code{ISO_646.irv:1991},
+@code{US-ASCII}, @code{cp367}, @code{iso-ir-6} and @code{us}.  The
+shortest way of specifying it in @code{recode} is @code{us}.
+
+This documentation used to include ASCII tables.  They have been removed
+since @code{recode} can now recreate these (and a lot of others) easily:
+
+@example
+recode -lf us                   for commented ASCII
+recode -ld us                   for concise decimal table
+recode -lo us                   for concise octal table
+recode -lh us                   for concise hexadecimal table
+@end example
+
+@node ISO 8859-1 charset, ASCII-BS, ASCII, ISO charsets
+@section ASCII extended by Latin Alphabets
+
+This charset is available in @code{recode} under the name @code{Latin-1}.
+In fact, it's true name is @code{ISO_8859-1:1987} as per RFC 1345,
+accepted aliases being @code{CP819}, @code{IBM819}, @code{ISO-8859-1},
+@code{ISO_8859-1}, @code{iso-ir-100}, @code{l1} and @code{Latin-1}.  The
+shortest way of specifying it in @code{recode} is @code{l1}.
+
+This charset corresponds to the ISO Latin Alphabet 1.  It is an eight-bit
+code which coincides with ASCII for the lower half.
+
+This documentation used to include Latin-1 tables.  They have been
+removed since @code{recode} can now recreate these (and a lot of others)
+easily:
+
+@example
+recode -lf l1                   for commented ISO Latin-1
+recode -ld l1                   for concise decimal table
+recode -lo l1                   for concise octal table
+recode -lh l1                   for concise hexadecimal table
+@end example
+
+The following from @file{lasko@@video.dec.com} (Tim Lasko), with no
+date.
+
+@quotation
+ISO Latin-1, or more completely ISO Latin Alphabet No 1, is now an
+international standard as of February 1987 (IS 8859, Part 1).  For
+those American USEnet'rs that care, the 8-bit ASCII standard, which is
+essentially the same code, is going through the final administrative
+processes prior to publication.
+
+ISO Latin-1 (IS 8859/1) is actually one of an entire family of
+eight-bit one-byte character sets, all having ASCII on the left hand
+side, and with varying repertoires on the right hand side:
+@end quotation
+
+@enumerate
+@item
+Latin Alphabet No 1 (caters to Western Europe - now approved).
+@item
+Latin Alphabet No 2 (caters to Eastern Europe - now approved).
+@item
+Latin Alphabet No 3 (caters to SE Europe + others - in draft ballot).
+@item
+Latin Alphabet No 4 (caters to Northern Europe - in draft ballot).
+@item
+Latin-Cyrillic alphabet (right half all Cyrillic - processing currently
+suspended pending USSR input).
+@item
+Latin-Arabic alphabet (right half all Arabic - now approved).
+@item
+Latin-Greek alphabet (right half Greek + symbols - in draft ballot).
+@item
+Latin-Hebrew alphabet (right half Hebrew + symbols - proposed).
+@end enumerate
+
+@node ASCII-BS, flat, ISO 8859-1 charset, ISO charsets
+@section ASCII 7-bits, @key{BS} to overstrike
+
+This charset is available in @code{recode} under the name
+@code{ASCII-BS}, with @code{BS} as an acceptable alias.
+
+The file is straight ASCII, seven bits only.  According to the definition
+of ASCII: diacritics are applied by a sequence of three characters: the
+letter, one @key{BS}, the diacritic mark.  We deviate slightly from this
+by exchanging the diacritic mark and the letter so, on a screen device, the
+diacritic will disappear and let the letter alone.  At recognition time,
+both methods are acceptable.
+
+The French quotes are coded by the sequences: @kbd{< @key{BS} "} or @kbd{"
+@key{BS} <} for the opening quote and @kbd{> @key{BS} "} or @kbd{"
+@key{BS} >} for the closing quote.  This artificial convention was
+inherited in straight @code{ASCII-BS} from habits around @code{Bang-Bang}
+entry, and is not well known.  But we decided to stick to it so that
+@code{ASCII-BS} charset will not loose French quotes.
+
+The @code{ASCII-BS} charset is independent of @code{ASCII}, and
+different.  The following examples demonstrate this, knowing at advance
+that @samp{!2} is the @code{Bang-Bang} way of representing an @kbd{e}
+with an acute accent.  Compare:
+
+@example
+% echo \!2 | recode -v bang:us | od -bc
+Bang-Bang -> ISO_8859-1:1987 -> RFC 1345 -> ANSI_X3.4-1968 (many to one)
+Simplified to: Bang-Bang -> ISO_8859-1:1987 -> ANSI_X3.4-1968 (many to one)
+0000000 351 012
+        351  \n
+0000002
+@end example
+
+@noindent
+with:
+
+@example
+% echo \!2 | recode -v bang:bs | od -bc
+Bang-Bang -> ISO_8859-1:1987 -> ASCII-BS (many to many)
+0000000 047 010 145 012
+          '  \b   e  \n
+0000004
+@end example
+
+In the first case, the @kbd{e} with an acute accent is merely
+transmitted by the @code{Latin-1:ASCII} mapping, not having a special
+recoding rule for it.  In the @code{Latin-1:ASCII-BS} case, the acute
+accent is applied over the @kbd{e} with a backspace: diacriticized
+characters have special rules.  For the @code{ASCII-BS} charset,
+reversibility is still possible, but there might be difficult cases.
+
+@node flat,  , ASCII-BS, ISO charsets
+@section ASCII without diacritics nor underline
+
+This charset is available in @code{recode} under the name @code{flat}.
+
+This code is ASCII expunged of all diacritics and underlines, as long as
+they are applied using three character sequences, with @key{BS} in the
+middle.  Also, despite slightly unrelated, each control character is
+represented by a sequence of two or three graphic characters.  The newline
+character, however, keeps its functionality and is not represented.
+
+Note that charset @code{flat} is a terminal charset.  We can convert
+@emph{to} @code{flat}, but not @emph{from} it.
+
+@node IBM charsets, CDC charsets, ISO charsets, Top
+@chapter Charsets based on IBM
+
+@menu
+* EBCDIC::              EBCDIC codes
+* IBM-PC::              IBM's PC code
+* Icon-QNX::            Unisys' ICON code
+@end menu
+
+@node EBCDIC, IBM-PC, IBM charsets, IBM charsets
+@section EBCDIC code
+
+This charset is the IBM's external binary coded decimal for interchange
+coding.  This is an eight bits code.  The following three variants were
+implemented in GNU @code{recode} independently of RFC 1345:
+
+@table @code
+
+@item EBCDIC
+GNU @code{recode} @code{us:ebcdic} conversion is identical to GNU
+@code{dd} @code{ebcdic} conversion, and @code{recode} @code{ebcdic:us}
+conversion is identical to GNU @code{dd} @code{ascii} conversion.  This
+charset also represents the way Control Data Corporation relates EBCDIC
+to 8-bits ASCII.
+
+@item EBCDIC-CCC
+GNU @code{recode} @code{us:ebcdic-ccc} or @code{ebcdic-ccc:us}
+conversions represent the way Concurrent Computer Corporation (formerly
+Perkin Elmer) relates EBCDIC to 8-bits ASCII.
+
+@item EBCDIC-IBM
+GNU @code{recode} @code{us:ebcdic-ibm} conversion is @emph{almost}
+identical to GNU @code{dd} @code{ibm} conversion.  Given the exact
+@code{dd} @code{ibm} conversion table, @code{recode} once said:
+
+@example
+Codes  91 and 213 both recode to 173
+Codes  93 and 229 both recode to 189
+No character recodes to  74
+No character recodes to 106
+@end example
+
+So I arbitrarily chose to recode 213 by 74 and 229 by 106.  This makes
+the @code{EBCDIC-IBM} recoding reversible, but this is not necessarily
+the best correction.  In any case, I believe GNU @code{dd} should be
+corrected, and preferably, GNU @code{dd} and GNU @code{recode} should
+agree on the same correction.  So, this table may change once again.
+
+@end table
+
+RFC 1345 brings in @code{recode} 15 other EBCDIC charsets, and 21 other
+charsets having EBCDIC in at least one of their alias names.  You can
+get a list of all these by executing:
+
+@example
+recode -l | grep ebcdic
+@end example
+
+@node IBM-PC, Icon-QNX, EBCDIC, IBM charsets
+@section IBM's PC code
+
+This charset is available in @code{recode} under the name @code{IBM-PC}.
+There are a few discrepancies between this charset and the very similar
+RFC 1345 charset @code{ibm437}, which have not been analyzed yet, so the
+charsets are being kept separate for now.  This might change in the
+future.
+
+The file was obtained or is aimed towards a PC microcomputer from IBM or
+any compatible.  This is an eight-bit code.
+
+@node Icon-QNX,  , IBM-PC, IBM charsets
+@section Unisys' ICON code
+
+This charset is available in @code{recode} under the name
+@code{Icon-QNX}, with @code{QNX} as an acceptable alias.
+
+The file is using Unisys' Icon way to represent diacritics with code 25
+escape sequences, under the system QNX.  This is a seven-bit code, even
+if eight-bit codes can flow through as part of IBM-PC charset.
+
+@node CDC charsets, Micro charsets, IBM charsets, Top
+@chapter Charsets based on CDC
+
+@menu
+* Display Code::        Control Data's Display Code
+* CDC-NOS::             ASCII 6/12 from NOS
+* Bang-Bang::           ASCII ``bang bang''
+@end menu
+
+@node Display Code, CDC-NOS, CDC charsets, CDC charsets
+@section Control Data's Display Code
+
+This code is not available in @code{recode}, but repeated here for
+reference.  This is a 6-bit code used on CDC mainframes.
+
+@example
+Octal display code to graphic       Octal display code to octal ASCII
+
+00  :    20  P    40  5   60  #     00 072  20 120  40 065  60 043
+01  A    21  Q    41  6   61  [     01 101  21 121  41 066  61 133
+02  B    22  R    42  7   62  ]     02 102  22 122  42 067  62 135
+03  C    23  S    43  8   63  %     03 103  23 123  43 070  63 045
+04  D    24  T    44  9   64  "     04 104  24 124  44 071  64 042
+05  E    25  U    45  +   65  _     05 105  25 125  45 053  65 137
+06  F    26  V    46  -   66  !     06 106  26 126  46 055  66 041
+07  G    27  W    47  *   67  &     07 107  27 127  47 052  67 046
+10  H    30  X    50  /   70  '     10 110  30 130  50 057  70 047
+11  I    31  Y    51  (   71  ?     11 111  31 131  51 050  71 077
+12  J    32  Z    52  )   72  <     12 112  32 132  52 051  72 074
+13  K    33  0    53  $   73  >     13 113  33 060  53 044  73 076
+14  L    34  1    54  =   74  @@     14 114  34 061  54 075  74 100
+15  M    35  2    55      75  \     15 115  35 062  55 040  75 134
+16  N    36  3    56  ,   76  ^     16 116  36 063  56 054  76 136
+17  O    37  4    57  .   77  ;     17 117  37 064  57 056  77 073
+@end example
+
+@node CDC-NOS, Bang-Bang, Display Code, CDC charsets
+@section ASCII 6/12 from NOS
+
+This charset is available in @code{recode} under the name
+@code{CDC-NOS}, with @code{NOS} as an acceptable alias.
+
+This is one of the charset in use on CDC Cyber NOS systems to represent
+ASCII, sometimes named @dfn{NOS 6/12} code for coding ASCII.  This code is
+also known as @dfn{caret ASCII}.  It is based on a six bits character set
+in which small letters and control characters are coded using a @kbd{^}
+escape and, sometimes, a @kbd{@@} escape.
+
+The routines given here presume that the six bits code is already expressed
+in ASCII by the communication channel, with embedded ASCII @kbd{^} and
+@kbd{@@} escapes.
+
+Here is a table showing which characters are being used to encode each
+ASCII character.
+
+@example
+000  ^5  020  ^#  040     060  0  100 @@A  120  P  140  @@G  160  ^P
+001  ^6  021  ^[  041  !  061  1  101  A  121  Q  141  ^A  161  ^Q
+002  ^7  022  ^]  042  "  062  2  102  B  122  R  142  ^B  162  ^R
+003  ^8  023  ^%  043  #  063  3  103  C  123  S  143  ^C  163  ^S
+004  ^9  024  ^"  044  $  064  4  104  D  124  T  144  ^D  164  ^T
+005  ^+  025  ^_  045  %  065  5  105  E  125  U  145  ^E  165  ^U
+006  ^-  026  ^!  046  &  066  6  106  F  126  V  146  ^F  166  ^V
+007  ^*  027  ^&  047  '  067  7  107  G  127  W  147  ^G  167  ^W
+010  ^/  030  ^'  050  (  070  8  110  H  130  X  150  ^H  170  ^X
+011  ^(  031  ^?  051  )  071  9  111  I  131  Y  151  ^I  171  ^Y
+012  ^)  032  ^<  052  *  072 @@D  112  J  132  Z  152  ^J  172  ^Z
+013  ^$  033  ^>  053  +  073  ;  113  K  133  [  153  ^K  173  ^0
+014  ^=  034  ^@@  054  ,  074  <  114  L  134  \  154  ^L  174  ^1
+015  ^   035  ^\  055  -  075  =  115  M  135  ]  155  ^M  175  ^2
+016  ^,  036  ^^  056  .  076  >  116  N  136 @@B  156  ^N  176  ^3
+017  ^.  037  ^;  057  /  077  ?  117  O  137  _  157  ^O  177  ^4
+@end example
+
+@node Bang-Bang,  , CDC-NOS, CDC charsets
+@section ASCII ``bang bang''
+
+This charset is available in @code{recode} under the name @code{Bang-Bang}.
+
+This is the local code in use on Cybers at Universite de Montreal, which
+grave and serious people there prefer to name @dfn{ASCII code display}.
+This code is also known as @dfn{Bang-bang}.  It is based on a six bits
+character set in which capitals, French diacritics and a few others are
+coded using an @kbd{!} escape followed by a single character, and
+control characters using a double @kbd{!} escape followed by a single
+character.
+
+The routines given here presume that the six bits code is already expressed
+in ASCII by the communication channel, with embedded ASCII @kbd{!}
+escapes.
+
+Here is a table showing which characters are being used to encode each
+ASCII character.
+
+@example
+000 !!@@  020 !!P  040    060 0  100 @@   120 !P  140 !@@ 160 P
+001 !!A  021 !!Q  041 !" 061 1  101 !A  121 !Q  141 A  161 Q
+002 !!B  022 !!R  042 "  062 2  102 !B  122 !R  142 B  162 R
+003 !!C  023 !!S  043 #  063 3  103 !C  123 !S  143 C  163 S
+004 !!D  024 !!T  044 $  064 4  104 !D  124 !T  144 D  164 T
+005 !!E  025 !!U  045 %  065 5  105 !E  125 !U  145 E  165 U
+006 !!F  026 !!V  046 &  066 6  106 !F  126 !V  146 F  166 V
+007 !!G  027 !!W  047 '  067 7  107 !G  127 !W  147 G  167 W
+010 !!H  030 !!X  050 (  070 8  110 !H  130 !X  150 H  170 X
+011 !!I  031 !!Y  051 )  071 9  111 !I  131 !Y  151 I  171 Y
+012 !!J  032 !!Z  052 *  072 :  112 !J  132 !Z  152 J  172 Z
+013 !!K  033 !![  053 +  073 ;  113 !K  133 [   153 K  173 ![
+014 !!L  034 !!\  054 ,  074 <  114 !L  134 \   154 L  174 !\
+015 !!M  035 !!]  055 -  075 =  115 !M  135 ]   155 M  175 !]
+016 !!N  036 !!^  056 .  076 >  116 !N  136 ^   156 N  176 !^
+017 !!O  037 !!_  057 /  077 ?  117 !O  137 _   157 O  177 !_
+@end example
+
+@node Micro charsets, Other charsets, CDC charsets, Top
+@chapter Non-IBM micro-computer charsets
+
+@menu
+* Apple-Mac::           Apple's Macintosh code
+* AtariST::             Atari ST code
+* NeXT::                NeXT international code
+@end menu
+
+@node Apple-Mac, AtariST, Micro charsets, Micro charsets
+@section Apple's Macintosh code
+
+This charset is available in @code{recode} under the name
+@code{Apple-Mac}.  There are a few discrepancies between this charset and
+the very similar RFC 1345 charset @code{macintosh}, which have not been
+analyzed yet, so the charsets are being kept separate for now.  This
+might change in the future.
+
+The file has been obtained or is aimed to a Macintosh micro-computer from
+Apple.  This is an eight bit code.  The file is the data fork only.
+
+@node AtariST, NeXT, Apple-Mac, Micro charsets
+@section Atari ST code
+
+This charset is available in @code{recode} under the name @code{AtariST}.
+
+This is the character set used on the Atari ST/TT/Falcon.  This is
+similar to @code{IBM-PC}, but differs in some details (includes some more
+accented characters, the graphic characters are mostly replaced by
+hebrew characters, and there is a true German @key{sharp s} different
+from Greek @key{beta}).
+
+About the end-of-line conversions: the canonical end-of-line on the
+Atari is @samp{\r\n}, but unlike @code{IBM-PC}, the OS makes no
+difference between text and binary input/output; it is up to the
+application how to interpret the data.  In fact, most of the libraries
+that come with compilers can grok both @samp{\r\n} and @samp{\n} as end
+of lines.  Many of the users who also have access to Unix systems prefer
+@samp{\n} to ease porting Unix utilities.  So, for easing reversibility,
+@code{recode} tries to let @samp{\r} undisturbed through recodings.
+
+@node NeXT,  , AtariST, Micro charsets
+@section NeXT international code
+
+This charset is available in @code{recode} under the name @code{NeXT}.
+
+The NeXT encoding is an extension to the ISO Latin-1 ASCII encoding used
+by NeXT under the system NeXTSTEP.  It is identical to Latin-1 for the
+positions 0-127.  In the position 128-255, NeXT added some chars and
+shuffled them around a little bit (for some unknown reason).
+
+@node Other charsets, Internals, Micro charsets, Top
+@chapter Some other charsets
+
+Even if these charsets were originally added to @code{recode} for
+handling texts written in French, they find other uses.  We did use them
+lot for writing French diacriticized texts in the past, so @code{recode}
+knows how to handle these particularly well for French texts.
+
+@menu
+* LaTeX::               ASCII with LaTeX codes
+* Texte::               ASCII with easy French conventions
+* HTML::                World Wide Web representations
+@end menu
+
+@node LaTeX, Texte, Other charsets, Other charsets
+@section ASCII with LaTeX codes
+
+This charset is available in @code{recode} under the name @code{LaTeX}
+and has @code{ltex} as an alias.  It is used for ASCII files coded to be
+read by La@TeX{} or, in certain cases, by @TeX{}.
+
+Whenever you recode from another charset to @code{LaTeX}, beware that
+all occurrences of backslashes @kbd{\} are usually translated into
+the string @samp{\backslash@{@}}.  However, in practice, people often
+use backslashes in the other charset for introducing @TeX{} commands,
+compromising it: it is not pure @TeX{}, nor it is pure other charset.
+This translation of backslashes into @samp{\backslash@{@}} can be rather
+inconvenient, it may be inhibited through the command option @code{-d}.
+
+@node Texte, HTML, LaTeX, Other charsets
+@section ASCII with easy French conventions
+
+This charset is available in @code{recode} under the name @code{Texte}
+and has @code{txte} for an alias.
+
+This charset is a seven bits code, identical to @code{ASCII-BS}, save
+for French diacritics which are noted using a slightly different
+convention.
+
+At text entry time, these conventions provide a little speed up.  At
+read time, they slightly improve the readability over a few alternate
+ways of coding diacritics.  Of course, it would better to have a
+specialized keyboard to make direct eight bits entries and fonts for
+immediately displaying eight bit ISO Latin-1 characters.  But not
+everybody is so fortunate.  In several mailing environments, the eight
+bit is often willingfully destroyed.
+
+Easy French has been in use in France for a while.  I only slightly
+adapted it (the diaeresis option) to make it more comfortable to several
+usages in Qu@'ebec originating from Universit@'e de Montr@'eal.  In
+fact, the main problem for me was not to necessarily to invent Easy
+French, but to recognize the ``best'' convention to use, (best is not
+being defined, here) and to try to solve the main pitfalls associated
+with the selected convention.
+
+@menu
+* Diacritics::          Diacritics
+* Ending diaeresis::    List of words ending with diaeresis
+@end menu
+
+@node Diacritics, Ending diaeresis, Texte, Texte
+@subsection Diacritics
+
+French quotes (sometimes called ``angle quotes'') are noted the same way
+English quotes are noted in @TeX{}, @emph{id est} by @kbd{``} and
+@kbd{''}.
+
+No effort has been put to preserve Latin ligatures (@kbd{ae}, @kbd{oe})
+which are representable in several other charsets.  So, these ligatures
+may be lost through Easy French conventions.
+
+This is almost the French convention for simplified diacritics entry:
+
+@table @kbd
+@item e'
+Acute accent
+@item e`
+Grave accent
+@item e^
+Circumflex accent
+@item e"
+Diaeresis
+@item c,
+Cedilla
+@end table
+
+In some countries, @kbd{:} is used instead of @kbd{"} to mark diaeresis.
+@code{recode} support one convention on a single call, depending on the
+@code{-c} option of the @code{recode} command.
+
+The convention is prone to loosing information, because the diacritic
+meaning overloads some characters that already have other uses.  To
+alleviate this, some knowledge of the French language is boosted into
+the recognition routines.  So, the following subtleties are systematically
+obeyed by the various recognizers.
+
+@itemize @bullet
+@item
+A single quote which follows a @kbd{e} does not necessarily means an acute
+accent if it is followed by a single other one.  For example:
+
+@table @kbd
+@item e'
+will give an @kbd{e} with an acute accent.
+@item e''
+will give a simple @kbd{e}, with a closing quotation mark.
+@item e'''
+will give an @kbd{e} with an acute accent, followed by a closing quotation
+mark.
+@end table
+
+There is a problem induced by this convention if there are English
+quotations with a French text.  In sentences like:
+
+@example
+There's a meeting at Archie's restaurant.
+@end example
+
+the single quotes will be mistaken twice for acute accents.  So English
+contractions and suffix possessives could be mangled.
+
+@item
+A double quote or colon, depending on @code{-c} option, which follows a
+vowel is interpreted as diaeresis only if it is followed by another
+letter.  But there are in French several words that @emph{end} with a
+diaeresis, the program also recognizes them.  @xref{Ending diaeresis},
+for a study of all the problematic cases.
+
+@item
+A comma which follows a @kbd{c} is interpreted as a cedilla only if it is
+followed by one of the vowels @kbd{a}, @kbd{o} and @kbd{u}.
+
+@end itemize
+
+@node Ending diaeresis,  , Diacritics, Texte
+@subsection List of words ending with diaeresis
+
+Here is a classification of all cases of a diaeresis at the end of a French
+word:
+
+@itemize @bullet
+@item
+Words ending in ``igue''
+
+@itemize -
+@item
+Feminine words without a relative masculine: @samp{besaigue"} and
+@samp{cigue"}.
+
+@item
+Feminine words with a relative masculine (1): @samp{aigue"},
+@samp{ambigue"}, @samp{contigue"}, @samp{exigue"}, @samp{subaigue"} and
+@samp{suraigue"}.
+
+@end itemize
+
+@item
+Words not ending in ``igue''
+
+@itemize -
+@item
+Ended by ``i'' (2): @samp{ai"}, @samp{congai"}, @samp{goi"},
+@samp{hai"kai"}, @samp{inoui"}, @samp{sai"}, @samp{samurai"},
+@samp{thai"} and @samp{tokai"}.
+
+@item
+Ended by ``e'': @samp{canoe"}.
+
+@item
+Ended by ``u'' (3): @samp{Esau"}.
+
+@end itemize
+@end itemize
+
+Notes:
+
+@enumerate
+@item
+There are supposed to be seven words in this case.  So, one is missing.
+
+@item
+Look at one of the following sentences (the second has to be interpreted
+with the @code{-c} option):
+
+@example
+"Ai"e!  Voici le proble`me que j'ai"
+Ai:e!  Voici le proble`me que j'ai:
+@end example
+
+There is an ambiguity between an @samp{ai"}, the small animal, and the
+indicative future of @emph{avoir} (first person singular), when followed
+by what could be a diaeresis mark.  Hopefully, the case is solved by the
+fact that an apostrophe always precedes the verb and almost never the
+animal.
+
+@item
+I did not pay attention to proper nouns, but this one showed up as being
+fairly evident.
+
+@end enumerate
+
+Just to complete this topic, note that it would be wrong to make a rule
+for all words ending in ``igue'' as needing a diaerisis.  Here are
+counter-examples: @samp{becfigue}, @samp{be`sigue}, @samp{bigue},
+@samp{bordigue}, @samp{bourdigue}, @samp{brigue}, @samp{contre-digue},
+@samp{digue}, @samp{d'intrigue}, @samp{fatigue}, @samp{figue},
+@samp{garrigue}, @samp{gigue}, @samp{igue}, @samp{intrigue},
+@samp{ligue}, @samp{prodigue}, @samp{sarigue} and @samp{zigue}.
+
+@node HTML,  , Texte, Other charsets
+@section World Wide Web representations
+
+This charset is available in @code{recode} under the name @code{HTML}
+and has @code{w3} and @code{WWW} for aliases.
+
+HTML texts used by World Wide Web limit themselves to 7-bit characters
+internally, special sequences beginning with an ampersand @kbd{&} and
+ending with a semicolon @kbd{;} are used for representing characters
+from Latin-1 having the 8th bit set.
+
+When you recode from another charset to @code{HTML}, beware that all
+occurrences of ampersands are usually translated into the string
+@samp{&amp;}, similarly, left angle brackets @kbd{<} are translated
+into @samp{&lt;} and right angle brackets @kbd{>} are translated into
+@samp{&gt;}.  However, in practice, people often use ampersands and
+angle brackets in the other charset for introducing HTML commands,
+compromising it: it is not pure HTML, not it is pure other charset.
+These three translations can be rather inconvenient, they may be
+specifically inhibited through the command option @code{-d}.
+
+@node Internals,  , Other charsets, Top
+@chapter Internal aspects
+
+Suppose that four elementary steps are selected at path optimization
+time.  Then @code{recode} will split itself into four different tasks
+interconnected with pipes, logically equivalent to:
+
+@example
+@var{step1} <@var{input} | @var{step2} | @var{step3} | @var{step4} >@var{output}
+@end example
+
+@menu
+* Main flow::           Overall organization
+* New charsets::        Adding new charsets
+@end menu
+
+@node Main flow, New charsets, Internals, Internals
+@section Overall organization
+
+The main driver constructs, while initializing all conversion modules, a
+table giving all the conversion routines available (@dfn{single step}s)
+and for each, the starting charset and the ending charset.  If we
+consider these charsets as being the nodes of a directed graph, each
+single step may be considered as oriented arc from one node to the
+other.  A cost is attributed to each arc: for example, a high penalty
+is given to single steps which are prone to loosing characters, a low
+penalty is given to those which need studying more than one input
+character for producing an output character, etc.
+
+Given a starting code and a goal code, @code{recode} computes the most
+economical route through the elementary recodings, that is, the best
+sequence of conversions that will transform the input charset into the
+final charset.  To speed up execution, @code{recode} looks for
+subsequences of conversions which are simple enough to be merged, it
+then dynamically creates new single steps for these mergings.
+
+A @dfn{double step} is a sequence of two single steps, the output of the
+first being the special charset @code{rfc1345}, the input of the second
+single step being also @code{rfc1345}.  A special machinery dynamically
+produces efficient, reversible, merge-able single steps out of these
+double steps.
+
+The main part of @code{recode} is written in C, as are most single
+steps.  A few single steps need to recognize sequences of multiple
+characters, they are often better written in @code{flex}.
+
+@node New charsets,  , Main flow, Internals
+@section Adding new charsets
+
+It is easy for a programmer to add a new charset to @code{recode}.  All
+it requires is making a few functions kept in a single @file{.c} file,
+adjusting @file{Makefile.in}, and remaking @code{recode}.
+
+One of the function should convert from any previous charset to the new
+one.  Any previous charset will do, but try to select it so you will not
+loose too much information while converting.  The other function should
+convert from the new charset to any older one.  You do not have to
+select the same old charset than what you selected for the previous
+routine.  Once again, select any charset for which you will not loose
+too much information while converting.
+
+If, for any of these two functions, you have to read multiple bytes of
+the old charset before recognizing the character to produce, you might
+prefer programming it in @code{flex} in a separate @file{.l} file.
+Prototype your C or @code{flex} files after one of those which exist
+already, so to keep the sources uniform.  Besides, at @code{make} time,
+all @file{.l} files are automatically merged into a single big one by
+the script @file{mergelex.awk}, which requires sources to follow some
+rules.  Mimetism is a simple approach which relieves me of explaining
+all these rules!
+
+Each of your source files should have its own initialization function,
+named @code{module_@var{charset}}, which is meant to be executed
+quickly, once, prior to any recoding.  It should declare the name of
+your charsets and the single steps (or elementary recodings) you
+provide, by calling @code{declare_step} one or more times.  Besides the
+charset names, @code{declare_step} expects a description of the recoding
+quality (see @file{recode.h}) and two functions you also provide.
+
+The first such function has the purpose of allocating structures,
+preconditioning conversion tables, etc.  It is also the usual way of
+further modifying the @code{STEP} structure.  This function is executed
+only if and when the single step is retained in an actual recoding
+sequence.  If you do not need such delayed initialization, merely use
+@code{NULL} for the function argument.
+
+The second function executes the elementary recoding on a whole file.
+There are a few cases when you can spare writing this function:
+
+@itemize @bullet
+
+@item
+Some single steps do nothing else than a pure copy of the input onto the
+output, in this case, you can use the predefined function
+@code{file_one_to_one}, while having a delayed initialization for
+presetting the @code{STEP} field @code{one_to_one} to the predefined
+value @code{one_to_same}.
+
+@item
+Some single steps are driven by a table which recodes one character into
+another; if the recoding does nothing else, you can use the predefined
+function @code{file_one_to_one}, while having a delayed initialization
+for presetting the @code{STEP} field @code{one_to_one} with your table.
+
+@item
+Some single steps are driven by a table which recodes one character into
+a string; if the recoding does nothing else, you can use the predefined
+function @code{file_one_to_many}, while having a delayed initialization
+for presetting the @code{STEP} field @code{one_to_many} with your table.
+
+@end itemize
+
+If you have a recoding table handy in a suitable format but do not use
+one of the predefined recoding functions, it is still a good idea to use
+a delayed initialization to save it anyway, because @code{recode} option
+@code{-h} will take advantage of this information when available.
+
+Finally, edit @file{Makefile.in} to add the source file name of your
+routines to the @code{C_STEPS} or @code{L_STEPS} macro definition,
+depending on the fact your routines is written in C or in @code{flex}.
+For C files only, also modify the @code{STEPOBJS} macro definition.
+
+@contents
+@bye
+
+@c Local Variables:
+@c texinfo-column-for-description: 24
+@c End:
diff --git a/rfc1345.txt b/rfc1345.txt
new file mode 100644 (file)
index 0000000..875cd84
--- /dev/null
@@ -0,0 +1,6078 @@
+
+
+
+
+Network Working Group                                        K. Simonsen
+Request for Comments: 1345                   Rationel Almen Planlaegning
+                                                               June 1992
+
+
+                  Character Mnemonics & Character Sets
+
+Status of the Memo
+
+   This memo provides information for the Internet community.  It does
+   not specify an Internet standard.  Distribution of this memo is
+   unlimited.
+
+Summary
+
+   This memo lists a selection of characters and their presence in some
+   coded character sets. To facilitate the coded character set
+   tabulations an unambiguous mnemonic for each character is used, and a
+   format for tabulating the coded character sets is defined. The coded
+   character sets are given names for easy reference. A family of coded
+   character sets called the mnemonic character sets and conversion
+   between these coded character set without information loss is
+   defined.
+
+   The character set names are registered with the Internet Assigned
+   Numbers Authority (IANA).  Additional character sets not described in
+   this memo should be registered with the IANA. This memo may be
+   updated periodically, or additional specifications may be published,
+   to reflect other coded character sets.
+
+   Please send any comments including comments about the accuracy of the
+   tables to the author, Keld Simonsen <Keld.Simonsen@dkuug.dk>.
+
+1.  INTRODUCTION
+
+   With the growing internationalization of the Internet, support for
+   many coded character sets is required. It is the intention of this
+   memo to document precisely the mapping between all characters and
+   their corresponding coded representations in various coded character
+   sets, and give names to these coded character sets, so they can be
+   referenced unambiguously in Internet standards.
+
+   This memo does not indicate anything about the validity of using
+   these specifications in any Internet standard, so you should consult
+   each individual Internet standard to see which coded character sets
+   and names are allowed there.
+
+   Unambiguous character mnemonics are specified, which provide a
+   practical way of identifying a character, without reference to a
+   coded character set and its code in this coded character set.  The
+   mnemonics are written in a minimal set of characters, namely the
+   invariant 83 graphical characters of ISO 646, which is a kind of
+   greatest common subset to be found between the majority of coded
+
+Simonsen                                                        [Page 1]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+   character sets, including ASCII, national variants of the ISO 646 7-
+   bit character set and various EBCDICs.  In addition, the numeric
+   value of the coded representations of all these characters are the
+   same in all coded character sets compatible with ISO standards.  All
+   of them except two, EXCLAMATION MARK and QUOTATION MARK, have the
+   same coded representation in all variants of EBCDIC.  This minimal
+   set of characters is called the reference character set in this memo.
+
+   The mnemonics can be used in Internet standards for easy and
+   unambiguous reference, and they can also serve as a fallback
+   representation in various Internet specifications.
+
+   The coded character sets covered include all parts of ISO 8859, ISO
+   6937-2 and all ISO 646 conforming coded character sets in the ISO
+   character set registry managed by ECMA according to ISO 2375.  Almost
+   all graphic coded character sets in the ECMA registry (1) are
+   covered.  The graphic coded character sets not included are registry
+   numbers 31, 38, 39, 53, 59, 68, 71, 72, 129 and 137.  In addition
+   many vendor defined character sets are covered, including PC
+   codepages (4), (7), (8), many EBCDIC character sets (4), (5), (6) and
+   HP, DEC and Apple character sets (8), (9), (10), (13), (14).  The
+   East-Asian 16-bit character sets from the ECMA registry is also
+   included in this memo.
+
+2.  CHARACTER MNEMONICS
+
+2.1  General Syntax
+
+   The character mnemonics are taken from the ISO committee draft (CD)
+   of the POSIX.2 standard (3).  They are classified into two groups:
+
+
+   1. A group with two-character mnemonics
+      - Primarily intended for alphabetic scripts like Latin, Greek,
+        Cyrillic, Hebrew and Arabic, and special characters.
+   2. A group with variable-length mnemonics
+      - primarily intended for non-alphabetic scripts like Japanese and
+        Chinese, but also used for some accented letters and special
+        characters.
+
+   In the two-character mnemonics, all invariant graphic character in
+   the ISO 646 character codes except "&" are used, i.e. the following
+   characters:
+
+           ! "     %   ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+             A B C D E F G H I J K L M N O P Q R S T U V W X Y Z       _
+             a b c d e f g h i j k l m n o p q r s t u v w x y z
+
+   The character "_" is not used as the first character.
+
+   In the variable-length mnemonics, the character "_" is not  used as
+   the first character. If it is used in a name, its presence is
+   doubled.
+
+Simonsen                                                        [Page 2]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+   The mnemonics can be used in several different ways for different
+   purposes.  One of these is description of coded character sets, which
+   is detailed in section 3.  Another is for extending a given coded
+   character set to a mnemonic character set.  This is described in
+   section 4.  The restrictions on the use of the characters "&" and "_"
+   are due to demands of the compositional methods of these techniques.
+
+2.2  ISO Official Long Descriptive Character Name
+
+   For all mnemonics, the character for which it stands is indicated in
+   the following table by a long descriptive name.  This name is
+   identical to the ISO name of the character as given in reference (2).
+   For a few characters that are not included there, descriptive names
+   of the same kind are introduced in this memo.  The source of each
+   character is stated in the table after the name and should be
+   consulted for a reliable identification of the character.
+
+   These long descriptive names consists only of the capital Latin
+   letters of the invariant part of ISO 646, the digits, "-", and SPACE.
+   Digits are only used in names of ideographic and Hangul characters
+   and never as the first character.
+
+2.3  The 2-character Mnemonics
+
+   The two-character mnemonics include various accented Latin letters,
+   Greek, Cyrillic, Hebrew, Arabic, Hiragana and Katakana.  Also a fair
+   number of special characters are included.  Almost all ISO or ISO
+   registered 7- and 8-bit graphical coded character sets are covered
+   with these two-character mnemonics.
+
+   The two characters are chosen so the graphical appearance in the
+   reference set resembles as much as possible (within the possibilities
+   available) the graphical appearance of the character. The basic
+   character set of ISO 646 is used as the reference set, as mentioned
+   above.
+
+   The characters in the reference character set are chosen to represent
+   themselves.
+
+   For control characters from ISO 646 the two-character acronyms of ISO
+   2047 are used as mnemonics.  For the other control characters of ISO
+   6429, two-character mnemonics have been selected based on the
+   variable-length acronyms used in that standard.
+
+   Letters, including Greek, Cyrillic, Arabic and Hebrew, are
+   represented with the base letter as the first letter, and the second
+   letter represents an accent or relation to a non-Latin script.  Non-
+   Latin letters are transliterated to Latin letters, following
+   transliteration standards as closely as possible.  This is also done
+   with the Latin letters such as ETH and THORN, and the
+   Danish/Norwegian/Swedish letter A WITH RING ABOVE is transliterated
+   into "aa".
+
+
+Simonsen                                                        [Page 3]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+   After a letter, the second character signifies the following:
+
+     Exclamation mark           ! Grave
+     Apostrophe                 ' Acute accent
+     Greater-Than sign          > Circumflex accent
+     Question Mark              ? tilde
+     Hyphen-Minus               - Macron
+     Left parenthesis           ( Breve
+     Full Stop                  . Dot Above
+     Colon                      : Diaeresis
+     Comma                      , Cedilla
+     Underline                  _ Underline
+     Solidus                    / Stroke
+     Quotation mark             " Double acute accent
+     Semicolon                  ; Ogonek
+     Less-Than sign             < Caron
+     Zero                       0 Ring above
+     Two                        2 Hook
+     Nine                       9 Horn
+
+     Equals                     = Cyrillic
+     Asterisk                   * Greek
+     Percent sign               % Greek/Cyrillic special
+     Plus                       + smalls: Arabic, capitals: Hebrew
+     Three                      3 some Latin/Greek/Cyrillic letters
+     Four                       4 Bopomofo
+     Five                       5 Hiragana
+     Six                        6 Katakana
+
+   In designing the mnemonics the following special characters were
+   reserved: The ampersand is reserved as an intro character, indicating
+   that the following string is in the mnemonic character set.  The
+   underline character is reserved for the variable-length mnemonics.
+   This use does not eliminate usage as an accent or language
+   identifier.
+
+   Special characters are encoded with some mnemonic value.  These are
+   not systematic thruout, but most mnemonics start with a related
+   special character of the reference set.
+
+2.4  The Variable-length Character Mnemonics
+
+   The Variable-length Character Mnemonics are primarily meant for the
+   ideographic characters in larger Asian character sets, but are also
+   used for accented characters with several accents and some special
+   characters. To have the mnemonics as short as possible, which both
+   saves storage and is easier to input, a quite short name is
+   preferred. Considering the Chinese standard GB 2312-1980, the
+   Japanese standards JIS X0208 and JIS X0212, and the Korean standard
+   KS C 5601, they are all given by row and column numbers between 1 and
+   94. So two positions for row and column and a character set
+   identifier of one character would be almost as short as possible.
+   The following character set identifiers are defined:
+
+Simonsen                                                        [Page 4]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+            c   GB 2312-1980
+            j   JIS X0208-1990
+            J   JIS X0212-1990
+            k   KS C 5601-1987
+
+   This system for the representation of ideographic characters and
+   Hangul characters is not truly mnemonic, but it provides short
+   representations that are easy to connect to the corresponding
+   character by means of the code table of an official character set
+   standard. Alternative methods based on the graphic appearance or the
+   pronunciation of the characters are thought to be unfeasible.
+
+   One prominent character in the reference character set is reserved
+   for identifying variable-length mnemonics, namely the underline
+   character "_". This character is intended as a delimiter both in the
+   front and in the end of the mnemonic. An example of its use would be:
+   (&=intro):
+
+             &_j3210_ &_j4436_&_j6530_
+
+3.  CHARACTER MNEMONIC TABLE
+
+   The following table contains the character mnemonic and the encoding
+   and long descriptive name of ISO 2DIS 10646 (2).  Although the ISO
+   10646 is only at DIS stage at this moment of writing and there is
+   quite some debate about it, the long descriptive naming in the DIS is
+   considered to be stable and the best official ISO reference to
+   character names. The 2-octet encoded value of the ISO 2DIS 10646 is
+   also used, but only as an identification of the character, and it
+   should only be used for identification purposes as the coded
+   representation may be changed in the final 10646 international
+   standard. Some characters not in the ISO 2DIS 10646 are allocated
+   values in the private use zone and given names and references to a
+   character set where it is used.
+
+   The format of the table is:
+
+   1st field is the character mnemonic (mostly 2 characters).
+   2nd field is the ISO 2DIS 10646 code in hexadecimal.
+   3rd field is the long descriptive name of ISO 2DIS 10646.
+
+ SP     0020    SPACE
+ !      0021    EXCLAMATION MARK
+ "      0022    QUOTATION MARK
+ Nb     0023    NUMBER SIGN
+ DO     0024    DOLLAR SIGN
+ %      0025    PERCENT SIGN
+ &      0026    AMPERSAND
+ '      0027    APOSTROPHE
+ (      0028    LEFT PARENTHESIS
+ )      0029    RIGHT PARENTHESIS
+ *      002a    ASTERISK
+ +      002b    PLUS SIGN
+
+Simonsen                                                        [Page 5]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ ,      002c    COMMA
+ -      002d    HYPHEN-MINUS
+ .      002e    FULL STOP
+ /      002f    SOLIDUS
+ 0      0030    DIGIT ZERO
+ 1      0031    DIGIT ONE
+ 2      0032    DIGIT TWO
+ 3      0033    DIGIT THREE
+ 4      0034    DIGIT FOUR
+ 5      0035    DIGIT FIVE
+ 6      0036    DIGIT SIX
+ 7      0037    DIGIT SEVEN
+ 8      0038    DIGIT EIGHT
+ 9      0039    DIGIT NINE
+ :      003a    COLON
+ ;      003b    SEMICOLON
+ <      003c    LESS-THAN SIGN
+ =      003d    EQUALS SIGN
+ >      003e    GREATER-THAN SIGN
+ ?      003f    QUESTION MARK
+ At     0040    COMMERCIAL AT
+ A      0041    LATIN CAPITAL LETTER A
+ B      0042    LATIN CAPITAL LETTER B
+ C      0043    LATIN CAPITAL LETTER C
+ D      0044    LATIN CAPITAL LETTER D
+ E      0045    LATIN CAPITAL LETTER E
+ F      0046    LATIN CAPITAL LETTER F
+ G      0047    LATIN CAPITAL LETTER G
+ H      0048    LATIN CAPITAL LETTER H
+ I      0049    LATIN CAPITAL LETTER I
+ J      004a    LATIN CAPITAL LETTER J
+ K      004b    LATIN CAPITAL LETTER K
+ L      004c    LATIN CAPITAL LETTER L
+ M      004d    LATIN CAPITAL LETTER M
+ N      004e    LATIN CAPITAL LETTER N
+ O      004f    LATIN CAPITAL LETTER O
+ P      0050    LATIN CAPITAL LETTER P
+ Q      0051    LATIN CAPITAL LETTER Q
+ R      0052    LATIN CAPITAL LETTER R
+ S      0053    LATIN CAPITAL LETTER S
+ T      0054    LATIN CAPITAL LETTER T
+ U      0055    LATIN CAPITAL LETTER U
+ V      0056    LATIN CAPITAL LETTER V
+ W      0057    LATIN CAPITAL LETTER W
+ X      0058    LATIN CAPITAL LETTER X
+ Y      0059    LATIN CAPITAL LETTER Y
+ Z      005a    LATIN CAPITAL LETTER Z
+ <(     005b    LEFT SQUARE BRACKET
+ //     005c    REVERSE SOLIDUS
+ )>     005d    RIGHT SQUARE BRACKET
+ '>     005e    CIRCUMFLEX ACCENT
+ _      005f    LOW LINE
+ '!     0060    GRAVE ACCENT
+
+Simonsen                                                        [Page 6]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ a      0061    LATIN SMALL LETTER A
+ b      0062    LATIN SMALL LETTER B
+ c      0063    LATIN SMALL LETTER C
+ d      0064    LATIN SMALL LETTER D
+ e      0065    LATIN SMALL LETTER E
+ f      0066    LATIN SMALL LETTER F
+ g      0067    LATIN SMALL LETTER G
+ h      0068    LATIN SMALL LETTER H
+ i      0069    LATIN SMALL LETTER I
+ j      006a    LATIN SMALL LETTER J
+ k      006b    LATIN SMALL LETTER K
+ l      006c    LATIN SMALL LETTER L
+ m      006d    LATIN SMALL LETTER M
+ n      006e    LATIN SMALL LETTER N
+ o      006f    LATIN SMALL LETTER O
+ p      0070    LATIN SMALL LETTER P
+ q      0071    LATIN SMALL LETTER Q
+ r      0072    LATIN SMALL LETTER R
+ s      0073    LATIN SMALL LETTER S
+ t      0074    LATIN SMALL LETTER T
+ u      0075    LATIN SMALL LETTER U
+ v      0076    LATIN SMALL LETTER V
+ w      0077    LATIN SMALL LETTER W
+ x      0078    LATIN SMALL LETTER X
+ y      0079    LATIN SMALL LETTER Y
+ z      007a    LATIN SMALL LETTER Z
+ (!     007b    LEFT CURLY BRACKET
+ !!     007c    VERTICAL LINE
+ !)     007d    RIGHT CURLY BRACKET
+ '?     007e    TILDE
+ NS     00a0    NO-BREAK SPACE
+ !I     00a1    INVERTED EXCLAMATION MARK
+ Ct     00a2    CENT SIGN
+ Pd     00a3    POUND SIGN
+ Cu     00a4    CURRENCY SIGN
+ Ye     00a5    YEN SIGN
+ BB     00a6    BROKEN BAR
+ SE     00a7    SECTION SIGN
+ ':     00a8    DIAERESIS
+ Co     00a9    COPYRIGHT SIGN
+ -a     00aa    FEMININE ORDINAL INDICATOR
+ <<     00ab    LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ NO     00ac    NOT SIGN
+ --     00ad    SOFT HYPHEN
+ Rg     00ae    REGISTERED SIGN
+ 'm     00af    MACRON
+ DG     00b0    DEGREE SIGN
+ +-     00b1    PLUS-MINUS SIGN
+ 2S     00b2    SUPERSCRIPT TWO
+ 3S     00b3    SUPERSCRIPT THREE
+ ''     00b4    ACUTE ACCENT
+ My     00b5    MICRO SIGN
+ PI     00b6    PILCROW SIGN
+
+Simonsen                                                        [Page 7]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ .M     00b7    MIDDLE DOT
+ ',     00b8    CEDILLA
+ 1S     00b9    SUPERSCRIPT ONE
+ -o     00ba    MASCULINE ORDINAL INDICATOR
+ >>     00bb    RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ 14     00bc    VULGAR FRACTION ONE QUARTER
+ 12     00bd    VULGAR FRACTION ONE HALF
+ 34     00be    VULGAR FRACTION THREE QUARTERS
+ ?I     00bf    INVERTED QUESTION MARK
+ A!     00c0    LATIN CAPITAL LETTER A WITH GRAVE
+ A'     00c1    LATIN CAPITAL LETTER A WITH ACUTE
+ A>     00c2    LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ A?     00c3    LATIN CAPITAL LETTER A WITH TILDE
+ A:     00c4    LATIN CAPITAL LETTER A WITH DIAERESIS
+ AA     00c5    LATIN CAPITAL LETTER A WITH RING ABOVE
+ AE     00c6    LATIN CAPITAL LETTER AE
+ C,     00c7    LATIN CAPITAL LETTER C WITH CEDILLA
+ E!     00c8    LATIN CAPITAL LETTER E WITH GRAVE
+ E'     00c9    LATIN CAPITAL LETTER E WITH ACUTE
+ E>     00ca    LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ E:     00cb    LATIN CAPITAL LETTER E WITH DIAERESIS
+ I!     00cc    LATIN CAPITAL LETTER I WITH GRAVE
+ I'     00cd    LATIN CAPITAL LETTER I WITH ACUTE
+ I>     00ce    LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ I:     00cf    LATIN CAPITAL LETTER I WITH DIAERESIS
+ D-     00d0    LATIN CAPITAL LETTER ETH (Icelandic)
+ N?     00d1    LATIN CAPITAL LETTER N WITH TILDE
+ O!     00d2    LATIN CAPITAL LETTER O WITH GRAVE
+ O'     00d3    LATIN CAPITAL LETTER O WITH ACUTE
+ O>     00d4    LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ O?     00d5    LATIN CAPITAL LETTER O WITH TILDE
+ O:     00d6    LATIN CAPITAL LETTER O WITH DIAERESIS
+ *X     00d7    MULTIPLICATION SIGN
+ O/     00d8    LATIN CAPITAL LETTER O WITH STROKE
+ U!     00d9    LATIN CAPITAL LETTER U WITH GRAVE
+ U'     00da    LATIN CAPITAL LETTER U WITH ACUTE
+ U>     00db    LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ U:     00dc    LATIN CAPITAL LETTER U WITH DIAERESIS
+ Y'     00dd    LATIN CAPITAL LETTER Y WITH ACUTE
+ TH     00de    LATIN CAPITAL LETTER THORN (Icelandic)
+ ss     00df    LATIN SMALL LETTER SHARP S (German)
+ a!     00e0    LATIN SMALL LETTER A WITH GRAVE
+ a'     00e1    LATIN SMALL LETTER A WITH ACUTE
+ a>     00e2    LATIN SMALL LETTER A WITH CIRCUMFLEX
+ a?     00e3    LATIN SMALL LETTER A WITH TILDE
+ a:     00e4    LATIN SMALL LETTER A WITH DIAERESIS
+ aa     00e5    LATIN SMALL LETTER A WITH RING ABOVE
+ ae     00e6    LATIN SMALL LETTER AE
+ c,     00e7    LATIN SMALL LETTER C WITH CEDILLA
+ e!     00e8    LATIN SMALL LETTER E WITH GRAVE
+ e'     00e9    LATIN SMALL LETTER E WITH ACUTE
+ e>     00ea    LATIN SMALL LETTER E WITH CIRCUMFLEX
+ e:     00eb    LATIN SMALL LETTER E WITH DIAERESIS
+
+Simonsen                                                        [Page 8]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ i!     00ec    LATIN SMALL LETTER I WITH GRAVE
+ i'     00ed    LATIN SMALL LETTER I WITH ACUTE
+ i>     00ee    LATIN SMALL LETTER I WITH CIRCUMFLEX
+ i:     00ef    LATIN SMALL LETTER I WITH DIAERESIS
+ d-     00f0    LATIN SMALL LETTER ETH (Icelandic)
+ n?     00f1    LATIN SMALL LETTER N WITH TILDE
+ o!     00f2    LATIN SMALL LETTER O WITH GRAVE
+ o'     00f3    LATIN SMALL LETTER O WITH ACUTE
+ o>     00f4    LATIN SMALL LETTER O WITH CIRCUMFLEX
+ o?     00f5    LATIN SMALL LETTER O WITH TILDE
+ o:     00f6    LATIN SMALL LETTER O WITH DIAERESIS
+ -:     00f7    DIVISION SIGN
+ o/     00f8    LATIN SMALL LETTER O WITH STROKE
+ u!     00f9    LATIN SMALL LETTER U WITH GRAVE
+ u'     00fa    LATIN SMALL LETTER U WITH ACUTE
+ u>     00fb    LATIN SMALL LETTER U WITH CIRCUMFLEX
+ u:     00fc    LATIN SMALL LETTER U WITH DIAERESIS
+ y'     00fd    LATIN SMALL LETTER Y WITH ACUTE
+ th     00fe    LATIN SMALL LETTER THORN (Icelandic)
+ y:     00ff    LATIN SMALL LETTER Y WITH DIAERESIS
+ A-     0100    LATIN CAPITAL LETTER A WITH MACRON
+ a-     0101    LATIN SMALL LETTER A WITH MACRON
+ A(     0102    LATIN CAPITAL LETTER A WITH BREVE
+ a(     0103    LATIN SMALL LETTER A WITH BREVE
+ A;     0104    LATIN CAPITAL LETTER A WITH OGONEK
+ a;     0105    LATIN SMALL LETTER A WITH OGONEK
+ C'     0106    LATIN CAPITAL LETTER C WITH ACUTE
+ c'     0107    LATIN SMALL LETTER C WITH ACUTE
+ C>     0108    LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ c>     0109    LATIN SMALL LETTER C WITH CIRCUMFLEX
+ C.     010a    LATIN CAPITAL LETTER C WITH DOT ABOVE
+ c.     010b    LATIN SMALL LETTER C WITH DOT ABOVE
+ C<     010c    LATIN CAPITAL LETTER C WITH CARON
+ c<     010d    LATIN SMALL LETTER C WITH CARON
+ D<     010e    LATIN CAPITAL LETTER D WITH CARON
+ d<     010f    LATIN SMALL LETTER D WITH CARON
+ D/     0110    LATIN CAPITAL LETTER D WITH STROKE
+ d/     0111    LATIN SMALL LETTER D WITH STROKE
+ E-     0112    LATIN CAPITAL LETTER E WITH MACRON
+ e-     0113    LATIN SMALL LETTER E WITH MACRON
+ E(     0114    LATIN CAPITAL LETTER E WITH BREVE
+ e(     0115    LATIN SMALL LETTER E WITH BREVE
+ E.     0116    LATIN CAPITAL LETTER E WITH DOT ABOVE
+ e.     0117    LATIN SMALL LETTER E WITH DOT ABOVE
+ E;     0118    LATIN CAPITAL LETTER E WITH OGONEK
+ e;     0119    LATIN SMALL LETTER E WITH OGONEK
+ E<     011a    LATIN CAPITAL LETTER E WITH CARON
+ e<     011b    LATIN SMALL LETTER E WITH CARON
+ G>     011c    LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ g>     011d    LATIN SMALL LETTER G WITH CIRCUMFLEX
+ G(     011e    LATIN CAPITAL LETTER G WITH BREVE
+ g(     011f    LATIN SMALL LETTER G WITH BREVE
+ G.     0120    LATIN CAPITAL LETTER G WITH DOT ABOVE
+
+Simonsen                                                        [Page 9]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ g.     0121    LATIN SMALL LETTER G WITH DOT ABOVE
+ G,     0122    LATIN CAPITAL LETTER G WITH CEDILLA
+ g,     0123    LATIN SMALL LETTER G WITH CEDILLA
+ H>     0124    LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ h>     0125    LATIN SMALL LETTER H WITH CIRCUMFLEX
+ H/     0126    LATIN CAPITAL LETTER H WITH STROKE
+ h/     0127    LATIN SMALL LETTER H WITH STROKE
+ I?     0128    LATIN CAPITAL LETTER I WITH TILDE
+ i?     0129    LATIN SMALL LETTER I WITH TILDE
+ I-     012a    LATIN CAPITAL LETTER I WITH MACRON
+ i-     012b    LATIN SMALL LETTER I WITH MACRON
+ I(     012c    LATIN CAPITAL LETTER I WITH BREVE
+ i(     012d    LATIN SMALL LETTER I WITH BREVE
+ I;     012e    LATIN CAPITAL LETTER I WITH OGONEK
+ i;     012f    LATIN SMALL LETTER I WITH OGONEK
+ I.     0130    LATIN CAPITAL LETTER I WITH DOT ABOVE
+ i.     0131    LATIN SMALL LETTER I DOTLESS
+ IJ     0132    LATIN CAPITAL LIGATURE IJ
+ ij     0133    LATIN SMALL LIGATURE IJ
+ J>     0134    LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ j>     0135    LATIN SMALL LETTER J WITH CIRCUMFLEX
+ K,     0136    LATIN CAPITAL LETTER K WITH CEDILLA
+ k,     0137    LATIN SMALL LETTER K WITH CEDILLA
+ kk     0138    LATIN SMALL LETTER KRA (Greenlandic)
+ L'     0139    LATIN CAPITAL LETTER L WITH ACUTE
+ l'     013a    LATIN SMALL LETTER L WITH ACUTE
+ L,     013b    LATIN CAPITAL LETTER L WITH CEDILLA
+ l,     013c    LATIN SMALL LETTER L WITH CEDILLA
+ L<     013d    LATIN CAPITAL LETTER L WITH CARON
+ l<     013e    LATIN SMALL LETTER L WITH CARON
+ L.     013f    LATIN CAPITAL LETTER L WITH MIDDLE DOT
+ l.     0140    LATIN SMALL LETTER L WITH MIDDLE DOT
+ L/     0141    LATIN CAPITAL LETTER L WITH STROKE
+ l/     0142    LATIN SMALL LETTER L WITH STROKE
+ N'     0143    LATIN CAPITAL LETTER N WITH ACUTE
+ n'     0144    LATIN SMALL LETTER N WITH ACUTE
+ N,     0145    LATIN CAPITAL LETTER N WITH CEDILLA
+ n,     0146    LATIN SMALL LETTER N WITH CEDILLA
+ N<     0147    LATIN CAPITAL LETTER N WITH CARON
+ n<     0148    LATIN SMALL LETTER N WITH CARON
+ 'n     0149    LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+ NG     014a    LATIN CAPITAL LETTER ENG (Lappish)
+ ng     014b    LATIN SMALL LETTER ENG (Lappish)
+ O-     014c    LATIN CAPITAL LETTER O WITH MACRON
+ o-     014d    LATIN SMALL LETTER O WITH MACRON
+ O(     014e    LATIN CAPITAL LETTER O WITH BREVE
+ o(     014f    LATIN SMALL LETTER O WITH BREVE
+ O"     0150    LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ o"     0151    LATIN SMALL LETTER O WITH DOUBLE ACUTE
+ OE     0152    LATIN CAPITAL LIGATURE OE
+ oe     0153    LATIN SMALL LIGATURE OE
+ R'     0154    LATIN CAPITAL LETTER R WITH ACUTE
+ r'     0155    LATIN SMALL LETTER R WITH ACUTE
+
+Simonsen                                                       [Page 10]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ R,     0156    LATIN CAPITAL LETTER R WITH CEDILLA
+ r,     0157    LATIN SMALL LETTER R WITH CEDILLA
+ R<     0158    LATIN CAPITAL LETTER R WITH CARON
+ r<     0159    LATIN SMALL LETTER R WITH CARON
+ S'     015a    LATIN CAPITAL LETTER S WITH ACUTE
+ s'     015b    LATIN SMALL LETTER S WITH ACUTE
+ S>     015c    LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ s>     015d    LATIN SMALL LETTER S WITH CIRCUMFLEX
+ S,     015e    LATIN CAPITAL LETTER S WITH CEDILLA
+ s,     015f    LATIN SMALL LETTER S WITH CEDILLA
+ S<     0160    LATIN CAPITAL LETTER S WITH CARON
+ s<     0161    LATIN SMALL LETTER S WITH CARON
+ T,     0162    LATIN CAPITAL LETTER T WITH CEDILLA
+ t,     0163    LATIN SMALL LETTER T WITH CEDILLA
+ T<     0164    LATIN CAPITAL LETTER T WITH CARON
+ t<     0165    LATIN SMALL LETTER T WITH CARON
+ T/     0166    LATIN CAPITAL LETTER T WITH STROKE
+ t/     0167    LATIN SMALL LETTER T WITH STROKE
+ U?     0168    LATIN CAPITAL LETTER U WITH TILDE
+ u?     0169    LATIN SMALL LETTER U WITH TILDE
+ U-     016a    LATIN CAPITAL LETTER U WITH MACRON
+ u-     016b    LATIN SMALL LETTER U WITH MACRON
+ U(     016c    LATIN CAPITAL LETTER U WITH BREVE
+ u(     016d    LATIN SMALL LETTER U WITH BREVE
+ U0     016e    LATIN CAPITAL LETTER U WITH RING ABOVE
+ u0     016f    LATIN SMALL LETTER U WITH RING ABOVE
+ U"     0170    LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ u"     0171    LATIN SMALL LETTER U WITH DOUBLE ACUTE
+ U;     0172    LATIN CAPITAL LETTER U WITH OGONEK
+ u;     0173    LATIN SMALL LETTER U WITH OGONEK
+ W>     0174    LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ w>     0175    LATIN SMALL LETTER W WITH CIRCUMFLEX
+ Y>     0176    LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ y>     0177    LATIN SMALL LETTER Y WITH CIRCUMFLEX
+ Y:     0178    LATIN CAPITAL LETTER Y WITH DIAERESIS
+ Z'     0179    LATIN CAPITAL LETTER Z WITH ACUTE
+ z'     017a    LATIN SMALL LETTER Z WITH ACUTE
+ Z.     017b    LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ z.     017c    LATIN SMALL LETTER Z WITH DOT ABOVE
+ Z<     017d    LATIN CAPITAL LETTER Z WITH CARON
+ z<     017e    LATIN SMALL LETTER Z WITH CARON
+ O9     01a0    LATIN CAPITAL LETTER O WITH HORN
+ o9     01a1    LATIN SMALL LETTER O WITH HORN
+ OI     01a2    LATIN CAPITAL LETTER OI
+ oi     01a3    LATIN SMALL LETTER OI
+ yr     01a6    LATIN LETTER YR
+ U9     01af    LATIN CAPITAL LETTER U WITH HORN
+ u9     01b0    LATIN SMALL LETTER U WITH HORN
+ Z/     01b5    LATIN CAPITAL LETTER Z WITH STROKE
+ z/     01b6    LATIN SMALL LETTER Z WITH STROKE
+ ED     01b7    LATIN CAPITAL LETTER EZH
+ A<     01cd    LATIN CAPITAL LETTER A WITH CARON
+ a<     01ce    LATIN SMALL LETTER A WITH CARON
+
+Simonsen                                                       [Page 11]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ I<     01cf    LATIN CAPITAL LETTER I WITH CARON
+ i<     01d0    LATIN SMALL LETTER I WITH CARON
+ O<     01d1    LATIN CAPITAL LETTER O WITH CARON
+ o<     01d2    LATIN SMALL LETTER O WITH CARON
+ U<     01d3    LATIN CAPITAL LETTER U WITH CARON
+ u<     01d4    LATIN SMALL LETTER U WITH CARON
+ U:-    01d5    LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
+ u:-    01d6    LATIN SMALL LETTER U WITH DIAERESIS AND MACRON
+ U:'    01d7    LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
+ u:'    01d8    LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE
+ U:<    01d9    LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
+ u:<    01da    LATIN SMALL LETTER U WITH DIAERESIS AND CARON
+ U:!    01db    LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
+ u:!    01dc    LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE
+ A1     01de    LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+ a1     01df    LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+ A7     01e0    LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+ a7     01e1    LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+ A3     01e2    LATIN CAPITAL LETTER AE WITH MACRON
+ a3     01e3    LATIN SMALL LETTER AE WITH MACRON
+ G/     01e4    LATIN CAPITAL LETTER G WITH STROKE
+ g/     01e5    LATIN SMALL LETTER G WITH STROKE
+ G<     01e6    LATIN CAPITAL LETTER G WITH CARON
+ g<     01e7    LATIN SMALL LETTER G WITH CARON
+ K<     01e8    LATIN CAPITAL LETTER K WITH CARON
+ k<     01e9    LATIN SMALL LETTER K WITH CARON
+ O;     01ea    LATIN CAPITAL LETTER O WITH OGONEK
+ o;     01eb    LATIN SMALL LETTER O WITH OGONEK
+ O1     01ec    LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+ o1     01ed    LATIN SMALL LETTER O WITH OGONEK AND MACRON
+ EZ     01ee    LATIN CAPITAL LETTER EZH WITH CARON
+ ez     01ef    LATIN SMALL LETTER EZH WITH CARON
+ j<     01f0    LATIN SMALL LETTER J WITH CARON
+ G'     01f4    LATIN CAPITAL LETTER G WITH ACUTE
+ g'     01f5    LATIN SMALL LETTER G WITH ACUTE
+ AA'    01fa    LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
+ aa'    01fb    LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE
+ AE'    01fc    LATIN CAPITAL LETTER AE WITH ACUTE
+ ae'    01fd    LATIN SMALL LETTER AE WITH ACUTE
+ O/'    01fe    LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
+ o/'    01ff    LATIN SMALL LETTER O WITH STROKE AND ACUTE
+ ;S     02bf    MODIFIER LETTER LEFT HALF RING
+ '<     02c7    CARON
+ '(     02d8    BREVE
+ '.     02d9    DOT ABOVE
+ '0     02da    RING ABOVE
+ ';     02db    OGONEK
+ '"     02dd    DOUBLE ACUTE ACCENT
+ A%     0386    GREEK CAPITAL LETTER ALPHA WITH ACUTE
+ E%     0388    GREEK CAPITAL LETTER EPSILON WITH ACUTE
+ Y%     0389    GREEK CAPITAL LETTER ETA WITH ACUTE
+ I%     038a    GREEK CAPITAL LETTER IOTA WITH ACUTE
+ O%     038c    GREEK CAPITAL LETTER OMICRON WITH ACUTE
+
+Simonsen                                                       [Page 12]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ U%     038e    GREEK CAPITAL LETTER UPSILON WITH ACUTE
+ W%     038f    GREEK CAPITAL LETTER OMEGA WITH ACUTE
+ i3     0390    GREEK SMALL LETTER IOTA WITH ACUTE AND DIAERESIS
+ A*     0391    GREEK CAPITAL LETTER ALPHA
+ B*     0392    GREEK CAPITAL LETTER BETA
+ G*     0393    GREEK CAPITAL LETTER GAMMA
+ D*     0394    GREEK CAPITAL LETTER DELTA
+ E*     0395    GREEK CAPITAL LETTER EPSILON
+ Z*     0396    GREEK CAPITAL LETTER ZETA
+ Y*     0397    GREEK CAPITAL LETTER ETA
+ H*     0398    GREEK CAPITAL LETTER THETA
+ I*     0399    GREEK CAPITAL LETTER IOTA
+ K*     039a    GREEK CAPITAL LETTER KAPPA
+ L*     039b    GREEK CAPITAL LETTER LAMDA
+ M*     039c    GREEK CAPITAL LETTER MU
+ N*     039d    GREEK CAPITAL LETTER NU
+ C*     039e    GREEK CAPITAL LETTER XI
+ O*     039f    GREEK CAPITAL LETTER OMICRON
+ P*     03a0    GREEK CAPITAL LETTER PI
+ R*     03a1    GREEK CAPITAL LETTER RHO
+ S*     03a3    GREEK CAPITAL LETTER SIGMA
+ T*     03a4    GREEK CAPITAL LETTER TAU
+ U*     03a5    GREEK CAPITAL LETTER UPSILON
+ F*     03a6    GREEK CAPITAL LETTER PHI
+ X*     03a7    GREEK CAPITAL LETTER CHI
+ Q*     03a8    GREEK CAPITAL LETTER PSI
+ W*     03a9    GREEK CAPITAL LETTER OMEGA
+ J*     03aa    GREEK CAPITAL LETTER IOTA WITH DIAERESIS
+ V*     03ab    GREEK CAPITAL LETTER UPSILON WITH DIAERESIS
+ a%     03ac    GREEK SMALL LETTER ALPHA WITH ACUTE
+ e%     03ad    GREEK SMALL LETTER EPSILON WITH ACUTE
+ y%     03ae    GREEK SMALL LETTER ETA WITH ACUTE
+ i%     03af    GREEK SMALL LETTER IOTA WITH ACUTE
+ u3     03b0    GREEK SMALL LETTER UPSILON WITH ACUTE AND DIAERESIS
+ a*     03b1    GREEK SMALL LETTER ALPHA
+ b*     03b2    GREEK SMALL LETTER BETA
+ g*     03b3    GREEK SMALL LETTER GAMMA
+ d*     03b4    GREEK SMALL LETTER DELTA
+ e*     03b5    GREEK SMALL LETTER EPSILON
+ z*     03b6    GREEK SMALL LETTER ZETA
+ y*     03b7    GREEK SMALL LETTER ETA
+ h*     03b8    GREEK SMALL LETTER THETA
+ i*     03b9    GREEK SMALL LETTER IOTA
+ k*     03ba    GREEK SMALL LETTER KAPPA
+ l*     03bb    GREEK SMALL LETTER LAMDA
+ m*     03bc    GREEK SMALL LETTER MU
+ n*     03bd    GREEK SMALL LETTER NU
+ c*     03be    GREEK SMALL LETTER XI
+ o*     03bf    GREEK SMALL LETTER OMICRON
+ p*     03c0    GREEK SMALL LETTER PI
+ r*     03c1    GREEK SMALL LETTER RHO
+ *s     03c2    GREEK SMALL LETTER FINAL SIGMA
+ s*     03c3    GREEK SMALL LETTER SIGMA
+
+Simonsen                                                       [Page 13]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ t*     03c4    GREEK SMALL LETTER TAU
+ u*     03c5    GREEK SMALL LETTER UPSILON
+ f*     03c6    GREEK SMALL LETTER PHI
+ x*     03c7    GREEK SMALL LETTER CHI
+ q*     03c8    GREEK SMALL LETTER PSI
+ w*     03c9    GREEK SMALL LETTER OMEGA
+ j*     03ca    GREEK SMALL LETTER IOTA WITH DIAERESIS
+ v*     03cb    GREEK SMALL LETTER UPSILON WITH DIAERESIS
+ o%     03cc    GREEK SMALL LETTER OMICRON WITH ACUTE
+ u%     03cd    GREEK SMALL LETTER UPSILON WITH ACUTE
+ w%     03ce    GREEK SMALL LETTER OMEGA WITH ACUTE
+ 'G     03d8    GREEK NUMERAL SIGN
+ ,G     03d9    GREEK LOWER NUMERAL SIGN
+ T3     03da    GREEK CAPITAL LETTER STIGMA
+ t3     03db    GREEK SMALL LETTER STIGMA
+ M3     03dc    GREEK CAPITAL LETTER DIGAMMA
+ m3     03dd    GREEK SMALL LETTER DIGAMMA
+ K3     03de    GREEK CAPITAL LETTER KOPPA
+ k3     03df    GREEK SMALL LETTER KOPPA
+ P3     03e0    GREEK CAPITAL LETTER SAMPI
+ p3     03e1    GREEK SMALL LETTER SAMPI
+ '%     03f4    ACUTE ACCENT AND DIAERESIS (Tonos and Dialytika)
+ j3     03f5    GREEK IOTA BELOW
+ IO     0401    CYRILLIC CAPITAL LETTER IO
+ D%     0402    CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
+ G%     0403    CYRILLIC CAPITAL LETTER GJE (Macedonian)
+ IE     0404    CYRILLIC CAPITAL LETTER UKRAINIAN IE
+ DS     0405    CYRILLIC CAPITAL LETTER DZE (Macedonian)
+ II     0406    CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+ YI     0407    CYRILLIC CAPITAL LETTER YI (Ukrainian)
+ J%     0408    CYRILLIC CAPITAL LETTER JE
+ LJ     0409    CYRILLIC CAPITAL LETTER LJE
+ NJ     040a    CYRILLIC CAPITAL LETTER NJE
+ Ts     040b    CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
+ KJ     040c    CYRILLIC CAPITAL LETTER KJE (Macedonian)
+ V%     040e    CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
+ DZ     040f    CYRILLIC CAPITAL LETTER DZHE
+ A=     0410    CYRILLIC CAPITAL LETTER A
+ B=     0411    CYRILLIC CAPITAL LETTER BE
+ V=     0412    CYRILLIC CAPITAL LETTER VE
+ G=     0413    CYRILLIC CAPITAL LETTER GHE
+ D=     0414    CYRILLIC CAPITAL LETTER DE
+ E=     0415    CYRILLIC CAPITAL LETTER IE
+ Z%     0416    CYRILLIC CAPITAL LETTER ZHE
+ Z=     0417    CYRILLIC CAPITAL LETTER ZE
+ I=     0418    CYRILLIC CAPITAL LETTER I
+ J=     0419    CYRILLIC CAPITAL LETTER SHORT I
+ K=     041a    CYRILLIC CAPITAL LETTER KA
+ L=     041b    CYRILLIC CAPITAL LETTER EL
+ M=     041c    CYRILLIC CAPITAL LETTER EM
+ N=     041d    CYRILLIC CAPITAL LETTER EN
+ O=     041e    CYRILLIC CAPITAL LETTER O
+ P=     041f    CYRILLIC CAPITAL LETTER PE
+
+Simonsen                                                       [Page 14]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ R=     0420    CYRILLIC CAPITAL LETTER ER
+ S=     0421    CYRILLIC CAPITAL LETTER ES
+ T=     0422    CYRILLIC CAPITAL LETTER TE
+ U=     0423    CYRILLIC CAPITAL LETTER U
+ F=     0424    CYRILLIC CAPITAL LETTER EF
+ H=     0425    CYRILLIC CAPITAL LETTER HA
+ C=     0426    CYRILLIC CAPITAL LETTER TSE
+ C%     0427    CYRILLIC CAPITAL LETTER CHE
+ S%     0428    CYRILLIC CAPITAL LETTER SHA
+ Sc     0429    CYRILLIC CAPITAL LETTER SHCHA
+ ="     042a    CYRILLIC CAPITAL LETTER HARD SIGN
+ Y=     042b    CYRILLIC CAPITAL LETTER YERU
+ %"     042c    CYRILLIC CAPITAL LETTER SOFT SIGN
+ JE     042d    CYRILLIC CAPITAL LETTER E
+ JU     042e    CYRILLIC CAPITAL LETTER YU
+ JA     042f    CYRILLIC CAPITAL LETTER YA
+ a=     0430    CYRILLIC SMALL LETTER A
+ b=     0431    CYRILLIC SMALL LETTER BE
+ v=     0432    CYRILLIC SMALL LETTER VE
+ g=     0433    CYRILLIC SMALL LETTER GHE
+ d=     0434    CYRILLIC SMALL LETTER DE
+ e=     0435    CYRILLIC SMALL LETTER IE
+ z%     0436    CYRILLIC SMALL LETTER ZHE
+ z=     0437    CYRILLIC SMALL LETTER ZE
+ i=     0438    CYRILLIC SMALL LETTER I
+ j=     0439    CYRILLIC SMALL LETTER SHORT I
+ k=     043a    CYRILLIC SMALL LETTER KA
+ l=     043b    CYRILLIC SMALL LETTER EL
+ m=     043c    CYRILLIC SMALL LETTER EM
+ n=     043d    CYRILLIC SMALL LETTER EN
+ o=     043e    CYRILLIC SMALL LETTER O
+ p=     043f    CYRILLIC SMALL LETTER PE
+ r=     0440    CYRILLIC SMALL LETTER ER
+ s=     0441    CYRILLIC SMALL LETTER ES
+ t=     0442    CYRILLIC SMALL LETTER TE
+ u=     0443    CYRILLIC SMALL LETTER U
+ f=     0444    CYRILLIC SMALL LETTER EF
+ h=     0445    CYRILLIC SMALL LETTER HA
+ c=     0446    CYRILLIC SMALL LETTER TSE
+ c%     0447    CYRILLIC SMALL LETTER CHE
+ s%     0448    CYRILLIC SMALL LETTER SHA
+ sc     0449    CYRILLIC SMALL LETTER SHCHA
+ ='     044a    CYRILLIC SMALL LETTER HARD SIGN
+ y=     044b    CYRILLIC SMALL LETTER YERU
+ %'     044c    CYRILLIC SMALL LETTER SOFT SIGN
+ je     044d    CYRILLIC SMALL LETTER E
+ ju     044e    CYRILLIC SMALL LETTER YU
+ ja     044f    CYRILLIC SMALL LETTER YA
+ io     0451    CYRILLIC SMALL LETTER IO
+ d%     0452    CYRILLIC SMALL LETTER DJE (Serbocroatian)
+ g%     0453    CYRILLIC SMALL LETTER GJE (Macedonian)
+ ie     0454    CYRILLIC SMALL LETTER UKRAINIAN IE
+ ds     0455    CYRILLIC SMALL LETTER DZE (Macedonian)
+
+Simonsen                                                       [Page 15]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ ii     0456    CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ yi     0457    CYRILLIC SMALL LETTER YI (Ukrainian)
+ j%     0458    CYRILLIC SMALL LETTER JE
+ lj     0459    CYRILLIC SMALL LETTER LJE
+ nj     045a    CYRILLIC SMALL LETTER NJE
+ ts     045b    CYRILLIC SMALL LETTER TSHE (Serbocroatian)
+ kj     045c    CYRILLIC SMALL LETTER KJE (Macedonian)
+ v%     045e    CYRILLIC SMALL LETTER SHORT U (Byelorussian)
+ dz     045f    CYRILLIC SMALL LETTER DZHE
+ Y3     0462    CYRILLIC CAPITAL LETTER YAT
+ y3     0463    CYRILLIC SMALL LETTER YAT
+ O3     046a    CYRILLIC CAPITAL LETTER BIG YUS
+ o3     046b    CYRILLIC SMALL LETTER BIG YUS
+ F3     0472    CYRILLIC CAPITAL LETTER FITA
+ f3     0473    CYRILLIC SMALL LETTER FITA
+ V3     0474    CYRILLIC CAPITAL LETTER IZHITSA
+ v3     0475    CYRILLIC SMALL LETTER IZHITSA
+ C3     0480    CYRILLIC CAPITAL LETTER KOPPA
+ c3     0481    CYRILLIC SMALL LETTER KOPPA
+ G3     0490    CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+ g3     0491    CYRILLIC SMALL LETTER GHE WITH UPTURN
+ A+     05d0    HEBREW LETTER ALEF
+ B+     05d1    HEBREW LETTER BET
+ G+     05d2    HEBREW LETTER GIMEL
+ D+     05d3    HEBREW LETTER DALET
+ H+     05d4    HEBREW LETTER HE
+ W+     05d5    HEBREW LETTER VAV
+ Z+     05d6    HEBREW LETTER ZAYIN
+ X+     05d7    HEBREW LETTER HET
+ Tj     05d8    HEBREW LETTER TET
+ J+     05d9    HEBREW LETTER YOD
+ K%     05da    HEBREW LETTER FINAL KAF
+ K+     05db    HEBREW LETTER KAF
+ L+     05dc    HEBREW LETTER LAMED
+ M%     05dd    HEBREW LETTER FINAL MEM
+ M+     05de    HEBREW LETTER MEM
+ N%     05df    HEBREW LETTER FINAL NUN
+ N+     05e0    HEBREW LETTER NUN
+ S+     05e1    HEBREW LETTER SAMEKH
+ E+     05e2    HEBREW LETTER AYIN
+ P%     05e3    HEBREW LETTER FINAL PE
+ P+     05e4    HEBREW LETTER PE
+ Zj     05e5    HEBREW LETTER FINAL TSADI
+ ZJ     05e6    HEBREW LETTER TSADI
+ Q+     05e7    HEBREW LETTER QOF
+ R+     05e8    HEBREW LETTER RESH
+ Sh     05e9    HEBREW LETTER SHIN
+ T+     05ea    HEBREW LETTER TAV
+ ,+     060c    ARABIC COMMA
+ ;+     061b    ARABIC SEMICOLON
+ ?+     061f    ARABIC QUESTION MARK
+ H'     0621    ARABIC LETTER HAMZA
+ aM     0622    ARABIC LETTER ALEF WITH MADDA ABOVE
+
+Simonsen                                                       [Page 16]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ aH     0623    ARABIC LETTER ALEF WITH HAMZA ABOVE
+ wH     0624    ARABIC LETTER WAW WITH HAMZA ABOVE
+ ah     0625    ARABIC LETTER ALEF WITH HAMZA BELOW
+ yH     0626    ARABIC LETTER YEH WITH HAMZA ABOVE
+ a+     0627    ARABIC LETTER ALEF
+ b+     0628    ARABIC LETTER BEH
+ tm     0629    ARABIC LETTER TEH MARBUTA
+ t+     062a    ARABIC LETTER TEH
+ tk     062b    ARABIC LETTER THEH
+ g+     062c    ARABIC LETTER JEEM
+ hk     062d    ARABIC LETTER HAH
+ x+     062e    ARABIC LETTER KHAH
+ d+     062f    ARABIC LETTER DAL
+ dk     0630    ARABIC LETTER THAL
+ r+     0631    ARABIC LETTER REH
+ z+     0632    ARABIC LETTER ZAIN
+ s+     0633    ARABIC LETTER SEEN
+ sn     0634    ARABIC LETTER SHEEN
+ c+     0635    ARABIC LETTER SAD
+ dd     0636    ARABIC LETTER DAD
+ tj     0637    ARABIC LETTER TAH
+ zH     0638    ARABIC LETTER ZAH
+ e+     0639    ARABIC LETTER AIN
+ i+     063a    ARABIC LETTER GHAIN
+ ++     0640    ARABIC TATWEEL
+ f+     0641    ARABIC LETTER FEH
+ q+     0642    ARABIC LETTER QAF
+ k+     0643    ARABIC LETTER KAF
+ l+     0644    ARABIC LETTER LAM
+ m+     0645    ARABIC LETTER MEEM
+ n+     0646    ARABIC LETTER NOON
+ h+     0647    ARABIC LETTER HEH
+ w+     0648    ARABIC LETTER WAW
+ j+     0649    ARABIC LETTER ALEF MAKSURA
+ y+     064a    ARABIC LETTER YEH
+ :+     064b    ARABIC FATHATAN
+ "+     064c    ARABIC DAMMATAN
+ =+     064d    ARABIC KASRATAN
+ /+     064e    ARABIC FATHA
+ '+     064f    ARABIC DAMMA
+ 1+     0650    ARABIC KASRA
+ 3+     0651    ARABIC SHADDA
+ 0+     0652    ARABIC SUKUN
+ aS     0670    SUPERSCRIPT ARABIC LETTER ALEF
+ p+     067e    ARABIC LETTER PEH
+ v+     06a4    ARABIC LETTER VEH
+ gf     06af    ARABIC LETTER GAF
+ 0a     06f0    EASTERN ARABIC-INDIC DIGIT ZERO
+ 1a     06f1    EASTERN ARABIC-INDIC DIGIT ONE
+ 2a     06f2    EASTERN ARABIC-INDIC DIGIT TWO
+ 3a     06f3    EASTERN ARABIC-INDIC DIGIT THREE
+ 4a     06f4    EASTERN ARABIC-INDIC DIGIT FOUR
+ 5a     06f5    EASTERN ARABIC-INDIC DIGIT FIVE
+
+Simonsen                                                       [Page 17]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ 6a     06f6    EASTERN ARABIC-INDIC DIGIT SIX
+ 7a     06f7    EASTERN ARABIC-INDIC DIGIT SEVEN
+ 8a     06f8    EASTERN ARABIC-INDIC DIGIT EIGHT
+ 9a     06f9    EASTERN ARABIC-INDIC DIGIT NINE
+ A-0    1e00    LATIN CAPITAL LETTER A WITH RING BELOW
+ a-0    1e01    LATIN SMALL LETTER A WITH RING BELOW
+ B.     1e02    LATIN CAPITAL LETTER B WITH DOT ABOVE
+ b.     1e03    LATIN SMALL LETTER B WITH DOT ABOVE
+ B-.    1e04    LATIN CAPITAL LETTER B WITH DOT BELOW
+ b-.    1e05    LATIN SMALL LETTER B WITH DOT BELOW
+ B_     1e06    LATIN CAPITAL LETTER B WITH LINE BELOW
+ b_     1e07    LATIN SMALL LETTER B WITH LINE BELOW
+ C,'    1e08    LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
+ c,'    1e09    LATIN SMALL LETTER C WITH CEDILLA AND ACUTE
+ D.     1e0a    LATIN CAPITAL LETTER D WITH DOT ABOVE
+ d.     1e0b    LATIN SMALL LETTER D WITH DOT ABOVE
+ D-.    1e0c    LATIN CAPITAL LETTER D WITH DOT BELOW
+ d-.    1e0d    LATIN SMALL LETTER D WITH DOT BELOW
+ D_     1e0e    LATIN CAPITAL LETTER D WITH LINE BELOW
+ d_     1e0f    LATIN SMALL LETTER D WITH LINE BELOW
+ D,     1e10    LATIN CAPITAL LETTER D WITH CEDILLA
+ d,     1e11    LATIN SMALL LETTER D WITH CEDILLA
+ D->    1e12    LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
+ d->    1e13    LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW
+ E-!    1e14    LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
+ e-!    1e15    LATIN SMALL LETTER E WITH MACRON AND GRAVE
+ E-'    1e16    LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
+ e-'    1e17    LATIN SMALL LETTER E WITH MACRON AND ACUTE
+ E->    1e18    LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
+ e->    1e19    LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW
+ E-?    1e1a    LATIN CAPITAL LETTER E WITH TILDE BELOW
+ e-?    1e1b    LATIN SMALL LETTER E WITH TILDE BELOW
+ E,(    1e1c    LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
+ e,(    1e1d    LATIN SMALL LETTER E WITH CEDILLA AND BREVE
+ F.     1e1e    LATIN CAPITAL LETTER F WITH DOT ABOVE
+ f.     1e1f    LATIN SMALL LETTER F WITH DOT ABOVE
+ G-     1e20    LATIN CAPITAL LETTER G WITH MACRON
+ g-     1e21    LATIN SMALL LETTER G WITH MACRON
+ H.     1e22    LATIN CAPITAL LETTER H WITH DOT ABOVE
+ h.     1e23    LATIN SMALL LETTER H WITH DOT ABOVE
+ H-.    1e24    LATIN CAPITAL LETTER H WITH DOT BELOW
+ h-.    1e25    LATIN SMALL LETTER H WITH DOT BELOW
+ H:     1e26    LATIN CAPITAL LETTER H WITH DIAERESIS
+ h:     1e27    LATIN SMALL LETTER H WITH DIAERESIS
+ H,     1e28    LATIN CAPITAL LETTER H WITH CEDILLA
+ h,     1e29    LATIN SMALL LETTER H WITH CEDILLA
+ H-(    1e2a    LATIN CAPITAL LETTER H WITH BREVE BELOW
+ h-(    1e2b    LATIN SMALL LETTER H WITH BREVE BELOW
+ I-?    1e2c    LATIN CAPITAL LETTER I WITH TILDE BELOW
+ i-?    1e2d    LATIN SMALL LETTER I WITH TILDE BELOW
+ I:'    1e2e    LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
+ i:'    1e2f    LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE
+ K'     1e30    LATIN CAPITAL LETTER K WITH ACUTE
+
+Simonsen                                                       [Page 18]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ k'     1e31    LATIN SMALL LETTER K WITH ACUTE
+ K-.    1e32    LATIN CAPITAL LETTER K WITH DOT BELOW
+ k-.    1e33    LATIN SMALL LETTER K WITH DOT BELOW
+ K_     1e34    LATIN CAPITAL LETTER K WITH LINE BELOW
+ k_     1e35    LATIN SMALL LETTER K WITH LINE BELOW
+ L-.    1e36    LATIN CAPITAL LETTER L WITH DOT BELOW
+ l-.    1e37    LATIN SMALL LETTER L WITH DOT BELOW
+ L--.   1e38    LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
+ l--.   1e39    LATIN SMALL LETTER L WITH DOT BELOW AND MACRON
+ L_     1e3a    LATIN CAPITAL LETTER L WITH LINE BELOW
+ l_     1e3b    LATIN SMALL LETTER L WITH LINE BELOW
+ L->    1e3c    LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
+ l->    1e3d    LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW
+ M'     1e3e    LATIN CAPITAL LETTER M WITH ACUTE
+ m'     1e3f    LATIN SMALL LETTER M WITH ACUTE
+ M.     1e40    LATIN CAPITAL LETTER M WITH DOT ABOVE
+ m.     1e41    LATIN SMALL LETTER M WITH DOT ABOVE
+ M-.    1e42    LATIN CAPITAL LETTER M WITH DOT BELOW
+ m-.    1e43    LATIN SMALL LETTER M WITH DOT BELOW
+ N.     1e44    LATIN CAPITAL LETTER N WITH DOT ABOVE
+ n.     1e45    LATIN SMALL LETTER N WITH DOT ABOVE
+ N-.    1e46    LATIN CAPITAL LETTER N WITH DOT BELOW
+ n-.    1e47    LATIN SMALL LETTER N WITH DOT BELOW
+ N_     1e48    LATIN CAPITAL LETTER N WITH LINE BELOW
+ n_     1e49    LATIN SMALL LETTER N WITH LINE BELOW
+ N->    1e4a    LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
+ N->    1e4b    LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW
+ O?'    1e4c    LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
+ o?'    1e4d    LATIN SMALL LETTER O WITH TILDE AND ACUTE
+ O?:    1e4e    LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
+ o?:    1e4f    LATIN SMALL LETTER O WITH TILDE AND DIAERESIS
+ O-!    1e50    LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
+ o-!    1e51    LATIN SMALL LETTER O WITH MACRON AND GRAVE
+ O-'    1e52    LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
+ o-'    1e53    LATIN SMALL LETTER O WITH MACRON AND ACUTE
+ P'     1e54    LATIN CAPITAL LETTER P WITH ACUTE
+ p'     1e55    LATIN SMALL LETTER P WITH ACUTE
+ P.     1e56    LATIN CAPITAL LETTER P WITH DOT ABOVE
+ p.     1e57    LATIN SMALL LETTER P WITH DOT ABOVE
+ R.     1e58    LATIN CAPITAL LETTER R WITH DOT ABOVE
+ r.     1e59    LATIN SMALL LETTER R WITH DOT ABOVE
+ R-.    1e5a    LATIN CAPITAL LETTER R WITH DOT BELOW
+ r-.    1e5b    LATIN SMALL LETTER R WITH DOT BELOW
+ R--.   1e5c    LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
+ r--.   1e5d    LATIN SMALL LETTER R WITH DOT BELOW AND MACRON
+ R_     1e5e    LATIN CAPITAL LETTER R WITH LINE BELOW
+ r_     1e5f    LATIN SMALL LETTER R WITH LINE BELOW
+ S.     1e60    LATIN CAPITAL LETTER S WITH DOT ABOVE
+ s.     1e61    LATIN SMALL LETTER S WITH DOT ABOVE
+ S-.    1e62    LATIN CAPITAL LETTER S WITH DOT BELOW
+ s-.    1e63    LATIN SMALL LETTER S WITH DOT BELOW
+ S'.    1e64    LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
+ s'.    1e65    LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE
+
+Simonsen                                                       [Page 19]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ S<.    1e66    LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
+ s<.    1e67    LATIN SMALL LETTER S WITH CARON AND DOT ABOVE
+ S.-.   1e68    LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
+ S.-.   1e69    LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
+ T.     1e6a    LATIN CAPITAL LETTER T WITH DOT ABOVE
+ t.     1e6b    LATIN SMALL LETTER T WITH DOT ABOVE
+ T-.    1e6c    LATIN CAPITAL LETTER T WITH DOT BELOW
+ t-.    1e6d    LATIN SMALL LETTER T WITH DOT BELOW
+ T_     1e6e    LATIN CAPITAL LETTER T WITH LINE BELOW
+ t_     1e6f    LATIN SMALL LETTER T WITH LINE BELOW
+ T->    1e70    LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
+ t->    1e71    LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW
+ U--:   1e72    LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
+ u--:   1e73    LATIN SMALL LETTER U WITH DIAERESIS BELOW
+ U-?    1e74    LATIN CAPITAL LETTER U WITH TILDE BELOW
+ u-?    1e75    LATIN SMALL LETTER U WITH TILDE BELOW
+ U->    1e76    LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
+ u->    1e77    LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW
+ U?'    1e78    LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
+ u?'    1e79    LATIN SMALL LETTER U WITH TILDE AND ACUTE
+ U-:    1e7a    LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
+ u-:    1e7b    LATIN SMALL LETTER U WITH MACRON AND DIAERESIS
+ V?     1e7c    LATIN CAPITAL LETTER V WITH TILDE
+ v?     1e7d    LATIN SMALL LETTER V WITH TILDE
+ V-.    1e7e    LATIN CAPITAL LETTER V WITH DOT BELOW
+ v-.    1e7f    LATIN SMALL LETTER V WITH DOT BELOW
+ W!     1e80    LATIN CAPITAL LETTER W WITH GRAVE
+ w!     1e81    LATIN SMALL LETTER W WITH GRAVE
+ W'     1e82    LATIN CAPITAL LETTER W WITH ACUTE
+ w'     1e83    LATIN SMALL LETTER W WITH ACUTE
+ W:     1e84    LATIN CAPITAL LETTER W WITH DIAERESIS
+ w:     1e85    LATIN SMALL LETTER W WITH DIAERESIS
+ W.     1e86    LATIN CAPITAL LETTER W WITH DOT ABOVE
+ w.     1e87    LATIN SMALL LETTER W WITH DOT ABOVE
+ W-.    1e88    LATIN CAPITAL LETTER W WITH DOT BELOW
+ w-.    1e89    LATIN SMALL LETTER W WITH DOT BELOW
+ X.     1e8a    LATIN CAPITAL LETTER X WITH DOT ABOVE
+ x.     1e8b    LATIN SMALL LETTER X WITH DOT ABOVE
+ X:     1e8c    LATIN CAPITAL LETTER X WITH DIAERESIS
+ x:     1e8d    LATIN SMALL LETTER X WITH DIAERESIS
+ Y.     1e8e    LATIN CAPITAL LETTER Y WITH DOT ABOVE
+ y.     1e8f    LATIN SMALL LETTER Y WITH DOT ABOVE
+ Z>     1e90    LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+ z>     1e91    LATIN SMALL LETTER Z WITH CIRCUMFLEX
+ Z-.    1e92    LATIN CAPITAL LETTER Z WITH DOT BELOW
+ z-.    1e93    LATIN SMALL LETTER Z WITH DOT BELOW
+ Z_     1e94    LATIN CAPITAL LETTER Z WITH LINE BELOW
+ z_     1e95    LATIN SMALL LETTER Z WITH LINE BELOW
+ h_     1e96    LATIN SMALL LETTER H WITH LINE BELOW
+ t:     1e97    LATIN SMALL LETTER T WITH DIAERESIS
+ w0     1e98    LATIN SMALL LETTER W WITH RING ABOVE
+ y0     1e99    LATIN SMALL LETTER Y WITH RING ABOVE
+ A-.    1ea0    LATIN CAPITAL LETTER A WITH DOT BELOW
+
+Simonsen                                                       [Page 20]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ a-.    1ea1    LATIN SMALL LETTER A WITH DOT BELOW
+ A2     1ea2    LATIN CAPITAL LETTER A WITH HOOK ABOVE
+ a2     1ea3    LATIN SMALL LETTER A WITH HOOK ABOVE
+ A>'    1ea4    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
+ a>'    1ea5    LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
+ A>!    1ea6    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
+ a>!    1ea7    LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
+ A>2    1ea8    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ a>2    1ea9    LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
+ A>?    1eaa    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
+ a>?    1eab    LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE
+ A>-.   1eac    LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ a>-.   1ead    LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
+ A('    1eae    LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
+ a('    1eaf    LATIN SMALL LETTER A WITH BREVE AND ACUTE
+ A(!    1eb0    LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
+ a(!    1eb1    LATIN SMALL LETTER A WITH BREVE AND GRAVE
+ A(2    1eb2    LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
+ a(2    1eb3    LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE
+ A(?    1eb4    LATIN CAPITAL LETTER A WITH BREVE AND TILDE
+ a(?    1eb5    LATIN SMALL LETTER A WITH BREVE AND TILDE
+ A(-.   1eb6    LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
+ a(-.   1eb7    LATIN SMALL LETTER A WITH BREVE AND DOT BELOW
+ E-.    1eb8    LATIN CAPITAL LETTER E WITH DOT BELOW
+ e-.    1eb9    LATIN SMALL LETTER E WITH DOT BELOW
+ E2     1eba    LATIN CAPITAL LETTER E WITH HOOK ABOVE
+ e2     1ebb    LATIN SMALL LETTER E WITH HOOK ABOVE
+ E?     1ebc    LATIN CAPITAL LETTER E WITH TILDE
+ e?     1ebd    LATIN SMALL LETTER E WITH TILDE
+ E>'    1ebe    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
+ e>'    1ebf    LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
+ E>!    1ec0    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
+ e>!    1ec1    LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
+ E>2    1ec2    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ e>2    1ec3    LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
+ E>?    1ec4    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
+ e>?    1ec5    LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE
+ E>-.   1ec6    LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ e>-.   1ec7    LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
+ I2     1ec8    LATIN CAPITAL LETTER I WITH HOOK ABOVE
+ i2     1ec9    LATIN SMALL LETTER I WITH HOOK ABOVE
+ I-.    1eca    LATIN CAPITAL LETTER I WITH DOT BELOW
+ i-.    1ecb    LATIN SMALL LETTER I WITH DOT BELOW
+ O-.    1ecc    LATIN CAPITAL LETTER O WITH DOT BELOW
+ o-.    1ecd    LATIN SMALL LETTER O WITH DOT BELOW
+ O2     1ece    LATIN CAPITAL LETTER O WITH HOOK ABOVE
+ o2     1ecf    LATIN SMALL LETTER O WITH HOOK ABOVE
+ O>'    1ed0    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
+ o>'    1ed1    LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
+ O>!    1ed2    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
+ o>!    1ed3    LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
+ O>2    1ed4    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+ o>2    1ed5    LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
+
+Simonsen                                                       [Page 21]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ O>?    1ed6    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
+ o>?    1ed7    LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE
+ O>-.   1ed8    LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ o>-.   1ed9    LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
+ O9'    1eda    LATIN CAPITAL LETTER O WITH HORN AND ACUTE
+ o9'    1edb    LATIN SMALL LETTER O WITH HORN AND ACUTE
+ O9!    1edc    LATIN CAPITAL LETTER O WITH HORN AND GRAVE
+ o9!    1edd    LATIN SMALL LETTER O WITH HORN AND GRAVE
+ O92    1ede    LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
+ o92    1edf    LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE
+ O9?    1ee0    LATIN CAPITAL LETTER O WITH HORN AND TILDE
+ o9?    1ee1    LATIN SMALL LETTER O WITH HORN AND TILDE
+ O9-.   1ee2    LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
+ o9-.   1ee3    LATIN SMALL LETTER O WITH HORN AND DOT BELOW
+ U-.    1ee4    LATIN CAPITAL LETTER U WITH DOT BELOW
+ u-.    1ee5    LATIN SMALL LETTER U WITH DOT BELOW
+ U2     1ee6    LATIN CAPITAL LETTER U WITH HOOK ABOVE
+ u2     1ee7    LATIN SMALL LETTER U WITH HOOK ABOVE
+ U9'    1ee8    LATIN CAPITAL LETTER U WITH HORN AND ACUTE
+ u9'    1ee9    LATIN SMALL LETTER U WITH HORN AND ACUTE
+ U9!    1eea    LATIN CAPITAL LETTER U WITH HORN AND GRAVE
+ u9!    1eeb    LATIN SMALL LETTER U WITH HORN AND GRAVE
+ U92    1eec    LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
+ u92    1eed    LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE
+ U9?    1eee    LATIN CAPITAL LETTER U WITH HORN AND TILDE
+ u9?    1eef    LATIN SMALL LETTER U WITH HORN AND TILDE
+ U9-.   1ef0    LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
+ u9-.   1ef1    LATIN SMALL LETTER U WITH HORN AND DOT BELOW
+ Y!     1ef2    LATIN CAPITAL LETTER Y WITH GRAVE
+ y!     1ef3    LATIN SMALL LETTER Y WITH GRAVE
+ Y-.    1ef4    LATIN CAPITAL LETTER Y WITH DOT BELOW
+ y-.    1ef5    LATIN SMALL LETTER Y WITH DOT BELOW
+ Y2     1ef6    LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+ y2     1ef7    LATIN SMALL LETTER Y WITH HOOK ABOVE
+ Y?     1ef8    LATIN CAPITAL LETTER Y WITH TILDE
+ y?     1ef9    LATIN SMALL LETTER Y WITH TILDE
+ ;'     1f00    GREEK DASIA AND ACUTE ACCENT
+ ,'     1f01    GREEK PSILI AND ACUTE ACCENT
+ ;!     1f02    GREEK DASIA AND VARIA
+ ,!     1f03    GREEK PSILI AND VARIA
+ ?;     1f04    GREEK DASIA AND PERISPOMENI
+ ?,     1f05    GREEK PSILI AND PERISPOMENI
+ !:     1f06    GREEK DIAERESIS AND VARIA
+ ?:     1f07    GREEK DIAERESIS AND PERISPOMENI
+ 1N     2002    EN SPACE
+ 1M     2003    EM SPACE
+ 3M     2004    THREE-PER-EM SPACE
+ 4M     2005    FOUR-PER-EM SPACE
+ 6M     2006    SIX-PER-EM SPACE
+ 1T     2009    THIN SPACE
+ 1H     200a    HAIR SPACE
+ -1     2010    HYPHEN
+ -N     2013    EN DASH
+
+Simonsen                                                       [Page 22]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ -M     2014    EM DASH
+ -3     2015    HORIZONTAL BAR
+ !2     2016    DOUBLE VERTICAL LINE
+ =2     2017    DOUBLE LOW LINE
+ '6     2018    LEFT SINGLE QUOTATION MARK
+ '9     2019    RIGHT SINGLE QUOTATION MARK
+ .9     201a    SINGLE LOW-9 QUOTATION MARK
+ 9'     201b    SINGLE HIGH-REVERSED-9 QUOTATION MARK
+ "6     201c    LEFT DOUBLE QUOTATION MARK
+ "9     201d    RIGHT DOUBLE QUOTATION MARK
+ :9     201e    DOUBLE LOW-9 QUOTATION MARK
+ 9"     201f    DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+ /-     2020    DAGGER
+ /=     2021    DOUBLE DAGGER
+ ..     2025    TWO DOT LEADER
+ %0     2030    PER MILLE SIGN
+ 1'     2032    PRIME
+ 2'     2033    DOUBLE PRIME
+ 3'     2034    TRIPLE PRIME
+ 1"     2035    REVERSED PRIME
+ 2"     2036    REVERSED DOUBLE PRIME
+ 3"     2037    REVERSED TRIPLE PRIME
+ Ca     2038    CARET
+ <1     2039    SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ >1     203a    SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ :X     203b    REFERENCE MARK
+ !*2    203c    DOUBLE EXCLAMATION MARK
+ '-     203e    OVERLINE
+ /f     2044    FRACTION SLASH
+ 0S     2070    SUPERSCRIPT DIGIT ZERO
+ 4S     2074    SUPERSCRIPT DIGIT FOUR
+ 5S     2075    SUPERSCRIPT DIGIT FIVE
+ 6S     2076    SUPERSCRIPT DIGIT SIX
+ 7S     2077    SUPERSCRIPT DIGIT SEVEN
+ 8S     2078    SUPERSCRIPT DIGIT EIGHT
+ 9S     2079    SUPERSCRIPT DIGIT NINE
+ +S     207a    SUPERSCRIPT PLUS SIGN
+ -S     207b    SUPERSCRIPT MINUS
+ =S     207c    SUPERSCRIPT EQUALS SIGN
+ (S     207d    SUPERSCRIPT LEFT PARENTHESIS
+ )S     207e    SUPERSCRIPT RIGHT PARENTHESIS
+ nS     207f    SUPERSCRIPT LATIN SMALL LETTER N
+ 0s     2080    SUBSCRIPT DIGIT ZERO
+ 1s     2081    SUBSCRIPT DIGIT ONE
+ 2s     2082    SUBSCRIPT DIGIT TWO
+ 3s     2083    SUBSCRIPT DIGIT THREE
+ 4s     2084    SUBSCRIPT DIGIT FOUR
+ 5s     2085    SUBSCRIPT DIGIT FIVE
+ 6s     2086    SUBSCRIPT DIGIT SIX
+ 7s     2087    SUBSCRIPT DIGIT SEVEN
+ 8s     2088    SUBSCRIPT DIGIT EIGHT
+ 9s     2089    SUBSCRIPT DIGIT NINE
+ +s     208a    SUBSCRIPT PLUS SIGN
+
+Simonsen                                                       [Page 23]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ -s     208b    SUBSCRIPT MINUS
+ =s     208c    SUBSCRIPT EQUALS SIGN
+ (s     208d    SUBSCRIPT LEFT PARENTHESIS
+ )s     208e    SUBSCRIPT RIGHT PARENTHESIS
+ Li     20a4    LIRA SIGN
+ Pt     20a7    PESETA SIGN
+ W=     20a9    WON SIGN
+ oC     2103    DEGREE CENTIGRADE
+ co     2105    CARE OF
+ oF     2109    DEGREE FAHRENHEIT
+ N0     2116    NUMERO SIGN
+ PO     2117    SOUND RECORDING COPYRIGHT
+ Rx     211e    PRESCRIPTION TAKE
+ SM     2120    SERVICE MARK
+ TM     2122    TRADE MARK SIGN
+ Om     2126    OHM SIGN
+ AO     212b    ANGSTROEM SIGN
+ 13     2153    VULGAR FRACTION ONE THIRD
+ 23     2154    VULGAR FRACTION TWO THIRDS
+ 15     2155    VULGAR FRACTION ONE FIFTH
+ 25     2156    VULGAR FRACTION TWO FIFTHS
+ 35     2157    VULGAR FRACTION THREE FIFTHS
+ 45     2158    VULGAR FRACTION FOUR FIFTHS
+ 16     2159    VULGAR FRACTION ONE SIXTH
+ 56     215a    VULGAR FRACTION FIVE SIXTHS
+ 18     215b    VULGAR FRACTION ONE EIGHTH
+ 38     215c    VULGAR FRACTION THREE EIGHTHS
+ 58     215d    VULGAR FRACTION FIVE EIGHTHS
+ 78     215e    VULGAR FRACTION SEVEN EIGHTHS
+ 1R     2160    ROMAN NUMERAL ONE
+ 2R     2161    ROMAN NUMERAL TWO
+ 3R     2162    ROMAN NUMERAL THREE
+ 4R     2163    ROMAN NUMERAL FOUR
+ 5R     2164    ROMAN NUMERAL FIVE
+ 6R     2165    ROMAN NUMERAL SIX
+ 7R     2166    ROMAN NUMERAL SEVEN
+ 8R     2167    ROMAN NUMERAL EIGHT
+ 9R     2168    ROMAN NUMERAL NINE
+ aR     2169    ROMAN NUMERAL TEN
+ bR     216a    ROMAN NUMERAL ELEVEN
+ cR     216b    ROMAN NUMERAL TWELVE
+ 50R    216c    ROMAN NUMERAL FIFTY
+ 100R   216d    ROMAN NUMERAL ONE HUNDRED
+ 500R   216e    ROMAN NUMERAL FIVE HUNDRED
+ 1000R  216f    ROMAN NUMERAL ONE THOUSAND
+ 1r     2170    SMALL ROMAN NUMERAL ONE
+ 2r     2171    SMALL ROMAN NUMERAL TWO
+ 3r     2172    SMALL ROMAN NUMERAL THREE
+ 4r     2173    SMALL ROMAN NUMERAL FOUR
+ 5r     2174    SMALL ROMAN NUMERAL FIVE
+ 6r     2175    SMALL ROMAN NUMERAL SIX
+ 7r     2176    SMALL ROMAN NUMERAL SEVEN
+ 8r     2177    SMALL ROMAN NUMERAL EIGHT
+
+Simonsen                                                       [Page 24]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ 9r     2178    SMALL ROMAN NUMERAL NINE
+ ar     2179    SMALL ROMAN NUMERAL TEN
+ br     217a    SMALL ROMAN NUMERAL ELEVEN
+ cr     217b    SMALL ROMAN NUMERAL TWELVE
+ 50r    217c    SMALL ROMAN NUMERAL FIFTY
+ 100r   217d    SMALL ROMAN NUMERAL ONE HUNDRED
+ 500r   217e    SMALL ROMAN NUMERAL FIVE HUNDRED
+ 1000r  217f    SMALL ROMAN NUMERAL ONE THOUSAND
+ 1000RCD        2180    ROMAN NUMERAL ONE THOUSAND C D
+ 5000R  2181    ROMAN NUMERAL FIVE THOUSAND
+ 10000R 2182    ROMAN NUMERAL TEN THOUSAND
+ <-     2190    LEFTWARDS ARROW
+ -!     2191    UPWARDS ARROW
+ ->     2192    RIGHTWARDS ARROW
+ -v     2193    DOWNWARDS ARROW
+ <>     2194    LEFT RIGHT ARROW
+ UD     2195    UP DOWN ARROW
+ <!!    2196    NORTH WEST ARROW
+ //>    2197    NORTH EAST ARROW
+ !!>    2198    SOUTH EAST ARROW
+ <//    2199    SOUTH WEST ARROW
+ <=     21d0    LEFTWARDS DOUBLE ARROW
+ =>     21d2    RIGHTWARDS DOUBLE ARROW
+ ==     21d4    LEFT RIGHT DOUBLE ARROW
+ FA     2200    FOR ALL
+ dP     2202    PARTIAL DIFFERENTIAL
+ TE     2203    THERE EXISTS
+ /0     2205    EMPTY SET
+ DE     2206    INCREMENT
+ NB     2207    NABLA
+ (-     2208    ELEMENT OF
+ -)     220b    CONTAINS AS MEMBER
+ *P     220f    N-ARY PRODUCT
+ +Z     2211    N-ARY SUMMATION
+ -2     2212    MINUS SIGN
+ -+     2213    MINUS-OR-PLUS SIGN
+ *-     2217    ASTERISK OPERATOR
+ Ob     2218    RING OPERATOR
+ Sb     2219    BULLET OPERATOR
+ RT     221a    SQUARE ROOT
+ 0(     221d    PROPORTIONAL TO
+ 00     221e    INFINITY
+ -L     221f    RIGHT ANGLE
+ -V     2220    ANGLE
+ PP     2225    PARALLEL TO
+ AN     2227    LOGICAL AND
+ OR     2228    LOGICAL OR
+ (U     2229    INTERSECTION
+ )U     222a    UNION
+ In     222b    INTEGRAL
+ DI     222c    DOUBLE INTEGRAL
+ Io     222e    CONTOUR INTEGRAL
+ .:     2234    THEREFORE
+
+Simonsen                                                       [Page 25]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ :.     2235    BECAUSE
+ :R     2236    RATIO
+ ::     2237    PROPORTION
+ ?1     223c    TILDE OPERATOR
+ CG     223e    INVERTED LAZY S
+ ?-     2243    ASYMPTOTICALLY EQUAL TO
+ ?=     2245    APPROXIMATELY EQUAL TO
+ ?2     2248    ALMOST EQUAL TO
+ =?     224c    ALL EQUAL TO
+ HI     2253    IMAGE OF OR APPROXIMATELY EQUAL TO
+ !=     2260    NOT EQUAL TO
+ =3     2261    IDENTICAL TO
+ =<     2264    LESS-THAN OR EQUAL TO
+ >=     2265    GREATER-THAN OR EQUAL TO
+ <*     226a    MUCH LESS-THAN
+ *>     226b    MUCH GREATER-THAN
+ !<     226e    NOT LESS-THAN
+ !>     226f    NOT GREATER-THAN
+ (C     2282    SUBSET OF
+ )C     2283    SUPERSET OF
+ (_     2286    SUBSET OF OR EQUAL TO
+ )_     2287    SUPERSET OF OR EQUAL TO
+ 0.     2299    CIRCLED DOT OPERATOR
+ 02     229a    CIRCLED RING OPERATOR
+ -T     22a5    UP TACK
+ .P     22c5    DOT OPERATOR
+ :3     22ee    VERTICAL ELLIPSIS
+ .3     22ef    MIDLINE HORIZONTAL ELLIPSIS
+ Eh     2302    HOUSE
+ <7     2308    LEFT CEILING
+ >7     2309    RIGHT CEILING
+ 7<     230a    LEFT FLOOR
+ 7>     230b    RIGHT FLOOR
+ NI     2310    REVERSED NOT SIGN
+ (A     2312    ARC
+ TR     2315    TELEPHONE RECORDER
+ Iu     2320    TOP HALF INTEGRAL
+ Il     2321    BOTTOM HALF INTEGRAL
+ </     2329    LEFT-POINTING ANGLE BRACKET
+ />     232a    RIGHT-POINTING ANGLE BRACKET
+ Vs     2423    OPEN BOX
+ 1h     2440    OCR HOOK
+ 3h     2441    OCR CHAIR
+ 2h     2442    OCR FORK
+ 4h     2443    OCR INVERTED FORK
+ 1j     2446    OCR BRANCH BANK IDENTIFICATION
+ 2j     2447    OCR AMOUNT OF CHECK
+ 3j     2448    OCR DASH
+ 4j     2449    OCR CUSTOMER ACCOUNT NUMBER
+ 1-o    2460    CIRCLED DIGIT ONE
+ 2-o    2461    CIRCLED DIGIT TWO
+ 3-o    2462    CIRCLED DIGIT THREE
+ 4-o    2463    CIRCLED DIGIT FOUR
+
+Simonsen                                                       [Page 26]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ 5-o    2464    CIRCLED DIGIT FIVE
+ 6-o    2465    CIRCLED DIGIT SIX
+ 7-o    2466    CIRCLED DIGIT SEVEN
+ 8-o    2467    CIRCLED DIGIT EIGHT
+ 9-o    2468    CIRCLED DIGIT NINE
+ 10-o   2469    CIRCLED NUMBER TEN
+ 11-o   246a    CIRCLED NUMBER ELEVEN
+ 12-o   246b    CIRCLED NUMBER TWELVE
+ 13-o   246c    CIRCLED NUMBER THIRTEEN
+ 14-o   246d    CIRCLED NUMBER FOURTEEN
+ 15-o   246e    CIRCLED NUMBER FIFTEEN
+ 16-o   246f    CIRCLED NUMBER SIXTEEN
+ 17-o   2470    CIRCLED NUMBER SEVENTEEN
+ 18-o   2471    CIRCLED NUMBER EIGHTEEN
+ 19-o   2472    CIRCLED NUMBER NINETEEN
+ 20-o   2473    CIRCLED NUMBER TWENTY
+ (1)    2474    PARENTHESIZED DIGIT ONE
+ (2)    2475    PARENTHESIZED DIGIT TWO
+ (3)    2476    PARENTHESIZED DIGIT THREE
+ (4)    2477    PARENTHESIZED DIGIT FOUR
+ (5)    2478    PARENTHESIZED DIGIT FIVE
+ (6)    2479    PARENTHESIZED DIGIT SIX
+ (7)    247a    PARENTHESIZED DIGIT SEVEN
+ (8)    247b    PARENTHESIZED DIGIT EIGHT
+ (9)    247c    PARENTHESIZED DIGIT NINE
+ (10)   247d    PARENTHESIZED NUMBER TEN
+ (11)   247e    PARENTHESIZED NUMBER ELEVEN
+ (12)   247f    PARENTHESIZED NUMBER TWELVE
+ (13)   2480    PARENTHESIZED NUMBER THIRTEEN
+ (14)   2481    PARENTHESIZED NUMBER FOURTEEN
+ (15)   2482    PARENTHESIZED NUMBER FIFTEEN
+ (16)   2483    PARENTHESIZED NUMBER SIXTEEN
+ (17)   2484    PARENTHESIZED NUMBER SEVENTEEN
+ (18)   2485    PARENTHESIZED NUMBER EIGHTEEN
+ (19)   2486    PARENTHESIZED NUMBER NINETEEN
+ (20)   2487    PARENTHESIZED NUMBER TWENTY
+ 1.     2488    DIGIT ONE FULL STOP
+ 2.     2489    DIGIT TWO FULL STOP
+ 3.     248a    DIGIT THREE FULL STOP
+ 4.     248b    DIGIT FOUR FULL STOP
+ 5.     248c    DIGIT FIVE FULL STOP
+ 6.     248d    DIGIT SIX FULL STOP
+ 7.     248e    DIGIT SEVEN FULL STOP
+ 8.     248f    DIGIT EIGHT FULL STOP
+ 9.     2490    DIGIT NINE FULL STOP
+ 10.    2491    NUMBER TEN FULL STOP
+ 11.    2492    NUMBER ELEVEN FULL STOP
+ 12.    2493    NUMBER TWELVE FULL STOP
+ 13.    2494    NUMBER THIRTEEN FULL STOP
+ 14.    2495    NUMBER FOURTEEN FULL STOP
+ 15.    2496    NUMBER FIFTEEN FULL STOP
+ 16.    2497    NUMBER SIXTEEN FULL STOP
+ 17.    2498    NUMBER SEVENTEEN FULL STOP
+
+Simonsen                                                       [Page 27]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ 18.    2499    NUMBER EIGHTEEN FULL STOP
+ 19.    249a    NUMBER NINETEEN FULL STOP
+ 20.    249b    NUMBER TWENTY FULL STOP
+ (a)    249c    PARENTHESIZED LATIN SMALL LETTER A
+ (b)    249d    PARENTHESIZED LATIN SMALL LETTER B
+ (c)    249e    PARENTHESIZED LATIN SMALL LETTER C
+ (d)    249f    PARENTHESIZED LATIN SMALL LETTER D
+ (e)    24a0    PARENTHESIZED LATIN SMALL LETTER E
+ (f)    24a1    PARENTHESIZED LATIN SMALL LETTER F
+ (g)    24a2    PARENTHESIZED LATIN SMALL LETTER G
+ (h)    24a3    PARENTHESIZED LATIN SMALL LETTER H
+ (i)    24a4    PARENTHESIZED LATIN SMALL LETTER I
+ (j)    24a5    PARENTHESIZED LATIN SMALL LETTER J
+ (k)    24a6    PARENTHESIZED LATIN SMALL LETTER K
+ (l)    24a7    PARENTHESIZED LATIN SMALL LETTER L
+ (m)    24a8    PARENTHESIZED LATIN SMALL LETTER M
+ (n)    24a9    PARENTHESIZED LATIN SMALL LETTER N
+ (o)    24aa    PARENTHESIZED LATIN SMALL LETTER O
+ (p)    24ab    PARENTHESIZED LATIN SMALL LETTER P
+ (q)    24ac    PARENTHESIZED LATIN SMALL LETTER Q
+ (r)    24ad    PARENTHESIZED LATIN SMALL LETTER R
+ (s)    24ae    PARENTHESIZED LATIN SMALL LETTER S
+ (t)    24af    PARENTHESIZED LATIN SMALL LETTER T
+ (u)    24b0    PARENTHESIZED LATIN SMALL LETTER U
+ (v)    24b1    PARENTHESIZED LATIN SMALL LETTER V
+ (w)    24b2    PARENTHESIZED LATIN SMALL LETTER W
+ (x)    24b3    PARENTHESIZED LATIN SMALL LETTER X
+ (y)    24b4    PARENTHESIZED LATIN SMALL LETTER Y
+ (z)    24b5    PARENTHESIZED LATIN SMALL LETTER Z
+ A-o    24b6    CIRCLED LATIN CAPITAL LETTER A
+ B-o    24b7    CIRCLED LATIN CAPITAL LETTER B
+ C-o    24b8    CIRCLED LATIN CAPITAL LETTER C
+ D-o    24b9    CIRCLED LATIN CAPITAL LETTER D
+ E-o    24ba    CIRCLED LATIN CAPITAL LETTER E
+ F-o    24bb    CIRCLED LATIN CAPITAL LETTER F
+ G-o    24bc    CIRCLED LATIN CAPITAL LETTER G
+ H-o    24bd    CIRCLED LATIN CAPITAL LETTER H
+ I-o    24be    CIRCLED LATIN CAPITAL LETTER I
+ J-o    24bf    CIRCLED LATIN CAPITAL LETTER J
+ K-o    24c0    CIRCLED LATIN CAPITAL LETTER K
+ L-o    24c1    CIRCLED LATIN CAPITAL LETTER L
+ M-o    24c2    CIRCLED LATIN CAPITAL LETTER M
+ N-o    24c3    CIRCLED LATIN CAPITAL LETTER N
+ O-o    24c4    CIRCLED LATIN CAPITAL LETTER O
+ P-o    24c5    CIRCLED LATIN CAPITAL LETTER P
+ Q-o    24c6    CIRCLED LATIN CAPITAL LETTER Q
+ R-o    24c7    CIRCLED LATIN CAPITAL LETTER R
+ S-o    24c8    CIRCLED LATIN CAPITAL LETTER S
+ T-o    24c9    CIRCLED LATIN CAPITAL LETTER T
+ U-o    24ca    CIRCLED LATIN CAPITAL LETTER U
+ V-o    24cb    CIRCLED LATIN CAPITAL LETTER V
+ W-o    24cc    CIRCLED LATIN CAPITAL LETTER W
+ X-o    24cd    CIRCLED LATIN CAPITAL LETTER X
+
+Simonsen                                                       [Page 28]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ Y-o    24ce    CIRCLED LATIN CAPITAL LETTER Y
+ Z-o    24cf    CIRCLED LATIN CAPITAL LETTER Z
+ a-o    24d0    CIRCLED LATIN SMALL LETTER A
+ b-o    24d1    CIRCLED LATIN SMALL LETTER B
+ c-o    24d2    CIRCLED LATIN SMALL LETTER C
+ d-o    24d3    CIRCLED LATIN SMALL LETTER D
+ e-o    24d4    CIRCLED LATIN SMALL LETTER E
+ f-o    24d5    CIRCLED LATIN SMALL LETTER F
+ g-o    24d6    CIRCLED LATIN SMALL LETTER G
+ h-o    24d7    CIRCLED LATIN SMALL LETTER H
+ i-o    24d8    CIRCLED LATIN SMALL LETTER I
+ j-o    24d9    CIRCLED LATIN SMALL LETTER J
+ k-o    24da    CIRCLED LATIN SMALL LETTER K
+ l-o    24db    CIRCLED LATIN SMALL LETTER L
+ m-o    24dc    CIRCLED LATIN SMALL LETTER M
+ n-o    24dd    CIRCLED LATIN SMALL LETTER N
+ o-o    24de    CIRCLED LATIN SMALL LETTER O
+ p-o    24df    CIRCLED LATIN SMALL LETTER P
+ q-o    24e0    CIRCLED LATIN SMALL LETTER Q
+ r-o    24e1    CIRCLED LATIN SMALL LETTER R
+ s-o    24e2    CIRCLED LATIN SMALL LETTER S
+ t-o    24e3    CIRCLED LATIN SMALL LETTER T
+ u-o    24e4    CIRCLED LATIN SMALL LETTER U
+ v-o    24e5    CIRCLED LATIN SMALL LETTER V
+ w-o    24e6    CIRCLED LATIN SMALL LETTER W
+ x-o    24e7    CIRCLED LATIN SMALL LETTER X
+ y-o    24e8    CIRCLED LATIN SMALL LETTER Y
+ z-o    24e9    CIRCLED LATIN SMALL LETTER Z
+ 0-o    24ea    CIRCLED DIGIT ZERO
+ hh     2500    BOX DRAWINGS LIGHT HORIZONTAL
+ HH     2501    BOX DRAWINGS HEAVY HORIZONTAL
+ vv     2502    BOX DRAWINGS LIGHT VERTICAL
+ VV     2503    BOX DRAWINGS HEAVY VERTICAL
+ 3-     2504    BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+ 3_     2505    BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+ 3!     2506    BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+ 3/     2507    BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+ 4-     2508    BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+ 4_     2509    BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+ 4!     250a    BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+ 4/     250b    BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+ dr     250c    BOX DRAWINGS LIGHT DOWN AND RIGHT
+ dR     250d    BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+ Dr     250e    BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+ DR     250f    BOX DRAWINGS HEAVY DOWN AND RIGHT
+ dl     2510    BOX DRAWINGS LIGHT DOWN AND LEFT
+ dL     2511    BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+ Dl     2512    BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+ LD     2513    BOX DRAWINGS HEAVY DOWN AND LEFT
+ ur     2514    BOX DRAWINGS LIGHT UP AND RIGHT
+ uR     2515    BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+ Ur     2516    BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+ UR     2517    BOX DRAWINGS HEAVY UP AND RIGHT
+
+Simonsen                                                       [Page 29]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ ul     2518    BOX DRAWINGS LIGHT UP AND LEFT
+ uL     2519    BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+ Ul     251a    BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+ UL     251b    BOX DRAWINGS HEAVY UP AND LEFT
+ vr     251c    BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+ vR     251d    BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+ Udr    251e    BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT
+ uDr    251f    BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT
+ Vr     2520    BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+ UdR    2521    BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY
+ uDR    2522    BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY
+ VR     2523    BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+ vl     2524    BOX DRAWINGS LIGHT VERTICAL AND LEFT
+ vL     2525    BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+ Udl    2526    BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT
+ uDl    2527    BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT
+ Vl     2528    BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+ UdL    2529    BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY
+ uDL    252a    BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY
+ VL     252b    BOX DRAWINGS HEAVY VERTICAL AND LEFT
+ dh     252c    BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+ dLr    252d    BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT
+ dlR    252e    BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT
+ dH     252f    BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+ Dh     2530    BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+ DLr    2531    BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY
+ DlR    2532    BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY
+ DH     2533    BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+ uh     2534    BOX DRAWINGS LIGHT UP AND HORIZONTAL
+ uLr    2535    BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT
+ ulR    2536    BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT
+ uH     2537    BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+ Uh     2538    BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+ ULr    2539    BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY
+ UlR    253a    BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY
+ UH     253b    BOX DRAWINGS HEAVY UP AND HORIZONTAL
+ vh     253c    BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+ vLr    253d    BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT
+ vlR    253e    BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT
+ vH     253f    BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+ Udh    2540    BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT
+ uDh    2541    BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT
+ Vh     2542    BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+ UdLr   2543    BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT
+ UdlR   2544    BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT
+ uDLr   2545    BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT
+ uDlR   2546    BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT
+ UdH    2547    BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY
+ uDH    2548    BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY
+ VLr    2549    BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY
+ VlR    254a    BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY
+ VH     254b    BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+ FD     2571    BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+
+Simonsen                                                       [Page 30]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ BD     2572    BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+ TB     2580    UPPER HALF BLOCK
+ LB     2584    LOWER HALF BLOCK
+ FB     2588    FULL BLOCK
+ lB     258c    LEFT HALF BLOCK
+ RB     2590    RIGHT HALF BLOCK
+ .S     2591    LIGHT SHADE
+ :S     2592    MEDIUM SHADE
+ ?S     2593    DARK SHADE
+ fS     25a0    BLACK SQUARE
+ OS     25a1    WHITE SQUARE
+ RO     25a2    WHITE SQUARE WITH ROUNDED CORNERS
+ Rr     25a3    WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+ RF     25a4    SQUARE WITH HORIZONTAL FILL
+ RY     25a5    SQUARE WITH VERTICAL FILL
+ RH     25a6    SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+ RZ     25a7    SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+ RK     25a8    SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+ RX     25a9    SQUARE WITH DIAGONAL CROSSHATCH FILL
+ sB     25aa    BLACK SMALL SQUARE
+ SR     25ac    BLACK RECTANGLE
+ Or     25ad    WHITE RECTANGLE
+ UT     25b2    BLACK UP-POINTING TRIANGLE
+ uT     25b3    WHITE UP-POINTING TRIANGLE
+ PR     25b6    BLACK RIGHT-POINTING TRIANGLE
+ Tr     25b7    WHITE RIGHT-POINTING TRIANGLE
+ Dt     25bc    BLACK DOWN-POINTING TRIANGLE
+ dT     25bd    WHITE DOWN-POINTING TRIANGLE
+ PL     25c0    BLACK LEFT-POINTING TRIANGLE
+ Tl     25c1    WHITE LEFT-POINTING TRIANGLE
+ Db     25c6    BLACK DIAMOND
+ Dw     25c7    WHITE DIAMOND
+ LZ     25ca    LOZENGE
+ 0m     25cb    WHITE CIRCLE
+ 0o     25ce    BULLSEYE
+ 0M     25cf    BLACK CIRCLE
+ 0L     25d0    CIRCLE WITH LEFT HALF BLACK
+ 0R     25d1    CIRCLE WITH RIGHT HALF BLACK
+ Sn     25d8    INVERSE BULLET
+ Ic     25d9    INVERSE WHITE CIRCLE
+ Fd     25e2    BLACK LOWER RIGHT TRIANGLE
+ Bd     25e3    BLACK LOWER LEFT TRIANGLE
+ *2     2605    BLACK STAR
+ *1     2606    WHITE STAR
+ TEL    260e    BLACK TELEPHONE
+ tel    260f    WHITE TELEPHONE
+ <H     261c    WHITE LEFT POINTING INDEX
+ >H     261e    WHITE RIGHT POINTING INDEX
+ 0u     263a    WHITE SMILING FACE
+ 0U     263b    BLACK SMILING FACE
+ SU     263c    WHITE SUN WITH RAYS
+ Fm     2640    FEMALE SIGN
+ Ml     2642    MALE SIGN
+
+Simonsen                                                       [Page 31]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ cS     2660    BLACK SPADE SUIT
+ cH     2661    WHITE HEART SUIT
+ cD     2662    WHITE DIAMOND SUIT
+ cC     2663    BLACK CLUB SUIT
+ cS-    2664    WHITE SPADE SUIT
+ cH-    2665    BLACK HEART SUIT
+ cD-    2666    BLACK DIAMOND SUIT
+ cC-    2667    WHITE CLUB SUIT
+ Md     2669    QUARTER NOTE
+ M8     266a    EIGHTH NOTE
+ M2     266b    BARRED EIGHTH NOTES
+ M16    266c    BARRED SIXTEENTH NOTES
+ Mb     266d    MUSIC FLAT SIGN
+ Mx     266e    MUSIC NATURAL SIGN
+ MX     266f    MUSIC SHARP SIGN
+ OK     2713    CHECK MARK
+ XX     2717    BALLOT X
+ -X     2720    MALTESE CROSS
+ IS     3000    IDEOGRAPHIC SPACE
+ ,_     3001    IDEOGRAPHIC COMMA
+ ._     3002    IDEOGRAPHIC PERIOD
+ +"     3003    DITTO MARK
+ +_     3004    IDEOGRAPHIC DITTO MARK
+ *_     3005    IDEOGRAPHIC ITERATION MARK
+ ;_     3006    IDEOGRAPHIC CLOSING MARK
+ 0_     3007    IDEOGRAPHIC NUMBER ZERO
+ <+     300a    LEFT DOUBLE ANGLE BRACKET
+ >+     300b    RIGHT DOUBLE ANGLE BRACKET
+ <'     300c    LEFT CORNER BRACKET
+ >'     300d    RIGHT CORNER BRACKET
+ <"     300e    LEFT WHITE CORNER BRACKET
+ >"     300f    RIGHT WHITE CORNER BRACKET
+ ("     3010    LEFT BLACK LENTICULAR BRACKET
+ )"     3011    RIGHT BLACK LENTICULAR BRACKET
+ =T     3012    POSTAL MARK
+ =_     3013    GETA MARK
+ ('     3014    LEFT TORTOISE SHELL BRACKET
+ )'     3015    RIGHT TORTOISE SHELL BRACKET
+ (I     3016    LEFT WHITE LENTICULAR BRACKET
+ )I     3017    RIGHT WHITE LENTICULAR BRACKET
+ -?     301c    WAVE DASH
+ =T:)   3020    POSTAL MARK FACE
+ A5     3041    HIRAGANA LETTER SMALL A
+ a5     3042    HIRAGANA LETTER A
+ I5     3043    HIRAGANA LETTER SMALL I
+ i5     3044    HIRAGANA LETTER I
+ U5     3045    HIRAGANA LETTER SMALL U
+ u5     3046    HIRAGANA LETTER U
+ E5     3047    HIRAGANA LETTER SMALL E
+ e5     3048    HIRAGANA LETTER E
+ O5     3049    HIRAGANA LETTER SMALL O
+ o5     304a    HIRAGANA LETTER O
+ ka     304b    HIRAGANA LETTER KA
+
+Simonsen                                                       [Page 32]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ ga     304c    HIRAGANA LETTER GA
+ ki     304d    HIRAGANA LETTER KI
+ gi     304e    HIRAGANA LETTER GI
+ ku     304f    HIRAGANA LETTER KU
+ gu     3050    HIRAGANA LETTER GU
+ ke     3051    HIRAGANA LETTER KE
+ ge     3052    HIRAGANA LETTER GE
+ ko     3053    HIRAGANA LETTER KO
+ go     3054    HIRAGANA LETTER GO
+ sa     3055    HIRAGANA LETTER SA
+ za     3056    HIRAGANA LETTER ZA
+ si     3057    HIRAGANA LETTER SI
+ zi     3058    HIRAGANA LETTER ZI
+ su     3059    HIRAGANA LETTER SU
+ zu     305a    HIRAGANA LETTER ZU
+ se     305b    HIRAGANA LETTER SE
+ ze     305c    HIRAGANA LETTER ZE
+ so     305d    HIRAGANA LETTER SO
+ zo     305e    HIRAGANA LETTER ZO
+ ta     305f    HIRAGANA LETTER TA
+ da     3060    HIRAGANA LETTER DA
+ ti     3061    HIRAGANA LETTER TI
+ di     3062    HIRAGANA LETTER DI
+ tU     3063    HIRAGANA LETTER SMALL TU
+ tu     3064    HIRAGANA LETTER TU
+ du     3065    HIRAGANA LETTER DU
+ te     3066    HIRAGANA LETTER TE
+ de     3067    HIRAGANA LETTER DE
+ to     3068    HIRAGANA LETTER TO
+ do     3069    HIRAGANA LETTER DO
+ na     306a    HIRAGANA LETTER NA
+ ni     306b    HIRAGANA LETTER NI
+ nu     306c    HIRAGANA LETTER NU
+ ne     306d    HIRAGANA LETTER NE
+ no     306e    HIRAGANA LETTER NO
+ ha     306f    HIRAGANA LETTER HA
+ ba     3070    HIRAGANA LETTER BA
+ pa     3071    HIRAGANA LETTER PA
+ hi     3072    HIRAGANA LETTER HI
+ bi     3073    HIRAGANA LETTER BI
+ pi     3074    HIRAGANA LETTER PI
+ hu     3075    HIRAGANA LETTER HU
+ bu     3076    HIRAGANA LETTER BU
+ pu     3077    HIRAGANA LETTER PU
+ he     3078    HIRAGANA LETTER HE
+ be     3079    HIRAGANA LETTER BE
+ pe     307a    HIRAGANA LETTER PE
+ ho     307b    HIRAGANA LETTER HO
+ bo     307c    HIRAGANA LETTER BO
+ po     307d    HIRAGANA LETTER PO
+ ma     307e    HIRAGANA LETTER MA
+ mi     307f    HIRAGANA LETTER MI
+ mu     3080    HIRAGANA LETTER MU
+
+Simonsen                                                       [Page 33]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ me     3081    HIRAGANA LETTER ME
+ mo     3082    HIRAGANA LETTER MO
+ yA     3083    HIRAGANA LETTER SMALL YA
+ ya     3084    HIRAGANA LETTER YA
+ yU     3085    HIRAGANA LETTER SMALL YU
+ yu     3086    HIRAGANA LETTER YU
+ yO     3087    HIRAGANA LETTER SMALL YO
+ yo     3088    HIRAGANA LETTER YO
+ ra     3089    HIRAGANA LETTER RA
+ ri     308a    HIRAGANA LETTER RI
+ ru     308b    HIRAGANA LETTER RU
+ re     308c    HIRAGANA LETTER RE
+ ro     308d    HIRAGANA LETTER RO
+ wA     308e    HIRAGANA LETTER SMALL WA
+ wa     308f    HIRAGANA LETTER WA
+ wi     3090    HIRAGANA LETTER WI
+ we     3091    HIRAGANA LETTER WE
+ wo     3092    HIRAGANA LETTER WO
+ n5     3093    HIRAGANA LETTER N
+ vu     3094    HIRAGANA LETTER VU
+ "5     309b    KATAKANA-HIRAGANA VOICED SOUND MARK
+ 05     309c    KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ *5     309d    HIRAGANA ITERATION MARK
+ +5     309e    HIRAGANA VOICED ITERATION MARK
+ a6     30a1    KATAKANA LETTER SMALL A
+ A6     30a2    KATAKANA LETTER A
+ i6     30a3    KATAKANA LETTER SMALL I
+ I6     30a4    KATAKANA LETTER I
+ u6     30a5    KATAKANA LETTER SMALL U
+ U6     30a6    KATAKANA LETTER U
+ e6     30a7    KATAKANA LETTER SMALL E
+ E6     30a8    KATAKANA LETTER E
+ o6     30a9    KATAKANA LETTER SMALL O
+ O6     30aa    KATAKANA LETTER O
+ Ka     30ab    KATAKANA LETTER KA
+ Ga     30ac    KATAKANA LETTER GA
+ Ki     30ad    KATAKANA LETTER KI
+ Gi     30ae    KATAKANA LETTER GI
+ Ku     30af    KATAKANA LETTER KU
+ Gu     30b0    KATAKANA LETTER GU
+ Ke     30b1    KATAKANA LETTER KE
+ Ge     30b2    KATAKANA LETTER GE
+ Ko     30b3    KATAKANA LETTER KO
+ Go     30b4    KATAKANA LETTER GO
+ Sa     30b5    KATAKANA LETTER SA
+ Za     30b6    KATAKANA LETTER ZA
+ Si     30b7    KATAKANA LETTER SI
+ Zi     30b8    KATAKANA LETTER ZI
+ Su     30b9    KATAKANA LETTER SU
+ Zu     30ba    KATAKANA LETTER ZU
+ Se     30bb    KATAKANA LETTER SE
+ Ze     30bc    KATAKANA LETTER ZE
+ So     30bd    KATAKANA LETTER SO
+
+Simonsen                                                       [Page 34]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ Zo     30be    KATAKANA LETTER ZO
+ Ta     30bf    KATAKANA LETTER TA
+ Da     30c0    KATAKANA LETTER DA
+ Ti     30c1    KATAKANA LETTER TI
+ Di     30c2    KATAKANA LETTER DI
+ TU     30c3    KATAKANA LETTER SMALL TU
+ Tu     30c4    KATAKANA LETTER TU
+ Du     30c5    KATAKANA LETTER DU
+ Te     30c6    KATAKANA LETTER TE
+ De     30c7    KATAKANA LETTER DE
+ To     30c8    KATAKANA LETTER TO
+ Do     30c9    KATAKANA LETTER DO
+ Na     30ca    KATAKANA LETTER NA
+ Ni     30cb    KATAKANA LETTER NI
+ Nu     30cc    KATAKANA LETTER NU
+ Ne     30cd    KATAKANA LETTER NE
+ No     30ce    KATAKANA LETTER NO
+ Ha     30cf    KATAKANA LETTER HA
+ Ba     30d0    KATAKANA LETTER BA
+ Pa     30d1    KATAKANA LETTER PA
+ Hi     30d2    KATAKANA LETTER HI
+ Bi     30d3    KATAKANA LETTER BI
+ Pi     30d4    KATAKANA LETTER PI
+ Hu     30d5    KATAKANA LETTER HU
+ Bu     30d6    KATAKANA LETTER BU
+ Pu     30d7    KATAKANA LETTER PU
+ He     30d8    KATAKANA LETTER HE
+ Be     30d9    KATAKANA LETTER BE
+ Pe     30da    KATAKANA LETTER PE
+ Ho     30db    KATAKANA LETTER HO
+ Bo     30dc    KATAKANA LETTER BO
+ Po     30dd    KATAKANA LETTER PO
+ Ma     30de    KATAKANA LETTER MA
+ Mi     30df    KATAKANA LETTER MI
+ Mu     30e0    KATAKANA LETTER MU
+ Me     30e1    KATAKANA LETTER ME
+ Mo     30e2    KATAKANA LETTER MO
+ YA     30e3    KATAKANA LETTER SMALL YA
+ Ya     30e4    KATAKANA LETTER YA
+ YU     30e5    KATAKANA LETTER SMALL YU
+ Yu     30e6    KATAKANA LETTER YU
+ YO     30e7    KATAKANA LETTER SMALL YO
+ Yo     30e8    KATAKANA LETTER YO
+ Ra     30e9    KATAKANA LETTER RA
+ Ri     30ea    KATAKANA LETTER RI
+ Ru     30eb    KATAKANA LETTER RU
+ Re     30ec    KATAKANA LETTER RE
+ Ro     30ed    KATAKANA LETTER RO
+ WA     30ee    KATAKANA LETTER SMALL WA
+ Wa     30ef    KATAKANA LETTER WA
+ Wi     30f0    KATAKANA LETTER WI
+ We     30f1    KATAKANA LETTER WE
+ Wo     30f2    KATAKANA LETTER WO
+
+Simonsen                                                       [Page 35]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ N6     30f3    KATAKANA LETTER N
+ Vu     30f4    KATAKANA LETTER VU
+ KA     30f5    KATAKANA LETTER SMALL KA
+ KE     30f6    KATAKANA LETTER SMALL KE
+ Va     30f7    KATAKANA LETTER VA
+ Vi     30f8    KATAKANA LETTER VI
+ Ve     30f9    KATAKANA LETTER VE
+ Vo     30fa    KATAKANA LETTER VO
+ .6     30fb    KATAKANA MIDDLE DOT
+ -6     30fc    KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ *6     30fd    KATAKANA ITERATION MARK
+ +6     30fe    KATAKANA VOICED ITERATION MARK
+ b4     3105    BOPOMOFO LETTER B
+ p4     3106    BOPOMOFO LETTER P
+ m4     3107    BOPOMOFO LETTER M
+ f4     3108    BOPOMOFO LETTER F
+ d4     3109    BOPOMOFO LETTER D
+ t4     310a    BOPOMOFO LETTER T
+ n4     310b    BOPOMOFO LETTER N
+ l4     310c    BOPOMOFO LETTER L
+ g4     310d    BOPOMOFO LETTER G
+ k4     310e    BOPOMOFO LETTER K
+ h4     310f    BOPOMOFO LETTER H
+ j4     3110    BOPOMOFO LETTER J
+ q4     3111    BOPOMOFO LETTER Q
+ x4     3112    BOPOMOFO LETTER X
+ zh     3113    BOPOMOFO LETTER ZH
+ ch     3114    BOPOMOFO LETTER CH
+ sh     3115    BOPOMOFO LETTER SH
+ r4     3116    BOPOMOFO LETTER R
+ z4     3117    BOPOMOFO LETTER Z
+ c4     3118    BOPOMOFO LETTER C
+ s4     3119    BOPOMOFO LETTER S
+ a4     311a    BOPOMOFO LETTER A
+ o4     311b    BOPOMOFO LETTER O
+ e4     311c    BOPOMOFO LETTER E
+ eh4    311d    BOPOMOFO LETTER EH
+ ai     311e    BOPOMOFO LETTER AI
+ ei     311f    BOPOMOFO LETTER EI
+ au     3120    BOPOMOFO LETTER AU
+ ou     3121    BOPOMOFO LETTER OU
+ an     3122    BOPOMOFO LETTER AN
+ en     3123    BOPOMOFO LETTER EN
+ aN     3124    BOPOMOFO LETTER ANG
+ eN     3125    BOPOMOFO LETTER ENG
+ er     3126    BOPOMOFO LETTER ER
+ i4     3127    BOPOMOFO LETTER I
+ u4     3128    BOPOMOFO LETTER U
+ iu     3129    BOPOMOFO LETTER IU
+ v4     312a    BOPOMOFO LETTER V
+ nG     312b    BOPOMOFO LETTER NG
+ gn     312c    BOPOMOFO LETTER GN
+ (JU)   321c    PARENTHESIZED HANGUL JU
+
+Simonsen                                                       [Page 36]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ 1c     3220    PARENTHESIZED IDEOGRAPH ONE
+ 2c     3221    PARENTHESIZED IDEOGRAPH TWO
+ 3c     3222    PARENTHESIZED IDEOGRAPH THREE
+ 4c     3223    PARENTHESIZED IDEOGRAPH FOUR
+ 5c     3224    PARENTHESIZED IDEOGRAPH FIVE
+ 6c     3225    PARENTHESIZED IDEOGRAPH SIX
+ 7c     3226    PARENTHESIZED IDEOGRAPH SEVEN
+ 8c     3227    PARENTHESIZED IDEOGRAPH EIGHT
+ 9c     3228    PARENTHESIZED IDEOGRAPH NINE
+ 10c    3229    PARENTHESIZED IDEOGRAPH TEN
+ KSC    327f    KOREAN STANDARD SYMBOL
+ ff     fb00    LATIN SMALL LIGATURE FF
+ fi     fb01    LATIN SMALL LIGATURE FI
+ fl     fb02    LATIN SMALL LIGATURE FL
+ ffi    fb03    LATIN SMALL LIGATURE FFI
+ ffl    fb04    LATIN SMALL LIGATURE FFL
+ ft     fb05    LATIN SMALL LIGATURE FT
+ st     fb06    LATIN SMALL LIGATURE ST
+ 3+;    fe7d    ARABIC SHADDA MEDIAL FORM
+ aM.    fe82    ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM
+ aH.    fe84    ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM
+ a+-    fe8d    ARABIC LETTER ALEF ISOLATED FORM
+ a+.    fe8e    ARABIC LETTER ALEF FINAL FORM
+ b+-    fe8f    ARABIC LETTER BEH ISOLATED FORM
+ b+,    fe90    ARABIC LETTER BEH INITIAL FORM
+ b+;    fe91    ARABIC LETTER BEH MEDIAL FORM
+ b+.    fe92    ARABIC LETTER BEH FINAL FORM
+ tm-    fe93    ARABIC LETTER TEH MARBUTA ISOLATED FORM
+ tm.    fe94    ARABIC LETTER TEH MARBUTA FINAL FORM
+ t+-    fe95    ARABIC LETTER TEH ISOLATED FORM
+ t+,    fe96    ARABIC LETTER TEH INITIAL FORM
+ t+;    fe97    ARABIC LETTER TEH MEDIAL FORM
+ t+.    fe98    ARABIC LETTER TEH FINAL FORM
+ tk-    fe99    ARABIC LETTER THEH ISOLATED FORM
+ tk,    fe9a    ARABIC LETTER THEH INITIAL FORM
+ tk;    fe9b    ARABIC LETTER THEH MEDIAL FORM
+ tk.    fe9c    ARABIC LETTER THEH FINAL FORM
+ g+-    fe9d    ARABIC LETTER JEEM ISOLATED FORM
+ g+,    fe9e    ARABIC LETTER JEEM INITIAL FORM
+ g+;    fe9f    ARABIC LETTER JEEM MEDIAL FORM
+ g+.    fea0    ARABIC LETTER JEEM FINAL FORM
+ hk-    fea1    ARABIC LETTER HAH ISOLATED FORM
+ hk,    fea2    ARABIC LETTER HAH INITIAL FORM
+ hk;    fea3    ARABIC LETTER HAH MEDIAL FORM
+ hk.    fea4    ARABIC LETTER HAH FINAL FORM
+ x+-    fea5    ARABIC LETTER KHAH ISOLATED FORM
+ x+,    fea6    ARABIC LETTER KHAH INITIAL FORM
+ x+;    fea7    ARABIC LETTER KHAH MEDIAL FORM
+ x+.    fea8    ARABIC LETTER KHAH FINAL FORM
+ d+-    fea9    ARABIC LETTER DAL ISOLATED FORM
+ d+.    feaa    ARABIC LETTER DAL FINAL FORM
+ dk-    feab    ARABIC LETTER THAL ISOLATED FORM
+ dk.    feac    ARABIC LETTER THAL FINAL FORM
+
+Simonsen                                                       [Page 37]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ r+-    fead    ARABIC LETTER REH ISOLATED FORM
+ r+.    feae    ARABIC LETTER REH FINAL FORM
+ z+-    feaf    ARABIC LETTER ZAIN ISOLATED FORM
+ z+.    feb0    ARABIC LETTER ZAIN FINAL FORM
+ s+-    feb1    ARABIC LETTER SEEN ISOLATED FORM
+ s+,    feb2    ARABIC LETTER SEEN INITIAL FORM
+ s+;    feb3    ARABIC LETTER SEEN MEDIAL FORM
+ s+.    feb4    ARABIC LETTER SEEN FINAL FORM
+ sn-    feb5    ARABIC LETTER SHEEN ISOLATED FORM
+ sn,    feb6    ARABIC LETTER SHEEN INITIAL FORM
+ sn;    feb7    ARABIC LETTER SHEEN MEDIAL FORM
+ sn.    feb8    ARABIC LETTER SHEEN FINAL FORM
+ c+-    feb9    ARABIC LETTER SAD ISOLATED FORM
+ c+,    feba    ARABIC LETTER SAD INITIAL FORM
+ c+;    febb    ARABIC LETTER SAD MEDIAL FORM
+ c+.    febc    ARABIC LETTER SAD FINAL FORM
+ dd-    febd    ARABIC LETTER DAD ISOLATED FORM
+ dd,    febe    ARABIC LETTER DAD INITIAL FORM
+ dd;    febf    ARABIC LETTER DAD MEDIAL FORM
+ dd.    fec0    ARABIC LETTER DAD FINAL FORM
+ tj-    fec1    ARABIC LETTER TAH ISOLATED FORM
+ tj,    fec2    ARABIC LETTER TAH INITIAL FORM
+ tj;    fec3    ARABIC LETTER TAH MEDIAL FORM
+ tj.    fec4    ARABIC LETTER TAH FINAL FORM
+ zH-    fec5    ARABIC LETTER ZAH ISOLATED FORM
+ zH,    fec6    ARABIC LETTER ZAH INITIAL FORM
+ zH;    fec7    ARABIC LETTER ZAH MEDIAL FORM
+ zH.    fec8    ARABIC LETTER ZAH FINAL FORM
+ e+-    fec9    ARABIC LETTER AIN ISOLATED FORM
+ e+,    feca    ARABIC LETTER AIN INITIAL FORM
+ e+;    fecb    ARABIC LETTER AIN MEDIAL FORM
+ e+.    fecc    ARABIC LETTER AIN FINAL FORM
+ i+-    fecd    ARABIC LETTER GHAIN ISOLATED FORM
+ i+,    fece    ARABIC LETTER GHAIN INITIAL FORM
+ i+;    fecf    ARABIC LETTER GHAIN MEDIAL FORM
+ i+.    fed0    ARABIC LETTER GHAIN FINAL FORM
+ f+-    fed1    ARABIC LETTER FEH ISOLATED FORM
+ f+,    fed2    ARABIC LETTER FEH INITIAL FORM
+ f+;    fed3    ARABIC LETTER FEH MEDIAL FORM
+ f+.    fed4    ARABIC LETTER FEH FINAL FORM
+ q+-    fed5    ARABIC LETTER QAF ISOLATED FORM
+ q+,    fed6    ARABIC LETTER QAF INITIAL FORM
+ q+;    fed7    ARABIC LETTER QAF MEDIAL FORM
+ q+.    fed8    ARABIC LETTER QAF FINAL FORM
+ k+-    fed9    ARABIC LETTER KAF ISOLATED FORM
+ k+,    feda    ARABIC LETTER KAF INITIAL FORM
+ k+;    fedb    ARABIC LETTER KAF MEDIAL FORM
+ k+.    fedc    ARABIC LETTER KAF FINAL FORM
+ l+-    fedd    ARABIC LETTER LAM ISOLATED FORM
+ l+,    fede    ARABIC LETTER LAM INITIAL FORM
+ l+;    fedf    ARABIC LETTER LAM MEDIAL FORM
+ l+.    fee0    ARABIC LETTER LAM FINAL FORM
+ m+-    fee1    ARABIC LETTER MEEM ISOLATED FORM
+
+Simonsen                                                       [Page 38]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ m+,    fee2    ARABIC LETTER MEEM INITIAL FORM
+ m+;    fee3    ARABIC LETTER MEEM MEDIAL FORM
+ m+.    fee4    ARABIC LETTER MEEM FINAL FORM
+ n+-    fee5    ARABIC LETTER NOON ISOLATED FORM
+ n+,    fee6    ARABIC LETTER NOON INITIAL FORM
+ n+;    fee7    ARABIC LETTER NOON MEDIAL FORM
+ n+.    fee8    ARABIC LETTER NOON FINAL FORM
+ h+-    fee9    ARABIC LETTER HEH ISOLATED FORM
+ h+,    feea    ARABIC LETTER HEH INITIAL FORM
+ h+;    feeb    ARABIC LETTER HEH MEDIAL FORM
+ h+.    feec    ARABIC LETTER HEH FINAL FORM
+ w+-    feed    ARABIC LETTER WAW ISOLATED FORM
+ w+.    feee    ARABIC LETTER WAW FINAL FORM
+ j+-    feef    ARABIC LETTER ALEF MAKSURA ISOLATED FORM
+ j+.    fef0    ARABIC LETTER ALEF MAKSURA FINAL FORM
+ y+-    fef1    ARABIC LETTER YEH ISOLATED FORM
+ y+,    fef2    ARABIC LETTER YEH INITIAL FORM
+ y+;    fef3    ARABIC LETTER YEH MEDIAL FORM
+ y+.    fef4    ARABIC LETTER YEH FINAL FORM
+ lM-    fef5    ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
+                ISOLATED FORM
+ lM.    fef6    ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE
+                FINAL FORM
+ lH-    fef7    ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
+                ISOLATED FORM
+ lH.    fef8    ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE
+                FINAL FORM
+ lh-    fef9    ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
+                ISOLATED FORM
+ lh.    fefa    ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW
+                FINAL FORM
+ la-    fefb    ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM
+ la.    fefc    ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+ NU     0000    NULL (NUL)
+ SH     0001    START OF HEADING (SOH)
+ SX     0002    START OF TEXT (STX)
+ EX     0003    END OF TEXT (ETX)
+ ET     0004    END OF TRANSMISSION (EOT)
+ EQ     0005    ENQUIRY (ENQ)
+ AK     0006    ACKNOWLEDGE (ACK)
+ BL     0007    BELL (BEL)
+ BS     0008    BACKSPACE (BS)
+ HT     0009    CHARACTER TABULATION (HT)
+ LF     000a    LINE FEED (LF)
+ VT     000b    LINE TABULATION (VT)
+ FF     000c    FORM FEED (FF)
+ CR     000d    CARRIAGE RETURN (CR)
+ SO     000e    SHIFT OUT (SO)
+ SI     000f    SHIFT IN (SI)
+ DL     0010    DATALINK ESCAPE (DLE)
+ D1     0011    DEVICE CONTROL ONE (DC1)
+ D2     0012    DEVICE CONTROL TWO (DC2)
+ D3     0013    DEVICE CONTROL THREE (DC3)
+
+Simonsen                                                       [Page 39]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+ D4     0014    DEVICE CONTROL FOUR (DC4)
+ NK     0015    NEGATIVE ACKNOWLEDGE (NAK)
+ SY     0016    SYNCRONOUS IDLE (SYN)
+ EB     0017    END OF TRANSMISSION BLOCK (ETB)
+ CN     0018    CANCEL (CAN)
+ EM     0019    END OF MEDIUM (EM)
+ SB     001a    SUBSTITUTE (SUB)
+ EC     001b    ESCAPE (ESC)
+ FS     001c    FILE SEPARATOR (IS4)
+ GS     001d    GROUP SEPARATOR (IS3)
+ RS     001e    RECORD SEPARATOR (IS2)
+ US     001f    UNIT SEPARATOR (IS1)
+ DT     007f    DELETE (DEL)
+ PA     0080    PADDING CHARACTER (PAD)
+ HO     0081    HIGH OCTET PRESET (HOP)
+ BH     0082    BREAK PERMITTED HERE (BPH)
+ NH     0083    NO BREAK HERE (NBH)
+ IN     0084    INDEX (IND)
+ NL     0085    NEXT LINE (NEL)
+ SA     0086    START OF SELECTED AREA (SSA)
+ ES     0087    END OF SELECTED AREA (ESA)
+ HS     0088    CHARACTER TABULATION SET (HTS)
+ HJ     0089    CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
+ VS     008a    LINE TABULATION SET (VTS)
+ PD     008b    PARTIAL LINE FORWARD (PLD)
+ PU     008c    PARTIAL LINE BACKWARD (PLU)
+ RI     008d    REVERSE LINE FEED (RI)
+ S2     008e    SINGLE-SHIFT TWO (SS2)
+ S3     008f    SINGLE-SHIFT THREE (SS3)
+ DC     0090    DEVICE CONTROL STRING (DCS)
+ P1     0091    PRIVATE USE ONE (PU1)
+ P2     0092    PRIVATE USE TWO (PU2)
+ TS     0093    SET TRANSMIT STATE (STS)
+ CC     0094    CANCEL CHARACTER (CCH)
+ MW     0095    MESSAGE WAITING (MW)
+ SG     0096    START OF GUARDED AREA (SPA)
+ EG     0097    END OF GUARDED AREA (EPA)
+ SS     0098    START OF STRING (SOS)
+ GC     0099    SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
+ SC     009a    SINGLE CHARACTER INTRODUCER (SCI)
+ CI     009b    CONTROL SEQUENCE INTRODUCER (CSI)
+ ST     009c    STRING TERMINATOR (ST)
+ OC     009d    OPERATING SYSTEM COMMAND (OSC)
+ PM     009e    PRIVACY MESSAGE (PM)
+ AC     009f    APPLICATION PROGRAM COMMAND (APC)
+        e000    indicates unfinished (Mnemonic)
+ /c     e001    JOIN THIS LINE WITH NEXT LINE (Mnemonic)
+ UA     e002    Unit space A (ISO-IR-8-1 064)
+ UB     e003    Unit space B (ISO-IR-8-1 096)
+ "3     e004    NON-SPACING UMLAUT (ISO-IR-38 201) (character part)
+ "1     e005    NON-SPACING DIAERESIS WITH ACCENT (ISO-IR-70 192)
+                (character part)
+ "!     e006    NON-SPACING GRAVE ACCENT (ISO-IR-103 193) (character
+
+Simonsen                                                       [Page 40]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+                part)
+ "'     e007    NON-SPACING ACUTE ACCENT (ISO-IR-103 194) (character
+                part)
+ ">     e008    NON-SPACING CIRCUMFLEX ACCENT (ISO-IR-103 195)
+                (character part)
+ "?     e009    NON-SPACING TILDE (ISO-IR-103 196) (character part)
+ "-     e00a    NON-SPACING MACRON (ISO-IR-103 197) (character part)
+ "(     e00b    NON-SPACING BREVE (ISO-IR-103 198) (character part)
+ ".     e00c    NON-SPACING DOT ABOVE (ISO-IR-103 199) (character part)
+ ":     e00d    NON-SPACING DIAERESIS (ISO-IR-103 200) (character part)
+ "0     e00e    NON-SPACING RING ABOVE (ISO-IR-103 202) (character part)
+ ""     e00f    NON-SPACING DOUBLE ACCUTE (ISO-IR-103 204) (character
+                part)
+ "<     e010    NON-SPACING CARON (ISO-IR-103 206) (character part)
+ ",     e011    NON-SPACING CEDILLA (ISO-IR-103 203) (character part)
+ ";     e012    NON-SPACING OGONEK (ISO-IR-103 206) (character part)
+ "_     e013    NON-SPACING LOW LINE (ISO-IR-103 204) (character
+                part)
+ "=     e014    NON-SPACING DOUBLE LOW LINE (ISO-IR-38 217) (character
+                part)
+ "/     e015    NON-SPACING LONG SOLIDUS (ISO-IR-128 201) (character
+                part)
+ "i     e016    GREEK NON-SPACING IOTA BELOW (ISO-IR-55 39) (character
+                part)
+ "d     e017    GREEK NON-SPACING DASIA PNEUMATA (ISO-IR-55 38)
+                (character part)
+ "p     e018    GREEK NON-SPACING PSILI PNEUMATA (ISO-IR-55 37)
+                (character part)
+ ;;     e019    GREEK DASIA PNEUMATA (ISO-IR-18 92)
+ ,,     e01a    GREEK PSILI PNEUMATA (ISO-IR-18 124)
+ b3     e01b    GREEK SMALL LETTER MIDDLE BETA (ISO-IR-18 99)
+ Ci     e01c    CIRCLE (ISO-IR-83 0294)
+ f(     e01d    FUNCTION SIGN (ISO-IR-143 221)
+ ed     e01e    LATIN SMALL LETTER EZH (ISO-IR-158 142)
+ am     e01f    ANTE MERIDIAM SIGN (ISO-IR-149 0267)
+ pm     e020    POST MERIDIAM SIGN (ISO-IR-149 0268)
+ Tel    e021    TEL COMPATIBILITY SIGN (ISO-IR-149 0269)
+ a+:    e022    ARABIC LETTER ALEF FINAL FORM COMPATIBILITY (IBM868 144)
+ Fl     e023    DUTCH GUILDER SIGN (IBM437 159)
+ GF     e024    GAMMA FUNCTION SIGN (ISO-10646-1DIS 032/032/037/122)
+ >V     e025    RIGHTWARDS VECTOR ABOVE (ISO-10646-1DIS 032/032/038/046)
+ !*     e026    GREEK VARIA (ISO-10646-1DIS 032/032/042/164)
+ ?*     e027    GREEK PERISPOMENI (ISO-10646-1DIS 032/032/042/165)
+ J<     e028    LATIN CAPITAL LETTER J WITH CARON (lowercase:
+                000/000/001/240)
+
+4.  CHARSETS
+
+   The character mnemonics hav been used to table a number of coded
+   character sets.  The coded character set names are taken if possible
+   from the official ISO registration description in the ISO 2375 (ECMA)
+   register, or with a number like the code page number - or with an
+   indication of the language or country it is being used for - using
+
+Simonsen                                                       [Page 41]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+   the country designators of ISO 3166.  For the character sets in the
+   ECMA register, their ISO registration number is also given (as ISO-
+   IR-xxx). Often the ISO registration number does not cover all the
+   codes of a character set in use, but for instance only the graphical
+   characters, where another ISO registration number covers the control
+   characters; in the case of the 8-bit character sets the ISO
+   registration only covers the upper graphical characters (GR).  The
+   ISO registration number is here taken to indicate the full coded
+   character set including control characters and lower half of the
+   graphical characters, normally ISO 6429 and ASCII, respectively.
+
+   The ISO definition of the term "coded character set" is as follows:
+   "A set of unambiguous rules that establishes a character set and the
+   one-to-one relationship between the characters of the set and their
+   coded representation." and this definition may be subject to
+   different interpretations.  This memo does not put further
+   restrictions on the term of "coded character set" than the following:
+   "A coded character set is a set of rules that unambiguously and
+   completely determines which sequence of characters, if any, is
+   represented by each possible sequence of n-bit bytes for a certain
+   value of n." This implies that e.g. a coded character set extended
+   with one or more other coded character sets by means of the extension
+   techniques of ISO 2022 constitutes a coded character set in its own
+   right.  In this memo the term "charset" is used to refer to the above
+   interpretation of the ISO term "coded character set".
+
+   A special problem is, if two characters of two different coded
+   character sets with the same descriptive name, or depicted by what
+   looks like the same graphic symbol, or with the same historical
+   origin, really are to be regarded as the same character or not.  This
+   problem has been studied in great detail in the development efforts
+   that have resulted in ISO DIS 10646 and Unicode (under the heading
+   "character unification").  As much as possible such results have been
+   used in the construction of the code tables of this section.
+
+4.1  Charset Naming
+
+   The coded character set names are given in ISO 646 invariant subset
+   (83 characters, where a space in the name is replaced with an
+   underline character; sometimes a hyphen is also used instead of a
+   blank, or the blank is eliminated when practice exist).  Case is not
+   significant in the charset names.
+
+4.2  Code Table Format
+
+   The following code tables are given in a simple format to facilitate
+   use of this text as program input. Programs and routines written in C
+   to handle these tables are freely available from the author of this
+   memo. Keywords are signified with the character "&" as the first
+   character, to distinguish them from ordinary data. Numbers may be
+   given in decimal, hexadecimal or octal notation; hexadecimal numbers
+   are given with an "x" as the first character, and octal numbers has
+   an "o" as the first character.
+
+Simonsen                                                       [Page 42]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+   The following keywords are used:
+
+   "&charset" has one parameter defining the name of the character set.
+   This is required for every character set.
+
+   "&alias" has one parameter defining a possible alternate name for the
+   character set. This is optional.
+
+   "&g0esc", "&g1esc", "&g2esc", "&g3esc", "&c0esc", "&c1esc" has one
+   parameter indicating the string of octets used to define the
+   character set as the G0, G1, G2, G3, C0 or C1 set respectively,
+   according to ISO 2022 (11).  The string is to be preceded by an ESC
+   character. It is only the relevant parts of the table, which can be
+   used with the definition; the charset is often coded with both
+   graphical and control character sets.  If the coded character set is
+   a 96-character set, it is tabled with the relevant GL set (normally
+   ISO-IR-6) and with ISO 6429 as C0 and C1 (12).  If it is a 94-
+   character set, it is tabled with the C0 set of ISO 6429. If it is a
+   double-octet coded character set, it is tabled without control
+   character sets and accompanying one-octet coded character sets, and
+   the two-octet code is tabled as a G0 set.
+
+   "&bits" has one parameter indicating the number of bits to represent
+   the charset. This is optional and 8 bits is the default.
+
+   "&code" has one parameter indicating the byte number allocated to the
+   following character mnemonic. After the "&code" specification the
+   characters are listed with their mnemonic in ascending order.  A
+   character mnemonic of "??" indicates that the position is unused.  A
+   character mnemonic of "__" indicates that the character set is not
+   completely defined with the specifications in this memo.
+
+   "&code2" has 2 parameters specifying the row and column in certain
+   16-bit character sets.  The value 32 must be added to obtain the
+   first and second byte respectively.  Mnemonics can be specified after
+   the "&code2" specification as mentioned for the "&code"
+   specification.
+
+   "&codex" has 5 parameters, specifying the character set prefix
+   string, the start row number, the end row number, the start column
+   number and the end column number respectively. This is equivalent to
+   specifying a series of mnemonics of the form "nrrcc" where "n" is the
+   character set name prefix string, "rr" is the row number running from
+   the specified start row number to the end row number, and "cc" is the
+   column number running from the specified start column number to the
+   end column number.  The thereby created series mnemonics are
+   allocated to code positions which are added 32 to the row and column
+   numbers to get the row and column octet.
+
+   "&duplicate" has a special meaning indicating that a position is
+   being used for more than one character. This is an ugly convention
+   but it is a sad fact of life that same code in one coded character
+   set can mean different characters. "&duplicate" takes two parameters
+
+Simonsen                                                       [Page 43]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+   - the first is the code to be duplicated, the other is the new
+   mnemonic.
+
+   "&rem" is followed by text to explain something in the table to a
+   human reader.  All lines in such a remark has to start with this
+   keyword.
+
+   "&comb2" specifies a combination of two characters which signifies a
+   third character.  All characters in the specification are given by
+   their mnemonic.  The two combining characters must be specified
+   previously in the code table.  The first combining character is
+   specified as the first character after the keyword, and then the
+   following pairs of characters are the second combining character and
+   the result, respectively.  The specification can be repeated,
+   terminated by an occurrence of a keyword.
+
+4.3  Mnemonic charsets
+
+   The following is compatible with current practice on the internet
+   within EUnet - the European not-for-profit networking organisation in
+   Europe and North Africa currently operating in 24 countries.
+
+   The mnemonic charsets are a family of charsets which have the
+   facility that within the relevant parts of the message, encoded in an
+   ordinary coded character set, text may have occurrences of the
+   following sequence: an intro character sequence, followed by a string
+   of characters that represent a character mnemonic, as described
+   below.  Similarly, the intro character sequence may be doubled,
+   indicating a single occurrence of the respective symbols in decoded
+   format.
+
+   Note that many characters within a mnemonic character set may be
+   represented in two different ways.  Normally the character itself is
+   used, but it is also possible to use the mnemonic allocated to the
+   character in a mnemonic sequence.
+
+   In this way all characters with assigned mnemonics can be represented
+   without information loss in any character set, which contains the
+   invariant ISO 646 characters as a subset.  As a consequence, using a
+   mnemonic character set all these characters can be generated
+   uniformly on all keyboards and presented uniformly on all terminal
+   equipment, whenever the real character is not available.
+
+   Data encoded in a mnemonic charset is intended to be read by the end
+   user possibly without further treatment.  If the transport encoding
+   and the presentation encoding for the user differ, it is recommended
+   that the data be translated into a mnemonic representation in the
+   presentation encoding.
+
+   A mnemonic charset is specified with the name
+   "mnemonic+charset+intro" where "mnemonic" is written as given and
+   "charset" and "intro" is specified as described below. The mnemonic
+   charset "mnemonic" is a shorthand for "mnemonic+ascii+38".  The
+
+Simonsen                                                       [Page 44]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+   mnemonic charset "mnem" is a shorthand for "mnemonic+ascii+8200".
+
+   It is discouraged to use mnemonics for Chinese characters of either
+   Chinese, Japanese or Korean origin, as the probability that the end
+   user equipment can deal with the original encoding is very high for
+   the intended receiver, and the mnemonics for such Chinese characters
+   described in this memo convey very little meaning to humans.
+
+4.3.1  charset
+
+   The charset is given as one of the charset names in this memo and is
+   the encoding used for the transport.  It cannot be a mnemonic
+   charset.
+
+4.3.2  Intro
+
+   The intro character sequence is given as the decimal value of the
+   intro characters in the transport character set. There may be up to
+   two characters used in the intro character sequence, and the decimal
+   value for two-character intro sequences are then the first character
+   value multiplied with 256 to the power of the number of octets used
+   in the character set, plus the second character value.  The
+   recommended value is 38 for the ampersand (&) character in ASCII.
+   Another common value is 29 for the control character "Group
+   Separator", or 8200 for "space" followed by "backspace", which may be
+   convenient when operating in some environments, and ordinary text is
+   not changed.  Only the ampersand character may be chosen as intro
+   from the invariant ISO 646 charset, but any character not in the
+   invariant ISO 646 character can be used as intro.  The intro
+   character sequence is used for introducing character mnemonics when a
+   character is not present in the mail transport character set (as
+   defined by "charset").  Character mnemonics longer than two
+   characters are surrounded by the underline character. The intro
+   character sequence is doubled to represent one occurrence of itself.
+   Characters in the mail transport character set are normally just
+   represented with their encoding, but may also be represented by the
+   intro character sequence and the mnemonic encoding.
+
+   If the intro character sequence is specified as 0 (zero), it is
+   omitted in the transport, giving a better readably content, but
+   eliminating the possibility of reversibility and introducing an
+   information loss.  With intro specified as 0, also underline
+   characters surrounding mnemonics longer than 2 characters are
+   removed.  Mnemonic charsets with the intro specified as zero is
+   equivalent to the ordinary charset, e.g. "mnemonic+ascii+0" is
+   equivalent to "ascii".
+
+   The intro character can be given in a header "Mnemonic-Intro:" with
+   the value given in decimal as noted above in the first parameter.
+   This has only meaning if the charset can be deducted by other
+   information as specified by the relevant Internet specification.
+   This information has precedence over other information on the intro.
+
+
+Simonsen                                                       [Page 45]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+4.3.3  Compatibility
+
+   If applications conforming to this memo interoperate with other
+   versions of this memo, and encounter mnemonics that are undefined
+   with this memo, they shall leave the mnemonic as it is coded. This
+   provides for upward compatibility.
+
+4.3.4  Conversion Between Mnemonic Charsets
+
+   To determine which mnemonic charsets are permitted with the use of an
+   Internet specification, please refer to that specification.  It may
+   be that only "ASCII" or "INVARIANT" is allowed as the base charset.
+   ASCII is the most used character set, while INVARIANT will be very
+   robust for traversing gateways, but it will cause trouble for
+   (amongst other things) source code for several programming languages.
+   The use of other character sets may be limited to agreement between
+   the communicating parties. When such an agreement has been achieved,
+   a conversion between different mnemonic charsets can be done
+   according to the charset tables below, as characters occurring in
+   both encodings are just transformed, and characters not existing in
+   the receiving coded character set are represented by the intro
+   character sequence of the receiving coded character set plus the
+   character mnemonic, as described for the intro character sequence.
+   The characters forming the mnemonic are translated into the receiving
+   code, which must have these characters present.  An undefined
+   character in the originating coded character set is transformed into
+   the following sequence: the intro character sequence, an underline, a
+   question mark character, a "u" (for undefined) and then the
+   hexadecimal value of the character with letters in lowercase
+   (possibly more than one byte for multibyte character sets) and then a
+   terminating underline character.  Headers may need to be changed
+   accordingly to reflect such conversion.  The character mnemonic "/c"
+   has a special meaning in specifying that a line is to be continued
+   even if the next characters are specifying a new line.
+
+5.  CHARSET TABLES
+
+  &charset ISO_646.basic:1983
+  &rem source: ECMA registry
+  &alias ref
+  &code 32
+  SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?? ?? ?? ?? _
+  ?? a b c d e f g h i j k l m n o p q r s t u v w x y z
+
+  &charset INVARIANT
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?? ?? ?? ?? _
+  ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? ?? ?? ?? DT
+
+
+Simonsen                                                       [Page 46]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &charset ISO_646.irv:1983
+  &rem source: ECMA registry
+  &alias iso-ir-2
+  &alias irv
+  &g0esc x2840 &g1esc x2940 &g2esc x2a40 &g3esc x2b40
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
+
+  &charset BS_4730
+  &rem source: ECMA registry
+  &alias iso-ir-4
+  &alias ISO646-GB
+  &g0esc x2841 &g1esc x2941 &g2esc x2a41 &g3esc x2b41
+  &alias gb
+  &alias uk
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
+
+  &charset ANSI_X3.4-1968
+  &rem source: ECMA registry
+  &alias iso-ir-6
+  &alias ANSI_X3.4-1986
+  &alias ISO_646.irv:1991
+  &g0esc x2842 &g1esc x2942 &g2esc x2a42 &g3esc x2b42
+  &alias ASCII
+  &alias ISO646-US
+  &alias US-ASCII
+  &alias us
+  &alias IBM367
+  &alias cp367
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+
+  &charset NATS-SEFI
+  &rem source: ECMA registry
+  &alias iso-ir-8-1
+  &g0esc x2843 &g1esc x2943 &g2esc x2a43 &g3esc x2b43
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+
+Simonsen                                                       [Page 47]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  UA A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: AA fS _
+  UB a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: aa -N DT
+
+  &charset NATS-SEFI-ADD
+  &rem source: ECMA registry
+  &alias iso-ir-8-2
+  &g0esc x2844 &g1esc x2944 &g2esc x2a44 &g3esc x2b44
+  &code 0
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? A! ?? ?? D/ E' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  TH ?? ?? ?? ?? U: ?? ?? ?? ?? ?? AE O/ ?? ?? ??
+  ?? a! ?? ?? d/ e' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  th ?? ?? ?? ?? u: ?? ?? ?? ?? ?? ae o/ ?? ?? ??
+
+  &charset NATS-DANO
+  &rem source: ECMA registry
+  &alias iso-ir-9-1
+  &g0esc x2845 &g1esc x2945 &g2esc x2a45 &g3esc x2b45
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! << >> DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  UA A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA fS _
+  UB a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa -N DT
+
+  &charset NATS-DANO-ADD
+  &rem source: ECMA registry
+  &alias iso-ir-9-2
+  &g0esc x2846 &g1esc x2946 &g2esc x2a46 &g3esc x2b46
+  &code 0
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? A! ?? ?? D/ E' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  TH ?? ?? ?? ?? U: ?? ?? ?? ?? ?? A: O: ?? ?? ??
+  ?? a! ?? ?? d/ e' ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  th ?? ?? ?? ?? u: ?? ?? ?? ?? ?? a: o: ?? ?? ??
+
+  &charset SEN_850200_B
+  &rem source: ECMA registry
+  &alias iso-ir-10
+  &alias FI
+  &alias ISO646-FI
+  &alias ISO646-SE
+  &alias se
+  &g0esc x2847 &g1esc x2947 &g2esc x2a47 &g3esc x2b47
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+
+Simonsen                                                       [Page 48]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: AA '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: aa '- DT
+
+  &charset SEN_850200_C
+  &rem source: ECMA registry
+  &alias iso-ir-11
+  &alias ISO646-SE2
+  &g0esc x2848 &g1esc x2948 &g2esc x2a48 &g3esc x2b48
+  &alias se2
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  E' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: AA U: _
+  e' a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: aa u: DT
+
+  &charset JIS_C6220-1969-jp
+  &rem source: ECMA registry
+  &alias JIS_C6220-1969
+  &alias iso-ir-13
+  &alias katakana
+  &alias x0201-7
+  &g0esc x2849 &g1esc x2949 &g2esc x2a49 &g3esc x2b49
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ._ <' >' ,_ .6 Wo a6 i6 u6 e6 o6 YA YU YO TU
+  -6 A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko Sa Si Su Se So
+  Ta Ti Tu Te To Na Ni Nu Ne No Ha Hi Hu He Ho Ma
+  Mi Mu Me Mo Ya Yu Yo Ra Ri Ru Re Ro Wa N6 "5 05
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
+
+  &charset JIS_C6220-1969-ro
+  &rem source: ECMA registry
+  &alias iso-ir-14
+  &g0esc x284a &g1esc x294a &g2esc x2a4a &g3esc x2b4a
+  &alias jp
+  &alias ISO646-JP
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( Ye )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
+
+  &charset IT
+  &rem source: ECMA registry
+  &alias iso-ir-15
+  &alias ISO646-IT
+  &g0esc x2859 &g1esc x2959 &g2esc x2a59 &g3esc x2b59
+  &code 0
+
+Simonsen                                                       [Page 49]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DG c, e' '> _
+  u! a b c d e f g h i j k l m n o p q r s t u v w x y z a! o! e! i! DT
+
+  &charset PT
+  &rem source: ECMA registry
+  &alias iso-ir-16
+  &alias ISO646-PT
+  &g0esc x284c &g1esc x294c &g2esc x2a4c &g3esc x2b4c
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A? C, O? '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z a? c, o? DG DT
+
+  &charset ES
+  &rem source: ECMA registry
+  &alias iso-ir-17
+  &alias ISO646-ES
+  &g0esc x285a &g1esc x295a &g2esc x2a5a &g3esc x2b5a
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z !I N? ?I '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z DG n? c, '? DT
+
+  &charset greek7-old
+  &rem source: ECMA registry
+  &alias iso-ir-18
+  &g0esc x285b &g1esc x295b &g2esc x2a5b &g3esc x2b5b
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  '' a* b* q* d* e* f* g* y* i* c* k* l* m* n* o*
+  p* j3 r* s* t* h* w* *s x* u* z* ?, ,, ,' '? _
+  '! A* B* Q* D* E* F* G* Y* I* C* K* L* M* N* O*
+  P* ?? R* S* T* H* W* .M X* U* Z* ?; ;; ;' ': DT
+
+  &charset latin-greek
+  &rem source: ECMA registry
+  &alias iso-ir-19
+  &g0esc x285c &g1esc x295c &g2esc x2a5c &g3esc x2b5c
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A  B  C  D  E  F  G  H  I  J  K  L  M  N  O
+  P  Q  R  S  T  U  V  W  X  Y  Z  <( // )> '> _
+
+Simonsen                                                       [Page 50]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  '! A* B* Q* D* E* F* G* Y* I* C* K* L* M* N* O*
+  P* ?? R* S* T* H* W* .M X* U* Z* (! !! !) ': DT
+
+  &charset DIN_66003
+  &rem source: ECMA registry
+  &alias iso-ir-21
+  &g0esc x284b &g1esc x294b &g2esc x2a4b &g3esc x2b4b
+  &alias de
+  &alias ISO646-DE
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  SE A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A: O: U: '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z a: o: u: ss DT
+
+  &charset NF_Z_62-010_(1973)
+  &rem source: ECMA registry
+  &alias iso-ir-25
+  &alias ISO646-FR1
+  &g0esc x2852 &g1esc x2952 &g2esc x2a52 &g3esc x2b52
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DG c, SE '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! ': DT
+
+  &charset Latin-greek-1
+  &rem source: ECMA registry
+  &alias iso-ir-27
+  &g0esc x2855 &g1esc x2955 &g2esc x2a55 &g3esc x2b55
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP C* " G* Cu % & ' ( ) * + , - . /
+  0 1 2 3 4 5 6 7 8 9 Q* ; < = > P*
+  D* A B C D E F G H I J K L M N O
+  P Q R S T U V W X Y Z W* H* F* L* S*
+  '! a b c d e f g h i j k l m n o
+  p q r s t u v w x y z (! !! !) '- DT
+
+  &charset ISO_5427
+  &rem source: ECMA registry
+  &alias iso-ir-37
+  &g0esc x284e &g1esc x294e &g2esc x2a4e &g3esc x2b4e
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  ju a= b= c= d= e= f= g= h= i= j= k= l= m= n= o=
+  p= ja r= s= t= u= z% v= %' y= z= s% je sc c% ='
+  JU A= B= C= D= E= F= G= H= I= J= K= L= M= N= O=
+
+Simonsen                                                       [Page 51]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  P= JA R= S= T= U= Z% V= %" Y= Z= S% JE Sc C% DT
+
+  &charset JIS_C6226-1978
+  &rem source: ECMA registry
+  &alias iso-ir-42
+  &bits 16
+  &g0esc x2440 &g1esc x242940 &g2esc x242a40 &g3esc x242b40
+  &code2 1 1
+  SP ,_ ._ , . .6 : ; ! "5 05 '' '! ': '> '- _ *6 +6 *5 +5 +"
+  +_ *_ ;_ 0_ -6 -? -N
+  &code2 1 31
+  FD BD ?1 PP !! .3 .. '6 '9 "6 "9 ( ) (' )' <( )>
+  (! !) <1 >1 </ /> <' >' <" >" (" )" + - +- *X -: = != < > =< >= 00
+  .: Ml Fm DG 1' 2' oC Ye DO Ct Pd % Nb & * At SE *1 *2 0m 0M 0o LZ
+  &code2 2 1
+  Db OS fS uT UT dT DT :X =T -> <- -! -v =_
+  &code2 3 16
+  0 1 2 3 4 5 6 7 8 9
+  &code2 3 33
+  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+  &code2 3 65
+  a b c d e f g h i j k l m n o p q r s t u v w x y z
+  &code2 4 1
+     A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
+  gu ke ge ko go sa za si zi su zu se ze so zo ta
+  da ti di tU tu du te de to do na ni nu ne no ha
+  ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
+  mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
+  wi we wo n5
+  &code2 5 1
+     a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
+  Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
+  Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
+  Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
+  Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
+  Wi We Wo N6 Vi KA KE
+  &code2 6 1
+  A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
+  P* R* S* T* U* F* X* Q* W*
+  &code2 6 33
+  a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
+  p* r* s* t* u* f* x* q* w*
+  &code2 7 1
+  A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
+  R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
+  &code2 7 49
+  a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
+  r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
+  &codex j 16 46 1 94
+  &codex j 47 47 1 51
+  &codex j 48 83 1 94
+
+  &charset BS_viewdata
+
+Simonsen                                                       [Page 52]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &rem source: ECMA registry
+  &alias iso-ir-47
+  &g0esc x2856 &g1esc x2956 &g2esc x2a56 &g3esc x2b56
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <- 12 -> -! OS
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z 14 PP 34 -: DT
+
+  &charset INIS
+  &rem source: ECMA registry
+  &alias iso-ir-49
+  &g0esc x2857 &g1esc x2957 &g2esc x2a57 &g3esc x2b57
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? ?? ?? DO % ?? ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ??
+  ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( ?? )> ?? ??
+  ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? !! ?? ?? DT
+
+  &charset INIS-8
+  &rem source: ECMA registry
+  &alias iso-ir-50
+  &g0esc x285d &g1esc x295d &g2esc x2a5d &g3esc x2b5d
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? a* b* g* d* C* ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -> In
+  0S 1S 2S 3S 4S 5S 6S 7S 8S 9S +S -S Ru D* L* W*
+  0s 1s 2s 3s 4s 5s 6s 7s 8s 9s S* m* n* w* p* DT
+
+  &charset INIS-cyrillic
+  &rem source: ECMA registry
+  &alias iso-ir-51
+  &g0esc x285e &g1esc x295e &g2esc x2a5e &g3esc x2b5e
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? RT ?? -> In
+  a* b* g* d* S* m* n* w* p* C* D* L* W* =" -S +S
+  ju a= b= c= d= e= f= g= h= i= j= k= l= m= n= o=
+  p= ja r= s= t= u= z% v= %' y= z= s% je sc c% ='
+  JU A= B= C= D= E= F= G= H= I= J= K= L= M= N= O=
+  P= JA R= S= T= U= Z% V= %" Y= Z= S% JE Sc C% DT
+
+  &charset ISO_5427:1981
+  &rem source: ECMA registry
+  &alias iso-ir-54
+  &g0esc x2851 &g1esc x2951 &g2esc x2a51 &g3esc x2b51
+
+Simonsen                                                       [Page 53]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  g3 d% g% ie io ds ii yi j% lj nj ts kj v% dz ??
+  y3 f3 v3 o3 ?? ?? ?? ?? ?? ?? ?? <( ?? )> ?? _
+  G3 D% G% IE IO DS II YI J% LJ NJ Ts KJ V% DZ ="
+  Y3 F3 V3 O3 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
+
+  &charset ISO_5428:1980
+  &rem source: ECMA registry
+  &alias iso-ir-55
+  &g0esc x2853 &g1esc x2953 &g2esc x2a53 &g3esc x2b53
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP "! "' ": "? "p "d "i ?? ?? ?? ?? ?? ?? ?? ??
+  << >> "9 "6 'G ,G ?? ?? ?? ?? ?? .M ?? ?? ?? ;
+  ?? A* B* ?? G* D* E* T3 M3 Z* Y* H* I* K* L* M*
+  N* C* O* P* K3 R* S* ?? T* U* F* X* Q* W* P3 ??
+  ?? a* b* b3 g* d* e* t3 m3 z* y* h* i* k* l* m*
+  n* c* o* p* k3 r* s* *s t* u* f* x* q* w* p3 DT
+
+  &charset GB_1988-80
+  &rem source: ECMA registry
+  &alias iso-ir-57
+  &g0esc x2854 &g1esc x2954 &g2esc x2a54 &g3esc x2b54
+  &alias cn
+  &alias ISO646-CN
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Ye % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
+
+  &charset GB_2312-80
+  &rem source: ECMA registry
+  &alias iso-ir-58
+  &g0esc x2441 &g1esc x242941 &g2esc x242a41 &g3esc x242b41
+  &bits 16
+  &alias chinese
+  &code2 1 1
+  SP ,_ .6 .M 'm '< ': +" *_ -6 ?1
+  !2 .3 '6 '9 "6 "9 (' )'
+  <1 >1 << >> <+ >+ <7 7> (I )I (" )" +- *X -: :R AN OR +Z *P (U )U (-
+  :: RT -T PP -L
+  (A 0. In Io =3 =? ?2 CG 0( != !< !> =< >= 00
+  :. .: Ml Fm DG 1' 2' oC DO
+  Cu Ct Pd %0 SE NB *1 *2 0m 0M 0o Dw Db OS fS uT UT :X -> <- -! -v =_
+  &code2 2 17
+  1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
+
+Simonsen                                                       [Page 54]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14)
+  (15) (16) (17) (18) (19) (20) 1-o 2-o 3-o 4-o 5-o 6-o 7-o 8-o 9-o
+  &code2 2 69
+  1c 2c 3c 4c 5c 6c 7c 8c 9c 10c
+  &code2 2 81
+  1R 2R 3R 4R 5R 6R 7R 8R 9R aR bR cR
+  &code2 3 1
+  ! " Nb Ye % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7
+  8 9 : ; < = > ? At A B C D E F G H I J K L M N O
+  P Q R S T U V W X Y Z <( // )> '> _ a b c d e f g
+  h i j k l m n o p q r s t u v w x y z (! !! !) '-
+  &code2 4 1
+     A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
+  gu ke ge ko go sa za si zi su zu se ze so zo ta
+  da ti di tU tu du te de to do na ni nu ne no ha
+  ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
+  mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
+  wi we wo n5
+  &code2 5 1
+     a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
+  Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
+  Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
+  Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
+  Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
+  Wi We Wo N6 Vi KA KE
+  &code2 6 1
+  A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
+  P* R* S* T* U* F* X* Q* W*
+  &code2 6 33
+  a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
+  p* r* s* t* u* f* x* q* w*
+  &code2 7 1
+  A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
+  R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
+  &code2 7 49
+  a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
+  r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
+  &code2 8 1
+  a- a' a< a! e- e' e< e! i- i' i< i! o- o' o< o! u- u' u< u! u:- u:<
+  u:! u: e>
+  &code2 8 37
+  b4 p4 m4 f4 d4 t4 n4 l4 g4 k4 h4 j4 q4 x4 zh ch sh r4 z4 c4
+  s4 a4 o4 e4 eh4 ai ei au ou an en aN eN er i4 u4 iu
+  &code2 9 4
+  hh HH vv VV 3- 3_ 3! 3/ 4- 4_ 4! 4/ dr dR Dr DR dl dL Dl LD
+  ur uR Ur UR ul uL Ul UL vr vR Udr uDr Vr UdR uDR VR
+  vl vL Udl uDl Vl UdL uDL VL
+  dh dLr dlR dH Dh DLr DlR DH
+  vh vLr vlR vH Udh uDh Vh UdLr
+  UdlR uDLr uDlR UdH uDH VLr VlR VH
+  &codex c 16 54 1 94
+  &codex c 55 55 1 89
+  &codex c 56 87 1 94
+
+Simonsen                                                       [Page 55]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+
+  &charset NS_4551-1
+  &rem source: ECMA registry
+  &alias iso-ir-60
+  &alias ISO646-NO
+  &g0esc x2860 &g1esc x2960 &g2esc x2a60 &g3esc x2b60
+  &alias no
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa '- DT
+
+  &charset NS_4551-2
+  &rem source: ECMA registry
+  &alias ISO646-NO2
+  &alias iso-ir-61
+  &g0esc x2861 &g1esc x2961 &g2esc x2a61 &g3esc x2b61
+  &alias no2
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " PI DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa !! DT
+
+  &charset NF_Z_62-010
+  &rem source: ECMA registry
+  &alias iso-ir-69
+  &alias ISO646-FR
+  &g0esc x2866 &g1esc x2966 &g2esc x2a66 &g3esc x2b66
+  &alias fr
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z DG c, SE '> _
+  My a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! ': DT
+
+  &charset videotex-suppl
+  &rem source: ECMA registry
+  &alias iso-ir-70
+  &g0esc x2862 &g1esc x2962 &g2esc x2a62 &g3esc x2b62
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd DO Ye Nb SE Cu '6 "6 << <- -! -> -v
+
+Simonsen                                                       [Page 56]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
+  "1 "! "' "> "? "- "( ". ": ?? "0 ", ?? "" "; "<
+  -M 1S Rg Co TM Md ?? ?? ?? ?? ?? ?? 18 38 58 78
+  Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
+  kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
+  &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
+                  y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
+                  s s' S S' z z' Z Z'
+  &comb2 "( SP '( a a( A A( g g( G G(                     u u( U U(
+  &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
+                  r r< R R< s s< S S< t t< T T< z z< Z Z<
+  &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
+                  r r, R R, s s, S S, t t, T T,
+  &comb2 ">       a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
+                  y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
+                  s s> S S> w w> W W>
+  &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
+                  y y: Y Y:
+  &comb2 ". SP '. c c. C C. e e. E E. g g. G G.      I I. z z. Z Z.
+  &comb2 "" SP '"                               o o" O O" u u" U U"
+  &comb2 "!       a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
+  &comb2 "-       a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
+  &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
+  &comb2 "0 SP '0 a aa A AA                               u u0 U U0
+  &comb2 "? SP '? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
+
+  &charset PT2
+  &rem source: ECMA registry
+  &alias iso-ir-84
+  &alias ISO646-PT2
+  &g0esc x2867 &g1esc x2967 &g2esc x2a67 &g3esc x2b67
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  '' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A? C, O? '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z a? c, o? '- DT
+
+  &charset ES2
+  &rem source: ECMA registry
+  &alias iso-ir-85
+  &alias ISO646-ES2
+  &g0esc x2868 &g1esc x2968 &g2esc x2a68 &g3esc x2b68
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  Sb A B C D E F G H I J K L M N O P Q R S T U V W X Y Z !I N? C, ?I _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z '' n? c, ': DT
+
+  &charset MSZ_7795.3
+  &rem source: ECMA registry
+  &alias iso-ir-86
+
+Simonsen                                                       [Page 57]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &alias ISO646-HU
+  &g0esc x2869 &g1esc x2969 &g2esc x2a69 &g3esc x2b69
+  &alias hu
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  A' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z E' O: U: '> _
+  a' a b c d e f g h i j k l m n o p q r s t u v w x y z e' o: u: '" DT
+
+  &charset JIS_C6226-1983
+  &rem source: ECMA registry
+  &alias iso-ir-87
+  &bits 16
+  &g0esc x2442 &g1esc x242942 &g2esc x242a42 &g3esc x242b42
+  &alias x0208
+  &alias JIS_X0208-1983
+  &code2 1 1
+  SP ,_ ._ , . .6 : ; ! "5 05 '' '! ': '> '- _ *6 +6 *5 +5 +"
+  +_ *_ ;_ 0_ -6 -? -N
+  &code2 1 31
+  FD BD ?1 PP !! .3 .. '6 '9 "6 "9 ( ) (' )' <( )>
+  (! !) <1 >1 </ /> <' >' <" >" (" )" + - +- *X -: = != < > =< >= 00
+  .: Ml Fm DG 1' 2' oC Ye DO Ct Pd % Nb & * At SE *1 *2 0m 0M 0o LZ
+  &code2 2 1
+  Db OS fS uT UT dT DT :X =T -> <- -! -v =_
+  &code2 2 26
+  (- -) (_ )_ (C )C (U )U
+  &code2 2 42
+  AN OR NO => <= FA TE
+  &code2 2 60
+  -V -T (A dP NB =3 HI <* *> RT CG 0( :. In DI
+  &code2 2 82
+  AA %0 MX Mb Md /- /= PI
+  &code2 2 94
+  Ci
+  &code2 3 16
+  0 1 2 3 4 5 6 7 8 9
+  &code2 3 33
+  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+  &code2 3 65
+  a b c d e f g h i j k l m n o p q r s t u v w x y z
+  &code2 4 1
+     A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
+  gu ke ge ko go sa za si zi su zu se ze so zo ta
+  da ti di tU tu du te de to do na ni nu ne no ha
+  ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
+  mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
+  wi we wo n5
+  &code2 5 1
+     a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
+  Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
+  Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
+
+Simonsen                                                       [Page 58]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
+  Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
+  Wi We Wo N6 Vi KA KE
+  &code2 6 1
+  A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
+  P* R* S* T* U* F* X* Q* W*
+  &code2 6 33
+  a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
+  p* r* s* t* u* f* x* q* w*
+  &code2 7 1
+  A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
+  R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
+  &code2 7 49
+  a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
+  r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
+  &code2 8 1
+  hh vv dr dl ul ur vr dh vl uh vh
+  HH VV DR LD UL UR VR DH VL UH VH
+  Vr dH Vl uH vH vR Dh vL Uh Vh
+  &codex j 16 46 1 94
+  &codex j 47 47 1 51
+  &codex j 48 83 1 94
+  &codex j 84 84 1 4
+
+  &charset greek7
+  &rem source: ECMA registry
+  &alias iso-ir-88
+  &g0esc x286a &g1esc x296a &g2esc x2a6a &g3esc x2b6a
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A* B* G* D* E* Z* Y* H* I* ?? K* L* M* N* C*
+  O* P* R* S* T* U* F* ?? X* Q* W* <( // )> '> _
+  '! a* b* g* d* e* z* y* h* i* ?? k* l* m* n* c*
+  o* p* r* s* t* u* f* *s x* q* w* (! !! !) '- DT
+
+  &charset ASMO_449
+  &rem source: ECMA registry
+  &alias ISO_9036
+  &alias arabic7
+  &alias iso-ir-89
+  &g0esc x286b &g1esc x296b &g2esc x2a6b &g3esc x2b6b
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + ,+ - . / 0 1 2 3 4 5 6 7 8 9 : ;+ < = > ?+
+  At H' aM aH wH ah yH a+ b+ tm t+ tk g+ hk x+ d+
+  dk r+ z+ s+ sn c+ dd tj zH e+ i+ <( // )> '> _
+  ++ f+ q+ k+ l+ m+ n+ h+ w+ j+ y+ :+ "+ =+ /+ '+
+  1+ 3+ 0+ ?? ?? ?? ?? ?? ?? ?? ?? (! !! !) '- DT
+
+  &charset iso-ir-90
+
+Simonsen                                                       [Page 59]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &rem source: ECMA registry
+  &g0esc x286c &g1esc x296c &g2esc x2a6c &g3esc x2b6c
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd DO Ye ?? SE ?? '6 "6 << <- -! -> -v
+  DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
+  ?? "! "' "> "? "- "( ". ": ?? "0 ", "_ "" "; "<
+  -M 1S Rg Co TM Md ?? ?? ?? ?? ?? ?? 18 38 58 78
+  Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
+  kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
+  &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
+                  y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
+                  s s' S S' z z' Z Z'
+  &comb2 "( SP '( a a( A A( g g( G G(                     u u( U U(
+  &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
+                  r r< R R< s s< S S< t t< T T< z z< Z Z<
+  &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
+                  r r, R R, s s, S S, t t, T T,
+  &comb2 ">       a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
+                  y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
+                  s s> S S> w w> W W>
+  &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
+                  y y: Y Y:
+  &comb2 ". SP '. c c. C C. e e. E E. g g. G G.      I I. z z. Z Z.
+  &comb2 "" SP '"                               o o" O O" u u" U U"
+  &comb2 "!       a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
+  &comb2 "-       a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
+  &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
+  &comb2 "0 SP '0 a aa A AA                               u u0 U U0
+  &comb2 "? SP '? a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
+
+  &charset JIS_C6229-1984-a
+  &rem source: ECMA registry
+  &alias iso-ir-91
+  &g0esc x286d &g1esc x296d &g2esc x2a6d &g3esc x2b6d
+  &alias jp-ocr-a
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? " Pd DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; 1h = 3h ?
+  ?? A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ?? Ye 2h '> _
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? 4h ?? ?? DT
+
+  &charset JIS_C6229-1984-b
+  &rem source: ECMA registry
+  &alias iso-ir-92
+
+Simonsen                                                       [Page 60]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &alias ISO646-JP-OCR-B
+  &g0esc x286e &g1esc x296e &g2esc x2a6e &g3esc x2b6e
+  &alias jp-ocr-b
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z </ Ye /> '> _
+  ?? a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) ?? DT
+
+  &charset JIS_C6229-1984-b-add
+  &rem source: ECMA registry
+  &alias iso-ir-93
+  &g0esc x286f &g1esc x296f &g2esc x2a6f &g3esc x2b6f
+  &alias jp-ocr-b-add
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? ?? Pd Cu // ?? SE ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
+
+  &charset JIS_C6229-1984-hand
+  &rem source: ECMA registry
+  &alias iso-ir-94
+  &g0esc x2870 &g1esc x2970 &g2esc x2a70 &g3esc x2b70
+  &alias jp-ocr-hand
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z </ Ye /> '> _
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? !! ?? ?? DT
+
+  &charset JIS_C6229-1984-hand-add
+  &rem source: ECMA registry
+  &alias iso-ir-95
+  &g0esc x2871 &g1esc x2971 &g2esc x2a71 &g3esc x2b71
+  &alias jp-ocr-hand-add
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? ?? ?? ?? // ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
+
+
+Simonsen                                                       [Page 61]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &charset JIS_C6229-1984-kana
+  &rem source: ECMA registry
+  &alias iso-ir-96
+  &g0esc x2872 &g1esc x2972 &g2esc x2a72 &g3esc x2b72
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? <' >' ?? ?? Wo ?? ?? ?? ?? ?? ?? ?? ?? ??
+  -6 A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko Sa Si Su Se So
+  Ta Ti Tu Te To Na Ni Nu Ne No Ha Hi Hu He Ho Ma
+  Mi Mu Me Mo Ya Yu Yo Ra Ri Ru Re Ro Wa N6 "5 05
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
+
+  &charset ISO_2033-1983
+  &rem source: ECMA registry
+  &alias iso-ir-98
+  &alias e13b
+  &g0esc x2873 &g1esc x2973 &g2esc x2a73 &g3esc x2b73
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  1j 2j 3j 4j ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? DT
+
+  &charset ANSI_X3.110-1983
+  &rem source: ECMA registry
+  &alias iso-ir-99
+  &alias CSA_T500-1983
+  &alias NAPLPS
+  &g0esc x2874 &g1esc x2974 &g2esc x2a74 &g3esc x2b74
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd DO Ye Nb SE Cu '6 "6 << <- -! -> -v
+  DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
+  ?? "! "' "> "? "- "( ". ": "/ "0 ", "_ "" "; "<
+  -M 1S Rg Co TM Md HH VV FD BD Fd Bd 18 38 58 78
+  Om AE D- -a H/ VH IJ L. L/ O/ OE -o TH T/ NG 'n
+  kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
+  &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
+                  y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
+                  s s' S S' z z' Z Z'
+  &comb2 "( SP '( a a( A A( g g( G G(                     u u( U U(
+
+Simonsen                                                       [Page 62]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
+                  r r< R R< s s< S S< t t< T T< z z< Z Z<
+  &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
+                  r r, R R, s s, S S, t t, T T,
+  &comb2 ">       a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
+                  y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
+                  s s> S S> w w> W W>
+  &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
+                  y y: Y Y:
+  &comb2 ". SP '. c c. C C. e e. E E. g g. G G.      I I. z z. Z Z.
+  &comb2 "" SP '"                               o o" O O" u u" U U"
+  &comb2 "!       a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
+  &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
+  &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
+  &comb2 "0 SP '0 a aa A AA                               u u0 U U0
+  &comb2 "?       a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
+
+  &charset ISO_8859-1:1987
+  &rem source: ECMA registry
+  &alias iso-ir-100
+  &g1esc x2d41 &g2esc x2e41 &g3esc x2f41
+  &alias ISO_8859-1
+  &alias ISO-8859-1
+  &alias latin1
+  &alias l1
+  &alias IBM819
+  &alias CP819
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd Cu Ye BB SE ': Co -a << NO -- Rg '-
+  DG +- 2S 3S '' My PI .M ', 1S -o >> 14 12 34 ?I
+  A! A' A> A? A: AA AE C, E! E' E> E: I! I' I> I:
+  D- N? O! O' O> O? O: *X O/ U! U' U> U: Y' TH ss
+  a! a' a> a? a: aa ae c, e! e' e> e: i! i' i> i:
+  d- n? o! o' o> o? o: -: o/ u! u' u> u: y' th y:
+
+  &charset ISO_8859-2:1987
+  &rem source: ECMA registry
+  &alias iso-ir-101
+  &g1esc x2d42 &g2esc x2e42 &g3esc x2f42
+  &alias ISO_8859-2
+  &alias ISO-8859-2
+  &alias latin2
+  &alias l2
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+
+Simonsen                                                       [Page 63]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS A; '( L/ Cu L< S' SE ': S< S, T< Z' -- Z< Z.
+  DG a; '; l/ '' l< s' '< ', s< s, t< z' '" z< z.
+  R' A' A> A( A: L' C' C, C< E' E; E: E< I' I> D<
+  D/ N' N< O' O> O" O: *X R< U0 U' U" U: Y' T, ss
+  r' a' a> a( a: l' c' c, c< e' e; e: e< i' i> d<
+  d/ n' n< o' o> o" o: -: r< u0 u' u" u: y' t, '.
+
+  &charset T.61-7bit
+  &rem source: ECMA registry
+  &alias iso-ir-102
+  &g0esc x2875 &g1esc x2975 &g2esc x2a75 &g3esc x2b75
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( ?? )> ?? _
+  ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? !! ?? ?? DT
+
+  &charset T.61-8bit
+  &alias T.61
+  &rem source: ECMA registry
+  &alias iso-ir-103
+  &g0esc x2876 &g1esc x2976 &g2esc x2a76 &g3esc x2b76
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( ?? )> ?? _
+  ?? a b c d e f g h i j k l m n o p q r s t u v w x y z ?? !! ?? ?? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd DO Ye Nb SE Cu ?? ?? << ?? ?? ?? ??
+  DG +- 2S 3S *X My PI .M -: ?? ?? >> 14 12 34 ?I
+  ?? "! "' "> "? "- "( ". ": ?? "0 ", "_ "" "; "<
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
+  kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
+  &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
+                  y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
+                  s s' S S' z z' Z Z'
+  &comb2 "( SP '( a a( A A( g g( G G(                     u u( U U(
+  &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
+                  r r< R R< s s< S S< t t< T T< z z< Z Z<
+  &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
+                  r r, R R, s s, S S, t t, T T,
+  &comb2 ">       a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
+                  y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
+                  s s> S S> w w> W W>
+
+Simonsen                                                       [Page 64]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
+                  y y: Y Y:
+  &comb2 ". SP '. c c. C C. e e. E E. g g. G G.      I I. z z. Z Z.
+  &comb2 "" SP '"                               o o" O O" u u" U U"
+  &comb2 "!       a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
+  &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
+  &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
+  &comb2 "0 SP '0 a aa A AA                               u u0 U U0
+  &comb2 "?       a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
+
+  &charset ISO_8859-3:1988
+  &rem source: ECMA registry
+  &alias iso-ir-109
+  &g1esc x2d43 &g2esc x2e43 &g3esc x2f43
+  &alias ISO_8859-3
+  &alias ISO-8859-3
+  &alias latin3
+  &alias l3
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS H/ '( Pd Cu ?? H> SE ': I. S, G( J> -- ?? Z.
+  DG h/ 2S 3S '' My h> .M ', i. s, g( j> 12 ?? z.
+  A! A' A> ?? A: C. C> C, E! E' E> E: I! I' I> I:
+  ?? N? O! O' O> G. O: *X G> U! U' U> U: U( S> ss
+  a! a' a> ?? a: c. c> c, e! e' e> e: i! i' i> i:
+  ?? n? o! o' o> g. o: -: g> u! u' u> u: u( s> '.
+
+  &charset ISO_8859-4:1988
+  &rem source: ECMA registry
+  &alias iso-ir-110
+  &g1esc x2d44 &g2esc x2e44 &g3esc x2f44
+  &alias ISO_8859-4
+  &alias ISO-8859-4
+  &alias latin4
+  &alias l4
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS A; kk R, Cu I? L, SE ': S< E- G, T/ -- Z< '-
+  DG a; '; r, '' i? l, '< ', s< e- g, t/ NG z< ng
+  A- A' A> A? A: AA AE I; C< E' E; E: E. I' I> I-
+  D/ N, O- K, O> O? O: *X O/ U; U' U> U: U? U- ss
+
+Simonsen                                                       [Page 65]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  a- a' a> a? a: aa ae i; c< e' e; e: e. i' i> i-
+  d/ n, o- k, o> o? o: -: o/ u; u' u> u: u? u- '.
+
+  &charset ECMA-cyrillic
+  &rem source: ECMA registry
+  &alias iso-ir-111
+  &g1esc x2d40 &g2esc x2e40 &g3esc x2f40
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS IO D% G% IE DS II YI J% LJ NJ Ts KJ -- V% DZ
+  N0 io d% g% ie ds ii yi j% lj nj ts kj Cu v% dz
+  A= B= V= G= D= E= Z% Z= I= J= K= L= M= N= O= P=
+  R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
+  a= b= v= g= d= e= z% z= i= j= k= l= m= n= o= p=
+  r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
+
+  &charset CSA_Z243.4-1985-1
+  &rem source: ECMA registry
+  &alias iso-ir-121
+  &g0esc x2877 &g1esc x2977 &g2esc x2a77 &g3esc x2b77
+  &alias ISO646-CA
+  &alias csa7-1
+  &alias ca
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a> c, e> i> _
+  o> a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! u> DT
+
+  &charset CSA_Z243.4-1985-2
+  &rem source: ECMA registry
+  &alias iso-ir-122
+  &alias ISO646-CA2
+  &g0esc x2878 &g1esc x2978 &g2esc x2a78 &g3esc x2b78
+  &alias csa7-2
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  a! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a> c, e> E' _
+  o> a b c d e f g h i j k l m n o p q r s t u v w x y z e' u! e! u> DT
+
+  &charset CSA_Z243.4-1985-gr
+  &rem source: ECMA registry
+  &alias iso-ir-123
+  &g1esc x2d45 &g2esc x2e45 &g3esc x2f45
+
+Simonsen                                                       [Page 66]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I ': Pd Ct Ye +- '' (S )S 12 +S ', -- .M -S
+  0S 1S 2S 3S 4S 5S 6S 7S 8S 9S 14 34 <= != >= ?I
+  A! A' A> C, E! E' E> E: I' I> I: N? O' O> U! U'
+  U> U: Rg SE PI m* -a -o '6 '9 "6 "9 << >> DG BB
+  a! a' a> c, e! e' e> e: i' i> i: n? o' o> u! u'
+  u> u: Co hh vv ur ul dl dr vr uh vl dh vh NO FB
+
+  &charset ISO_8859-7:1987
+  &rem source: ECMA registry
+  &alias iso-ir-126
+  &g1esc x2d46 &g2esc x2e46 &g3esc x2f46
+  &alias ISO_8859-7
+  &alias ISO-8859-7
+  &alias ELOT_928
+  &alias ECMA-118
+  &alias greek
+  &alias greek8
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS 9' '9 Pd ?? ?? BB SE ': Co ?? << NO -- ?? -M
+  DG +- 2S 3S '' '% A% .M E% Y% I% >> O% 12 U% W%
+  i3 A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
+  P* R* ?? S* T* U* F* X* Q* W* J* V* a% e% y% i%
+  u3 a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
+  p* r* *s s* t* u* f* x* q* w* j* v* o% u% w% ??
+
+  &charset ISO_8859-6:1987
+  &rem source: ECMA registry
+  &alias iso-ir-127
+  &g1esc x2d47 &g2esc x2e47 &g3esc x2f47
+  &alias ISO_8859-6
+  &alias ISO-8859-6
+  &alias ECMA-114
+  &alias ASMO-708
+  &alias arabic
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+
+Simonsen                                                       [Page 67]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS ?? ?? ?? Cu ?? ?? ?? ?? ?? ?? ?? ,+ -- ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ;+ ?? ?? ?? ?+
+  ?? H' aM aH wH ah yH a+ b+ tm t+ tk g+ hk x+ d+
+  dk r+ z+ s+ sn c+ dd tj zH e+ i+ ?? ?? ?? ?? ??
+  ++ f+ q+ k+ l+ m+ n+ h+ w+ j+ y+ :+ "+ =+ /+ '+
+  1+ 3+ 0+ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+  &charset T.101-G2
+  &rem source: ECMA registry
+  &alias iso-ir-128
+  &g0esc x287c &g1esc x297c &g2esc x2a7c &g3esc x2b7c
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " ?? ?? % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd DO Ye Nb SE Cu '6 "6 << <- -! -> -v
+  DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
+  ?? "! "' "> "? "- "( ". ": "/ "0 ", "_ "" "; "<
+  -M 1S Rg Co TM Md HH VV FD BD Fd Bd 18 38 58 78
+  Om AE D- -a H/ VH IJ L. L/ O/ OE -o TH T/ NG 'n
+  kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng ??
+  &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
+                  y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
+                  s s' S S' z z' Z Z'
+  &comb2 "( SP '( a a( A A( g g( G G(                     u u( U U(
+  &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
+                  r r< R R< s s< S S< t t< T T< z z< Z Z<
+  &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
+                  r r, R R, s s, S S, t t, T T,
+  &comb2 ">       a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
+                  y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
+                  s s> S S> w w> W W>
+  &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
+                  y y: Y Y:
+  &comb2 ". SP '. c c. C C. e e. E E. g g. G G.      I I. z z. Z Z.
+  &comb2 "" SP '"                               o o" O O" u u" U U"
+  &comb2 "!       a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
+  &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
+  &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
+  &comb2 "0 SP '0 a aa A AA                               u u0 U U0
+  &comb2 "?       a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
+
+  &charset ISO_8859-8:1988
+  &rem source: ECMA registry
+  &alias iso-ir-138
+
+Simonsen                                                       [Page 68]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &g1esc x2d48 &g2esc x2e48 &g3esc x2f48
+  &alias ISO_8859-8
+  &alias ISO-8859-8
+  &alias hebrew
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS ?? Ct Pd Cu Ye BB SE ': Co *X << NO -- Rg '-
+  DG +- 2S 3S '' My PI .M ', 1S -: >> 14 12 34 ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? =2
+  A+ B+ G+ D+ H+ W+ Z+ X+ Tj J+ K% K+ L+ M% M+ N%
+  N+ S+ E+ P% P+ Zj ZJ Q+ R+ Sh T+ ?? ?? ?? ?? ??
+
+  &charset CSN_369103
+  &rem source: ECMA registry
+  &alias iso-ir-139
+  &g1esc x2d49 &g2esc x2e49 &g3esc x2f49
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS A; '( L/ DO L< S' SE ': S< S, T< Z' -- Z< Z.
+  DG a; '; l/ '' l< s' '< ', s< s, t< z' '" z< z.
+  R' A' A> A( A: L' C' C, C< E' E; E: E< I' I> D<
+  D/ N' N< O' O> O" O: *X R< U0 U' U" U: Y' T, ss
+  r' a' a> a( a: l' c' c, c< e' e; e: e< i' i> d<
+  d/ n' n< o' o> o" o: -: r< u0 u' u" u: y' t, '.
+
+  &charset JUS_I.B1.002
+  &rem source: ECMA registry
+  &alias iso-ir-141
+  &g0esc x287a &g1esc x297a &g2esc x2a7a &g3esc x2b7a
+  &alias ISO646-YU
+  &alias js
+  &alias yu
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  Z< A B C D E F G H I J K L M N O P Q R S T U V W X Y Z S< D/ C' C< _
+  z< a b c d e f g h i j k l m n o p q r s t u v w x y z s< d/ c' c< DT
+
+  &charset ISO_6937-2-add
+
+Simonsen                                                       [Page 69]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &rem source: ECMA registry and ISO 6937-2:1983
+  &alias iso-ir-142
+  &g1esc x2d4a &g2esc x2e4a &g3esc x2f4a
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd DO Ye ?? SE ?? '6 "6 << <- -! -> -v
+  DG +- 2S 3S *X My PI .M -: '9 "9 >> 14 12 34 ?I
+  ?? "! "' "> "? "- "( ". ": ?? "0 ", "_ "" "; "<
+  -M 1S Rg Co TM Md NO BB ?? ?? ?? ?? 18 38 58 78
+  Om AE D- -a H/ ?? IJ L. L/ O/ OE -o TH T/ NG 'n
+  kk ae d/ d- h/ i. ij l. l/ o/ oe ss th t/ ng --
+  &comb2 "' SP '' a a' A A' e e' E E' i i' I I' o o' O O' u u' U U'
+                  y y' Y Y' c c' C C' l l' L L' n n' N N' r r' R R'
+                  s s' S S' z z' Z Z'
+  &comb2 "( SP '( a a( A A( g g( G G(                     u u( U U(
+  &comb2 "< SP '< c c< C C< d d< D D< e e< E E< l l< L L< n n< N N<
+                  r r< R R< s s< S S< t t< T T< z z< Z Z<
+  &comb2 ", SP ', c c, C C, g g, G G, k k, K K, l l, L L, n n, N N,
+                  r r, R R, s s, S S, t t, T T,
+  &comb2 ">       a a> A A> e e> E E> i i> I I> o o> O O> u u> U U>
+                  y y> Y Y> c c> C C> g g> G G> h h> H H> j j> J J>
+                  s s> S S> w w> W W>
+  &comb2 ": SP ': a a: A A: e e: E E: i i: I I: o o: O O: u u: U U:
+                  y y: Y Y:
+  &comb2 ". SP '. c c. C C. e e. E E. g g. G G.      I I. z z. Z Z.
+  &comb2 "" SP '"                               o o" O O" u u" U U"
+  &comb2 "!       a a! A A! e e! E E! i i! I I! o o! O O! u u! U U!
+  &comb2 "- SP '- a a- A A- e e- E E- i i- I I- o o- O O- u u- U U-
+  &comb2 "; SP '; a a; A A; e e; E E; i i; I I; u u; U U;
+  &comb2 "0 SP '0 a aa A AA                               u u0 U U0
+  &comb2 "?       a a? A A? n n? N N? i i? I I? o o? O O? u u? U U?
+
+  &charset IEC_P27-1
+  &rem source: ECMA registry
+  &alias iso-ir-143
+  &g1esc x2d4b &g2esc x2e4b &g3esc x2f4b
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  '< =3 AN OR (U )U (C )C <= => .: :. (- -) (_ )_
+  In Io 00 NB dP ?1 ?2 ?- ?= =< != >= <> NO FA TE
+  A+ OS PP G* D* -T -V -L H* </ /> L* 1' 2' C* -+
+
+Simonsen                                                       [Page 70]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  P* 2S S* *X 3S U* F* .M Q* W* /0 >V RT f( 0( +-
+  DG a* b* g* d* e* z* y* h* i* k* l* m* n* c* %0
+  p* r* s* -: t* u* f* x* q* w* /- <- -! -> -v '-
+
+  &charset ISO_8859-5:1988
+  &rem source: ECMA registry
+  &alias iso-ir-144
+  &g1esc x2d4c &g2esc x2e4c &g3esc x2f4c
+  &alias ISO_8859-5
+  &alias ISO-8859-5
+  &alias cyrillic
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS IO D% G% IE DS II YI J% LJ NJ Ts KJ -- V% DZ
+  A= B= V= G= D= E= Z% Z= I= J= K= L= M= N= O= P=
+  R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
+  a= b= v= g= d= e= z% z= i= j= k= l= m= n= o= p=
+  r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
+  N0 io d% g% ie ds ii yi j% lj nj ts kj SE v% dz
+
+  &charset JUS_I.B1.003-serb
+  &rem source: ECMA registry
+  &alias iso-ir-146
+  &g0esc x287b &g1esc x297b &g2esc x2a7b &g3esc x2b7b
+  &alias serbian
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  Z% A= B= C= D= E= F= G= H= I= J% K= L= M= N= O=
+  P= LJ R= S= T= U= V= NJ DZ DS Z= S% D% Ts C% _
+  z% a= b= c= d= e= f= g= h= i= j% k= l= m= n= o=
+  p= lj r= s= t= u= v= nj dz ds z= s% d% ts c% DT
+
+  &charset JUS_I.B1.003-mac
+  &rem source: ECMA registry
+  &alias macedonian
+  &alias iso-ir-147
+  &g0esc x287d &g1esc x297d &g2esc x2a7d &g3esc x2b7d
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  Z% A= B= C= D= E= F= G= H= I= J% K= L= M= N= O=
+  P= LJ R= S= T= U= V= NJ DZ DS Z= S% G% KJ C% _
+  z% a= b= c= d= e= f= g= h= i= j% k= l= m= n= o=
+  p= lj r= s= t= u= v= nj dz ds z= s% g% kj c% DT
+
+Simonsen                                                       [Page 71]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+
+  &charset ISO_8859-9:1989
+  &rem source: ECMA registry
+  &alias iso-ir-148
+  &g1esc x2d4d &g2esc x2e4d &g3esc x2f4d
+  &alias ISO_8859-9
+  &alias ISO-8859-9
+  &alias latin5
+  &alias l5
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS !I Ct Pd Cu Ye BB SE ': Co -a << NO -- Rg '-
+  DG +- 2S 3S '' My PI .M ', 1S -o >> 14 12 34 ?I
+  A! A' A> A? A: AA AE C, E! E' E> E: I! I' I> I:
+  G( N? O! O' O> O? O: *X O/ U! U' U> U: I. S, ss
+  a! a' a> a? a: aa ae c, e! e' e; e: e. i' i> i-
+  g( n? o! o' o> o? o: -: o/ u! u' u> u: i. s, y:
+
+  &charset KS_C_5601-1987
+  &rem source: ECMA registry
+  &alias iso-ir-149
+  &alias KS_C_5601-1989
+  &alias KSC_5601
+  &bits 16
+  &g0esc x2443 &g1esc x242943 &g2esc x242a43 &g3esc x242b43
+  &alias korean
+  &code2 1 1
+  SP ,_ .6 .M .. .3 ': +" -N -M PP // ?1 '6 '9 "6 "9 (' )' <1 >1 <+ >+
+  <' >' <" >" (" )" +- *X -: != =< >= 00
+  .: DG 1' 2' oC Ye AA Ct Pd Ml Fm
+  -V -T (A dP NB =3 HI SE :X *1 *2
+  0m 0M 0o Dw Db OS fS uT UT dT DT -> <-
+  -! -v <> =2 <* *> RT CG 0( :. In DI
+  &code2 2 1
+  => == FA TE '' '? '< '( '" '0 '. ', '; !I ?I :R Io +Z *P Cu oF %0 Tl
+  PL Tr PR cS- cS cH cH- cC- cC 0. cD-
+  Rr 0L 0R .S RF RY RK RZ RH RX =T:) tel TEL
+  <H >H PI /- /= UD //> <// <!! !!>
+  Mb Md M8 M16 KSC (JU) N0 Co TM am pm Tel
+  &code2 3 1
+  ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7
+  8 9 : ; < = > ? At A B C D E F G H I J K L M N O
+  P Q R S T U V W X Y Z <( W= )> '> _ a b c d e f g
+  h i j k l m n o p q r s t u v w x y z (! !! !) '-
+  &codex k 4 4 1 94
+  &code2 5 1
+  1r 2r 3r 4r 5r 6r 7r 8r 9r ar br cr
+
+Simonsen                                                       [Page 72]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &code2 5 16
+  1R 2R 3R 4R 5R 6R 7R 8R 9R aR bR cR
+  &code2 5 33
+  A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
+  P* R* S* T* U* F* X* Q* W*
+  &code2 5 65
+  a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
+  p* r* s* t* u* f* x* q* w*
+  &code2 6 1
+  hh vv dr dl ul ur vr dh vl uh vh
+  HH VV DR LD UL UR VR DH VL UH VH Vr
+  dH Vl uH vH vR Dh vL Uh Vh Dl dL Ul uL Ur uR Dr dR
+  Udr uDr UdR uDR Udl uDl UdL
+  uDL dLr dlR DLr DlR uLr ulR UlR vLr vlR Udh uDh
+  UdLr UdlR uDLr uDlR UdH uDH VLr VlR
+  &codex k 7 7 1 79
+  &code2 8 1
+  AE D- -a H/ ?? IJ ?? L. L/ O/ OE -o TH T/ NG
+  &codex k 8 8 17 44
+  &code2 8 45
+  a-o b-o c-o d-o e-o f-o g-o h-o i-o j-o k-o l-o m-o n-o o-o
+  p-o q-o r-o s-o t-o u-o v-o w-o x-o y-o z-o
+  1-o 2-o 3-o 4-o 5-o 6-o 7-o 8-o 9-o 10-o 11-o 12-o 13-o 14-o 15-o
+  12 13 23 14 34 18 38 58 78
+  &code2 9 1
+  ae d/ d- h/ i. ij kk l. l/ o/ oe ss th t/ ng 'n
+  &codex k 9 9 17 44
+  &code2 9 45
+  (a) (b) (c) (d) (e) (f) (g) (h) (i) (j) (k) (l) (m) (n) (o)
+  (p) (q) (r) (s) (t) (u) (v) (w) (x) (y) (z)
+  (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15)
+  1S 2S 3S 4S nS 1s 2s 3s 4s
+  &code2 10 1
+     A5 a5 I5 i5 U5 u5 E5 e5 O5 o5 ka ga ki gi ku
+  gu ke ge ko go sa za si zi su zu se ze so zo ta
+  da ti di tU tu du te de to do na ni nu ne no ha
+  ba pa hi bi pi hu bu pu he be pe ho bo po ma mi
+  mu me mo yA ya yU yu yO yo ra ri ru re ro wA wa
+  wi we wo n5
+  &code2 11 1
+     a6 A6 i6 I6 u6 U6 e6 E6 o6 O6 Ka Ga Ki Gi Ku
+  Gu Ke Ge Ko Go Sa Za Si Zi Su Zu Se Ze So Zo Ta
+  Da Ti Di TU Tu Du Te De To Do Na Ni Nu Ne No Ha
+  Ba Pa Hi Bi Pi Hu Bu Pu He Be Pe Ho Bo Po Ma Mi
+  Mu Me Mo YA Ya YU Yu YO Yo Ra Ri Ru Re Ro WA Wa
+  Wi We Wo N6 Vi KA KE
+  &code2 12 1
+  A= B= V= G= D= E= IO Z% Z= I= J= K= L= M= N= O= P=
+  R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
+  &code2 12 49
+  a= b= v= g= d= e= io z% z= i= j= k= l= m= n= o= p=
+  r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
+  &codex k 16 40 1 94
+
+Simonsen                                                       [Page 73]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &codex k 42 93 1 94
+
+  &charset greek-ccitt
+  &rem source: ECMA registry
+  &alias iso-ir-150
+  &g0esc x282140 &g1esc x292140 &g2esc x2a2140 &g3esc x2b2140
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A* B* G* D* E* Z* Y* H* I* K* L* M* N* C* O*
+  P* R* ?? S* T* U* F* X* Q* W* ?? <( // )> '> _
+  ?? a* b* g* d* e* z* y* h* i* k* l* m* n* c* o*
+  p* r* *s s* t* u* f* x* q* w* ?? (! !! !) '- DT
+
+  &charset NC_NC00-10:81
+  &rem source: ECMA registry
+  &alias cuba
+  &alias iso-ir-151
+  &alias ISO646-CU
+  &g0esc x282141 &g1esc x292141 &g2esc x2a2141 &g3esc x2b2141
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z !I N? )> ?I _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z '' n? <( ': DT
+
+  &charset ISO_6937-2-25
+  &rem source: ECMA registry
+  &alias iso-ir-152
+  &g1esc x2d4e &g2esc x2e4e &g3esc x2f4e
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb Cu % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS ?? ?? ?? ?? ?? ?? ?? ?? ?? "6 ?? <- -! -> -v
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? "9 ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? TM Md ?? ?? ?? ?? ?? ?? 18 38 58 78
+  Om ?? ?? ?? ?? ?? IJ L. ?? ?? OE ?? W> Y> Y: 'n
+  ?? ?? ?? ?? ?? ?? ij l. ?? ?? oe ?? w> y> ?? ??
+
+  &charset GOST_19768-74
+  &rem source: ECMA registry
+  &alias ST_SEV_358-88
+  &alias iso-ir-153
+  &g1esc x2d4f &g2esc x2e4f &g3esc x2f4f
+  &code 0
+
+Simonsen                                                       [Page 74]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS IO ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? -- ?? ??
+  A= B= V= G= D= E= Z% Z= I= J= K= L= M= N= O= P=
+  R= S= T= U= F= H= C= C% S% Sc =" Y= %" JE JU JA
+  a= b= v= g= d= e= z% z= i= j= k= l= m= n= o= p=
+  r= s= t= u= f= h= c= c% s% sc =' y= %' je ju ja
+  ?? io ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+  &charset ISO_8859-supp
+  &rem source: ECMA registry
+  &alias iso-ir-154
+  &alias latin1-2-5
+  &g1esc x2d50 &g2esc x2e50 &g3esc x2f50
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  ?? ?? A- C> C. ?? E. E- G> '6 "6 TM <- -! -> -v
+  ?? ?? a- c> c. d- e. e- g> '9 "9 Md 18 38 58 78
+  ?? G( G. G, H> H/ I? I. I- I; IJ J> K, L, L. N,
+  -M NG O- OE R, S> T/ TH U? U( U- U; W> Y' Y> Y:
+  Om g( g. g, h> h/ i? i. i- i; ij j> k, l, l. n,
+  kk ng o- oe r, s> t/ th u? u( u- u; w> y' y> 'n
+
+  &charset ISO_10367-box
+  &rem source: ECMA registry
+  &alias iso-ir-155
+  &g1esc x2d51 &g2esc x2e51 &g3esc x2f51
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  VV HH DR LD UR UL VR VL DH UH VH UB LB FB sB ??
+  vv hh dr dl ur ul vr vl dh uh vh .S :S ?S ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+
+Simonsen                                                       [Page 75]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &charset latin6
+  &rem source: ECMA registry
+  &alias iso-ir-157
+  &alias l6
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS A; E- G, I- I? K, L, N' R, S< T/ Z< -- kk NG
+  d/ a; e- g, i- i? k, l, n' r, s< t/ z< SE ss ng
+  A- A' A> A? A: AA AE I; C< E' E; E: E. I' I> I:
+  D/ N, O- O' O> O? O: U? O/ U; U' U> U: Y' TH U-
+  a- a' a> a? a: aa ae i; c< e' e; e: e. i' i> i:
+  d- n, o- o' o> o? o: u? o/ u; u' u> u: y' th u-
+
+  &charset latin-lap
+  &rem source: ECMA registry
+  &alias lap
+  &alias iso-ir-158
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  '' ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ;S ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  A( A> A! A- A1 A7 A3 E( E! E- G/ G< K< O( O! O;
+  O1 U- ED EZ ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  a( a> a! a- a1 a7 a3 e( e! e- g/ g< k< o( o! o;
+  o1 u- ed ez ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+  &charset JIS_X0212-1990
+  &rem source: ECMA registry
+  &alias x0212
+  &alias iso-ir-159
+  &bits 16
+  &g0esc x2444 &g1esc x242944 &g2esc x242a44 &g3esc x242b44
+  &code2 2 15
+  '( '< ', '. '" '- '; '0 '?
+  '' '%
+  &code2 2 34
+  !I BB ?I TM Cu N0
+  &code2 2 75
+  -o -a Co Rg
+  &code2 6 65
+  A% E% Y% I% J* ?? O% ?? U% V* ?? W%
+
+Simonsen                                                       [Page 76]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &code2 6 81
+  a% e% y% i% j* i3 o% *s u% v* u3 w%
+  &code2 7 34
+  D% G% IE DS II YI J% LJ NJ Ts KJ V% DZ
+  &code2 7 82
+  d% g% ie ds ii yi j% lj nj ts kj v% dz
+  &code2 9 1
+  AE D/ ?? H/ ?? IJ ?? L/ L. ?? NG O/ OE ?? T/ TH
+  &code2 9 33
+  ae d/ d- h/ i. ij kk l/ l. 'n ng o/ oe ss t/ th
+  &code2 10 1
+  A' A! A: A> A( A< A; AA A? C' C> C< C, C. D< E' E! E: E> E( E. E-
+  E; ?? G> G( G, G. H> I' I! I: I> I< I. I- I; I? J> K, L' L, N' N< N,
+  N? O' O! O: O> O< O" O- O? R' R< R, S' S> S< S, T< T, U' U! U: U( U<
+  U" U- U; U0 U:' U:! U:< U:- W. Y' Y: Y> Z' Z< Z.
+  &code2 11 1
+  a' a! a: a> a( a< a; aa a? c' c> c< c, c. d< e' e! e: e> e( e. e-
+  e; g' g> g( ?? g. h> i' i! i: i> i< ?? i- i; i? j> k, l' l, n' n< n,
+  n? o' o! o: o> o< o" o- o? r' r< r, s' s> s< s, t< t, u' u! u: u( u<
+  u" u- u; u0 u:' u:! u:< u:- w. y' y: y> z' z< z.
+  &codex J 16 76 1 94
+  &codex J 77 77 1 67
+
+  &charset DS_2089
+  &rem source: Danish Standard, DS 2089, February 1974
+  &alias DS2089
+  &alias ISO646-DK
+  &alias dk
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa '? DT
+
+  &charset us-dk
+  &rem for compatibility with ASCII
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  &duplicate 91 AE
+  &duplicate 92 O/
+  &duplicate 93 AA
+  &duplicate 123 ae
+  &duplicate 124 o/
+  &duplicate 125 aa
+  &duplicate 91 A:
+  &duplicate 92 O:
+  &duplicate 123 a:
+  &duplicate 124 o:
+
+Simonsen                                                       [Page 77]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+
+  &charset dk-us
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AE O/ AA '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z ae o/ aa '? DT
+  &duplicate 91 <(
+  &duplicate 92 //
+  &duplicate 93 )>
+  &duplicate 123 (!
+  &duplicate 124 !!
+  &duplicate 125 !)
+  &duplicate 91 A:
+  &duplicate 92 O:
+  &duplicate 123 a:
+  &duplicate 124 o:
+
+  &charset JIS_X0201
+  &alias X0201
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( Ye )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '- DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS ._ <' >' ,_ .6 Wo a6 i6 u6 e6 o6 YA YU YO TU
+  -6 A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko Sa Si Su Se So
+  Ta Ti Tu Te To Na Ni Nu Ne No Ha Hi Hu He Ho Ma
+  Mi Mu Me Mo Ya Yu Yo Ra Ri Ru Re Ro Wa N6 "5 05
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+  &charset KSC5636
+  &alias ISO646-KR
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( W= )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+
+  &charset DEC-MCS
+  &rem VAX/VMS User's Manual, Order Number: AI-Y517A-TE, April 1986.
+  &alias dec
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+
+Simonsen                                                       [Page 78]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  ?? !I Ct Pd ?? Ye ?? SE Cu Co -a << ?? ?? ?? ??
+  DG +- 2S 3S ?? My PI .M ?? 1S -o >> 14 12 ?? ?I
+  A! A' A> A? A: AA AE C, E! E' E> E: I! I' I> I:
+  ?? N? O! O' O> O? O: OE O/ U! U' U> U: Y: ?? ss
+  a! a' a> a? a: aa ae c, e! e' e> e: i! i' i> i:
+  ?? n? o! o' o> o? o: oe o/ u! u' u> u: y: ?? ??
+
+  &charset hp-roman8
+  &rem source: LaserJet IIP Printer User's Manual,
+  &rem HP part no 33471-90901, Hewlet-Packard, June 1989.
+  &alias roman8
+  &alias r8
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  PA HO BH NH IN NL SA ES HS HJ VS PD PU RI S2 S3
+  DC P1 P2 TS CC MW SG EG SS GC SC CI ST OC PM AC
+  NS A! A> E! E> E: I> I: '' 1" AN ': ?1 U! U> Li
+  '- Y' y' DG C, c, N? n? !I ?I Cu Pd Ye SE Fl Ct
+  a> e> o> u> a' e' o' u' a! e! o! u! a: e: o: u:
+  AA i> O/ AE aa i' o/ ae A: i! O: U: E' i: ss O>
+  A' A? a? D- d- I' I! O' O! O? o? S< s< U' Y: y:
+  TH th .M My PI 34 -M 14 12 -a -o << fS >> +- ??
+
+  &charset macintosh
+  &rem source: The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991
+  &alias mac
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  A: AA C, E' N? O: U: a' a! a> a: a? aa c, e' e!
+  e> e: i' i! i> i: n? o' o! o> o: o? u' u! u> u:
+  /- DG Ct Pd SE Sb PI ss Rg Co TM '' ': != AE O/
+  00 +- =< >= Ye My dP +Z *P p* In -a -o W* ae o/
+  ?I !I NO RT Fl ?2 D* << >> .3 NS A! A? O? OE oe
+  -M -N "6 "9 '6 '9 -: Db y: Y: /f Cu <1 >1 fi fl
+  /= .M .9 :9 %0 A> E> A' E: E! I' I> I: I! O' O>
+  ?? O! U' U> U! i. ?? ?? '- '( '. '0 ', '" '; '<
+
+  &charset IBM037
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp037
+  &alias ebcdic-cp-us
+  &alias ebcdic-cp-ca
+
+Simonsen                                                       [Page 79]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &alias ebcdic-cp-wt
+  &alias ebcdic-cp-nl
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: a! a' a? aa c, n? Ct .  <  (  +  !!
+  &  e' e> e: e! i' i> i: i! ss !  DO *  )  ;  NO
+  -  /  A> A: A! A' A? AA C, N? BB ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! '! :  Nb At '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  DG j  k  l  m  n  o  p  q  r  -a -o ae ', AE Cu
+  My '? s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  '> Pd Ye .M Co SE PI 14 12 34 <( )> '- ': '' *X
+  (! A  B  C  D  E  F  G  H  I  -- o> o: o! o' o?
+  !) J  K  L  M  N  O  P  Q  R  1S u> u: u! u' y:
+  // -: S  T  U  V  W  X  Y  Z  2S O> O: O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM038
+  &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+  &alias EBCDIC-INT
+  &alias cp038
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? <( .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? )> DO *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Nb At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? '? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  (! A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  !) J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  // ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset IBM273
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP273
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> (! a! a' a? aa c, n? A: .  <  (  +  !
+  &  e' e> e: e! i' i> i: i! '? U: DO *  )  ;  '>
+  -  /  A> <( A! A' A? AA C, N? o: ,  %  _  >  ?
+
+Simonsen                                                       [Page 80]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  o/ E' E> E: E! I' I> I: I! '! :  Nb SE '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  DG j  k  l  m  n  o  p  q  r  -a -o ae ', AE Cu
+  My ss s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  Ct Pd Ye .M Co At PI 14 12 34 NO !! '- ': '' *X
+  a: A  B  C  D  E  F  G  H  I  -- o> BB o! o' o?
+  u: J  K  L  M  N  O  P  Q  R  1S u> !) u! u' y:
+  O: -: S  T  U  V  W  X  Y  Z  2S O> // O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> )> U! U' DT
+
+  &charset IBM274
+  &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+  &alias EBCDIC-BE
+  &alias CP274
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? <( .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? )> DO *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? u! ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Nb a! '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ': s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  e' A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  e! J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  c, ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset IBM275
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias EBCDIC-BR
+  &alias cp275
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? E' .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? DO C, *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? c, ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? a? :  O? A? '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? '? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  o? A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  e' J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  // ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+Simonsen                                                       [Page 81]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+
+  &charset IBM277
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias EBCDIC-CP-DK
+  &alias EBCDIC-CP-NO
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: a! a' a? !) c, n? Nb .  <  (  +  !
+  &  e' e> e: e! i' i> i: i! ss Cu AA *  )  ;  '>
+  -  /  A> A: A! A' A? DO C, N? o/ ,  %  _  >  ?
+  BB E' E> E: E! I' I> I: I! '! :  AE O/ '  =  "
+  At a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  DG j  k  l  m  n  o  p  q  r  -a -o (! ', <( )>
+  My u: s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  Ct Pd Ye .M Co SE PI 14 12 34 NO !! '- ': '' *X
+  ae A  B  C  D  E  F  G  H  I  -- o> o: o! o' o?
+  aa J  K  L  M  N  O  P  Q  R  1S u> '? u! u' y:
+  // -: S  T  U  V  W  X  Y  Z  2S O> O: O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM278
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP278
+  &alias ebcdic-cp-fi
+  &alias ebcdic-cp-se
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> (! a! a' a? !) c, n? SE .  <  (  +  !
+  &  '! e> e: e! i' i> i: i! ss Cu AA *  )  ;  '>
+  -  /  A> Nb A! A' A? DO C, N? o: ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! e' :  A: O: '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  DG j  k  l  m  n  o  p  q  r  -a -o ae ', AE )>
+  My u: s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  Ct Pd Ye .M Co <( PI 14 12 34 NO !! '- ': '' *X
+  a: A  B  C  D  E  F  G  H  I  -- o> BB o! o' o?
+  aa J  K  L  M  N  O  P  Q  R  1S u> '? u! u' y:
+  // -: S  T  U  V  W  X  Y  Z  2S O> At O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM280
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP280
+  &alias ebcdic-cp-it
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+
+Simonsen                                                       [Page 82]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: (! a' a? aa // n? DG .  <  (  +  !
+  &  )> e> e: !) i' i> i: '? ss e' DO *  )  ;  '>
+  -  /  A> A: A! A' A? AA C, N? o! ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! u! :  Pd SE '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  <( j  k  l  m  n  o  p  q  r  -a -o ae ', AE Cu
+  My i! s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  Ct Nb Ye .M Co At PI 14 12 34 NO !! '- ': '' *X
+  a! A  B  C  D  E  F  G  H  I  -- o> o: BB o' o?
+  e! J  K  L  M  N  O  P  Q  R  1S u> u: '! u' y:
+  c, -: S  T  U  V  W  X  Y  Z  2S O> O: O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM281
+  &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+  &alias EBCDIC-JP-E
+  &alias cp281
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Pd .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? !  Ye *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Nb At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? '- s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  (! A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  !) J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  DO ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset IBM284
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP284
+  &alias ebcdic-cp-es
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: a! a' a? aa c, BB <( .  <  (  +  !!
+  &  e' e> e: e! i' i> i: i! ss )> DO *  )  ;  NO
+  -  /  A> A: A! A' A? AA C, Nb n? ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! '! :  N? At '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  DG j  k  l  m  n  o  p  q  r  -a -o ae ', AE Cu
+  My ': s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+
+Simonsen                                                       [Page 83]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  Ct Pd Ye .M Co SE PI 14 12 34 '> !  '- '? '' *X
+  (! A  B  C  D  E  F  G  H  I  -- o> o: o! o' o?
+  !) J  K  L  M  N  O  P  Q  R  1S u> u: u! u' y:
+  // -: S  T  U  V  W  X  Y  Z  2S O> O: O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM285
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP285
+  &alias ebcdic-cp-gb
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: a! a' a? aa c, n? DO .  <  (  +  !!
+  &  e' e> e: e! i' i> i: i! ss !  Pd *  )  ;  NO
+  -  /  A> A: A! A' A? AA C, N? BB ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! '! :  Nb At '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  DG j  k  l  m  n  o  p  q  r  -a -o ae ', AE Cu
+  My '? s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  Ct <( Ye .M Co SE PI 14 12 34 '> )> '- ': '' *X
+  (! A  B  C  D  E  F  G  H  I  -- o> o: o! o' o?
+  !) J  K  L  M  N  O  P  Q  R  1S u> u: u! u' y:
+  // -: S  T  U  V  W  X  Y  Z  2S O> O: O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM290
+  &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+  &alias cp290
+  &alias EBCDIC-JP-kana
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ._ <' >' ,_ .6 Wo a6 i6 u6 Pd .  <  (  +  !!
+  &  e6 o6 YA YU YO TU ?? -6 ?? !  Ye *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Nb At '  =  "
+  ?? A6 I6 U6 E6 O6 Ka Ki Ku Ke Ko ?? Sa Si Su Se
+  So Ta Ti Tu Te To Na Ni Nu Ne No ?? ?? Ha Hi Hu
+  ?? '- He Ho Ma Mi Mu Me Mo Ya Yu ?? Yo Ra Ri Ru
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? Re Ro Wa N6 "5 05
+  ?? A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  ?? J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  DO ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset IBM297
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp297
+
+Simonsen                                                       [Page 84]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &alias ebcdic-cp-fr
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: At a' a? aa // n? DG .  <  (  +  !
+  &  (! e> e: !) i' i> i: i! ss SE DO *  )  ;  '>
+  -  /  A> A: A! A' A? AA C, N? u! ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! My :  Pd a! '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  <( j  k  l  m  n  o  p  q  r  -a -o ae ', AE Cu
+  '! ': s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  Ct Nb Ye .M Co )> PI 14 12 34 NO !! '- '? '' *X
+  e' A  B  C  D  E  F  G  H  I  -- o> o: o! o' o?
+  e! J  K  L  M  N  O  P  Q  R  1S u> u: BB u' y:
+  c, -: S  T  U  V  W  X  Y  Z  2S O> O: O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM420
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &rem IBM NLS RM p 11-11
+  &alias cp420
+  &alias ebcdic-cp-ar1
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP  NS  3+  3+; ++  ??  H'  aM  aM. aH  Ct  .   <   (   +   !!
+  &   aH. wH  ??  ??  yH  a+  a+. b+  b+, !   DO  *   )   ;   NO
+  -   /   tm  t+  t+, tk  tk, g+  g+, hk  BB  ,   %   _   >   ?
+  hk, x+  x+, d+  dk  r+  z+  s+  s+, ,+  :   Nb  At  '   =   "
+  sn  a   b   c   d   e   f   g   h   i   sn, c+  c+, dd  dd, tj
+  zH  j   k   l   m   n   o   p   q   r   e+  e+. e+, e+; i+  i+.
+  i+, -:  s   t   u   v   w   x   y   z   i+; f+  f+, q+  q+, k+
+  k+, l+  lM- lM. lH- lH. ??  ??  la- la. l+, m+  m+, n+  n+, h+
+  ;+  A   B   C   D   E   F   G   H   I   --  h+, ??  h+; ??  w+
+  ?+  J   K   L   M   N   O   P   Q   R   j+  j+. y+  y+. y+, 0a
+  *X  ??  S   T   U   V   W   X   Y   Z   1a  2a  ??  3a  4a  5a
+  0   1   2   3   4   5   6   7   8   9   ??  6a  7a  8a  9a  DT
+
+  &charset IBM423
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp423
+  &alias ebcdic-cp-gr
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP A* B* G* D* E* Z* Y* H* I* <( .  <  (  +  !
+  &  K* L* M* N* C* O* P* R* S* )> DO *  )  ;  '>
+
+Simonsen                                                       [Page 85]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  -  /  T* U* F* X* Q* W* ?? ?? ?? ,  %  _  >  ?
+  ?? A% E% Y% ?? I% O% U% W% '! :  Pd SE '  =  "
+  A: a  b  c  d  e  f  g  h  i  a* b* g* d* e* z*
+  O: j  k  l  m  n  o  p  q  r  y* h* i* k* l* m*
+  U: ': s  t  u  v  w  x  y  z  n* c* o* p* r* *s
+  ?? a% e% y% j* i% o% u% v* w% s* t* u* f* x* q*
+  %' y= z= s% je sc c% =' JU A= B= C= D= E= F= G=
+  ', A  B  C  D  E  F  G  H  I  ?? w* A> a! a: e>
+  '' J  K  L  M  N  O  P  Q  R  +- e' e! e: i> i:
+  DG ?? S  T  U  V  W  X  Y  Z  12 o: o> u> u! u:
+  0  1  2  3  4  5  6  7  8  9  y: c, C, ?? ?? DT
+
+  &charset IBM424
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp424
+  &alias ebcdic-cp-he
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP A+ B+ G+ D+ H+ W+ Z+ X+ Tj Ct .  <  (  +  !!
+  &  J+ K% K+ L+ M% M+ N% N+ S+ !  DO *  )  ;  NO
+  -  /  E+ P% P+ Zj ZJ Q+ R+ Sh BB ,  %  _  >  ?
+  ?? T+ ?? ?? NS ?? ?? ?? == '! :  Nb At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  << >> ?? ?? ?? ??
+  DG j  k  l  m  n  o  p  q  r  ?? ?? ?? ', ?? Cu
+  My '? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? Rg
+  '> Pd Ye .M Co SE PI 14 12 34 <( )> '- ': '' *X
+  (! A  B  C  D  E  F  G  H  I  -- ?? ?? ?? ?? ??
+  !) J  K  L  M  N  O  P  Q  R  1S ?? ?? ?? ?? ??
+  // -: S  T  U  V  W  X  Y  Z  2S ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  3S ?? ?? ?? ?? DT
+
+  &charset IBM437
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp437
+  &alias 437
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a: a! aa c, e> e: e! i: i> i! A: AA
+  E' ae AE o> o: o! u> u! y: O: U: Ct Pd Ye Pt Fl
+  a' i' o' u' n? N? -a -o ?I NI NO 12 14 !I << >>
+  .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
+  ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
+  Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
+  a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
+  =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
+
+
+Simonsen                                                       [Page 86]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &charset IBM500
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP500
+  &alias ebcdic-cp-be
+  &alias ebcdic-cp-ch
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: a! a' a? aa c, n? <( .  <  (  +  !
+  &  e' e> e: e! i' i> i: i! ss )> DO *  )  ;  '>
+  -  /  A> A: A! A' A? AA C, N? BB ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! '! :  Nb At '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> d- y' th +-
+  DG j  k  l  m  n  o  p  q  r  -a -o ae ', AE Cu
+  My '? s  t  u  v  w  x  y  z  !I ?I D- Y' TH Rg
+  Ct Pd Ye .M Co SE PI 14 12 34 NO !! '- ': '' *X
+  (! A  B  C  D  E  F  G  H  I  -- o> o: o! o' o?
+  !) J  K  L  M  N  O  P  Q  R  1S u> u: u! u' y:
+  // -: S  T  U  V  W  X  Y  Z  2S O> O: O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM850
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp850
+  &alias 850
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a: a! aa c, e> e: e! i: i> i! A: AA
+  E' ae AE o> o: o! u> u! y: O: U: o/ Pd O/ *X Fl
+  a' i' o' u' n? N? -a -o ?I Rg NO 12 14 !I << >>
+  .S :S ?S vv vl A' A> A! Co VL VV LD UL Ct Ye dl
+  ur uh dh vr hh vh a? A? UR DR UH DH VR HH VH Cu
+  d- D- E> E: E! i. I' I> I: ul dr FB LB BB I! TB
+  O' ss O> O! o? O? m* TH th U' U> U! y' Y' -M ''
+  -- +- == 34 PI SE -: '; DG ': '. 1S 3S 2S fS NS
+
+  &charset IBM851
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp851
+  &alias 851
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a: a! A% c, e> e: e! i: i> E% A: Y%
+
+Simonsen                                                       [Page 87]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  I% ?? O% o> o: U% u> u! W% O: U: a% Pd e% y% i%
+  j* i3 o% u% A* B* G* D* E* Z* Y* 12 H* I* << >>
+  .S :S ?S vv vl K* L* N* M* VL VV LD UL C* O* dl
+  ur uh dh vr hh vh P* R* UR DR UH DH VR HH VH S*
+  T* U* F* X* Q* W* a* b* g* ul dr FB LB d* e* TB
+  z* y* h* i* k* l* m* n* c* o* p* r* s* *s t* ''
+  -- +- u* f* x* SE q* '; DG ': w* v* u3 w% fS NS
+
+  &charset IBM852
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp852
+  &alias 852
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a: u0 c' c, l/ e: O" o" i> Z' A: C'
+  E' L' l' o> o: L< l< S' s' O: U: T< t< L/ *X c<
+  a' i' o' u' A; a; Z< z< E; e; ?? z' C< s, << >>
+  .S :S ?S vv vl A' A> E< S, VL VV LD UL Z. z. dl
+  ur uh dh vr hh vh A( a( UR DR UH DH VR HH VH Cu
+  d/ D/ D< E: d< N< I' U> e< ul dr FB LB T, U0 TB
+  O' ss O> N' n' n< S< s< R' U' r' U" y' Y' t, ''
+  -- '" ', '< '( SE -: '; DG ': '. u" R< r< fS NS
+
+  &charset IBM855
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp855
+  &alias 855
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  d% D% g% G% io IO ie IE ds DS ii II yi YI j% J%
+  lj LJ nj NJ ts TS kj KJ v% V% dz DZ ju JU =' ="
+  a= A= b= B= c= C= d= D= e= E= f= F= g= G= << >>
+  .S :S ?S vv vl h= H= i= I= VL VV LD UL j= J= dl
+  ur uh dh vr hh vh k= K= UR DR UH DH VR HH VH Cu
+  l= L= m= M= n= N= o= O= p= ul dr FB LB P= ja TB
+  JA r= R= s= S= t= T= u= U= z% Z% v= V= %' %" ''
+  -- y= Y= z= Z= s% S% je JE sc Sc c% C% ?? fS NS
+
+  &charset IBM857
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp857
+  &alias 857
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+
+Simonsen                                                       [Page 88]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a: a! aa c, e> e: e! i: i> i. A: AA
+  E' ae AE o> o: o! u> u! I. O: U: o/ Pd O/ S, s,
+  a' i' o' u' n? N? G( g( ?I Rg NO 12 14 !I << >>
+  .S :S ?S vv vl A' A> A! Co VL VV LD UL Ct Ye dl
+  ur uh dh vr hh vh a? A? UR DR UH DH VR HH VH Cu
+  -o -a E> E: E! ?? I' I> I: ul dr FB LB BB I! TB
+  O' ss O> O! o? O? m* ?? *X U' U> U! i! y: -M ''
+  -- +- ?? 34 PI SE -: '; DG ': '. 1S 3S 2S fS NS
+
+  &charset IBM860
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp860
+  &alias 860
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a? a! A' c, e> E> e! I> O> i! A? A>
+  E' A! E! o> o? o! U' u! I! O? U: Ct Pd U! Pt O!
+  a' i' o' u' n? N? -a -o ?I O' NO 12 14 !I << >>
+  .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
+  ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
+  Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
+  a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
+  =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
+
+  &charset IBM861
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp861
+  &alias 861
+  &alias cp-is
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a: a! aa c, e> e: e! D- d- TH A: AA
+  E' ae AE o> o: th u> Y' y' O: U: o/ Pd O/ Pt O!
+  a' i' o' u' A' I' O' U' ?I ?? NO 12 14 !I << >>
+  .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
+  ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
+  Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
+  a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
+  =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
+
+  &charset IBM862
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+Simonsen                                                       [Page 89]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &alias cp862
+  &alias 862
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  A+ B+ G+ D+ H+ W+ Z+ X+ Tj J+ K% K+ L+ M% M+ N%
+  N+ S+ E+ P% P+ Zj ZJ Q+ R+ Sh T+ Ct Pd U! Pt O!
+  a' i' o' u' n? N? -a -o ?I ?? NO 12 14 !I << >>
+  .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
+  ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
+  Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
+  a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
+  =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
+
+  &charset IBM863
+  &rem source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+  &alias cp863
+  &alias 863
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> A> a! PI c, e> e: e! i: i> i! A! SE
+  E' E! E> o> E: I: u> u! Cu O> U: Ct Pd U! U> Fl
+  BB '' o' u' ': ', 3S '- I> NI NO 12 14 34 << >>
+  .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
+  ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
+  Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
+  a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
+  =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
+
+  &charset IBM864
+  &rem source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+  &alias cp864
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  DG  .M  Ob  RT  :S  hh  vv  vh  vl  dh  vr  uh  dl  dr  ur  ul
+  ss  00  o/  +-  12  14  ?2  <<  >>  lH- lH. ??  ??  la- la. a+:
+  ??  --  aM. Pd  Cu  aH. ??  ??  a+. b+  t+  tk  ,+  g+  hk  x+
+  0a  1a  2a  3a  4a  5a  6a  7a  8a  9a  v+  ;+  s+  sn  c+  ?+
+  Ct  H'  aM  aH  wH  e+. yH  a+  b+, tm  t+, tk, g+, hk, x+, d+
+  dk  r+  z+  s+, sn, c+, dd, tj  zH  e+, i+, BB  NO  -:  *X  e+
+  ++  f+. q+. k+, l+. m+, n+. h+, w+  j+  y+, dd  m+. i+. i+  m+
+  3+; 3+  n+  h+  h+; j+. y+. f+  q+  lM- lM. l+  k+  y+  fS  NS
+
+Simonsen                                                       [Page 90]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+
+  &charset IBM865
+  &rem source: IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)
+  &alias cp865
+  &alias 865
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  C, u: e' a> a: a! aa c, e> e: e! i: i> i! A: AA
+  E' ae AE o> o: o! u> u! y: O: U: o/ Pd O/ Pt Fl
+  a' i' o' u' n? N? -a -o ?I NI NO 12 14 !I << >>
+  .S :S ?S vv vl vL Vl Dl dL VL VV LD UL Ul uL dl
+  ur uh dh vr hh vh vR Vr UR DR UH DH VR HH VH uH
+  Uh dH Dh Ur uR dR Dr Vh vH ul dr FB LB lB RB TB
+  a* b* G* p* S* s* m* t* F* H* W* d* 00 /0 e* (U
+  =3 +- >= =< Iu Il -: ?2 Ob .M Sb RT nS 2S fS NS
+
+  &charset IBM868
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP868
+  &alias cp-ar
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  0a  1a  2a  3a  4a  5a  6a  7a  8a  9a  ,+  ;+  ?+  aM  a+  a+.
+  a+: b+  b+, p+  ??  tm  t+  t+, ??  ??  tk  tk, g+  g+, ??  ??
+  hk  hk, x+  x+, d+  ??  dk  r+  ??  z+  ??  s+  s+, sn  <<  >>
+  sn, c+  .S  :S  ?S  vv  vl  c+, dd  dd, tj  VL  VV  LD  UL  zH
+  e+  dl  ur  uh  dh  vr  hh  vh  e+. e+, UR  DR  UH  DH  VR  HH
+  VH  e+; i+  i+. i+, i+; f+  f+, q+  q+, k+. ul  dr  FB  TB  k+,
+  ??  LB  ??  l+  l+. l+; m+  m+, ??  n+  n+, ??  w+  ??  ??  ??
+  ??  H'  --  ??  ??  ??  ??  ??  ??  ??  ??  3+  3+; ??  fS  NS
+
+  &charset IBM869
+  &rem source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+  &alias cp869
+  &alias 869
+  &alias cp-gr
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  ?? ?? ?? ?? ?? ?? A% ?? .M NO BB 9' '9 E% -M Y%
+  I% J* O% ?? ?? U% V* Co W% 2S 3S a% Pd e% y% i%
+  j* i3 o% u% A* B* G* D* E* Z* Y* 12 H* I* << >>
+
+Simonsen                                                       [Page 91]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  .S :S ?S vv vl K* L* M* N* VL VV LD UL C* O* dl
+  ur uh dh vr hh vh P* R* UR DR UH DH VR HH VH S*
+  T* U* F* X* Q* W* a* b* g* ul dr FB LB d* e* TB
+  z* y* h* i* k* l* m* n* c* o* p* r* s* *s t* ''
+  -- +- u* f* x* SE q* '% DG ': w* v* u3 w% fS NS
+
+  &charset IBM870
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP870
+  &alias ebcdic-cp-roece
+  &alias ebcdic-cp-yu
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS ?? a: ?? a' a( c< c, c' <( .  <  (  +  !
+  &  e' ?? e: u0 i' ?? l< l' ss )> DO *  )  ;  '>
+  -  /  ?? A: '" A' ?? C< C, C' !! ,  %  _  >  ?
+  '< E' ?? E: U0 I' ?? L< L' '! :  Nb At '  =  "
+  '( a  b  c  d  e  f  g  h  i  s' n< d/ y' r< ??
+  DG j  k  l  m  n  o  p  q  r  l/ n' s< ', '; Cu
+  a; '? s  t  u  v  w  x  y  z  S' N< D/ Y' R< ??
+  .M A; z. ?? Z. SE PI z< z' Z< Z' N' S< ': '' *X
+  (! A  B  C  D  E  F  G  H  I  -- o> o: r' o' o"
+  !) J  K  L  M  N  O  P  Q  R  E< u" u: t< u' e<
+  // -: S  T  U  V  W  X  Y  Z  d< O> O: R' O' O"
+  0  1  2  3  4  5  6  7  8  9  D< U" U: T< U' DT
+
+  &charset IBM871
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP871
+  &alias ebcdic-cp-is
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: a! a' a? aa c, n? th .  <  (  +  !
+  &  e' e> e: e! i' i> i: i! ss AE DO *  )  ;  O:
+  -  /  A> A: A! A' A? AA C, N? BB ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! d- :  Nb D- '  =  "
+  O/ a  b  c  d  e  f  g  h  i  << >> '! y' (! +-
+  DG j  k  l  m  n  o  p  q  r  -a -o !) ', )> Cu
+  My o: s  t  u  v  w  x  y  z  !I ?I At Y' <( Rg
+  Ct Pd Ye .M Co SE PI 14 12 34 NO !! '- ': // *X
+  TH A  B  C  D  E  F  G  H  I  -- o> '? o! o' o?
+  ae J  K  L  M  N  O  P  Q  R  1S u> u: u! u' y:
+  '' -: S  T  U  V  W  X  Y  Z  2S O> '> O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> U: U! U' DT
+
+  &charset IBM880
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+
+Simonsen                                                       [Page 92]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  &alias cp880
+  &alias EBCDIC-Cyrillic
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? d% g% io ?? ds ii yi j% <( .  <  (  +  !
+  &  lj nj ts kj ?? dz =" N0 D% )> DO *  )  ;  '>
+  -  /  G% IO ?? DS II YI J% LJ BB ,  %  _  >  ?
+  NJ Ts KJ ?? ?? DZ ju a= b= ?? :  Nb At '  =  "
+  c= a  b  c  d  e  f  g  h  i  d= e= f= g= h= i=
+  j= j  k  l  m  n  o  p  q  r  k= l= m= n= o= p=
+  ja ?? s  t  u  v  w  x  y  z  r= s= t= u= z% v=
+  %' y= z= s% je sc c% =' JU A= B= C= D= E= F= G=
+  ?? A  B  C  D  E  F  G  H  I  H= I= J= K= L= M=
+  ?? J  K  L  M  N  O  P  Q  R  N= O= P= JA R= S=
+  // Cu S  T  U  V  W  X  Y  Z  T= U= Z% V= %" Y=
+  0  1  2  3  4  5  6  7  8  9  Z= S% JE Sc C% DT
+
+  &charset IBM891
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp891
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+  &charset IBM903
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp903
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+Simonsen                                                       [Page 93]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+  &charset IBM904
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias cp904
+  &alias 904
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  SP ! " Nb DO % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+  At A B C D E F G H I J K L M N O P Q R S T U V W X Y Z <( // )> '> _
+  '! a b c d e f g h i j k l m n o p q r s t u v w x y z (! !! !) '? DT
+  Ct ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? NO BB ??
+
+  &charset IBM905
+  &rem source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+  &alias CP905
+  &alias ebcdic-cp-tr
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? a> a: a! a' ?? c. (! n? C, .  <  (  +  !
+  &  e' e> e: e! i' i> i: i! ss G( I. *  )  ;  '>
+  -  /  A> A: A! A' ?? C. <( N? s, ,  %  _  >  ?
+  ?? E' E> E: E! I' I> I: I! i. :  O: S, '  =  U:
+  '( a  b  c  d  e  f  g  h  i  h/ c> s> u( ?? !!
+  DG j  k  l  m  n  o  p  q  r  h> g> j> '; ?? Cu
+  My o: s  t  u  v  w  x  y  z  H/ C> S> U( ?? At
+  .M Pd z. !) Z. SE )> ?? 12 DO H> G> J> ': '' *X
+  c, A  B  C  D  E  F  G  H  I  -- o> '? o! o' g.
+  g( J  K  L  M  N  O  P  Q  R  '! u> // u! u' ??
+  u: -: S  T  U  V  W  X  Y  Z  2S O> Nb O! O' G.
+  0  1  2  3  4  5  6  7  8  9  3S U> "  U! U' DT
+
+  &charset IBM918
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP918
+  &alias ebcdic-cp-ar2
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+
+Simonsen                                                       [Page 94]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  SP  NS  ,+  ;+  ?+  aH  a+  a+. ??  b+  <(  .   <   (   +   !
+  &   b+, p+  ??  tm  t+  t+, ??  ??  tk  )>  DO  *   )   ;   '>
+  -   /   tk, g+  g+, ??  ??  hk  hk, x+  '!  ,   %   _   >   ?
+  0a  1a  2a  3a  4a  5a  6a  7a  8a  9a  :   Nb  At  '   =   "
+  x+, a   b   c   d   e   f   g   h   i   d+  ??  dk  r+  ??  z+
+  ??  j   k   l   m   n   o   p   q   r   s+  s+, sn  sn, c+  c+,
+  dd  '?  s   t   u   v   w   x   y   z   dd, tj  zH  e+  e+. e+,
+  e+; i+  i+. i+, i+; f+  f+, q+  q+, k+  k+, !!  ??  ??  l+  l+.
+  (!  A   B   C   D   E   F   G   H   I   --  ??  m+  m+, ??  n+
+  !)  J   K   L   M   N   O   P   Q   R   n+, ??  w+  ??  ??  ??
+  //  ??  S   T   U   V   W   X   Y   Z   H'  ??  ??  ??  ??  ??
+  0   1   2   3   4   5   6   7   8   9   ??  ??  ??  3+  3+; DT
+
+  &charset IBM1026
+  &rem source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+  &alias CP1026
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP NS a> a: a! a' a? aa (! n? C, .  <  (  +  !
+  &  e' e> e: e! i' i> i: i! ss G( I. *  )  ;  '>
+  -  /  A> A: A! A' A? AA <( N? s, ,  %  _  >  ?
+  o/ E' E> E: E! I' I> I: I! i. :  O: S, '  =  U:
+  O/ a  b  c  d  e  f  g  h  i  << >> !) '! BB +-
+  DG j  k  l  m  n  o  p  q  r  -a -o ae '; AE Cu
+  My o: s  t  u  v  w  x  y  z  !I ?I )> DO At Rg
+  Ct Pd Ye .M Co SE PI 14 12 34 NO !! -M ': '' *X
+  c, A  B  C  D  E  F  G  H  I  -- o> '? o! o' o?
+  g( J  K  L  M  N  O  P  Q  R  1S u> // u! u' y:
+  u: -: S  T  U  V  W  X  Y  Z  2S O> Nb O! O' O?
+  0  1  2  3  4  5  6  7  8  9  3S U> "  U! U' DT
+
+  &charset EBCDIC-AT-DE
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? A: .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? U: DO *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? o: ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Nb SE '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ss s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  a: A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  u: J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  O: ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+Simonsen                                                       [Page 95]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+
+  &charset EBCDIC-AT-DE-A
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? o: .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? u: U: *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? ss ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? :  A: O: '  =  a:
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ?? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  ?? J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  ?? ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-CA-FR
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? a> ?? ?? ?? ?? ?? c, ?? a! .  <  (  +  !
+  &  ?? e> e: ?? ?? i> i: ?? ?? '' DO *  )  ;  '>
+  -  /  A> ?? A! ?? ?? ?? C, ?? u! ,  %  _  >  ?
+  ?? E' E> E: ?? I> I: ?? ?? '! :  Nb At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ': s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  e' A  B  C  D  E  F  G  H  I  ?? o> ?? ?? ?? ??
+  e! J  K  L  M  N  O  P  Q  R  ?? u> u: ?? ?? ??
+  ', ?? S  T  U  V  W  X  Y  Z  ?? O> ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? U> U: U! ?? DT
+
+  &charset EBCDIC-DK-NO
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Nb .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? Cu AA *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? o/ ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  AE O/ '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+
+Simonsen                                                       [Page 96]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? u: s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ae A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  aa J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  // ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-DK-NO-A
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? o/ .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? aa AA *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? :  AE O/ '  =  ae
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ?? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  ?? J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  ?? ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-FI-SE
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? SE .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? Cu AA *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? o: ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? e' :  A: O: '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? u: s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  a: A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  aa J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  E' ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-FI-SE-A
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+
+Simonsen                                                       [Page 97]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? o: .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? aa AA *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? :  A: O: '  =  a:
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ?? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  ?? J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  ?? ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-FR
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? DG .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? SE DO *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? u! ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Pd a! '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ': s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  e' A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  e! J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  c, ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-IT
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? DG .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? e' DO *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? o! ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? u! :  Pd SE '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? i! s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  a! A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  e! J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  c, ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+
+Simonsen                                                       [Page 98]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-PT
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? <( .  <  (  +  !
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? )> DO *  )  ;  '>
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? o? ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  A? O? '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? c, s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  a? A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  '' J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  C, ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-ES
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Ct .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? !  Pt *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? n? ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  N? At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ': s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  (! A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  !) J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  // ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-ES-A
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Ct .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? !  Pt *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? :  N? At '  =  n?
+
+Simonsen                                                       [Page 99]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ?? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  ?? J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  ?? ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-ES-S
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Ct .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? !  DO *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? n? ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  N? At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? ': s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  (! A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  !) J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  // ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-UK
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? DO .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? !  Pd *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Nb At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? '- s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  (! A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  !) J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  // ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+  &charset EBCDIC-US
+  &rem source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+  &code 0
+  NU SH SX EX ET EQ AK BL BS HT LF VT FF CR SO SI
+
+Simonsen                                                      [Page 100]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+  DL D1 D2 D3 D4 NK SY EB CN EM SB EC FS GS RS US
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  SP ?? ?? ?? ?? ?? ?? ?? ?? ?? Ct .  <  (  +  !!
+  &  ?? ?? ?? ?? ?? ?? ?? ?? ?? !  DO *  )  ;  NO
+  -  /  ?? ?? ?? ?? ?? ?? ?? ?? BB ,  %  _  >  ?
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? '! :  Nb At '  =  "
+  ?? a  b  c  d  e  f  g  h  i  ?? ?? ?? ?? ?? ??
+  ?? j  k  l  m  n  o  p  q  r  ?? ?? ?? ?? ?? ??
+  ?? '? s  t  u  v  w  x  y  z  ?? ?? ?? ?? ?? ??
+  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
+  (! A  B  C  D  E  F  G  H  I  ?? ?? ?? ?? ?? ??
+  !) J  K  L  M  N  O  P  Q  R  ?? ?? ?? ?? ?? ??
+  // ?? S  T  U  V  W  X  Y  Z  ?? ?? ?? ?? ?? ??
+  0  1  2  3  4  5  6  7  8  9  ?? ?? ?? ?? ?? DT
+
+ACKNOWLEDGEMENTS
+
+   This memo has been produced with a grant from Nordisk Industrifond
+   project number 91030.  I thank all of the people in the IETF 822ext
+   WG for their constructive discussion and remarks on this memo. People
+   from many other circles have also commented on the text and the
+   tables. The following is a list of persons that I remember bringing
+   forward suggestions that made me change the specifications - my aging
+   memory may have forgot even significant contributions, and I
+   apologize for that.
+
+           Alain LaBonte'                  Alina Da Cruz
+           Anders Samuelsson               Bob Smart
+           Cuong Bui                       Dan Oscarsson
+           David Crocker                   David Joslin
+           Dick Weaver                     Dmitry V. Volodin
+           Erik van der Poel               Geir Petersen
+           Greg Vaudreuil                  Harald Tveit Alvestrand
+           Hugh Tucker                     Isai Scheinberg
+           James Do                        Jan-Michael Rynning
+           Johan van Wingen                John C. Klensin
+           John F. Chandler                Johnny Erikson
+           Justin Bur                      Keith Moore
+           Kevin Donnelly                  Kim F. Storm
+           Marius Olofson                  Masahiro Sekiguchi
+           Maurizio Sichera                Michael Patton
+           Nandor Horvath                  Nathaniel Borenstein
+           Ned Freed                       Neil Katin
+           Olle Jaernefors                 Patrick Faeltstroem
+           Paul Pomes                      Peter Svanberg
+           Philippe-Andre' Prindeville     Randall Atkinson
+           Steve Hardcastle-Kille
+
+
+
+
+
+
+Simonsen                                                      [Page 101]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+REFERENCES
+
+   (1) ISO 2375 registration: "International Register of Coded Character
+   Sets to be Used With Escape Sequences", European Computer
+   Manufacturers Association (ECMA), Rue du Rhone 114, CH-1204 Geneve,
+   Switzerland, December 1990.
+
+   (2) ISO 2DIS 10646, Information Technology - Universal Multiple-Octet
+   Coded Character Set (UCS), ISO/IEC JTC1/SC2/WG2 N783 (26 December
+   1991).
+
+   (3) ISO/IEC 9945-2.2 CD POSIX Shell and Utilities, informative annex
+   F, ISO/IEC JTC1/SC22 N1063 (October 1991).
+
+   (4) IBM National Language Support Reference Manual Volume 2, SE09-
+   8002-01 (March 1990).
+
+   (5) IBM 3174 Establishment Controller, Character Set Reference,
+   GA27-3831-02 (March 1990).
+
+   (6) IBM 3270 Information Display System Character Set Reference,
+   Chapter 10, GA27-2837-9 (April 1987)
+
+   (7) IBM DOS 3.30 Reference (Abridged) 94X9575 (February 1987)
+
+   (8) IBM Keyboard layouts and code pages, Part Number 07G4586 (June
+   1991)
+
+   (9) HP LaserJet IIP Printer User's Manual, HP Part No. 33471-90901
+   (June 1989)
+
+   (10) Danish Standard DS 2089, Application of ISO 7-bit coded
+   character set, UDC 681.3:003.62, February 1974. (withdrawn).
+
+   (11) ISO 2022:1986 Information processing - ISO 7-bit and 8-bit coded
+   character sets - Code extension techniques.
+
+   (12) ISO 6429:1988 Information processing - ISO 7-bit and 8-bit coded
+   character sets - Control functions for 7-bit and 8-bit coded
+   character sets.
+
+   (13) VAX/VMS User's Manual, Order Number: AI-Y517A-TE, April 1986.
+
+   (14) The Unicode Standard Version 1.0 Volume 1, ISBN 0-201-56788-1
+   (October 1991).
+
+
+
+
+
+
+
+
+
+Simonsen                                                      [Page 102]
+\f
+RFC 1345          Character Mnemonics & Character Sets         June 1992
+
+
+Author's Address
+
+   Keld Simonsen
+   Rationel Almen Planlaegning
+   Sankt Joergens Alle 8
+   DK-1615 Koebenhavn V
+   Danmark
+
+   Tel: +45 31 22 65 43
+   Fax: +45 33 15 85 16
+
+   Email: Keld.Simonsen@dkuug.dk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Simonsen                                                      [Page 103]
+\f
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644 (file)
index 0000000..342462f
--- /dev/null
@@ -0,0 +1 @@
+Sun Nov  6 04:06:07 EST 1994
diff --git a/stamp-init b/stamp-init
new file mode 100644 (file)
index 0000000..76a0532
--- /dev/null
@@ -0,0 +1 @@
+Sun Nov  6 05:13:18 EST 1994
diff --git a/stamp-vti b/stamp-vti
new file mode 100644 (file)
index 0000000..6bda710
--- /dev/null
+++ b/stamp-vti
@@ -0,0 +1 @@
+Sun Nov  6 05:12:53 EST 1994
diff --git a/texinfo.tex b/texinfo.tex
new file mode 100644 (file)
index 0000000..7d01a91
--- /dev/null
@@ -0,0 +1,4365 @@
+%% TeX macros to handle texinfo files
+
+%   Copyright (C) 1985, 86, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc.
+
+%This texinfo.tex file is free software; you can redistribute it and/or
+%modify it under the terms of the GNU General Public License as
+%published by the Free Software Foundation; either version 2, or (at
+%your option) any later version.
+
+%This texinfo.tex file is distributed in the hope that it will be
+%useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%General Public License for more details.
+
+%You should have received a copy of the GNU General Public License
+%along with this texinfo.tex file; see the file COPYING.  If not, write
+%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
+%USA.
+
+
+%In other words, you are welcome to use, share and improve this program.
+%You are forbidden to forbid anyone else to use, share and improve
+%what you give them.   Help stamp out software-hoarding!
+
+% This automatically updates the version number based on RCS.
+\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}}
+\deftexinfoversion$Revision: 2.136 $
+\message{Loading texinfo package [Version \texinfoversion]:}
+
+% Print the version number if in a .fmt file.
+\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
+
+% Save some parts of plain tex whose names we will redefine.
+
+\let\ptextilde=\~
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexdots=\dots
+\let\ptexdot=\.
+\let\ptexstar=\*
+\let\ptexend=\end
+\let\ptexbullet=\bullet
+\let\ptexb=\b
+\let\ptexc=\c
+\let\ptexi=\i
+\let\ptext=\t
+\let\ptexl=\l
+\let\ptexL=\L
+
+% Be sure we're in horizontal mode when doing a tie, since we make space
+% equivalent to this in @example-like environments. Otherwise, a space
+% at the beginning of a line will start with \penalty -- and
+% since \penalty is valid in vertical mode, we'd end up putting the
+% penalty on the vertical list instead of in the new paragraph.
+{\catcode`@ = 11
+ \gdef\tie{\leavevmode\penalty\@M\ }
+}
+\let\~ = \tie                  % And make it available as @~.
+
+\message{Basics,}
+\chardef\other=12
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+% Set up fixed words for English.
+\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi%
+\def\putwordInfo{Info}%
+\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi%
+\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi%
+\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi%
+\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi%
+\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi%
+\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi%
+\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi%
+\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi%
+\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi%
+
+% Ignore a token.
+%
+\def\gobble#1{}
+
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen \bindingoffset  \bindingoffset=0pt
+\newdimen \normaloffset   \normaloffset=\hoffset
+\newdimen\pagewidth \newdimen\pageheight
+\pagewidth=\hsize \pageheight=\vsize
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{\tracingcommands2 \tracingstats2
+   \tracingpages1 \tracingoutput1 \tracinglostchars1
+   \tracingmacros2 \tracingparagraphs1 \tracingrestores1
+   \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+
+%---------------------Begin change-----------------------
+%
+%%%% For @cropmarks command.
+% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\cornerlong \newdimen\cornerthick
+\newdimen \topandbottommargin
+\newdimen \outerhsize \newdimen \outervsize
+\cornerlong=1pc\cornerthick=.3pt       % These set size of cropmarks
+\outerhsize=7in
+%\outervsize=9.5in
+% Alternative @smallbook page size is 9.25in
+\outervsize=9.25in
+\topandbottommargin=.75in
+%
+%---------------------End change-----------------------
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions itself, but you have to call it yourself.
+\chardef\PAGE=255  \output={\onepageout{\pagecontents\PAGE}}
+\def\onepageout#1{\hoffset=\normaloffset
+\ifodd\pageno  \advance\hoffset by \bindingoffset
+\else \advance\hoffset by -\bindingoffset\fi
+{\escapechar=`\\\relax % makes sure backslash is used in output files.
+\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
+{\let\hsize=\pagewidth \makefootline}}}%
+\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+
+%%%% For @cropmarks command %%%%
+
+% Here is a modification of the main output routine for Near East Publications
+% This provides right-angle cropmarks at all four corners.
+% The contents of the page are centerlined into the cropmarks,
+% and any desired binding offset is added as an \hskip on either
+% site of the centerlined box.  (P. A. MacKay, 12 November, 1986)
+%
+\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
+{\escapechar=`\\\relax % makes sure backslash is used in output files.
+                \shipout
+                \vbox to \outervsize{\hsize=\outerhsize
+                 \vbox{\line{\ewtop\hfill\ewtop}}
+                 \nointerlineskip
+                 \line{\vbox{\moveleft\cornerthick\nstop}
+                       \hfill
+                       \vbox{\moveright\cornerthick\nstop}}
+                 \vskip \topandbottommargin
+                 \centerline{\ifodd\pageno\hskip\bindingoffset\fi
+                       \vbox{
+                       {\let\hsize=\pagewidth \makeheadline}
+                       \pagebody{#1}
+                       {\let\hsize=\pagewidth \makefootline}}
+                       \ifodd\pageno\else\hskip\bindingoffset\fi}
+                \vskip \topandbottommargin plus1fill minus1fill
+                 \boxmaxdepth\cornerthick
+                 \line{\vbox{\moveleft\cornerthick\nsbot}
+                       \hfill
+                       \vbox{\moveright\cornerthick\nsbot}}
+                 \nointerlineskip
+                 \vbox{\line{\ewbot\hfill\ewbot}}
+       }}
+  \advancepageno
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+%
+% Do @cropmarks to get crop marks
+\def\cropmarks{\let\onepageout=\croppageout }
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
+\dimen@=\dp#1 \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
+\ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+}
+
+%
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.  The argument is the rest of
+% the input line (except we remove a trailing comment).  #1 should be a
+% macro which expects an ordinary undelimited TeX argument.
+%
+\def\parsearg#1{%
+  \let\next = #1%
+  \begingroup
+    \obeylines
+    \futurelet\temp\parseargx
+}
+
+% If the next token is an obeyed space (from an @example environment or
+% the like), remove it and recurse.  Otherwise, we're done.
+\def\parseargx{%
+  % \obeyedspace is defined far below, after the definition of \sepspaces.
+  \ifx\obeyedspace\temp
+    \expandafter\parseargdiscardspace
+  \else
+    \expandafter\parseargline
+  \fi
+}
+
+% Remove a single space (as the delimiter token to the macro call).
+{\obeyspaces %
+ \gdef\parseargdiscardspace {\futurelet\temp\parseargx}}
+
+{\obeylines %
+  \gdef\parseargline#1^^M{%
+    \endgroup % End of the group started in \parsearg.
+    %
+    % First remove any @c comment, then any @comment.
+    % Result of each macro is put in \toks0.
+    \argremovec #1\c\relax %
+    \expandafter\argremovecomment \the\toks0 \comment\relax %
+    %
+    % Call the caller's macro, saved as \next in \parsearg.
+    \expandafter\next\expandafter{\the\toks0}%
+  }%
+}
+
+% Since all \c{,omment} does is throw away the argument, we can let TeX
+% do that for us.  The \relax here is matched by the \relax in the call
+% in \parseargline; it could be more or less anything, its purpose is
+% just to delimit the argument to the \c.
+\def\argremovec#1\c#2\relax{\toks0 = {#1}}
+\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}}
+
+% \argremovec{,omment} might leave us with trailing spaces, though; e.g.,
+%    @end itemize  @c foo
+% will have two active spaces as part of the argument with the
+% `itemize'.  Here we remove all active spaces from #1, and assign the
+% result to \toks0.
+%
+% This loses if there are any *other* active characters besides spaces
+% in the argument -- _ ^ +, for example -- since they get expanded.
+% Fortunately, Texinfo does not define any such commands.  (If it ever
+% does, the catcode of the characters in questionwill have to be changed
+% here.)  But this means we cannot call \removeactivespaces as part of
+% \argremovec{,omment}, since @c uses \parsearg, and thus the argument
+% that \parsearg gets might well have any character at all in it.
+%
+\def\removeactivespaces#1{%
+  \begingroup
+    \ignoreactivespaces
+    \edef\temp{#1}%
+    \global\toks0 = \expandafter{\temp}%
+  \endgroup
+}
+
+% Change the active space to expand to nothing.
+%
+\begingroup
+  \obeyspaces
+  \gdef\ignoreactivespaces{\obeyspaces\let =\empty}
+\endgroup
+
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment.  Type Return to continue.}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo  is the same as @foo, for now.
+\newhelp\EMsimple{Type <Return> to continue.}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+% @end foo executes the definition of \Efoo.
+%
+\def\end{\parsearg\endxxx}
+\def\endxxx #1{%
+  \removeactivespaces{#1}%
+  \edef\endthing{\the\toks0}%
+  %
+  \expandafter\ifx\csname E\endthing\endcsname\relax
+    \expandafter\ifx\csname \endthing\endcsname\relax
+      % There's no \foo, i.e., no ``environment'' foo.
+      \errhelp = \EMsimple
+      \errmessage{Undefined command `@end \endthing'}%
+    \else
+      \unmatchedenderror\endthing
+    \fi
+  \else
+    % Everything's ok; the right environment has been started.
+    \csname E\endthing\endcsname
+  \fi
+}
+
+% There is an environment #1, but it hasn't been started.  Give an error.
+%
+\def\unmatchedenderror#1{%
+  \errhelp = \EMsimple
+  \errmessage{This `@end #1' doesn't have a matching `@#1'}%
+}
+
+% Define the control sequence \E#1 to give an unmatched @end error.
+%
+\def\defineunmatchedend#1{%
+  \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}%
+}
+
+
+% Single-spacing is done by various environments (specifically, in
+% \nonfillstart and \quotations).
+\newskip\singlespaceskip \singlespaceskip = 12.5pt
+\def\singlespace{%
+  % Why was this kern here?  It messes up equalizing space above and below
+  % environments.  --karl, 6may93
+  %{\advance \baselineskip by -\singlespaceskip
+  %\kern \baselineskip}%
+  \setleading \singlespaceskip
+}
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
+\def\@{{\tt \char '100}}
+
+% This is turned off because it was never documented
+% and you can use @w{...} around a quote to suppress ligatures.
+%% Define @` and @' to be the same as ` and '
+%% but suppressing ligatures.
+%\def\`{{`}}
+%\def\'{{'}}
+
+% Used to generate quoted braces.
+
+\def\mylbrace {{\tt \char '173}}
+\def\myrbrace {{\tt \char '175}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @enddots{} is an end-of-sentence ellipsis.
+\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000}
+
+% @! is an end-of-sentence bang.
+\gdef\!{!\spacefactor=3000 }
+
+% @? is an end-of-sentence query.
+\gdef\?{?\spacefactor=3000 }
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+%
+\def\group{\begingroup
+  \ifnum\catcode13=\active \else
+    \errhelp = \groupinvalidhelp
+    \errmessage{@group invalid in context where filling is enabled}%
+  \fi
+  %
+  % The \vtop we start below produces a box with normal height and large
+  % depth; thus, TeX puts \baselineskip glue before it, and (when the
+  % next line of text is done) \lineskip glue after it.  (See p.82 of
+  % the TeXbook.)  Thus, space below is not quite equal to space
+  % above.  But it's pretty close.
+  \def\Egroup{%
+    \egroup           % End the \vtop.
+    \endgroup         % End the \group.
+  }%
+  %
+  \vtop\bgroup
+    % We have to put a strut on the last line in case the @group is in
+    % the midst of an example, rather than completely enclosing it.
+    % Otherwise, the interline space between the last line of the group
+    % and the first line afterwards is too small.  But we can't put the
+    % strut in \Egroup, since there it would be on a line by itself.
+    % Hence this just inserts a strut at the beginning of each line.
+    \everypar = {\strut}%
+    %
+    % Since we have a strut on every line, we don't need any of TeX's
+    % normal interline spacing.
+    \offinterlineskip
+    %
+    % OK, but now we have to do something about blank
+    % lines in the input in @example-like environments, which normally
+    % just turn into \lisppar, which will insert no space now that we've
+    % turned off the interline space.  Simplest is to make them be an
+    % empty paragraph.
+    \ifx\par\lisppar
+      \edef\par{\leavevmode \par}%
+      %
+      % Reset ^^M's definition to new definition of \par.
+      \obeylines
+    \fi
+    %
+    % Do @comment since we are called inside an environment such as
+    % @example, where each end-of-line in the input causes an
+    % end-of-line in the output.  We don't want the end-of-line after
+    % the `@group' to put extra space in the output.  Since @group
+    % should appear on a line by itself (according to the Texinfo
+    % manual), we don't worry about eating any user text.
+    \comment
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing `@group can only ...'.
+%
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+  % Go into vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % Don't add any leading before our big empty box, but allow a page
+  % break, since the best break might be right here.
+  \allowbreak
+  \nointerlineskip
+  \vtop to #1\mil{\vfil}%
+  %
+  % TeX does not even consider page breaks if a penalty added to the
+  % main vertical list is 10000 or more.  But in order to see if the
+  % empty box we just added fits on the page, we must make it consider
+  % page breaks.  On the other hand, we don't want to actually break the
+  % page after the empty box.  So we use a penalty of 9999.
+  %
+  % There is an extremely small chance that TeX will actually break the
+  % page at this \penalty, if there are no other feasible breakpoints in
+  % sight.  (If the user is using lots of big @group commands, which
+  % almost-but-not-quite fill up a page, TeX will have a hard time doing
+  % good page breaking, for example.)  However, I could not construct an
+  % example where a page broke at this \penalty; if it happens in a real
+  % document, then we can reconsider our strategy.
+  \penalty9999
+  %
+  % Back up by the size of the box, whether we did a page break or not.
+  \kern -#1\mil
+  %
+  % Do not allow a page break right after this kern.
+  \nobreak
+}
+
+% @br   forces paragraph break
+
+\let\br = \par
+
+% @dots{}  output some dots
+
+\def\dots{$\ldots$}
+
+% @page    forces the start of a new page
+
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+%\hbox{{\rm#1}}\hfil\break}}
+
+% @include file    insert text of that file as input.
+
+\def\include{\parsearg\includezzz}
+%Use \input\thisfile to avoid blank after \input, which may be an active
+%char (in which case the blank would become the \input argument).
+%The grouping keeps the value of \thisfile correct even when @include
+%is nested.
+\def\includezzz #1{\begingroup
+\def\thisfile{#1}\input\thisfile
+\endgroup}
+
+\def\thisfile{}
+
+% @center line   outputs that line, centered
+
+\def\center{\parsearg\centerzzz}
+\def\centerzzz #1{{\advance\hsize by -\leftskip
+\advance\hsize by -\rightskip
+\centerline{#1}}}
+
+% @sp n   outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\par \vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+\parsearg \commentxxx}
+
+\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
+
+\let\c=\comment
+
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+\let\chapter=\relax
+\let\unnumbered=\relax
+\let\top=\relax
+\let\unnumberedsec=\relax
+\let\unnumberedsection=\relax
+\let\unnumberedsubsec=\relax
+\let\unnumberedsubsection=\relax
+\let\unnumberedsubsubsec=\relax
+\let\unnumberedsubsubsection=\relax
+\let\section=\relax
+\let\subsec=\relax
+\let\subsubsec=\relax
+\let\subsection=\relax
+\let\subsubsection=\relax
+\let\appendix=\relax
+\let\appendixsec=\relax
+\let\appendixsection=\relax
+\let\appendixsubsec=\relax
+\let\appendixsubsection=\relax
+\let\appendixsubsubsec=\relax
+\let\appendixsubsubsection=\relax
+\let\contents=\relax
+\let\smallbook=\relax
+\let\titlepage=\relax
+}
+
+% Used in nested conditionals, where we have to parse the Texinfo source
+% and so want to turn off most commands, in case they are used
+% incorrectly.
+%
+\def\ignoremorecommands{%
+  \let\defcv = \relax
+  \let\deffn = \relax
+  \let\deffnx = \relax
+  \let\defindex = \relax
+  \let\defivar = \relax
+  \let\defmac = \relax
+  \let\defmethod = \relax
+  \let\defop = \relax
+  \let\defopt = \relax
+  \let\defspec = \relax
+  \let\deftp = \relax
+  \let\deftypefn = \relax
+  \let\deftypefun = \relax
+  \let\deftypevar = \relax
+  \let\deftypevr = \relax
+  \let\defun = \relax
+  \let\defvar = \relax
+  \let\defvr = \relax
+  \let\ref = \relax
+  \let\xref = \relax
+  \let\printindex = \relax
+  \let\pxref = \relax
+  \let\settitle = \relax
+  \let\include = \relax
+  \let\lowersections = \relax
+  \let\down = \relax
+  \let\raisesections = \relax
+  \let\up = \relax
+  \let\set = \relax
+  \let\clear = \relax
+  \let\item = \relax
+  \let\message = \relax
+}
+
+% Ignore @ignore ... @end ignore.
+%
+\def\ignore{\doignore{ignore}}
+
+% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text.
+%
+\def\ifinfo{\doignore{ifinfo}}
+\def\ifhtml{\doignore{ifhtml}}
+\def\html{\doignore{html}}
+\def\menu{\doignore{menu}}
+\def\direntry{\doignore{direntry}}
+
+% Ignore text until a line `@end #1'.
+%
+\def\doignore#1{\begingroup
+  % Don't complain about control sequences we have declared \outer.
+  \ignoresections
+  %
+  % Define a command to swallow text until we reach `@end #1'.
+  \long\def\doignoretext##1\end #1{\enddoignore}%
+  %
+  % Make sure that spaces turn into tokens that match what \doignoretext wants.
+  \catcode32 = 10
+  %
+  % And now expand that command.
+  \doignoretext
+}
+
+% What we do to finish off ignored text.
+%
+\def\enddoignore{\endgroup\ignorespaces}%
+
+\newif\ifwarnedobs\warnedobsfalse
+\def\obstexwarn{%
+  \ifwarnedobs\relax\else
+  % We need to warn folks that they may have trouble with TeX 3.0.
+  % This uses \immediate\write16 rather than \message to get newlines.
+    \immediate\write16{}
+    \immediate\write16{***WARNING*** for users of Unix TeX 3.0!}
+    \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).}
+    \immediate\write16{If you are running another version of TeX, relax.}
+    \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.}
+    \immediate\write16{  Then upgrade your TeX installation if you can.}
+    \immediate\write16{If you are stuck with version 3.0, run the}
+    \immediate\write16{  script ``tex3patch'' from the Texinfo distribution}
+    \immediate\write16{  to use a workaround.}
+    \immediate\write16{}
+    \warnedobstrue
+    \fi
+}
+
+% **In TeX 3.0, setting text in \nullfont hangs tex.  For a
+% workaround (which requires the file ``dummy.tfm'' to be installed),
+% uncomment the following line:
+%%%%%\font\nullfont=dummy\let\obstexwarn=\relax
+
+% Ignore text, except that we keep track of conditional commands for
+% purposes of nesting, up to an `@end #1' command.
+%
+\def\nestedignore#1{%
+  \obstexwarn
+  % We must actually expand the ignored text to look for the @end
+  % command, so that nested ignore constructs work.  Thus, we put the
+  % text into a \vbox and then do nothing with the result.  To minimize
+  % the change of memory overflow, we follow the approach outlined on
+  % page 401 of the TeXbook: make the current font be a dummy font.
+  %
+  \setbox0 = \vbox\bgroup
+    % Don't complain about control sequences we have declared \outer.
+    \ignoresections
+    %
+    % Define `@end #1' to end the box, which will in turn undefine the
+    % @end command again.
+    \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}%
+    %
+    % We are going to be parsing Texinfo commands.  Most cause no
+    % trouble when they are used incorrectly, but some commands do
+    % complicated argument parsing or otherwise get confused, so we
+    % undefine them.
+    %
+    % We can't do anything about stray @-signs, unfortunately;
+    % they'll produce `undefined control sequence' errors.
+    \ignoremorecommands
+    %
+    % Set the current font to be \nullfont, a TeX primitive, and define
+    % all the font commands to also use \nullfont.  We don't use
+    % dummy.tfm, as suggested in the TeXbook, because not all sites
+    % might have that installed.  Therefore, math mode will still
+    % produce output, but that should be an extremely small amount of
+    % stuff compared to the main input.
+    %
+    \nullfont
+    \let\tenrm = \nullfont  \let\tenit = \nullfont  \let\tensl = \nullfont
+    \let\tenbf = \nullfont  \let\tentt = \nullfont  \let\smallcaps = \nullfont
+    \let\tensf = \nullfont
+    % Similarly for index fonts (mostly for their use in
+    % smallexample)
+    \let\indrm = \nullfont  \let\indit = \nullfont  \let\indsl = \nullfont
+    \let\indbf = \nullfont  \let\indtt = \nullfont  \let\indsc = \nullfont
+    \let\indsf = \nullfont
+    %
+    % Don't complain when characters are missing from the fonts.
+    \tracinglostchars = 0
+    %
+    % Don't bother to do space factor calculations.
+    \frenchspacing
+    %
+    % Don't report underfull hboxes.
+    \hbadness = 10000
+    %
+    % Do minimal line-breaking.
+    \pretolerance = 10000
+    %
+    % Do not execute instructions in @tex
+    \def\tex{\doignore{tex}}
+}
+
+% @set VAR sets the variable VAR to an empty value.
+% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE.
+%
+% Since we want to separate VAR from REST-OF-LINE (which might be
+% empty), we can't just use \parsearg; we have to insert a space of our
+% own to delimit the rest of the line, and then take it out again if we
+% didn't need it.
+%
+\def\set{\parsearg\setxxx}
+\def\setxxx#1{\setyyy#1 \endsetyyy}
+\def\setyyy#1 #2\endsetyyy{%
+  \def\temp{#2}%
+  \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty
+  \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted.
+  \fi
+}
+\def\setzzz#1#2 \endsetzzz{\expandafter\xdef\csname SET#1\endcsname{#2}}
+
+% @clear VAR clears (i.e., unsets) the variable VAR.
+%
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax}
+
+% @value{foo} gets the text saved in variable foo.
+%
+\def\value#1{\expandafter
+               \ifx\csname SET#1\endcsname\relax
+                       {\{No value for ``#1''\}}
+               \else \csname SET#1\endcsname \fi}
+
+% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined
+% with @set.
+%
+\def\ifset{\parsearg\ifsetxxx}
+\def\ifsetxxx #1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \expandafter\ifsetfail
+  \else
+    \expandafter\ifsetsucceed
+  \fi
+}
+\def\ifsetsucceed{\conditionalsucceed{ifset}}
+\def\ifsetfail{\nestedignore{ifset}}
+\defineunmatchedend{ifset}
+
+% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been
+% defined with @set, or has been undefined with @clear.
+%
+\def\ifclear{\parsearg\ifclearxxx}
+\def\ifclearxxx #1{%
+  \expandafter\ifx\csname SET#1\endcsname\relax
+    \expandafter\ifclearsucceed
+  \else
+    \expandafter\ifclearfail
+  \fi
+}
+\def\ifclearsucceed{\conditionalsucceed{ifclear}}
+\def\ifclearfail{\nestedignore{ifclear}}
+\defineunmatchedend{ifclear}
+
+% @iftex always succeeds; we read the text following, through @end
+% iftex).  But `@end iftex' should be valid only after an @iftex.
+%
+\def\iftex{\conditionalsucceed{iftex}}
+\defineunmatchedend{iftex}
+
+% We can't just want to start a group at @iftex (for example) and end it
+% at @end iftex, since then @set commands inside the conditional have no
+% effect (they'd get reverted at the end of the group).  So we must
+% define \Eiftex to redefine itself to be its previous value.  (We can't
+% just define it to fail again with an ``unmatched end'' error, since
+% the @ifset might be nested.)
+%
+\def\conditionalsucceed#1{%
+  \edef\temp{%
+    % Remember the current value of \E#1.
+    \let\nece{prevE#1} = \nece{E#1}%
+    %
+    % At the `@end #1', redefine \E#1 to be its previous value.
+    \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}%
+  }%
+  \temp
+}
+
+% We need to expand lots of \csname's, but we don't want to expand the
+% control sequences after we've constructed them.
+%
+\def\nece#1{\expandafter\noexpand\csname#1\endcsname}
+
+% @asis just yields its argument.  Used with @table, for example.
+%
+\def\asis#1{#1}
+
+% @math means output in math mode.
+% We don't use $'s directly in the definition of \math because control
+% sequences like \math are expanded when the toc file is written.  Then,
+% we read the toc file back, the $'s will be normal characters (as they
+% should be, according to the definition of Texinfo).  So we must use a
+% control sequence to switch into and out of math mode.
+%
+% This isn't quite enough for @math to work properly in indices, but it
+% seems unlikely it will ever be needed there.
+%
+\let\implicitmath = $
+\def\math#1{\implicitmath #1\implicitmath}
+
+% @bullet and @minus need the same treatment as @math, just above.
+\def\bullet{\implicitmath\ptexbullet\implicitmath}
+\def\minus{\implicitmath-\implicitmath}
+
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\nwnode=\node
+\let\lastnode=\relax
+
+\def\donoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+\global\let\lastnode=\relax}
+
+\def\unnumbnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+\global\let\lastnode=\relax}
+
+\def\appendixnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+\global\let\lastnode=\relax}
+
+\let\refill=\relax
+
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \readauxfile
+   \opencontents
+   \openindices
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   \comment % Ignore the actual filename.
+}
+
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}},
+  node \samp{\ignorespaces#1{}}}
+
+\message{fonts,}
+
+% Font-change commands.
+
+% Texinfo supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+%% Try out Computer Modern fonts at \magstephalf
+\let\mainmagstep=\magstephalf
+
+% Set the font macro #1 to the font named #2, adding on the
+% specified font prefix (normally `cm').
+\def\fontprefix{cm}
+\def\setfont#1#2{\font#1=\fontprefix#2}
+
+% Enter `@setfontprefix dc' to use the dc fonts instead of the cm fonts.
+\def\setfontprefix{\parsearg\\setfontprefixzzz}
+\def\setfontprefixzzz#1{\gdef\fontprefix{#1}}
+
+\ifx\bigger\relax
+\let\mainmagstep=\magstep1
+\setfont\textrm{r12}
+\setfont\texttt{tt12}
+\else
+\setfont\textrm{r10 scaled \mainmagstep}
+\setfont\texttt{tt10 scaled \mainmagstep}
+\fi
+% Instead of cmb10, you many want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10.
+\setfont\textbf{b10 scaled \mainmagstep}
+\setfont\textit{ti10 scaled \mainmagstep}
+\setfont\textsl{sl10 scaled \mainmagstep}
+\setfont\textsf{ss10 scaled \mainmagstep}
+\setfont\textsc{csc10 scaled \mainmagstep}
+\setfont\texti{mi10 scaled \mainmagstep}
+\setfont\textsy{sy10 scaled \mainmagstep}
+
+% A few fonts for @defun, etc.
+\setfont\defbf{bx10 scaled \magstep1} %was 1314
+\setfont\deftt{tt10 scaled \magstep1}
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices and small examples.
+% We actually use the slanted font rather than the italic,
+% because texinfo normally uses the slanted fonts for that.
+% Do not make many font distinctions in general in the index, since they
+% aren't very useful.
+\setfont\ninett{tt9}
+\setfont\indrm{r9}
+\setfont\indit{sl9}
+\let\indsl=\indit
+\let\indtt=\ninett
+\let\indsf=\indrm
+\let\indbf=\indrm
+\let\indsc=\indrm
+\setfont\indi{mi9}
+\setfont\indsy{sy9}
+
+% Fonts for headings
+\setfont\chaprm{bx12 scaled \magstep2}
+\setfont\chapit{ti12 scaled \magstep2}
+\setfont\chapsl{sl12 scaled \magstep2}
+\setfont\chaptt{tt12 scaled \magstep2}
+\setfont\chapsf{ss12 scaled \magstep2}
+\let\chapbf=\chaprm
+\setfont\chapsc{csc10 scaled\magstep3}
+\setfont\chapi{mi12 scaled \magstep2}
+\setfont\chapsy{sy10 scaled \magstep3}
+
+\setfont\secrm{bx12 scaled \magstep1}
+\setfont\secit{ti12 scaled \magstep1}
+\setfont\secsl{sl12 scaled \magstep1}
+\setfont\sectt{tt12 scaled \magstep1}
+\setfont\secsf{ss12 scaled \magstep1}
+\setfont\secbf{bx12 scaled \magstep1}
+\setfont\secsc{csc10 scaled\magstep2}
+\setfont\seci{mi12 scaled \magstep1}
+\setfont\secsy{sy10 scaled \magstep2}
+
+% \setfont\ssecrm{bx10 scaled \magstep1}    % This size an font looked bad.
+% \setfont\ssecit{cmti10 scaled \magstep1}    % The letters were too crowded.
+% \setfont\ssecsl{sl10 scaled \magstep1}
+% \setfont\ssectt{tt10 scaled \magstep1}
+% \setfont\ssecsf{ss10 scaled \magstep1}
+
+%\setfont\ssecrm{b10 scaled 1315}      % Note the use of cmb rather than cmbx.
+%\setfont\ssecit{ti10 scaled 1315}     % Also, the size is a little larger than
+%\setfont\ssecsl{sl10 scaled 1315}     % being scaled magstep1.
+%\setfont\ssectt{tt10 scaled 1315}
+%\setfont\ssecsf{ss10 scaled 1315}
+
+%\let\ssecbf=\ssecrm
+
+\setfont\ssecrm{bx12 scaled \magstephalf}
+\setfont\ssecit{ti12 scaled \magstephalf}
+\setfont\ssecsl{sl12 scaled \magstephalf}
+\setfont\ssectt{tt12 scaled \magstephalf}
+\setfont\ssecsf{ss12 scaled \magstephalf}
+\setfont\ssecbf{bx12 scaled \magstephalf}
+\setfont\ssecsc{csc10 scaled \magstep1}
+\setfont\sseci{mi12 scaled \magstephalf}
+\setfont\ssecsy{sy10 scaled \magstep1}
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% Fonts for title page:
+\setfont\titlerm{bx12 scaled \magstep3}
+\let\authorrm = \secrm
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts, we
+% don't bother to reset \scriptfont and \scriptscriptfont (which would
+% also require loading a lot more fonts).
+%
+\def\resetmathfonts{%
+  \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
+  \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
+  \textfont\ttfam = \tentt \textfont\sffam = \tensf
+}
+
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current.  Plain TeX does, for example,
+% \def\bf{\fam=\bffam \tenbf}  By redefining \tenbf, we obviate the need
+% to redefine \bf itself.
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \resetmathfonts}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \resetmathfonts}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \resetmathfonts}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \resetmathfonts}
+\def\indexfonts{%
+  \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
+  \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
+  \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy
+  \resetmathfonts}
+
+% Set up the default fonts, so we can use them for creating boxes.
+%
+\textfonts
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\setfont\shortcontrm{r12}
+\setfont\shortcontbf{bx12}
+\setfont\shortcontsl{sl12}
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartitalic
+\let\dfn=\smartitalic
+\let\emph=\smartitalic
+\let\cite=\smartitalic
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+% We can't just use \exhyphenpenalty, because that only has effect at
+% the end of a paragraph.  Restore normal hyphenation at the end of the
+% group within which \nohyphenation is presumably called.
+%
+\def\nohyphenation{\hyphenchar\font = -1  \aftergroup\restorehyphenation}
+\def\restorehyphenation{\hyphenchar\font = `- }
+
+\def\t#1{%
+  {\tt \nohyphenation \rawbackslash \frenchspacing #1}%
+  \null
+}
+\let\ttfont = \t
+%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
+\def\samp #1{`\tclose{#1}'\null}
+\def\key #1{{\tt \nohyphenation \uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+\let\file=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\def\tclose#1{%
+  {%
+    % Change normal interword space to be same as for the current font.
+    \spaceskip = \fontdimen2\font
+    %
+    % Switch to typewriter.
+    \tt
+    %
+    % But `\ ' produces the large typewriter interword space.
+    \def\ {{\spaceskip = 0pt{} }}%
+    %
+    % Turn off hyphenation.
+    \nohyphenation
+    %
+    \rawbackslash
+    \frenchspacing
+    #1%
+  }%
+  \null
+}
+
+% We *must* turn on hyphenation at `-' and `_' in \code.
+% Otherwise, it is too hard to avoid overful hboxes
+% in the Emacs manual, the Library manual, etc.
+
+% Unfortunately, TeX uses one parameter (\hyphenchar) to control
+% both hyphenation at - and hyphenation within words.
+% We must therefore turn them both off (\tclose does that)
+% and arrange explicitly to hyphenate an a dash.
+%  -- rms.
+{
+\catcode`\-=\active
+\catcode`\_=\active
+\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex}
+% The following is used by \doprintindex to insure that long function names
+% wrap around.  It is necessary for - and _ to be active before the index is
+% read from the file, as \entry parses the arguments long before \code is
+% ever called.  -- mycroft
+\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder}
+}
+\def\realdash{-}
+\def\realunder{_}
+\def\codedash{-\discretionary{}{}{}}
+\def\codeunder{\normalunderscore\discretionary{}{}{}}
+\def\codex #1{\tclose{#1}\endgroup}
+
+%\let\exp=\tclose  %Was temporary
+
+% @kbd is like @code, except that if the argument is just one @key command,
+% then @kbd has no effect.
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else\tclose{\look}\fi
+\else\tclose{\look}\fi}
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of
+% @dmn{}pt.
+%
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+\def\l#1{{\li #1}\null}                %
+
+\def\r#1{{\rm #1}}             % roman font
+% Use of \lowercase was suggested.
+\def\sc#1{{\smallcaps#1}}      % smallcaps font
+\def\ii#1{{\it #1}}            % italic font
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\def\titlefont#1{{\titlerm #1}}
+
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+\def\shorttitlepage{\parsearg\shorttitlepagezzz}
+\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}%
+       \endgroup\page\hbox{}\page}
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+   \let\subtitlerm=\tenrm
+% I deinstalled the following change because \cmr12 is undefined.
+% This change was not in the ChangeLog anyway.  --rms.
+%   \let\subtitlerm=\cmr12
+   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+   %
+   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+   %
+   % Leave some space at the very top of the page.
+   \vglue\titlepagetopglue
+   %
+   % Now you can print the title using @title.
+   \def\title{\parsearg\titlezzz}%
+   \def\titlezzz##1{\leftline{\titlefont{##1}}
+                   % print a rule at the page bottom also.
+                   \finishedtitlepagefalse
+                   \vskip4pt \hrule height 4pt width \hsize \vskip4pt}%
+   % No rule at page bottom unless we print one at the top with @title.
+   \finishedtitlepagetrue
+   %
+   % Now you can put text using @subtitle.
+   \def\subtitle{\parsearg\subtitlezzz}%
+   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+   %
+   % @author should come last, but may come many times.
+   \def\author{\parsearg\authorzzz}%
+   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+      {\authorfont \leftline{##1}}}%
+   %
+   % Most title ``pages'' are actually two pages long, with space
+   % at the top of the second.  We don't want the ragged left on the second.
+   \let\oldpage = \page
+   \def\page{%
+      \iffinishedtitlepage\else
+        \finishtitlepage
+      \fi
+      \oldpage
+      \let\page = \oldpage
+      \hbox{}}%
+%   \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+   \iffinishedtitlepage\else
+      \finishtitlepage
+   \fi
+   % It is important to do the page break before ending the group,
+   % because the headline and footline are only empty inside the group.
+   % If we use the new definition of \page, we always get a blank page
+   % after the title page, which we certainly don't want.
+   \oldpage
+   \endgroup
+   \HEADINGSon
+}
+
+\def\finishtitlepage{%
+   \vskip4pt \hrule height 2pt width \hsize
+   \vskip\titlepagebottomglue
+   \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks \evenheadline    % Token sequence for heading line of even pages
+\newtoks \oddheadline     % Token sequence for heading line of odd pages
+\newtoks \evenfootline    % Token sequence for footing line of even pages
+\newtoks \oddfootline     % Token sequence for footing line of odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
+{\catcode`\@=0 %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
+\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
+\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+%
+}% unbind the catcode of @.
+
+% @headings double     turns headings on for double-sided printing.
+% @headings single     turns headings on for single-sided printing.
+% @headings off                turns them off.
+% @headings on         same as @headings double, retained for compatibility.
+% @headings after      turns on double-sided headings after this page.
+% @headings doubleafter        turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+% Subroutines used in generating headings
+% Produces Day Month Year style of output.
+\def\today{\number\day\space
+\ifcase\month\or
+January\or February\or March\or April\or May\or June\or
+July\or August\or September\or October\or November\or December\fi
+\space\number\year}
+
+% Use this if you want the Month Day, Year style of output.
+%\def\today{\ifcase\month\or
+%January\or February\or March\or April\or May\or June\or
+%July\or August\or September\or October\or November\or December\fi
+%\space\number\day, \number\year}
+
+% @settitle line...  specifies the title of the document, for headings
+% It generates no output of its own
+
+\def\thistitle{No Title}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+\message{tables,}
+
+% @tabs -- simple alignment
+
+% These don't work.  For one thing, \+ is defined as outer.
+% So these macros cannot even be defined.
+
+%\def\tabs{\parsearg\tabszzz}
+%\def\tabszzz #1{\settabs\+#1\cr}
+%\def\tabline{\parsearg\tablinezzz}
+%\def\tablinezzz #1{\+#1\cr}
+%\def\&{&}
+
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\newif\ifitemxneedsnegativevskip
+
+\def\itemxpar{\par\ifitemxneedsnegativevskip\vskip-\parskip\nobreak\fi}
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\itemxpar \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\itemxpar \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+                 \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+                 \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemfont{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % Be sure we are not still in the middle of a paragraph.
+  %{\parskip = 0in
+  %\par
+  %}%
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    %
+    % Make this a paragraph so we get the \parskip glue and wrapping,
+    % but leave it ragged-right.
+    \begingroup
+      \advance\leftskip by-\tableindent
+      \advance\hsize by\tableindent
+      \advance\rightskip by0pt plus1fil
+      \leavevmode\unhbox0\par
+    \endgroup
+    %
+    % We're going to be starting a paragraph, but we don't want the
+    % \parskip glue -- logically it's part of the @item we just started.
+    \nobreak \vskip-\parskip
+    %
+    % Stop a page break at the \parskip glue coming up.  Unfortunately
+    % we can't prevent a possible page break at the following
+    % \baselineskip glue.
+    \nobreak
+    \endgroup
+    \itemxneedsnegativevskipfalse
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.  Since that
+    % text will be indented by \tableindent, we make the item text be in
+    % a zero-width box.
+    \noindent
+    \rlap{\hskip -\tableindent\box0}\ignorespaces%
+    \endgroup%
+    \itemxneedsnegativevskiptrue%
+  \fi
+}
+
+\def\item{\errmessage{@item while not in a table}}
+\def\itemx{\errmessage{@itemx while not in a table}}
+\def\kitem{\errmessage{@kitem while not in a table}}
+\def\kitemx{\errmessage{@kitemx while not in a table}}
+\def\xitem{\errmessage{@xitem while not in a table}}
+\def\xitemx{\errmessage{@xitemx while not in a table}}
+
+%% Contains a kludge to get @end[description] to work
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1        \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1        \endtabley
+\def\Eftable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1        \endtabley
+\def\Evtable{\endgraf\afterenvbreak\endgroup}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Neccessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\afterenvbreak\endgroup}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+  \begingroup % ended by the @end itemsize
+  \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\afterenvbreak\endgroup}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+% Set sfcode to normal for the chars that usually have another value.
+% These are `.?!:;,'
+\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
+  \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+%
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+%
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  \begingroup % ended by the @end enumerate
+  %
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    %
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    %
+    \ifnum\lccode\expandafter`\thearg=0\relax
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+%
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+%
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+%
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{\in hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+% @multitable macros
+% Amy Hendrickson, 8/18/94
+%
+% @multitable ... @endmultitable will make as many columns as desired.
+% Contents of each column will wrap at width given in preamble. Width
+% can be specified either with sample text given in a template line,
+% or in percent of \hsize, the current width of text on page.
+
+% Table can continue over pages but will only break between lines.
+
+% To make preamble:
+%
+% Either define widths of columns in terms of percent of \hsize: 
+%   @multitable @percentofhsize .2 .3 .5
+%   @item ...
+%
+%   Numbers following @percentofhsize are the percent of the total
+%   current hsize to be used for each column. You may use as many
+%   columns as desired.
+
+% Or use a template:
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item ...
+%   using the widest term desired in each column.
+
+
+% Each new table line starts with @item, each subsequent new column 
+% starts with @tab. Empty columns may be produced by supplying @tab's
+% with nothing between them for as many times as empty columns are needed,
+% ie, @tab@tab@tab will produce two empty columns.
+
+% @item, @tab, @multicolumn or @endmulticolumn do not need to be on their
+% own lines, but it will not hurt if they are.
+
+% Sample multitable:
+
+%   @multitable {Column 1 template} {Column 2 template} {Column 3 template}
+%   @item first col stuff @tab second col stuff @tab third col
+%   @item 
+%   first col stuff 
+%   @tab 
+%   second col stuff 
+%   @tab 
+%   third col 
+%   @item first col stuff @tab second col stuff 
+%   @tab Many paragraphs of text may be used in any column.
+%     
+%         They will wrap at the width determined by the template.
+%   @item@tab@tab This will be in third column.
+%   @endmultitable
+
+% Default dimensions may be reset by user.
+% @intableparskip will set vertical space between paragraphs in table.
+% @intableparindent will set paragraph indent in table.
+% @spacebetweencols will set horizontal space to be left between columns.
+% @spacebetweenlines will set vertical space to be left between lines.
+
+%%%%
+% Dimensions 
+
+\newdimen\intableparskip
+\newdimen\intableparindent
+\newdimen\spacebetweencols
+\newdimen\spacebetweenlines
+\intableparskip=0pt
+\intableparindent=6pt
+\spacebetweencols=12pt
+\spacebetweenlines=12pt
+
+%%%%
+% Macros used to set up halign preamble:
+\let\endsetuptable\relax
+\def\xendsetuptable{\endsetuptable}
+\let\percentofhsize\relax
+\def\xpercentofhsize{\percentofhsize}
+\newif\ifsetpercent
+
+\newcount\colcount
+\def\setuptable#1{\def\firstarg{#1}%
+\ifx\firstarg\xendsetuptable\let\go\relax%
+\else
+  \ifx\firstarg\xpercentofhsize\global\setpercenttrue%
+  \else
+    \ifsetpercent
+       \if#1.\else%
+       \global\advance\colcount by1 %
+       \expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}%
+       \fi
+    \else
+       \global\advance\colcount by1
+       \setbox0=\hbox{#1}%
+       \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}%
+    \fi%
+  \fi%
+  \let\go\setuptable%
+\fi\go}
+%%%%
+% multitable syntax
+\def\tab{&}
+
+%%%%
+% @multitable ... @endmultitable definitions:
+
+\def\multitable#1\item{\bgroup
+\let\item\cr
+\tolerance=9500
+\hbadness=9500
+\parskip=\intableparskip
+\parindent=\intableparindent
+\overfullrule=0pt
+\global\colcount=0\relax%
+\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}%
+ % To parse everything between @multitable and @item :
+\def\one{#1}\expandafter\setuptable\one\endsetuptable
+ % Need to reset this to 0 after \setuptable.
+\global\colcount=0\relax% 
+ %
+ % This preamble sets up a generic column definition, which will
+ % be used as many times as user calls for columns.
+ % \vtop will set a single line and will also let text wrap and 
+ % continue for many paragraphs if desired.
+\halign\bgroup&\global\advance\colcount by 1\relax%
+\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname
+ % In order to keep entries from bumping into each other
+ % we will add a \leftskip of \spacebetweencols to all columns after
+ % the first one.
+ %  If a template has been used, we will add \spacebetweencols 
+ % to the width of each template entry.
+ %  If user has set preamble in terms of percent of \hsize
+ % we will use that dimension as the width of the column, and
+ % the \leftskip will keep entries from bumping into each other.
+ % Table will start at left margin and final column will justify at
+ % right margin.
+\ifnum\colcount=1
+\else
+  \ifsetpercent
+  \else
+   % If user has <not> set preamble in terms of percent of \hsize
+   % we will advance \hsize by \spacebetweencols 
+  \advance\hsize by \spacebetweencols
+  \fi
+ % In either case we will make \leftskip=\spacebetweencols:
+\leftskip=\spacebetweencols
+\fi
+\noindent##}\cr%
+ % \everycr will reset column counter, \colcount, at the end of
+ % each line. Every column  entry will cause \colcount to advance by one. 
+ % The table preamble
+ % looks at the current \colcount to find the correct column width.
+\global\everycr{\noalign{\nointerlineskip\vskip\spacebetweenlines
+\filbreak%% keeps underfull box messages off when table breaks over pages.
+\global\colcount=0\relax}}}
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
+{\catcode`\@=11
+\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that        accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+
+\def\newindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\doindex {#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+
+\def\newcodeindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\docodeindex {#1}}
+}
+
+\def\defcodeindex{\parsearg\newcodeindex}
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+\def\synindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\doindex {#2}}%
+}
+
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+\def\syncodeindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\docodeindex {#2}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+\def\indexdummies{%
+% Take care of the plain tex accent commands.
+\def\"{\realbackslash "}%
+\def\`{\realbackslash `}%
+\def\'{\realbackslash '}%
+\def\^{\realbackslash ^}%
+\def\~{\realbackslash ~}%
+\def\={\realbackslash =}%
+\def\b{\realbackslash b}%
+\def\c{\realbackslash c}%
+\def\d{\realbackslash d}%
+\def\u{\realbackslash u}%
+\def\v{\realbackslash v}%
+\def\H{\realbackslash H}%
+% Take care of the plain tex special European modified letters.
+\def\oe{\realbackslash oe}%
+\def\ae{\realbackslash ae}%
+\def\aa{\realbackslash aa}%
+\def\OE{\realbackslash OE}%
+\def\AE{\realbackslash AE}%
+\def\AA{\realbackslash AA}%
+\def\o{\realbackslash o}%
+\def\O{\realbackslash O}%
+\def\l{\realbackslash l}%
+\def\L{\realbackslash L}%
+\def\ss{\realbackslash ss}%
+% Take care of texinfo commands likely to appear in an index entry.
+\def\_{{\realbackslash _}}%
+\def\w{\realbackslash w }%
+\def\bf{\realbackslash bf }%
+\def\rm{\realbackslash rm }%
+\def\sl{\realbackslash sl }%
+\def\sf{\realbackslash sf}%
+\def\tt{\realbackslash tt}%
+\def\gtr{\realbackslash gtr}%
+\def\less{\realbackslash less}%
+\def\hat{\realbackslash hat}%
+\def\char{\realbackslash char}%
+\def\TeX{\realbackslash TeX}%
+\def\dots{\realbackslash dots }%
+\def\copyright{\realbackslash copyright }%
+\def\tclose##1{\realbackslash tclose {##1}}%
+\def\code##1{\realbackslash code {##1}}%
+\def\samp##1{\realbackslash samp {##1}}%
+\def\t##1{\realbackslash r {##1}}%
+\def\r##1{\realbackslash r {##1}}%
+\def\i##1{\realbackslash i {##1}}%
+\def\b##1{\realbackslash b {##1}}%
+\def\cite##1{\realbackslash cite {##1}}%
+\def\key##1{\realbackslash key {##1}}%
+\def\file##1{\realbackslash file {##1}}%
+\def\var##1{\realbackslash var {##1}}%
+\def\kbd##1{\realbackslash kbd {##1}}%
+\def\dfn##1{\realbackslash dfn {##1}}%
+\def\emph##1{\realbackslash emph {##1}}%
+}
+
+% \indexnofonts no-ops all font-change commands.
+% This is used when outputting the strings to sort the index by.
+\def\indexdummyfont#1{#1}
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+
+\def\indexnofonts{%
+% Just ignore accents.
+\let\"=\indexdummyfont
+\let\`=\indexdummyfont
+\let\'=\indexdummyfont
+\let\^=\indexdummyfont
+\let\~=\indexdummyfont
+\let\==\indexdummyfont
+\let\b=\indexdummyfont
+\let\c=\indexdummyfont
+\let\d=\indexdummyfont
+\let\u=\indexdummyfont
+\let\v=\indexdummyfont
+\let\H=\indexdummyfont
+% Take care of the plain tex special European modified letters.
+\def\oe{oe}%
+\def\ae{ae}%
+\def\aa{aa}%
+\def\OE{OE}%
+\def\AE{AE}%
+\def\AA{AA}%
+\def\o{o}%
+\def\O{O}%
+\def\l{l}%
+\def\L{L}%
+\def\ss{ss}%
+\let\w=\indexdummyfont
+\let\t=\indexdummyfont
+\let\r=\indexdummyfont
+\let\i=\indexdummyfont
+\let\b=\indexdummyfont
+\let\emph=\indexdummyfont
+\let\strong=\indexdummyfont
+\let\cite=\indexdummyfont
+\let\sc=\indexdummyfont
+%Don't no-op \tt, since it isn't a user-level command
+% and is used in the definitions of the active chars like <, >, |...
+%\let\tt=\indexdummyfont
+\let\tclose=\indexdummyfont
+\let\code=\indexdummyfont
+\let\file=\indexdummyfont
+\let\samp=\indexdummyfont
+\let\kbd=\indexdummyfont
+\let\key=\indexdummyfont
+\let\var=\indexdummyfont
+\let\TeX=\indexdummytex
+\let\dots=\indexdummydots
+}
+
+% To define \realbackslash, we must make \ not be an escape.
+% We must first make another character (@) an escape
+% so we do not become unable to do a definition.
+
+{\catcode`\@=0 \catcode`\\=\other
+@gdef@realbackslash{\}}
+
+\let\indexbackslash=0  %overridden during \printindex.
+
+\def\doind #1#2{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0% Expand all macros now EXCEPT \folio
+\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+% so it will be output as is; and it will print as backslash in the indx.
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2}%
+}%
+% Now produce the complete index entry.  We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}}}%
+\temp }%
+}\penalty\count10}}
+
+\def\dosubind #1#2#3{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0%
+\def\rawbackslashxx{\indexbackslash}%
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2 #3}%
+}%
+% Now produce the complete index entry.  We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
+\temp }%
+}\penalty\count10}}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% This is what you call to cause a particular index to get printed.
+% Write
+% @unnumbered Function Index
+% @printindex fn
+
+\def\printindex{\parsearg\doprintindex}
+
+\def\doprintindex#1{%
+  \tex
+  \dobreak \chapheadingskip {10000}
+  \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
+  \catcode`\$=\other
+  \catcode`\~=\other
+  \indexbreaks
+  %
+  % The following don't help, since the chars were translated
+  % when the raw index was written, and their fonts were discarded
+  % due to \indexnofonts.
+  %\catcode`\"=\active
+  %\catcode`\^=\active
+  %\catcode`\_=\active
+  %\catcode`\|=\active
+  %\catcode`\<=\active
+  %\catcode`\>=\active
+  % %
+  \def\indexbackslash{\rawbackslashxx}
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
+  \begindoublecolumns
+  %
+  % See if the index file exists and is nonempty.
+  \openin 1 \jobname.#1s
+  \ifeof 1
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    (Index is nonexistent)
+    \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      (Index is empty)
+    \else
+      \input \jobname.#1s
+    \fi
+  \fi
+  \closein 1
+  \enddoublecolumns
+  \Etex
+}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+% Same as \bigskipamount except no shrink.
+% \balancecolumns gets confused if there is any shrink.
+\newskip\initialskipamount \initialskipamount 12pt plus4pt
+
+\def\initial #1{%
+{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+\ifdim\lastskip<\initialskipamount
+\removelastskip \penalty-200 \vskip \initialskipamount\fi
+\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
+
+% This typesets a paragraph consisting of #1, dot leaders, and then #2
+% flush to the right margin.  It is used for index and table of contents
+% entries.  The paragraph is indented by \leftskip.
+%
+\def\entry #1#2{\begingroup
+  %
+  % Start a new paragraph if necessary, so our assignments below can't
+  % affect previous text.
+  \par
+  %
+  % Do not fill out the last line with white space.
+  \parfillskip = 0in
+  %
+  % No extra space above this paragraph.
+  \parskip = 0in
+  %
+  % Do not prefer a separate line ending with a hyphen to fewer lines.
+  \finalhyphendemerits = 0
+  %
+  % \hangindent is only relevant when the entry text and page number
+  % don't both fit on one line.  In that case, bob suggests starting the
+  % dots pretty far over on the line.  Unfortunately, a large
+  % indentation looks wrong when the entry text itself is broken across
+  % lines.  So we use a small indentation and put up with long leaders.
+  %
+  % \hangafter is reset to 1 (which is the value we want) at the start
+  % of each paragraph, so we need not do anything with that.
+  \hangindent=2em
+  %
+  % When the entry text needs to be broken, just fill out the first line
+  % with blank space.
+  \rightskip = 0pt plus1fil
+  %
+  % Start a ``paragraph'' for the index entry so the line breaking
+  % parameters we've set above will have an effect.
+  \noindent
+  %
+  % Insert the text of the index entry.  TeX will do line-breaking on it.
+  #1%
+  % The following is kluged to not output a line of dots in the index if
+  % there are no page numbers.  The next person who breaks this will be
+  % cursed by a Unix daemon.
+  \def\tempa{{\rm }}%
+  \def\tempb{#2}%
+  \edef\tempc{\tempa}%
+  \edef\tempd{\tempb}%
+  \ifx\tempc\tempd\ \else%
+    %
+    % If we must, put the page number on a line of its own, and fill out
+    % this line with blank space.  (The \hfil is overwhelmed with the
+    % fill leaders glue in \indexdotfill if the page number does fit.)
+    \hfil\penalty50
+    \null\nobreak\indexdotfill % Have leaders before the page number.
+    %
+    % The `\ ' here is removed by the implicit \unskip that TeX does as
+    % part of (the primitive) \par.  Without it, a spurious underfull
+    % \hbox ensues.
+    \ #2% The page number ends the paragraph.
+  \fi%
+  \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+
+\def\secondary #1#2{
+{\parfillskip=0in \parskip=0in
+\hangindent =1in \hangafter=1
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
+}}
+
+%% Define two-column mode, which is used in indexes.
+%% Adapted from the TeXbook, page 416.
+\catcode `\@=11
+
+\newbox\partialpage
+
+\newdimen\doublecolumnhsize
+
+\def\begindoublecolumns{\begingroup
+  % Grab any single-column material above us.
+  \output = {\global\setbox\partialpage
+    =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}%
+  \eject
+  %
+  % Now switch to the double-column output routine.
+  \output={\doublecolumnout}%
+  %
+  % Change the page size parameters.  We could do this once outside this
+  % routine, in each of @smallbook, @afourpaper, and the default 8.5x11
+  % format, but then we repeat the same computation.  Repeating a couple
+  % of assignments once per index is clearly meaningless for the
+  % execution time, so we may as well do it once.
+  %
+  % First we halve the line length, less a little for the gutter between
+  % the columns.  We compute the gutter based on the line length, so it
+  % changes automatically with the paper format.  The magic constant
+  % below is chosen so that the gutter has the same value (well, +- <
+  % 1pt) as it did when we hard-coded it.
+  %
+  % We put the result in a separate register, \doublecolumhsize, so we
+  % can restore it in \pagesofar, after \hsize itself has (potentially)
+  % been clobbered.
+  %
+  \doublecolumnhsize = \hsize
+    \advance\doublecolumnhsize by -.04154\hsize
+    \divide\doublecolumnhsize by 2
+  \hsize = \doublecolumnhsize
+  %
+  % Double the \vsize as well.  (We don't need a separate register here,
+  % since nobody clobbers \vsize.)
+  \vsize = 2\vsize
+  \doublecolumnpagegoal
+}
+
+\def\enddoublecolumns{\eject \endgroup \pagegoal=\vsize \unvbox\partialpage}
+
+\def\doublecolumnsplit{\splittopskip=\topskip \splitmaxdepth=\maxdepth
+  \global\dimen@=\pageheight \global\advance\dimen@ by-\ht\partialpage
+  \global\setbox1=\vsplit255 to\dimen@ \global\setbox0=\vbox{\unvbox1}
+  \global\setbox3=\vsplit255 to\dimen@ \global\setbox2=\vbox{\unvbox3}
+  \ifdim\ht0>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
+  \ifdim\ht2>\dimen@ \setbox255=\vbox{\unvbox0\unvbox2} \global\setbox255=\copy5 \fi
+}
+\def\doublecolumnpagegoal{%
+  \dimen@=\vsize \advance\dimen@ by-2\ht\partialpage \global\pagegoal=\dimen@
+}
+\def\pagesofar{\unvbox\partialpage %
+  \hsize=\doublecolumnhsize % have to restore this since output routine
+  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
+\def\doublecolumnout{%
+  \setbox5=\copy255
+  {\vbadness=10000 \doublecolumnsplit}
+  \ifvbox255
+    \setbox0=\vtop to\dimen@{\unvbox0}
+    \setbox2=\vtop to\dimen@{\unvbox2}
+    \onepageout\pagesofar \unvbox255 \penalty\outputpenalty
+  \else
+    \setbox0=\vbox{\unvbox5}
+    \ifvbox0
+      \dimen@=\ht0 \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+      \divide\dimen@ by2 \splittopskip=\topskip \splitmaxdepth=\maxdepth
+      {\vbadness=10000
+       \loop \global\setbox5=\copy0
+          \setbox1=\vsplit5 to\dimen@
+          \setbox3=\vsplit5 to\dimen@
+          \ifvbox5 \global\advance\dimen@ by1pt \repeat
+        \setbox0=\vbox to\dimen@{\unvbox1}
+        \setbox2=\vbox to\dimen@{\unvbox3}
+        \global\setbox\partialpage=\vbox{\pagesofar}
+        \doublecolumnpagegoal
+      }
+    \fi
+  \fi
+}
+
+\catcode `\@=\other
+\message{sectioning,}
+% Define chapters, sections, etc.
+
+\newcount \chapno
+\newcount \secno        \secno=0
+\newcount \subsecno     \subsecno=0
+\newcount \subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount \appendixno  \appendixno = `\@
+\def\appendixletter{\char\the\appendixno}
+
+\newwrite \contentsfile
+% This is called from \setfilename.
+\def\opencontents{\openout \contentsfile = \jobname.toc}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it.  @section does likewise
+
+\def\thischapter{} \def\thissection{}
+\def\seccheck#1{\if \pageno<0 %
+\errmessage{@#1 not allowed after generating table of contents}\fi
+%
+}
+
+\def\chapternofonts{%
+\let\rawbackslash=\relax%
+\let\frenchspacing=\relax%
+\def\result{\realbackslash result}
+\def\equiv{\realbackslash equiv}
+\def\expansion{\realbackslash expansion}
+\def\print{\realbackslash print}
+\def\TeX{\realbackslash TeX}
+\def\dots{\realbackslash dots}
+\def\copyright{\realbackslash copyright}
+\def\tt{\realbackslash tt}
+\def\bf{\realbackslash bf }
+\def\w{\realbackslash w}
+\def\less{\realbackslash less}
+\def\gtr{\realbackslash gtr}
+\def\hat{\realbackslash hat}
+\def\char{\realbackslash char}
+\def\tclose##1{\realbackslash tclose {##1}}
+\def\code##1{\realbackslash code {##1}}
+\def\samp##1{\realbackslash samp {##1}}
+\def\r##1{\realbackslash r {##1}}
+\def\b##1{\realbackslash b {##1}}
+\def\key##1{\realbackslash key {##1}}
+\def\file##1{\realbackslash file {##1}}
+\def\kbd##1{\realbackslash kbd {##1}}
+% These are redefined because @smartitalic wouldn't work inside xdef.
+\def\i##1{\realbackslash i {##1}}
+\def\cite##1{\realbackslash cite {##1}}
+\def\var##1{\realbackslash var {##1}}
+\def\emph##1{\realbackslash emph {##1}}
+\def\dfn##1{\realbackslash dfn {##1}}
+}
+
+\newcount\absseclevel % used to calculate proper heading level
+\newcount\secbase\secbase=0 % @raise/lowersections modify this count
+
+% @raisesections: treat @section as chapter, @subsection as section, etc.
+\def\raisesections{\global\advance\secbase by -1}
+\let\up=\raisesections % original BFox name
+
+% @lowersections: treat @chapter as section, @section as subsection, etc.
+\def\lowersections{\global\advance\secbase by 1}
+\let\down=\lowersections % original BFox name
+
+% Choose a numbered-heading macro
+% #1 is heading level if unmodified by @raisesections or @lowersections
+% #2 is text for heading
+\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \chapterzzz{#2}
+\or
+  \seczzz{#2}
+\or
+  \numberedsubseczzz{#2}
+\or
+  \numberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \chapterzzz{#2}
+  \else
+    \numberedsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% like \numhead, but chooses appendix heading levels
+\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \appendixzzz{#2}
+\or
+  \appendixsectionzzz{#2}
+\or
+  \appendixsubseczzz{#2}
+\or
+  \appendixsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \appendixzzz{#2}
+  \else
+    \appendixsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+% like \numhead, but chooses numberless heading levels
+\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1
+\ifcase\absseclevel
+  \unnumberedzzz{#2}
+\or
+  \unnumberedseczzz{#2}
+\or
+  \unnumberedsubseczzz{#2}
+\or
+  \unnumberedsubsubseczzz{#2}
+\else
+  \ifnum \absseclevel<0
+    \unnumberedzzz{#2}
+  \else
+    \unnumberedsubsubseczzz{#2}
+  \fi
+\fi
+}
+
+
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapteryyy}
+\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz
+\def\chapterzzz #1{\seccheck{chapter}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \chapno by 1 \message{Chapter \the\chapno}%
+\chapmacro {#1}{\the\chapno}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+% We don't substitute the actual chapter name into \thischapter
+% because we don't want its macros evaluated now.
+\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp  %
+\donoderef %
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+}}
+
+\outer\def\appendix{\parsearg\appendixyyy}
+\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz
+\def\appendixzzz #1{\seccheck{appendix}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
+\chapmacro {#1}{\putwordAppendix{} \appendixletter}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry
+  {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp  %
+\appendixnoderef %
+\global\let\section = \appendixsec
+\global\let\subsection = \appendixsubsec
+\global\let\subsubsection = \appendixsubsubsec
+}}
+
+\outer\def\top{\parsearg\unnumberedyyy}
+\outer\def\unnumbered{\parsearg\unnumberedyyy}
+\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz
+\def\unnumberedzzz #1{\seccheck{unnumbered}%
+\secno=0 \subsecno=0 \subsubsecno=0
+%
+% This used to be simply \message{#1}, but TeX fully expands the
+% argument to \message.  Therefore, if #1 contained @-commands, TeX
+% expanded them.  For example, in `@unnumbered The @cite{Book}', TeX
+% expanded @cite (which turns out to cause errors because \cite is meant
+% to be executed, not expanded).
+%
+% Anyway, we don't want the fully-expanded definition of @cite to appear
+% as a result of the \message, we just want `@cite' itself.  We use
+% \the<toks register> to achieve this: TeX expands \the<toks> only once,
+% simply yielding the contents of the <toks register>.
+\toks0 = {#1}\message{(\the\toks0)}%
+%
+\unnumbchapmacro {#1}%
+\gdef\thischapter{#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp  %
+\unnumbnoderef %
+\global\let\section = \unnumberedsec
+\global\let\subsection = \unnumberedsubsec
+\global\let\subsubsection = \unnumberedsubsubsec
+}}
+
+\outer\def\numberedsec{\parsearg\secyyy}
+\def\secyyy #1{\numhead1{#1}} % normally calls seczzz
+\def\seczzz #1{\seccheck{section}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appenixsection{\parsearg\appendixsecyyy}
+\outer\def\appendixsec{\parsearg\appendixsecyyy}
+\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz
+\def\appendixsectionzzz #1{\seccheck{appendixsection}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy}
+\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz
+\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy}
+\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz
+\def\numberedsubseczzz #1{\seccheck{subsection}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy}
+\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz
+\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy}
+\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz
+\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy}
+\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz
+\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry %
+  {#1}
+  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
+  {\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy}
+\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz
+\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry{#1}%
+  {\appendixletter}
+  {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy}
+\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz
+\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and
+% such:
+%      1) We use \vbox rather than the earlier \line to permit
+%         overlong headings to fold.
+%      2) \hyphenpenalty is set to 10000 because hyphenation in a
+%         heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+{\advance\chapheadingskip by 10pt \chapbreak }%
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                  \parindent=0pt\raggedright
+                  \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                  \parindent=0pt\raggedright
+                  \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\heading{\parsearg\secheadingi}
+
+\def\subheading{\parsearg\subsecheadingi}
+
+\def\subsubheading{\parsearg\subsubsecheadingi}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain}
+
+\def\chfplain #1#2{%
+  \pchapsepmacro
+  {%
+    \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                     \parindent=0pt\raggedright
+                     \rm #2\enspace #1}%
+  }%
+  \bigskip
+  \penalty5000
+}
+
+\def\unnchfplain #1{%
+\pchapsepmacro %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                  \parindent=0pt\raggedright
+                  \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen}
+
+% Parameter controlling skip before section headings.
+
+\newskip \subsecheadingskip  \subsecheadingskip = 17pt plus 8pt minus 4pt
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+
+\newskip \secheadingskip  \secheadingskip = 21pt plus 8pt minus 4pt
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+
+% @paragraphindent  is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
+% Section fonts are the base font at magstep2, which produces
+% a size a bit more than 14 points in the default situation.
+
+\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
+\def\plainsecheading #1{\secheadingi {#1}}
+\def\secheadingi #1{{\advance \secheadingskip by \parskip %
+\secheadingbreak}%
+{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                 \parindent=0pt\raggedright
+                 \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+
+% Subsection fonts are the base font at magstep1,
+% which produces a size of 12 points.
+
+\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
+\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                     \parindent=0pt\raggedright
+                     \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
+                                 % Perhaps make sssec fonts scaled
+                                 % magstep half
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
+\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
+
+
+\message{toc printing,}
+
+% Finish up the main text and prepare to read what we've written
+% to \contentsfile.
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\def\startcontents#1{%
+   \pagealignmacro
+   \immediate\closeout \contentsfile
+   \ifnum \pageno>0
+      \pageno = -1             % Request roman numbered pages.
+   \fi
+   % Don't need to put `Contents' or `Short Contents' in the headline.
+   % It is abundantly clear what they are.
+   \unnumbchapmacro{#1}\def\thischapter{}%
+   \begingroup                 % Set up to handle contents files properly.
+      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  \catcode`\@=11
+      \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi
+      \raggedbottom             % Worry more about breakpoints than the bottom.
+      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+}
+
+
+% Normal (long) toc.
+\outer\def\contents{%
+   \startcontents{\putwordTableofContents}%
+      \input \jobname.toc
+   \endgroup
+   \vfill \eject
+}
+
+% And just the chapters.
+\outer\def\summarycontents{%
+   \startcontents{\putwordShortContents}%
+      %
+      \let\chapentry = \shortchapentry
+      \let\unnumbchapentry = \shortunnumberedentry
+      % We want a true roman here for the page numbers.
+      \secfonts
+      \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
+      \rm
+      \advance\baselineskip by 1pt % Open it up a little.
+      \def\secentry ##1##2##3##4{}
+      \def\unnumbsecentry ##1##2{}
+      \def\subsecentry ##1##2##3##4##5{}
+      \def\unnumbsubsecentry ##1##2{}
+      \def\subsubsecentry ##1##2##3##4##5##6{}
+      \def\unnumbsubsubsecentry ##1##2{}
+      \input \jobname.toc
+   \endgroup
+   \vfill \eject
+}
+\let\shortcontents = \summarycontents
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapter-level things, for both the long and short contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+
+% See comments in \dochapentry re vbox and related settings
+\def\shortchapentry#1#2#3{%
+  \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}%
+}
+
+% Typeset the label for a chapter or appendix for the short contents.
+% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter.
+% We could simplify the code here by writing out an \appendixentry
+% command in the toc file for appendices, instead of using \chapentry
+% for both, but it doesn't seem worth it.
+\setbox0 = \hbox{\shortcontrm \putwordAppendix }
+\newdimen\shortappendixwidth \shortappendixwidth = \wd0
+
+\def\shortchaplabel#1{%
+  % We typeset #1 in a box of constant width, regardless of the text of
+  % #1, so the chapter titles will come out aligned.
+  \setbox0 = \hbox{#1}%
+  \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi
+  %
+  % This space should be plenty, since a single number is .5em, and the
+  % widest letter (M) is 1em, at least in the Computer Modern fonts.
+  % (This space doesn't include the extra space that gets added after
+  % the label; that gets put in in \shortchapentry above.)
+  \advance\dimen0 by 1.1em
+  \hbox to \dimen0{#1\hfil}%
+}
+
+\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
+
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the
+% page number.
+%
+% If the toc has to be broken over pages, we would want to be at chapters
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip\baselineskip
+   \begingroup
+     \chapentryfonts
+     \tocentry{#1}{\dopageno{#2}}%
+   \endgroup
+   \nobreak\vskip .25\baselineskip
+}
+
+\def\dosecentry#1#2{\begingroup
+  \secentryfonts \leftskip=\tocindent
+  \tocentry{#1}{\dopageno{#2}}%
+\endgroup}
+
+\def\dosubsecentry#1#2{\begingroup
+  \subsecentryfonts \leftskip=2\tocindent
+  \tocentry{#1}{\dopageno{#2}}%
+\endgroup}
+
+\def\dosubsubsecentry#1#2{\begingroup
+  \subsubsecentryfonts \leftskip=3\tocindent
+  \tocentry{#1}{\dopageno{#2}}%
+\endgroup}
+
+% Final typesetting of a toc entry; we use the same \entry macro as for
+% the index entries, but we want to suppress hyphenation here.  (We
+% can't do that in the \entry macro, since index entries might consist
+% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.)
+%
+\def\tocentry#1#2{\begingroup
+  \hyphenpenalty = 10000
+  \entry{#1}{#2}%
+\endgroup}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+
+% Since these characters are used in examples, it should be an even number of
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+% Furthermore, these definitions must come after we define our fonts.
+\newbox\dblarrowbox    \newbox\longdblarrowbox
+\newbox\pushcharbox    \newbox\bullbox
+\newbox\equivbox       \newbox\errorbox
+
+\let\ptexequiv = \equiv
+
+%{\tentt
+%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
+%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
+%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
+%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
+% Adapted from the manmac format (p.420 of TeXbook)
+%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex
+%                                      depth .1ex\hfil}
+%}
+
+\def\point{$\star$}
+
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% Adapted from the TeXbook's \boxit.
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+
+% The @error{} command.
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+\catcode `\%=14
+\catcode 43=12
+\catcode`\"=12
+\catcode`\==12
+\catcode`\|=12
+\catcode`\<=12
+\catcode`\>=12
+\escapechar=`\\
+%
+\let\~=\ptextilde
+\let\{=\ptexlbrace
+\let\}=\ptexrbrace
+\let\.=\ptexdot
+\let\*=\ptexstar
+\let\dots=\ptexdots
+\def\@{@}%
+\let\bullet=\ptexbullet
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
+\let\L=\ptexL
+%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @endlisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @endlisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^^M gets inside @lisp, @example, and other
+% such environments.  \null is better than a space, since it doesn't
+% have any width.
+\def\lisppar{\null\endgraf}
+
+% Make each space character in the input produce a normal interword
+% space in the output.  Don't allow a line break at this space, as this
+% is used only in environments like @example, where each line of input
+% should produce a line of output anyway.
+%
+{\obeyspaces %
+\gdef\sepspaces{\obeyspaces\let =\tie}}
+
+% Define \obeyedspace to be our active space, whatever it is.  This is
+% for use in \parsearg.
+{\sepspaces%
+\global\let\obeyedspace= }
+
+% This space is always present above and below environments.
+\newskip\envskipamount \envskipamount = 0pt
+
+% Make spacing and below environment symmetrical.  We use \parskip here
+% to help in doing that, since in @example-like environments \parskip
+% is reset to zero; thus the \afterenvbreak inserts no space -- but the
+% start of the next paragraph will insert \parskip
+%
+\def\aboveenvbreak{{\advance\envskipamount by \parskip
+\endgraf \ifdim\lastskip<\envskipamount
+\removelastskip \penalty-50 \vskip\envskipamount \fi}}
+
+\let\afterenvbreak = \aboveenvbreak
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \cartouche: draw rectangle w/rounded corners around argument
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+       \ctl\leaders\hrule height\circthick\hfil\ctr
+       \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+       \cbl\leaders\hrule height\circthick\hfil\cbr
+       \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\long\def\cartouche{%
+\begingroup
+       \lskip=\leftskip \rskip=\rightskip
+       \leftskip=0pt\rightskip=0pt %we want these *outside*.
+       \cartinner=\hsize \advance\cartinner by-\lskip
+                         \advance\cartinner by-\rskip
+       \cartouter=\hsize
+       \advance\cartouter by 18pt % allow for 3pt kerns on either
+%                                   side, and for 6pt waste from
+%                                   each corner char
+       \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+       % Flag to tell @lisp, etc., not to narrow margin.
+       \let\nonarrowing=\comment
+       \vbox\bgroup
+               \baselineskip=0pt\parskip=0pt\lineskip=0pt
+               \carttop
+               \hbox\bgroup
+                       \hskip\lskip
+                       \vrule\kern3pt
+                       \vbox\bgroup
+                               \hsize=\cartinner
+                               \kern3pt
+                               \begingroup
+                                       \baselineskip=\normbskip
+                                       \lineskip=\normlskip
+                                       \parskip=\normpskip
+                                       \vskip -\parskip
+\def\Ecartouche{%
+                               \endgroup
+                               \kern3pt
+                       \egroup
+                       \kern3pt\vrule
+                       \hskip\rskip
+               \egroup
+               \cartbot
+       \egroup
+\endgroup
+}}
+
+
+% This macro is called at the beginning of all the @example variants,
+% inside a group.
+\def\nonfillstart{%
+  \aboveenvbreak
+  \inENV % This group ends at the end of the body
+  \hfuzz = 12pt % Don't be fussy
+  \sepspaces % Make spaces be word-separators rather than space tokens.
+  \singlespace
+  \let\par = \lisppar % don't ignore blank lines
+  \obeylines % each line of input is a line of output
+  \parskip = 0pt
+  \parindent = 0pt
+  \emergencystretch = 0pt % don't try to avoid overfull boxes
+  % @cartouche defines \nonarrowing to inhibit narrowing
+  % at next level down.
+  \ifx\nonarrowing\relax
+    \advance \leftskip by \lispnarrowing
+    \exdentamount=\lispnarrowing
+    \let\exdent=\nofillexdent
+    \let\nonarrowing=\relax
+  \fi
+}
+
+% To ending an @example-like environment, we first end the paragraph
+% (via \afterenvbreak's vertical glue), and then the group.  That way we
+% keep the zero \parskip that the environments set -- \parskip glue
+% will be inserted at the beginning of the next paragraph in the
+% document, after the environment.
+%
+\def\nonfillfinish{\afterenvbreak\endgroup}%
+
+% This macro is
+\def\lisp{\begingroup
+  \nonfillstart
+  \let\Elisp = \nonfillfinish
+  \tt
+  \rawbackslash % have \ input char produce \ char from current font
+  \gobble
+}
+
+% Define the \E... control sequence only if we are inside the
+% environment, so the error checking in \end will work.
+%
+% We must call \lisp last in the definition, since it reads the
+% return following the @example (or whatever) command.
+%
+\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp}
+\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp}
+\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp}
+
+% @smallexample and @smalllisp.  This is not used unless the @smallbook
+% command is given.  Originally contributed by Pavel@xerox.
+%
+\def\smalllispx{\begingroup
+  \nonfillstart
+  \let\Esmalllisp = \nonfillfinish
+  \let\Esmallexample = \nonfillfinish
+  %
+  % Smaller interline space and fonts for small examples.
+  \setleading{10pt}%
+  \indexfonts \tt
+  \rawbackslash % make \ output the \ character from the current font (tt)
+  \gobble
+}
+
+% This is @display; same as @lisp except use roman font.
+%
+\def\display{\begingroup
+  \nonfillstart
+  \let\Edisplay = \nonfillfinish
+  \gobble
+}
+
+% This is @format; same as @display except don't narrow margins.
+%
+\def\format{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eformat = \nonfillfinish
+  \gobble
+}
+
+% @flushleft (same as @format) and @flushright.
+%
+\def\flushleft{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eflushleft = \nonfillfinish
+  \gobble
+}
+\def\flushright{\begingroup
+  \let\nonarrowing = t
+  \nonfillstart
+  \let\Eflushright = \nonfillfinish
+  \advance\leftskip by 0pt plus 1fill
+  \gobble}
+
+% @quotation does normal linebreaking (hence we can't use \nonfillstart)
+% and narrows the margins.
+%
+\def\quotation{%
+  \begingroup\inENV %This group ends at the end of the @quotation body
+  {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip
+  \singlespace
+  \parindent=0pt
+  % We have retained a nonzero parskip for the environment, since we're
+  % doing normal filling. So to avoid extra space below the environment...
+  \def\Equotation{\parskip = 0pt \nonfillfinish}%
+  %
+  % @cartouche defines \nonarrowing to inhibit narrowing at next level down.
+  \ifx\nonarrowing\relax
+    \advance\leftskip by \lispnarrowing
+    \advance\rightskip by \lispnarrowing
+    \exdentamount = \lispnarrowing
+    \let\nonarrowing = \relax
+  \fi
+}
+
+\message{defuns,}
+% Define formatter for defuns
+% First, allow user to change definition object font (\df) internally
+\def\setdeffont #1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deftypemargin \deftypemargin=12pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+% define \functionparens, which makes ( and ) and & do special things.
+% \functionparens affects the group it is contained in.
+\def\activeparens{%
+\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
+\catcode`\[=\active \catcode`\]=\active}
+
+% Make control sequences which act like normal parenthesis chars.
+\let\lparen = ( \let\rparen = )
+
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+
+% Be sure that we always have a definition for `(', etc.  For example,
+% if the fn name has parens in it, \boldbrax will not be in effect yet,
+% so TeX would otherwise complain about undefined control sequence.
+\global\let(=\lparen \global\let)=\rparen
+\global\let[=\lbrack \global\let]=\rbrack
+
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
+\global\advance\parencount by 1 }
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+% also in that case restore the outer-level definition of (.
+\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+\global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text.  This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
+\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}
+
+% First, defname, which formats the header line itself.
+% #1 should be the function name.
+% #2 should be the type of definition, such as "Function".
+
+\def\defname #1#2{%
+% Get the values of \leftskip and \rightskip as they were
+% outside the @def...
+\dimen2=\leftskip
+\advance\dimen2 by -\defbodyindent
+\dimen3=\rightskip
+\advance\dimen3 by -\defbodyindent
+\noindent        %
+\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %
+% Now output arg 2 ("Function" or some such)
+% ending at \deftypemargin from the right margin,
+% but stuck inside a box of width 0 so it does not interfere with linebreaking
+{% Adjust \hsize to exclude the ambient margins,
+% so that \rightline will obey them.
+\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
+% Make all lines underfull and no complaints:
+\tolerance=10000 \hbadness=10000
+\advance\leftskip by -\defbodyindent
+\exdentamount=\defbodyindent
+{\df #1}\enskip        % Generate function name
+}
+
+% Actually process the body of a definition
+% #1 should be the terminating control sequence, such as \Edefun.
+% #2 should be the "another name" control sequence, such as \defunx.
+% #3 should be the control sequence that actually processes the header,
+%    such as \defunheader.
+
+\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active % 61 is `='
+\obeylines\activeparens\spacesplit#3}
+
+\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
+\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+
+\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\spacesplit#3}
+
+% This is used for \def{tp,vr}parsebody.  It could probably be used for
+% some of the others, too, with some judicious conditionals.
+% 
+\def\parsebodycommon#1#2#3{%
+  \begingroup\inENV %
+  \medbreak %
+  % Define the end token that this defining construct specifies
+  % so that it will exit this group.
+  \def#1{\endgraf\endgroup\medbreak}%
+  \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+  \parindent=0in
+  \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+  \exdentamount=\defbodyindent
+  \begingroup\obeylines
+}
+
+\def\defvrparsebody#1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \spacesplit{#3{#4}}%
+}
+
+% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the
+% type is just `struct', because we lose the braces in `{struct
+% termios}' when \spacesplit reads its undelimited argument.  Sigh.
+% \let\deftpparsebody=\defvrparsebody
+%
+% So, to get around this, we put \empty in with the type name.  That
+% way, TeX won't find exactly `{...}' as an undelimited argument, and
+% won't strip off the braces.
+%
+\def\deftpparsebody #1#2#3#4 {%
+  \parsebodycommon{#1}{#2}{#3}%
+  \spacesplit{\parsetpheaderline{#3{#4}}}\empty
+}
+
+% Fine, but then we have to eventually remove the \empty *and* the
+% braces (if any).  That's what this does, putting the result in \tptemp.
+% 
+\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}%
+
+% After \spacesplit has done its work, this is called -- #1 is the final
+% thing to call, #2 the type name (which starts with \empty), and #3
+% (which might be empty) the arguments.
+% 
+\def\parsetpheaderline#1#2#3{%
+  \removeemptybraces#2\relax
+  #1{\tptemp}{#3}%
+}%
+
+\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#5}}}
+
+% Split up #2 at the first space token.
+% call #1 with two arguments:
+%  the first is all of #2 before the space token,
+%  the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+
+{\obeylines
+\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
+\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
+\ifx\relax #3%
+#1{#2}{}\else #1{#2}{#3#4}\fi}}
+
+% So much for the things common to all kinds of definitions.
+
+% Define @defun.
+
+% First, define the processing that is wanted for arguments of \defun
+% Use this to expand the args and terminate the paragraph they make up
+
+\def\defunargs #1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\hyphenchar\tensl=0
+#1%
+\hyphenchar\tensl=45
+\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\functionparens
+\tclose{#1}% avoid \code because of side effects on active chars
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Function}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type.  #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}%
+\deftypefunargs {#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% \defheaderxcond#1\relax$$$
+% puts #1 in @code, followed by a space, but does nothing if #1 is null.
+\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi}
+
+% #1 is the classification.  #2 is the data type.  #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup
+\normalparens % notably, turn off `&' magic, which prevents
+%               at least some C++ text from working
+\defname {\defheaderxcond#2\relax$$$#3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Macro}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Special Form}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% This definition is run if you use @defunx
+% anywhere other than immediately after a @defun or @defunx.
+
+\def\deffnx #1 {\errmessage{@deffnx in invalid context}}
+\def\defunx #1 {\errmessage{@defunx in invalid context}}
+\def\defmacx #1 {\errmessage{@defmacx in invalid context}}
+\def\defspecx #1 {\errmessage{@defspecx in invalid context}}
+\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}}
+\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}}
+
+% @defmethod, and so on
+
+% @defop {Funny Method} foo-class frobnicate argument
+
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+
+\def\defopheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
+\begingroup\defname {#2}{\defoptype{} on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defmethod == @defop Method
+
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+
+\def\defmethodheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% entry in function index
+\begingroup\defname {#2}{Method on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{\defcvtype{} of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% @defivar == @defcv {Instance Variable}
+
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+
+\def\defivarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{Instance Variable of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% These definitions are run if you use @defmethodx, etc.,
+% anywhere other than immediately after a @defmethod, etc.
+
+\def\defopx #1 {\errmessage{@defopx in invalid context}}
+\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}}
+\def\defcvx #1 {\errmessage{@defcvx in invalid context}}
+\def\defivarx #1 {\errmessage{@defivarx in invalid context}}
+
+% Now @defvar
+
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{Variable}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{User Option}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type.  #2 is the name.
+\def\deftypevarheader #1#2{%
+\doind {vr}{\code{#2}}% Make entry in variables index
+\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
+\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1}
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% This definition is run if you use @defvarx
+% anywhere other than immediately after a @defvar or @defvarx.
+
+\def\defvrx #1 {\errmessage{@defvrx in invalid context}}
+\def\defvarx #1 {\errmessage{@defvarx in invalid context}}
+\def\defoptx #1 {\errmessage{@defoptx in invalid context}}
+\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}}
+\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% This definition is run if you use @deftpx, etc
+% anywhere other than immediately after a @deftp, etc.
+
+\def\deftpx #1 {\errmessage{@deftpx in invalid context}}
+
+\message{cross reference,}
+% Define cross-reference macros
+\newwrite \auxfile
+
+\newif\ifhavexrefs  % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% \setref{foo} defines a cross-reference point named foo.
+
+\def\setref#1{%
+\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ysectionnumberandtype}}
+
+\def\unnumbsetref#1{%
+\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ynothing}}
+
+\def\appendixsetref#1{%
+\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Yappendixletterandtype}}
+
+% \xref, \pxref, and \ref generate cross-references to specified points.
+% For \xrefX, #1 is the node name, #2 the name of the Info
+% cross-reference, #3 the printed node name, #4 the name of the Info
+% file, #5 the name of the printed manual.  All but the node name can be
+% omitted.
+%
+\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]}
+\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup
+  \def\printedmanual{\ignorespaces #5}%
+  \def\printednodename{\ignorespaces #3}%
+  \setbox1=\hbox{\printedmanual}%
+  \setbox0=\hbox{\printednodename}%
+  \ifdim \wd0 = 0pt
+    % No printed node name was explicitly given.
+    \ifx\SETxref-automatic-section-title\relax %
+      % Use the actual chapter/section title appear inside
+      % the square brackets.  Use the real section title if we have it.
+      \ifdim \wd1>0pt%
+        % It is in another manual, so we don't have it.
+        \def\printednodename{\ignorespaces #1}%
+      \else
+        \ifhavexrefs
+          % We know the real title if we have the xref values.
+          \def\printednodename{\refx{#1-title}}%
+        \else
+          % Otherwise just copy the Info node name.
+          \def\printednodename{\ignorespaces #1}%
+        \fi%
+      \fi
+      \def\printednodename{#1-title}%
+    \else
+      % Use the node name inside the square brackets.
+      \def\printednodename{\ignorespaces #1}%
+    \fi
+  \fi
+  %
+  % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not
+  % insert empty discretionaries after hyphens, which means that it will
+  % not find a line break at a hyphen in a node names.  Since some manuals
+  % are best written with fairly long node names, containing hyphens, this
+  % is a loss.  Therefore, we give the text of the node name again, so it
+  % is as if TeX is seeing it for the first time.
+  \ifdim \wd1 > 0pt
+    \putwordsection{} ``\printednodename'' in \cite{\printedmanual}%
+  \else
+    % _ (for example) has to be the character _ for the purposes of the
+    % control sequence corresponding to the node, but it has to expand
+    % into the usual \leavevmode...\vrule stuff for purposes of
+    % printing. So we \turnoffactive for the \refx-snt, back on for the
+    % printing, back off for the \refx-pg.
+    {\turnoffactive \refx{#1-snt}{}}%
+    \space [\printednodename],\space
+    \turnoffactive \putwordpage\tie\refx{#1-pg}{}%
+  \fi
+\endgroup}
+
+% \dosetq is the interface for calls from other macros
+
+% Use \turnoffactive so that punctuation chars such as underscore
+% work in node names.
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
+\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
+\next}}
+
+% \internalsetq {foo}{page} expands into
+% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+% When the aux file is read, ' is the escape character
+
+\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq
+
+\def\Ypagenumber{\folio}
+
+\def\Ytitle{\thissection}
+
+\def\Ynothing{}
+
+\def\Ysectionnumberandtype{%
+\ifnum\secno=0 \putwordChapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno %
+\else %
+\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\def\Yappendixletterandtype{%
+\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\else %
+\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\gdef\xreftie{'tie}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+%
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Non-3.0.
+\else
+  \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+
+\def\refx#1#2{%
+  \expandafter\ifx\csname X#1\endcsname\relax
+    % If not defined, say something at least.
+    $\langle$un\-de\-fined$\rangle$%
+    \ifhavexrefs
+      \message{\linenumber Undefined cross reference `#1'.}%
+    \else
+      \ifwarnedxrefs\else
+        \global\warnedxrefstrue
+        \message{Cross reference values unknown; you must run TeX again.}%
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \csname X#1\endcsname
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+
+% This is the macro invoked by entries in the aux file.
+\def\xrdef #1#2{
+{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
+
+\def\readauxfile{%
+\begingroup
+\catcode `\^^@=\other
+\catcode `\\ 1=\other
+\catcode `\\ 2=\other
+\catcode `\^^C=\other
+\catcode `\^^D=\other
+\catcode `\^^E=\other
+\catcode `\^^F=\other
+\catcode `\^^G=\other
+\catcode `\^^H=\other
+\catcode `\\v=\other
+\catcode `\^^L=\other
+\catcode `\\ e=\other
+\catcode `\\ f=\other
+\catcode `\\10=\other
+\catcode `\\11=\other
+\catcode `\\12=\other
+\catcode `\\13=\other
+\catcode `\\14=\other
+\catcode `\\15=\other
+\catcode `\\16=\other
+\catcode `\\17=\other
+\catcode `\\18=\other
+\catcode `\\19=\other
+\catcode 26=\other
+\catcode `\^^[=\other
+\catcode `\^^\=\other
+\catcode `\^^]=\other
+\catcode `\^^^=\other
+\catcode `\^^_=\other
+\catcode `\@=\other
+\catcode `\^=\other
+\catcode `\~=\other
+\catcode `\[=\other
+\catcode `\]=\other
+\catcode`\"=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode `\$=\other
+\catcode `\#=\other
+\catcode `\&=\other
+% `\+ does not work, so use 43.
+\catcode 43=\other
+% Make the characters 128-255 be printing characters
+{%
+  \count 1=128
+  \def\loop{%
+    \catcode\count 1=\other
+    \advance\count 1 by 1
+    \ifnum \count 1<256 \loop \fi
+  }%
+}%
+% the aux file uses ' as the escape.
+% Turn off \ as an escape so we do not lose on
+% entries which were dumped with control sequences in their names.
+% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
+% Reference to such entries still does not work the way one would wish,
+% but at least they do not bomb out when the aux file is read in.
+\catcode `\{=1 \catcode `\}=2
+\catcode `\%=\other
+\catcode `\'=0
+\catcode `\\=\other
+\openin 1 \jobname.aux
+\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
+\global\warnedobstrue
+\fi
+% Open the new aux file.  Tex will close it automatically at exit.
+\openout \auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed.
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only..
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode `\@=11
+%
+% Auto-number footnotes.  Otherwise like plain.
+\gdef\footnote{%
+  \global\advance\footnoteno by \@ne
+  \edef\thisfootno{$^{\the\footnoteno}$}%
+  %
+  % In case the footnote comes at the end of a sentence, preserve the
+  % extra spacing after we do the footnote number.
+  \let\@sf\empty
+  \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+  %
+  % Remove inadvertent blank space before typesetting the footnote number.
+  \unskip
+  \thisfootno\@sf
+  \footnotezzz
+}%
+
+% Don't bother with the trickery in plain.tex to not require the
+% footnote text as a parameter.  Our footnotes don't need to be so general.
+%
+\long\gdef\footnotezzz#1{\insert\footins{%
+  % We want to typeset this text as a normal paragraph, even if the
+  % footnote reference occurs in (for example) a display environment.
+  % So reset some parameters.
+  \interlinepenalty\interfootnotelinepenalty
+  \splittopskip\ht\strutbox % top baseline for broken footnotes
+  \splitmaxdepth\dp\strutbox
+  \floatingpenalty\@MM
+  \leftskip\z@skip
+  \rightskip\z@skip
+  \spaceskip\z@skip
+  \xspaceskip\z@skip
+  \parindent\defaultparindent
+  %
+  % Hang the footnote text off the number.
+  \hang
+  \textindent{\thisfootno}%
+  %
+  % Don't crash into the line above the footnote text.  Since this
+  % expands into a box, it must come within the paragraph, lest it
+  % provide a place where TeX can split the footnote.
+  \footstrut
+  #1\strut}%
+}
+
+}%end \catcode `\@=11
+
+% Set the baselineskip to #1, and the lineskip and strut size
+% correspondingly.  There is no deep meaning behind these magic numbers
+% used as factors; they just match (closely enough) what Knuth defined.
+%
+\def\lineskipfactor{.08333}
+\def\strutheightpercent{.70833}
+\def\strutdepthpercent {.29167}
+%
+\def\setleading#1{%
+  \normalbaselineskip = #1\relax
+  \normallineskip = \lineskipfactor\normalbaselineskip
+  \normalbaselines
+  \setbox\strutbox =\hbox{%
+    \vrule width0pt height\strutheightpercent\baselineskip
+                    depth \strutdepthpercent \baselineskip
+  }%
+}
+
+% @| inserts a changebar to the left of the current line.  It should
+% surround any changed text.  This approach does *not* work if the
+% change spans more than two lines of output.  To handle that, we would
+% have adopt a much more difficult approach (putting marks into the main
+% vertical list for the beginning and end of each change).
+%
+\def\|{%
+  % \vadjust can only be used in horizontal mode.
+  \leavevmode
+  %
+  % Append this vertical mode material after the current line in the output.
+  \vadjust{%
+    % We want to insert a rule with the height and depth of the current
+    % leading; that is exactly what \strutbox is supposed to record.
+    \vskip-\baselineskip
+    %
+    % \vadjust-items are inserted at the left edge of the type.  So
+    % the \llap here moves out into the left-hand margin.
+    \llap{%
+      %
+      % For a thicker or thinner bar, change the `1pt'.
+      \vrule height\baselineskip width1pt
+      %
+      % This is the space between the bar and the text.
+      \hskip 12pt
+    }%
+  }%
+}
+
+% For a final copy, take out the rectangles
+% that mark overfull boxes (in case you have decided
+% that the text looks ok even though it passes the margin).
+%
+\def\finalout{\overfullrule=0pt}
+
+
+% End of control word definitions.
+
+\message{and turning on texinfo input format.}
+
+\def\openindices{%
+   \newindex{cp}%
+   \newcodeindex{fn}%
+   \newcodeindex{vr}%
+   \newcodeindex{tp}%
+   \newcodeindex{ky}%
+   \newcodeindex{pg}%
+}
+
+% Set some numeric style parameters, for 8.5 x 11 format.
+
+%\hsize = 6.5in
+\newdimen\defaultparindent \defaultparindent = 15pt
+\parindent = \defaultparindent
+\parskip 18pt plus 1pt
+\setleading{15pt}
+\advance\topskip by 1.2cm
+
+% Prevent underfull vbox error messages.
+\vbadness=10000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  This makes it come to about 9pt for the 8.5x11 format.
+%
+\ifx\emergencystretch\thisisundefined
+  % Allow us to assign to \emergencystretch anyway.
+  \def\emergencystretch{\dimen0}%
+\else
+  \emergencystretch = \hsize
+  \divide\emergencystretch by 45
+\fi
+
+% Use @smallbook to reset parameters for 7x9.5 format  (or else 7x9.25)
+\def\smallbook{
+
+% These values for secheadingskip and subsecheadingskip are
+% experiments.  RJC 7 Aug 1992
+\global\secheadingskip = 17pt plus 6pt minus 3pt
+\global\subsecheadingskip = 14pt plus 6pt minus 3pt
+
+\global\lispnarrowing = 0.3in
+\setleading{12pt}
+\advance\topskip by -1cm
+\global\parskip 3pt plus 1pt
+\global\hsize = 5in
+\global\vsize=7.5in
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\contentsrightmargin=0pt
+\global\deftypemargin=0pt
+\global\defbodyindent=.5cm
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+
+\global\let\smalllisp=\smalllispx
+\global\let\smallexample=\smalllispx
+\global\def\Esmallexample{\Esmalllisp}
+}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{
+\global\tolerance=700
+\global\hfuzz=1pt
+\setleading{12pt}
+\global\parskip 15pt plus 1pt
+
+\global\vsize= 53\baselineskip
+\advance\vsize by \topskip
+%\global\hsize=   5.85in     % A4 wide 10pt
+\global\hsize=  6.5in
+\global\outerhsize=\hsize
+\global\advance\outerhsize by 0.5in
+\global\outervsize=\vsize
+\global\advance\outervsize by 0.6in
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+}
+
+% Allow control of the text dimensions.  Parameters in order: textheight;
+% textwidth; \voffset; \hoffset (!); binding offset.  All require a dimension;
+% header is additional; added length extends the bottom of the page.
+
+\def\changepagesizes#1#2#3#4#5
+{\global\vsize= #1
+ \advance\vsize by \topskip
+ \global\voffset= #3
+ \global\hsize= #2
+ \global\outerhsize=\hsize
+ \global\advance\outerhsize by 0.5in
+ \global\outervsize=\vsize
+ \global\advance\outervsize by 0.6in
+ \global\pagewidth=\hsize
+ \global\pageheight=\vsize
+ \global\normaloffset= #4
+ \global\bindingoffset= #5}
+
+% This layout is compatible with Latex on A4 paper.
+
+\def\afourlatex{\changepagesizes{22cm}{15cm}{7mm}{4.6mm}{5mm}}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+%
+\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt \char '042}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt \char '176}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+% \lvvmode is equivalent in function to \leavevmode.
+% Using \leavevmode runs into trouble when written out to
+% an index file due to the expansion of \leavevmode into ``\unhbox
+% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our
+% magic tricks with @.
+\def\lvvmode{\vbox to 0pt{}}
+
+\catcode`\|=\active
+\def|{{\tt \char '174}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+%\catcode 27=\active
+%\def^^[{$\diamondsuit$}
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
+\catcode`\@=0
+
+% \rawbackslashxx output one backslash character in current font
+\global\chardef\rawbackslashxx=`\\
+%{\catcode`\\=\other
+%@gdef@rawbackslashxx{\}}
+
+% \rawbackslash redefines \ as input to do \rawbackslashxx.
+{\catcode`\\=\active
+@gdef@rawbackslash{@let\=@rawbackslashxx }}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+% Say @foo, not \foo, in error messages.
+\escapechar=`\@
+
+% \catcode 17=0   % Define control-q
+\catcode`\\=\active
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+@def@turnoffactive{@let"=@normaldoublequote
+@let\=@realbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus}
+
+@def@normalturnoffactive{@let"=@normaldoublequote
+@let\=@normalbackslash
+@let~=@normaltilde
+@let^=@normalcaret
+@let_=@normalunderscore
+@let|=@normalverticalbar
+@let<=@normalless
+@let>=@normalgreater
+@let+=@normalplus}
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing
+% a backslash.
+%
+@gdef@eatinput input texinfo{@fixbackslash}
+@global@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix
+% that, assuming it is called before the first `\' could plausibly occur.
+%
+@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi}
+
+%% These look ok in all fonts, so just make them not special.  The @rm below
+%% makes sure that the current font starts out as the newly loaded cmr10
+@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other
+
+@textfonts
+@rm
+
+@c Local variables:
+@c page-delimiter: "^\\\\message"
+@c End:
diff --git a/txtelat1.l b/txtelat1.l
new file mode 100644 (file)
index 0000000..1e611b1
--- /dev/null
@@ -0,0 +1,186 @@
+/* Conversion of files between different charsets and usages.
+   Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+   Francois Pinard <pinard@iro.umontreal.ca>, 1989.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* Step name: texte_latin1.  */
+
+%{
+
+void texte_latin1_diaeresis _((void));
+
+%}
+
+s                      (^|[^a-zA-Z])
+d                      [:"]
+l                      [a-zA-Z]
+%%
+
+``                     { output (171); }
+''                     { output (187); }
+
+A`                     { output (192); }
+A^                     { output (194); }
+A{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (196);
+                         else
+                           ECHO;
+                       }
+a`                     { output (224); }
+a^                     { output (226); }
+a{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (228);
+                         else
+                           ECHO;
+                       }
+
+C\,/[aAoOuU]           { output (199); }
+c\,/[aAoOuU]           { output (231); }
+
+E`                     { output (200); }
+E'''                   { output (201); output (187); }
+E''                    { output ('E'); output (187); }
+E'                     { output (201); }
+E^                     { output (202); }
+E{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (203);
+                         else
+                           ECHO;
+                       }
+e`                     { output (232); }
+e'''                   { output (233); output (187); }
+e''                    { output ('e'); output (187); }
+e'                     { output (233); }
+e^                     { output (234); }
+e{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (235);
+                         else
+                           ECHO;
+                       }
+
+I`                     { output (204); }
+I^                     { output (206); }
+I{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (207);
+                         else
+                           ECHO;
+                       }
+i`                     { output (236); }
+i^                     { output (238); }
+i{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (239);
+                         else
+                           ECHO;
+                       }
+
+O`                     { output (210); }
+O^                     { output (212); }
+O{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (214);
+                         else
+                           ECHO;
+                       }
+o`                     { output (242); }
+o^                     { output (244); }
+o{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (246);
+                         else
+                           ECHO;
+                       }
+
+U`                     { output (217); }
+U^                     { output (219); }
+U{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (220);
+                         else
+                           ECHO;
+                       }
+u`                     { output (249); }
+u^                     { output (251); }
+u{d}/{l}               { if (yytext[1] == diaeresis_char)
+                           output (252);
+                         else
+                           ECHO;
+                       }
+
+{s}[Bb]esaigue{d}      { texte_latin1_diaeresis (); }
+{s}[Cc]igue{d}         { texte_latin1_diaeresis (); }
+{s}[Aa]igue{d}         { texte_latin1_diaeresis (); }
+{s}[Aa]mbigue{d}       { texte_latin1_diaeresis (); }
+{s}[Cc]ontigue{d}      { texte_latin1_diaeresis (); }
+{s}[Ee]xigue{d}                { texte_latin1_diaeresis (); }
+{s}[Ss]ubaigue{d}      { texte_latin1_diaeresis (); }
+{s}[Ss]uraigue{d}      { texte_latin1_diaeresis (); }
+{s}[Aa]i{d}            { texte_latin1_diaeresis (); }
+{s}[Cc]ongai{d}                { texte_latin1_diaeresis (); }
+{s}[Gg]oi{d}           { texte_latin1_diaeresis (); }
+{s}[Hh]ai{d}kai{d}     { if (yytext[4] == diaeresis_char)
+                           texte_latin1_diaeresis ();
+                         else
+                           ECHO;
+                       }
+{s}[Ii]noui{d}         { texte_latin1_diaeresis (); }
+[JjTtLl]'[Aa][Ii]{d}   { ECHO; }
+{s}[Ss]ai{d}           { texte_latin1_diaeresis (); }
+{s}[Ss]amurai{d}       { texte_latin1_diaeresis (); }
+{s}[Tt]hai{d}          { texte_latin1_diaeresis (); }
+{s}[Tt]okai{d}         { texte_latin1_diaeresis (); }
+{s}[Cc]anoe{d}         { texte_latin1_diaeresis (); }
+{s}Esau{d}             { texte_latin1_diaeresis (); }
+%%
+
+void
+texte_latin1_diaeresis (void)
+{
+  int counter;
+
+  for (counter = 0; counter < yyleng; counter++)
+    if (yytext[counter+1] == diaeresis_char)
+      {
+       switch (yytext[counter])
+         {
+
+           /* The next "case 'A'" line once triggered a `NULL in input'
+              diagnostic in flex.  This astonishing bug has been hard to
+              isolate, so I'll leave this comment around for a while.  */
+
+         case 'A': output (196); break;
+         case 'E': output (203); break;
+         case 'I': output (207); break;
+         case 'O': output (214); break;
+         case 'U': output (220); break;
+         case 'a': output (228); break;
+         case 'e': output (235); break;
+         case 'i': output (239); break;
+         case 'o': output (246); break;
+         case 'u': output (252); break;
+         case 'y': output (255); break;
+         default:  output (yytext[counter]);
+         }
+       counter++;
+      }
+    else
+      output (yytext[counter]);
+}
+
+void
+module_texte_latin1 (void)
+{
+  declare_step ("Texte", "Latin-1", MANY_TO_ONE, NULL, file_texte_latin1);
+
+  declare_alias ("txte", "Texte");
+}
diff --git a/version.texi b/version.texi
new file mode 100644 (file)
index 0000000..b0f0deb
--- /dev/null
@@ -0,0 +1,3 @@
+@set EDITION 3.4
+@set UPDATED November 1994
+@set VERSION 3.4
diff --git a/xmalloc.c b/xmalloc.c
new file mode 100644 (file)
index 0000000..9f70111
--- /dev/null
+++ b/xmalloc.c
@@ -0,0 +1,95 @@
+/* xmalloc.c -- malloc with out of memory checking
+   Copyright (C) 1990, 91, 92, 93, 94 Free Software Foundation, Inc.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if __STDC__
+#define VOID void
+#else
+#define VOID char
+#endif
+
+#include <sys/types.h>
+
+#if STDC_HEADERS
+#include <stdlib.h>
+#else
+VOID *malloc ();
+VOID *realloc ();
+void free ();
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+/* Exit value when the requested amount of memory is not available.
+   The caller may set it to some other value.  */
+int xmalloc_exit_failure = EXIT_FAILURE;
+
+#if __STDC__ && (HAVE_VPRINTF || HAVE_DOPRNT)
+void error (int, int, const char *, ...);
+#else
+void error ();
+#endif
+
+static VOID *
+fixup_null_alloc (n)
+     size_t n;
+{
+  VOID *p;
+
+  p = 0;
+  if (n == 0)
+    p = malloc ((size_t) 1);
+  if (p == 0)
+    error (xmalloc_exit_failure, 0, "memory exhausted");
+  return p;
+}
+
+/* Allocate N bytes of memory dynamically, with error checking.  */
+
+VOID *
+xmalloc (n)
+     size_t n;
+{
+  VOID *p;
+
+  p = malloc (n);
+  if (p == 0)
+    p = fixup_null_alloc (n);
+  return p;
+}
+
+/* Change the size of an allocated block of memory P to N bytes,
+   with error checking.
+   If P is NULL, run xmalloc.  */
+
+VOID *
+xrealloc (p, n)
+     VOID *p;
+     size_t n;
+{
+  if (p == 0)
+    return xmalloc (n);
+  p = realloc (p, n);
+  if (p == 0)
+    p = fixup_null_alloc (n);
+  return p;
+}
diff --git a/xstrdup.c b/xstrdup.c
new file mode 100644 (file)
index 0000000..27cd0c6
--- /dev/null
+++ b/xstrdup.c
@@ -0,0 +1,36 @@
+/* xstrdup.c -- copy a string with out of memory checking
+   Copyright (C) 1990 Free Software Foundation, Inc.
+
+   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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+char *xmalloc ();
+
+/* Return a newly allocated copy of STRING.  */
+
+char *
+xstrdup (string)
+     char *string;
+{
+  return strcpy (xmalloc (strlen (string) + 1), string);
+}