--- /dev/null
+# 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)
--- /dev/null
+ 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.
--- /dev/null
+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.
--- /dev/null
+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...
--- /dev/null
+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.
+
--- /dev/null
+# 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:
--- /dev/null
+# 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
--- /dev/null
+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.
--- /dev/null
+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.
--- /dev/null
+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>
--- /dev/null
+\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
--- /dev/null
+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
--- /dev/null
+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:
--- /dev/null
+/* 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
--- /dev/null
+# 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)])])
+
--- /dev/null
+.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.
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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
+}
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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 */
+
+}
--- /dev/null
+/* 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);
+}
--- /dev/null
+;;; 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))
--- /dev/null
+/* 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");
+}
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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"},
+ };
--- /dev/null
+# 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;
+}
--- /dev/null
+1,/^ 3rd field is the long descriptive/d
+/^Simonsen/,/^RFC 1345/d
+/^4. CHARSETS/q
+/^$/d
+s/^ //p
--- /dev/null
+/* 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;
+}
--- /dev/null
+# 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 = "";
+}
--- /dev/null
+1,/^5\. CHARSET TABLES$/d
+/^Simonsen/,/^RFC 1345/d
+/^ACKNOWLEDGEMENTS$/q
+/^$/d
+s/^ //p
--- /dev/null
+
+@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
--- /dev/null
+/* 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");
+}
--- /dev/null
+/* 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");
+}
--- /dev/null
+:
+# 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
--- /dev/null
+/* 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
--- /dev/null
+/* 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
--- /dev/null
+/* 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
--- /dev/null
+#!/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];
+}
+
--- /dev/null
+#!/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
+
--- /dev/null
+# 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])
--- /dev/null
+#!/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];
+}
+
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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 */
--- /dev/null
+/* 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 */
--- /dev/null
+/* 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 */
--- /dev/null
+/* 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. */
+
+%%
+
+& { if (diacritics_only) ECHO; else output (38); }
+< { if (diacritics_only) ECHO; else output (60); }
+> { if (diacritics_only) ECHO; else output (62); }
+
+À { output (192); }
+Á { output (193); }
+Âu; { output (194); }
+Ã { output (195); }
+&Adiaer; { output (196); }
+Å { output (197); }
+&AE; { output (198); }
+Ç { output (199); }
+È { output (200); }
+É { output (201); }
+Êu; { output (202); }
+&Ediaer; { output (203); }
+Ì { output (204); }
+Í { output (205); }
+Îu; { output (206); }
+&Idiaer; { output (207); }
+Ð { output (208); }
+Ñ { output (209); }
+Ò { output (210); }
+Ó { output (211); }
+Ôu; { output (212); }
+Õ { output (213); }
+&Odiaer; { output (214); }
+&MULT; { output (215); }
+&Ostroke; { output (216); }
+Ù { output (217); }
+Ú { output (218); }
+Ûu; { output (219); }
+&Udiaer; { output (220); }
+Ý { output (221); }
+Þ { output (222); }
+&ssharp; { output (223); }
+à { output (224); }
+á { output (225); }
+âu; { output (226); }
+ã { output (227); }
+&adiaer; { output (228); }
+å { output (229); }
+&ae; { output (230); }
+ç { output (231); }
+è { output (232); }
+é { output (233); }
+êu; { output (234); }
+&ediaer; { output (235); }
+ì { output (236); }
+í { output (237); }
+îu; { output (238); }
+&idiaer; { output (239); }
+ð { output (240); }
+ñ { output (241); }
+ò { output (242); }
+ó { output (243); }
+ôu; { output (244); }
+õ { output (245); }
+&odiaer; { output (246); }
+&DIVIS; { output (247); }
+&ostroke; { output (248); }
+ù { output (249); }
+ú { output (250); }
+ûu; { output (251); }
+&udiaer; { output (252); }
+ý { output (253); }
+þ { 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");
+}
--- /dev/null
+/* 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
+}
--- /dev/null
+/* 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");
+}
--- /dev/null
+ 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 ();
--- /dev/null
+#!/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
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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, "À"},
+ {193, "Á"},
+ {194, "Âu;"},
+ {195, "Ã"},
+ {196, "&Adiaer;"},
+ {197, "Å"},
+ {198, "&AE;"},
+ {199, "Ç"},
+ {200, "È"},
+ {201, "É"},
+ {202, "Êu;"},
+ {203, "&Ediaer;"},
+ {204, "Ì"},
+ {205, "Í"},
+ {206, "Îu;"},
+ {207, "&Idiaer;"},
+ {208, "Ð"},
+ {209, "Ñ"},
+ {210, "Ò"},
+ {211, "Ó"},
+ {212, "Ôu;"},
+ {213, "Õ"},
+ {214, "&Odiaer;"},
+ {215, "&MULT;"},
+ {216, "&Ostroke;"},
+ {217, "Ù"},
+ {218, "Ú"},
+ {219, "Ûu;"},
+ {220, "&Udiaer;"},
+ {221, "Ý"},
+ {222, "Þ"},
+ {223, "&ssharp;"},
+ {224, "à"},
+ {225, "á"},
+ {226, "âu;"},
+ {227, "ã"},
+ {228, "&adiaer;"},
+ {229, "å"},
+ {230, "&ae;"},
+ {231, "ç"},
+ {232, "è"},
+ {233, "é"},
+ {234, "êu;"},
+ {235, "&ediaer;"},
+ {236, "ì"},
+ {237, "í"},
+ {238, "îu;"},
+ {239, "&idiaer;"},
+ {240, "ð"},
+ {241, "ñ"},
+ {242, "ò"},
+ {243, "ó"},
+ {244, "ôu;"},
+ {245, "õ"},
+ {246, "&odiaer;"},
+ {247, "&DIVIS;"},
+ {248, "&ostroke;"},
+ {249, "ù"},
+ {250, "ú"},
+ {251, "ûu;"},
+ {252, "&udiaer;"},
+ {253, "ý"},
+ {254, "þ"},
+ {255, "&ydiaer;"},
+ {0, NULL}
+ };
+
+static struct translation const other_translations [] =
+ {
+ {38, "&"},
+ {60, "<"},
+ {62, ">"},
+ {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");
+}
--- /dev/null
+/* 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");
+}
--- /dev/null
+/* 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");
+}
--- /dev/null
+/* 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");
+}
--- /dev/null
+/* 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");
+}
--- /dev/null
+# 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)
+}
+
--- /dev/null
+#!/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
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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 */
--- /dev/null
+/* 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);
+}
--- /dev/null
+/* 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
--- /dev/null
+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
+`&', similarly, left angle brackets `<' are translated into `<'
+and right angle brackets `>' are translated into `>'. 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
--- /dev/null
+\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{&}, similarly, left angle brackets @kbd{<} are translated
+into @samp{<} and right angle brackets @kbd{>} are translated into
+@samp{>}. 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:
--- /dev/null
+
+
+
+
+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
--- /dev/null
+Sun Nov 6 04:06:07 EST 1994
--- /dev/null
+Sun Nov 6 05:13:18 EST 1994
--- /dev/null
+Sun Nov 6 05:12:53 EST 1994
--- /dev/null
+%% 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\}\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:
--- /dev/null
+/* 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");
+}
--- /dev/null
+@set EDITION 3.4
+@set UPDATED November 1994
+@set VERSION 3.4
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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);
+}