#!/usr/bin/perl
#=======================================================================
# Copyright (C) 2000-2001 Daniele Giacomini <daniele@swlibero.org>
#
# 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.
#
# Written by Daniele Giacomini <daniele@swlibero.org>
#=======================================================================
# sgmltexi OPTION... SGML_SOURCE
#
# Front-end for the SGML to Texinfo system.
#=======================================================================

use POSIX;
use Locale::gettext;
setlocale (LC_MESSAGES, "");
textdomain ("sgmltexi");

#sub gettext
#{
#    return $_[0];
#}

# Program version.
$VERSION = "2001.09.03";

# Configuration files.
$CATALOG = "/usr/share/sgmltexi/sgmltexi.cat";

#=======================================================================
# Global variables that should not be modified by hand.
#=======================================================================

# Program name.
$program_canonical_name = "Sgmltexi";

# Program executable without path.
$program_executable = $0;
$program_executable =~ m{([^/]*)$};
$program_executable = $1;

# List of other temporary files that must be deleted at the end of
# elaboration.
$temp_files_list = "";

#=======================================================================
# Functions.
#=======================================================================

#-----------------------------------------------------------------------
# Show the right syntax for the use of this program.
#
# &help_syntax ()
#
sub help_syntax
{
    print STDOUT (sprintf (gettext
        ( "Usage: %s OPTIONS... SGML_SOURCE\n"
        . "       %s --help\n"
        . "       %s --version\n"
        . "\n"
        . "Front-end for the SGML to Texinfo system.\n"
        . "\n"
        . "Options:\n"
        . "--help        display this help and exit.\n"
        . "--version     display version information and exit.\n"
        . "--force       force things.\n"
        . "--number-sections\n"
        . "              add sections numbering when usually disabled.\n"
        . "--clean       remove stale files associated with the source name.\n"
        . "--verbose     show more messages.\n"
        . "--deriv=DERIVATION\n"
        . "              define the derivation name.\n"
        . "--input-encoding=ENCODING\n"
        . "              input encoding ISO-8859-n.\n"
        . "--sgml-include=PARAMETER_ENTITY\n"
        . "--include=PARAMETER_ENTITY\n"
        . "              assign \"INCLUDE\" to an SGML parameter entity.\n"
        . "--paper=PAPER\n"
        . "              define the paper format: \"letter\", \"a4\", \"a4latex\",\n"
        . "              \"a4wide\", \"small\".\n"
        . "--setchapternewpage={on|off|odd}\n"
        . "              define the chapter paper feed, overriding the tag\n"
        . "                <setchapternewpage content=\"...\"> inside the source.\n"
        . "--footnotestyle={end|separate}\n"
        . "              define the footnote location, overriding the tag\n"
        . "                <footnotestyle content=\"...\"> inside the source.\n"
        . "--headings={on|off|single|double|singleafter|doubleafter}\n"
        . "              turn page headings on or off, and/or specify single-sided\n"
        . "              or double-sided page headings for printing. It overrides the"
        . "                tag <headings content=\"...\"> inside the source.\n"
        . "--sgml-syntax, --sgml-check\n"
        . "              check SGML syntax and report errors.\n"
        . "--sp          SP output for debugging purpose.\n"
        . "--texi, --texinfo\n"
        . "              generate a Texinfo source output.\n"
        . "--dvi         generate a DVI output.\n"
        . "--ps, --postscript\n"
        . "              generate a PostScript output.\n"
        . "--pdf         generate a PDF output.\n"
        . "--info        generate an Info output.\n"
        . "--text        generate a text output.\n"
        . "--html        generate an HTML output.\n"
        . "\n"
        . "Arguments:\n"
        . "SGML_SOURCE   the SGML input file.\n"
        . "\n"
        . "Report bugs to <daniele\@swlibero.org>\n"),
        $program_executable, $program_executable, $program_executable));
}

#-----------------------------------------------------------------------
# Show version information.
#
# &version_info ()
#
sub version_info
{
    print STDOUT (sprintf (gettext
        ( "%s %s\n"
        . "\n"
        . "Copyright (C) Daniele Giacomini <daniele\@swlibero.org>\n"
        . "This is free software; see the source for copying conditions.\n"
        . "There is NO warranty; not even for MERCHANTABILITY or FITNESS\n"
        . "FOR A PARTICULAR PURPOSE.\n"
        . "\n"
        . "Written by Daniele Giacomini <daniele\@swlibero.org>\n" ),
        $program_canonical_name, $VERSION));
}

#-----------------------------------------------------------------------
# Define a temporary file.
#
# &temporary_file ()
#
sub temporary_file
{
    local( $temp_dir ) = "";
    local( $random_number ) = 0;
    local( $random_file_name ) = "";

    # Check for temp dir.
    if (-d $ENV{TEMPDIR}
        && -r $ENV{TEMPDIR}
        && -w $ENV{TEMPDIR}
        && -x $ENV{TEMPDIR})
      {
        # This directory is good.
        $temp_dir = $ENV{TEMPDIR};
      }
    elsif (-d "/tmp" && -r "/tmp" && -w "/tmp" && -x "/tmp")
      {
        # This other directory is good.
        $temp_dir = "/tmp";
      }
    elsif (-r "." && -w "." && -x ".")
      {
        # Current directory is good.
        $temp_dir = ".";
      }
    else
      {
        # We cannot use any temporary file!
        printf STDERR (gettext ("%s: cannot create any temporary file!\n"),
                       $program_executable);
        exit 1;
      }

    # If we are here, we have a valid temporary directory.
    # We try to find a good name for the file.
    while (1)
      {
        # Define the random number (six digits).
        $random_number = int ((rand) * 1000000);
        # Define the random file name: TF...tmp.
        $random_file_name = "$temp_dir/TF$random_number.tmp";
        # Check if it is new.
        if (-e $random_file_name)
          {
            # The file exists already.
            next;
          }
        else
          {
            if (open (TEMP_FILE, "> $random_file_name"))
              {
                # It works.
                close( TEMP_FILE );
                last;
              }
            else
              {
                # Don't know what to do.
                printf STDERR
                  (gettext ("%s: cannot create the temporary file %s\n"),
                   $program_executable, $random_file_name);
                next;
              }

            # This point cannot be reached.
            printf STDERR
              (gettext ("%s: function %s unknown error 1\n"),
               $program_executable, "&temporary_file()");
          }

        # This point cannot be reached.
        printf STDERR
          (gettext ("%s: function %s unknown error 2\n"),
           $program_executable, "&temporary_file()");
      }         

    # Return the file name.
    return ("$random_file_name");
}

#-----------------------------------------------------------------------
# Determinate the file name without extention.
#
# &root_name (FILE_NAME, EXTENTION)
#
sub root_name
{
    local( $file_name ) = $_[0];
    local( $extention_name ) = $_[1];
    local( $root_name ) = "";
    
    $file_name =~ m/^(.*)$extention_name$/;
    $root_name = $1;
    if ($root_name eq "")
      {
        # The extention is not the same.
        $root_name = $file_name;
      }
    return ("$root_name");
} # &root_name

#-----------------------------------------------------------------------
# Translate a positive integer into an alphabet sequence:
# from A to CZ.
#
# &integer_to_alphabet (INTEGER)
#
sub integer_to_alphabet
{
    local ($n) = $_[0];

    #-------------------------------------------------------------------
    # Generate an alphabet digit.
    # 1 -> A, 2 -> B,... 26 -> Z
    #
    # &alphabet_digit (1-26)
    #
    sub alphabet_digit
    {
        local ($digit) = $_[0];

	if ($digit == 0)
	  {
            return ("");
          }
	elsif ($digit == 1){
            return ("A");
          }
	elsif ($digit == 2)
	  {
            return ("B");
          }
        elsif ($digit == 3)
	  {
            return ("C");
          }
        elsif ($digit == 4)
          {
            return ("D");
          }
        elsif ($digit == 5)
          {
            return ("E");
          }
        elsif ($digit == 6)
          {
            return ("F");
          }
        elsif ($digit == 7)
          {
            return ("G");
          }
        elsif ($digit == 8)
          {
            return ("H");
          }
        elsif ($digit == 9)
          {
            return ("I");
          }
        elsif ($digit == 10)
          {
            return ("J");
          }
        elsif ($digit == 11)
          {
            return ("K");
          }
        elsif ($digit == 12)
          {
            return ("L");
          }
        elsif ($digit == 13)
          {
            return ("M");
          }
        elsif ($digit == 14)
          {
            return ("N");
          }
        elsif ($digit == 15)
          {
            return ("O");
          }
        elsif ($digit == 16)
          {
            return ("P");
          }
        elsif ($digit == 17)
          {
            return ("Q");
          }
        elsif ($digit == 18)
          {
            return ("R");
          }
        elsif ($digit == 19)
          {
            return ("S");
          }
        elsif ($digit == 20)
          {
            return ("T");
          }
        elsif ($digit == 21)
          {
            return ("U");
          }
        elsif ($digit == 22)
          {
            return ("V");
          }
        elsif ($digit == 23)
          {
            return ("W");
          }
        elsif ($digit == 24)
          {
            return ("X");
          }
        elsif ($digit == 25)
          {
            return ("Y");
          }
        elsif ($digit == 26)
          {
            return ("Z");
          }
    }

    # Analyze the number.
    if ($n <= 0)
      {
        # We cannot translate zero or negative numbers.
        $return = "##<A##";
      }
    elsif ($n <= 26)
      {
        # We have only one letter.
        $return = &alphabet_digit($n);
      }
    elsif ($n <= 52)
      {
        # We have two letters: Ax.
        $n = $n - 26;
        $return = "A" . &alphabet_digit($n);
      }
    elsif ($n <= 78)
      {
        # We have two letters: Bx.
        $n = $n - 52;
        $return = "B" . &alphabet_digit($n);

      }
    elsif ($n <= 104)
      {
        # We have two letters: Cx.
        $n = $n - 78;
        $return = "C" . &alphabet_digit($n);
      }
    else
      {
        # The number is too big.
        $return = "##>CZ##";
      }
} # &integer_to_alphabet

#-----------------------------------------------------------------------
# Translate a positive integer into a roman string.
#
# &integer_to_roman (INTEGER)
#
sub integer_to_roman
{
    local ( $n ) = $_[0];
    local ( $digit_1 ) = 0;
    local ( $digit_2 ) = 0;
    local ( $digit_3 ) = 0;
    local ( $digit_4 ) = 0;

    #-------------------------------------------------------------------
    # First digit into roman: 1-9
    #
    sub digit_1_to_roman
    {
        local ( $digit ) = $_[0];

        if ($digit == 0)
	  {
            return ("");
          }
        elsif ($digit == 1)
          {
            return ("I");
          }
        elsif ($digit == 2)
          {
            return ("II");
          }
        elsif ($digit == 3)
          {
            return ("III");
          }
        elsif ($digit == 4)
          {
            return ("IV");
          }
        elsif ($digit == 5)
          {
            return ("V");
          }
        elsif ($digit == 6)
          {
            return ("VI");
          }
        elsif ($digit == 7)
          {
            return ("VII");
          }
        elsif ($digit == 8)
          {
            return ("VIII");
          }
        elsif ($digit == 9)
          {
            return ("IX");
          }
    }

    #-------------------------------------------------------------------
    # Second digit into roman: 10-90
    #
    sub digit_2_to_roman
    {
        local ($digit) = $_[0];

        if ($digit == 0)
	  {
            return ("");
          }
        elsif ($digit == 1)
          {
            return ("X");
          }
        elsif ($digit == 2)
	  {
            return ("XX");
          }
        elsif ($digit == 3)
	  {
            return ("XXX");
          }
        elsif ($digit == 4)
	  {
            return ("XL");
          }
        elsif ($digit == 5)
	  {
            return ("L");
          }
        elsif ($digit == 6)
	  {
            return ("LX");
          }
        elsif ($digit == 7)
	  {
            return ("LXX");
          }
        elsif ($digit == 8)
	  {
            return ("LXXX");
          }
        elsif ($digit == 9)
	  {
            return ("XC");
          }
    }

    #-------------------------------------------------------------------
    # Third digit into roman: 100-900
    #
    sub digit_3_to_roman
    {
        local ($digit) = $_[0];

        if ($digit == 0)
   	  {
            return ("");
          }
        elsif ($digit == 1)
          {
            return ("C");
          }
        elsif ($digit == 2)
          {
            return ("CC");
          }
        elsif ($digit == 3)
          {
            return ("CCC");
          }
        elsif ($digit == 4)
          {
            return ("CD");
          }
        elsif ($digit == 5)
          {
            return ("D");
          }
        elsif ($digit == 6)
          {
            return ("DC");
          }
        elsif ($digit == 7)
          {
            return ("DCC");
          }
        elsif ($digit == 8)
          {
            return ("DCCC");
          }
        elsif ($digit == 9)
          {
            return ("CM");
          }
    }

    #-------------------------------------------------------------------
    # Fourth digit into roman: 1000-9000
    #
    sub digit_4_to_roman
    {
        local ($digit) = $_[0];

        if ($digit == 0)
	  {
            return ("");
          }
        elsif ($digit == 1)
          {
            return ("M");
          }
        elsif ($digit == 2)
          {
            return ("MM");
          }
        elsif ($digit == 3)
          {
            return ("MMM");
          }
        elsif ($digit == 4)
          {
            return ("MMMM");
          }
        elsif ($digit == 5)
          {
            return ("MMMMM");
          }
        elsif ($digit == 6)
          {
            return ("MMMMMM");
          }
        elsif ($digit == 7)
          {
            return ("MMMMMMM");
          }
        elsif ($digit == 8)
          {
            return ("MMMMMMMM");
          }
        elsif ($digit == 9)
          {
            return ("MMMMMMMMM");
          }
    }

    # Start the work.
    $digit_4 = int( $n / 1000 );
    $n = ($n - $digit_4*1000);
    $digit_3 = int( $n / 100 );
    $n = ($n - $digit_3*100);
    $digit_2 = int( $n / 10 );
    $n = ($n - $digit_2*10);
    $digit_1 = $n;

    return (&digit_4_to_roman($digit_4)
            . &digit_3_to_roman($digit_3)
            . &digit_2_to_roman($digit_2)
            . &digit_1_to_roman($digit_1));
} # &integer_to_roman

#-----------------------------------------------------------------------
# Minimal conversion into SP SDATA entities.
#
# &minimal_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub minimal_sp_text_to_sdata
{
    local ($line) = $_[0];

    # US-ASCII special characters for Texinfo.
    $line =~ s/\@/\\\|\[commat\]\\\|/g; # ISOnum : commercial at
    $line =~ s/\{/\\\|\[lcub  \]\\\|/g; # ISOnum : left curly bracket
    $line =~ s/\}/\\\|\[rcub  \]\\\|/g; # ISOnum : right curly bracket

    return ($line);
}

#-----------------------------------------------------------------------
# ISO 8859-1 into SP SDATA entities.
#
# &iso_8859_1_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_1_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[iexcl \]\\\|/g;	# ISOnum : INVERTED EXCLAMATION MARK
    $line =~ s/\xA2/\\\|\[cent  \]\\\|/g;	# ISOnum : CENT SIGN
    $line =~ s/\xA3/\\\|\[pound \]\\\|/g;	# ISOnum : POUND SIGN
    $line =~ s/\xA4/\\\|\[curren\]\\\|/g;	# ISOnum : CURRENCY SIGN
    $line =~ s/\xA5/\\\|\[yen   \]\\\|/g;	# ISOnum : YEN SIGN
    $line =~ s/\xA6/\\\|\[brvbar\]\\\|/g;	# ISOnum : BROKEN BAR
    $line =~ s/\xA7/\\\|\[sect  \]\\\|/g;	# ISOnum : SECTION SIGN
    $line =~ s/\xA8/\\\|\[die   \]\\\|/g;	# ISOdia : DIERESIS
    $line =~ s/\xA9/\\\|\[copy  \]\\\|/g;	# ISOnum : COPYRIGHT SIGN
    $line =~ s/\xAA/\\\|\[ordf  \]\\\|/g;	# ISOnum : FEMININE ORDINAL INDICATOR
    $line =~ s/\xAB/\\\|\[laquo \]\\\|/g;	# ISOnum : LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xAC/\\\|\[not   \]\\\|/g;	# ISOnum : NOT SIGN
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAE/\\\|\[reg   \]\\\|/g;	# ISOnum : REGISTERED SIGN
    $line =~ s/\xAF/\\\|\[macr  \]\\\|/g;	# ISOdia : OVERLINE (MACRON)
    $line =~ s/\xB0/\\\|\[deg   \]\\\|/g;	# ISOnum : DEGREE SIGN
    $line =~ s/\xB1/\\\|\[plusmn\]\\\|/g;	# ISOnum : PLUS-MINUS SIGN
    $line =~ s/\xB2/\\\|\[sup2  \]\\\|/g;	# ISOnum : SUPERSCRIPT TWO
    $line =~ s/\xB3/\\\|\[sup3  \]\\\|/g;	# ISOnum : SUPERSCRIPT THREE
    $line =~ s/\xB4/\\\|\[acute \]\\\|/g;	# ISOdia : ACUTE ACCENT
    $line =~ s/\xB5/\\\|\[micro \]\\\|/g;	# ISOnum : MICRO SIGN
    $line =~ s/\xB6/\\\|\[para  \]\\\|/g;	# ISOnum : PILCROW SIGN
    $line =~ s/\xB7/\\\|\[middot\]\\\|/g;	# ISOnum : MIDDLE DOT
    $line =~ s/\xB8/\\\|\[cedil \]\\\|/g;	# ISOdia : CEDILLA
    $line =~ s/\xB9/\\\|\[sup1  \]\\\|/g;	# ISOnum : SUPERSCRIPT ONE
    $line =~ s/\xBA/\\\|\[ordm  \]\\\|/g;	# ISOnum : MASCULINE ORDINAL INDICATOR
    $line =~ s/\xBB/\\\|\[raquo \]\\\|/g;	# ISOnum : RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xBC/\\\|\[frac14\]\\\|/g;	# ISOnum : VULGAR FRACTION ONE QUARTER
    $line =~ s/\xBD/\\\|\[frac12\]\\\|/g;	# ISOnum : VULGAR FRACTION ONE HALF
    $line =~ s/\xBE/\\\|\[frac34\]\\\|/g;	# ISOnum : VULGAR FRACTION THREE QUARTERS
    $line =~ s/\xBF/\\\|\[iquest\]\\\|/g;	# ISOnum : INVERTED QUESTION MARK
    $line =~ s/\xC0/\\\|\[Agrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH GRAVE
    $line =~ s/\xC1/\\\|\[Aacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH ACUTE
    $line =~ s/\xC2/\\\|\[Acirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xC3/\\\|\[Atilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH TILDE
    $line =~ s/\xC4/\\\|\[Auml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH DIERESIS
    $line =~ s/\xC5/\\\|\[Aring \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH RING ABOVE
    $line =~ s/\xC6/\\\|\[AElig \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER AE
    $line =~ s/\xC7/\\\|\[Ccedil\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER C WITH CEDILLA
    $line =~ s/\xC8/\\\|\[Egrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH GRAVE
    $line =~ s/\xC9/\\\|\[Eacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH ACUTE
    $line =~ s/\xCA/\\\|\[Ecirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH CIRCUMFLEX
    $line =~ s/\xCB/\\\|\[Euml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH DIERESIS
    $line =~ s/\xCC/\\\|\[Igrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH GRAVE
    $line =~ s/\xCD/\\\|\[Iacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH ACUTE
    $line =~ s/\xCE/\\\|\[Icirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xCF/\\\|\[Iuml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH DIERESIS
    $line =~ s/\xD0/\\\|\[ETH   \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER ETH (Icelandic)
    $line =~ s/\xD1/\\\|\[Ntilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER N WITH TILDE
    $line =~ s/\xD2/\\\|\[Ograve\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH GRAVE
    $line =~ s/\xD3/\\\|\[Oacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH ACUTE
    $line =~ s/\xD4/\\\|\[Ocirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xD5/\\\|\[Otilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH TILDE
    $line =~ s/\xD6/\\\|\[Ouml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH DIERESIS
    $line =~ s/\xD7/\\\|\[times \]\\\|/g;	# ISOnum : MULTIPLICATION SIGN
    $line =~ s/\xD8/\\\|\[Oslash\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH STROKE
    $line =~ s/\xD9/\\\|\[Ugrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH GRAVE
    $line =~ s/\xDA/\\\|\[Uacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH ACUTE
    $line =~ s/\xDB/\\\|\[Ucirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xDC/\\\|\[Uuml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH DIERESIS
    $line =~ s/\xDD/\\\|\[Yacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER Y WITH ACUTE
    $line =~ s/\xDE/\\\|\[THORN \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER THORN (Icelandic)
    $line =~ s/\xDF/\\\|\[szlig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER SHARP S (German)
    $line =~ s/\xE0/\\\|\[agrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH GRAVE
    $line =~ s/\xE1/\\\|\[aacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH ACUTE
    $line =~ s/\xE2/\\\|\[acirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xE3/\\\|\[atilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH TILDE
    $line =~ s/\xE4/\\\|\[auml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH DIERESIS
    $line =~ s/\xE5/\\\|\[aring \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH RING ABOVE
    $line =~ s/\xE6/\\\|\[aelig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER AE
    $line =~ s/\xE7/\\\|\[ccedil\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER C WITH CEDILLA
    $line =~ s/\xE8/\\\|\[egrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH GRAVE
    $line =~ s/\xE9/\\\|\[eacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH ACUTE
    $line =~ s/\xEA/\\\|\[ecirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH CIRCUMFLEX
    $line =~ s/\xEB/\\\|\[euml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH DIERESIS
    $line =~ s/\xEC/\\\|\[igrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH GRAVE
    $line =~ s/\xED/\\\|\[iacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH ACUTE
    $line =~ s/\xEE/\\\|\[icirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xEF/\\\|\[iuml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH DIERESIS
    $line =~ s/\xF0/\\\|\[eth   \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER ETH (Icelandic)
    $line =~ s/\xF1/\\\|\[ntilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER N WITH TILDE
    $line =~ s/\xF2/\\\|\[ograve\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH GRAVE
    $line =~ s/\xF3/\\\|\[oacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH ACUTE
    $line =~ s/\xF4/\\\|\[ocirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xF5/\\\|\[otilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH TILDE
    $line =~ s/\xF6/\\\|\[ouml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH DIERESIS
    $line =~ s/\xF7/\\\|\[divide\]\\\|/g;	# ISOnum : DIVISION SIGN
    $line =~ s/\xF8/\\\|\[oslash\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH STROKE
    $line =~ s/\xF9/\\\|\[ugrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH GRAVE
    $line =~ s/\xFA/\\\|\[uacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH ACUTE
    $line =~ s/\xFB/\\\|\[ucirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xFC/\\\|\[uuml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH DIERESIS
    $line =~ s/\xFD/\\\|\[yacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER Y WITH ACUTE
    $line =~ s/\xFE/\\\|\[thorn \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER THORN (Icelandic)
    $line =~ s/\xFF/\\\|\[yuml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER Y WITH DIERESIS

    return ($line);
}


#-----------------------------------------------------------------------
# ISO 8859-2 into SP SDATA entities.
#
# &iso_8859_2_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_2_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[Aogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER A WITH OGONEK
    $line =~ s/\xA2/\\\|\[breve \]\\\|/g;	# ISOdia : BREVE
    $line =~ s/\xA3/\\\|\[Lstrok\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER L WITH STROKE
    $line =~ s/\xA4/\\\|\[curren\]\\\|/g;	# ISOnum : CURRENCY SIGN
    $line =~ s/\xA5/\\\|\[Lcaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER L WITH CARON
    $line =~ s/\xA6/\\\|\[Sacute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH ACUTE
    $line =~ s/\xA7/\\\|\[sect  \]\\\|/g;	# ISOnum : SECTION SIGN
    $line =~ s/\xA8/\\\|\[die   \]\\\|/g;	# ISOdia : DIERESIS
    $line =~ s/\xA9/\\\|\[Scaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH CARON
    $line =~ s/\xAA/\\\|\[Scedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH CEDILLA
    $line =~ s/\xAB/\\\|\[Tcaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER T WITH CARON
    $line =~ s/\xAC/\\\|\[Zacute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER Z WITH ACUTE
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAE/\\\|\[Zcaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER Z WITH CARON
    $line =~ s/\xAF/\\\|\[Zdot  \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER Z WITH DOT ABOVE
    $line =~ s/\xB0/\\\|\[deg   \]\\\|/g;	# ISOnum : DEGREE SIGN
    $line =~ s/\xB1/\\\|\[aogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER A WITH OGONEK
    $line =~ s/\xB2/\\\|\[ogon  \]\\\|/g;	# ISOdia : OGONEK
    $line =~ s/\xB3/\\\|\[lstrok\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER L WITH STROKE
    $line =~ s/\xB4/\\\|\[acute \]\\\|/g;	# ISOdia : ACUTE ACCENT
    $line =~ s/\xB5/\\\|\[lcaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER L WITH CARON
    $line =~ s/\xB6/\\\|\[sacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER S WITH ACUTE
    $line =~ s/\xB7/\\\|\[caron \]\\\|/g;	# ISOdia : CARON
    $line =~ s/\xB8/\\\|\[cedil \]\\\|/g;	# ISOdia : CEDILLA
    $line =~ s/\xB9/\\\|\[scaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER S WITH CARON
    $line =~ s/\xBA/\\\|\[scedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER S WITH CEDILLA
    $line =~ s/\xBB/\\\|\[tcaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER T WITH CARON
    $line =~ s/\xBC/\\\|\[zacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER Z WITH ACUTE
    $line =~ s/\xBD/\\\|\[dblac \]\\\|/g;	# ISOdia : DOUBLE ACUTE ACCENT
    $line =~ s/\xBE/\\\|\[zcaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER Z WITH CARON
    $line =~ s/\xBF/\\\|\[zdot  \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER Z WITH DOT ABOVE
    $line =~ s/\xC0/\\\|\[Racute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER R WITH ACUTE
    $line =~ s/\xC1/\\\|\[Aacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH ACUTE
    $line =~ s/\xC2/\\\|\[Acirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xC3/\\\|\[Abreve\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER A WITH BREVE
    $line =~ s/\xC4/\\\|\[Auml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH DIERESIS
    $line =~ s/\xC5/\\\|\[Lacute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER L WITH ACUTE
    $line =~ s/\xC6/\\\|\[Cacute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER C WITH ACUTE
    $line =~ s/\xC7/\\\|\[Ccedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER C WITH CEDILLA
    $line =~ s/\xC8/\\\|\[Ccaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER C WITH CARON
    $line =~ s/\xC9/\\\|\[Eacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH ACUTE
    $line =~ s/\xCA/\\\|\[Eogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH OGONEK
    $line =~ s/\xCB/\\\|\[Euml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH DIERESIS
    $line =~ s/\xCC/\\\|\[Ecaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH CARON
    $line =~ s/\xCD/\\\|\[Iacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH ACUTE
    $line =~ s/\xCE/\\\|\[Icirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xCF/\\\|\[Dcaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER D WITH CARON
    $line =~ s/\xD0/\\\|\[Dstrok\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER D WITH STROKE
    $line =~ s/\xD1/\\\|\[Nacute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER N WITH ACUTE
    $line =~ s/\xD2/\\\|\[Ncaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER N WITH CARON
    $line =~ s/\xD3/\\\|\[Oacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH ACUTE
    $line =~ s/\xD4/\\\|\[Ocirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xD5/\\\|\[Odblac\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
    $line =~ s/\xD6/\\\|\[Ouml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH DIERESIS
    $line =~ s/\xD7/\\\|\[times \]\\\|/g;	# ISOnum : MULTIPLICATION SIGN
    $line =~ s/\xD8/\\\|\[Rcaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER R WITH CARON
    $line =~ s/\xD9/\\\|\[Uring \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH RING ABOVE
    $line =~ s/\xDA/\\\|\[Uacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH ACUTE
    $line =~ s/\xDB/\\\|\[Udblac\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
    $line =~ s/\xDC/\\\|\[Uuml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH DIERESIS
    $line =~ s/\xDD/\\\|\[Yacute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER Y WITH ACUTE
    $line =~ s/\xDE/\\\|\[Tcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER T WITH CEDILLA
    $line =~ s/\xDF/\\\|\[szlig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER SHARP S (German)
    $line =~ s/\xE0/\\\|\[racute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER R WITH ACUTE
    $line =~ s/\xE1/\\\|\[aacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH ACUTE
    $line =~ s/\xE2/\\\|\[acirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xE3/\\\|\[abreve\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER A WITH BREVE
    $line =~ s/\xE4/\\\|\[auml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH DIERESIS
    $line =~ s/\xE5/\\\|\[lacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER L WITH ACUTE
    $line =~ s/\xE6/\\\|\[cacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER C WITH ACUTE
    $line =~ s/\xE7/\\\|\[ccedil\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER C WITH CEDILLA
    $line =~ s/\xE8/\\\|\[ccaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER C WITH CARON
    $line =~ s/\xE9/\\\|\[eacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH ACUTE
    $line =~ s/\xEA/\\\|\[eogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH OGONEK
    $line =~ s/\xEB/\\\|\[euml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH DIERESIS
    $line =~ s/\xEC/\\\|\[ecaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH CARON
    $line =~ s/\xED/\\\|\[iacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH ACUTE
    $line =~ s/\xEE/\\\|\[icirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xEF/\\\|\[dcaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER D WITH CARON
    $line =~ s/\xF0/\\\|\[dstrok\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER D WITH STROKE
    $line =~ s/\xF1/\\\|\[nacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER N WITH ACUTE
    $line =~ s/\xF2/\\\|\[ncaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER N WITH CARON
    $line =~ s/\xF3/\\\|\[oacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH ACUTE
    $line =~ s/\xF4/\\\|\[ocirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xF5/\\\|\[odblac\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER O WITH DOUBLE ACUTE
    $line =~ s/\xF6/\\\|\[ouml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH DIERESIS
    $line =~ s/\xF7/\\\|\[divide\]\\\|/g;	# ISOnum : DIVISION SIGN
    $line =~ s/\xF8/\\\|\[rcaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER R WITH CARON
    $line =~ s/\xF9/\\\|\[uring \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER U WITH RING ABOVE
    $line =~ s/\xFA/\\\|\[uacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH ACUTE
    $line =~ s/\xFB/\\\|\[udblac\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER U WITH DOUBLE ACUTE
    $line =~ s/\xFC/\\\|\[uuml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH DIERESIS
    $line =~ s/\xFD/\\\|\[yacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER Y WITH ACUTE
    $line =~ s/\xFE/\\\|\[tcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER T WITH CEDILLA
    $line =~ s/\xFF/\\\|\[dot   \]\\\|/g;	# ISOdia : DOT ABOVE

    return ($line);
}


#-----------------------------------------------------------------------
# ISO 8859-3 into SP SDATA entities.
#
# &iso_8859_3_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_3_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[Hstrok\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER H WITH STROKE
    $line =~ s/\xA2/\\\|\[breve \]\\\|/g;	# ISOdia : BREVE
    $line =~ s/\xA3/\\\|\[pound \]\\\|/g;	# ISOnum : POUND SIGN
    $line =~ s/\xA4/\\\|\[curren\]\\\|/g;	# ISOnum : CURRENCY SIGN
    $line =~ s/\xA6/\\\|\[Hcirc \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER H WITH CIRCUMFLEX
    $line =~ s/\xA7/\\\|\[sect  \]\\\|/g; 	# ISOnum : SECTION SIGN
    $line =~ s/\xA8/\\\|\[die   \]\\\|/g;  	# ISOdia : DIERESIS
    $line =~ s/\xA9/\\\|\[Idot  \]\\\|/g; 	# ISOlat2: LATIN CAPITAL LETTER I WITH DOT ABOVE
    $line =~ s/\xAA/\\\|\[Scedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH CEDILLA
    $line =~ s/\xAB/\\\|\[Gbreve\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER G WITH BREVE
    $line =~ s/\xAC/\\\|\[Jcirc \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER J WITH CIRCUMFLEX
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;  	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAF/\\\|\[Zdot  \]\\\|/g; 	# ISOlat2: LATIN CAPITAL LETTER Z WITH DOT ABOVE
    $line =~ s/\xB0/\\\|\[deg   \]\\\|/g;  	# ISOnum : DEGREE SIGN
    $line =~ s/\xB1/\\\|\[hstrok\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER H WITH STROKE
    $line =~ s/\xB2/\\\|\[sup2  \]\\\|/g; 	# ISOnum : SUPERSCRIPT TWO
    $line =~ s/\xB3/\\\|\[sup3  \]\\\|/g; 	# ISOnum : SUPERSCRIPT THREE
    $line =~ s/\xB4/\\\|\[acute \]\\\|/g;	# ISOdia : ACUTE ACCENT
    $line =~ s/\xB5/\\\|\[micro \]\\\|/g;	# ISOnum : MICRO SIGN
    $line =~ s/\xB6/\\\|\[hcirc \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER H WITH CIRCUMFLEX
    $line =~ s/\xB7/\\\|\[middot\]\\\|/g;	# ISOnum : MIDDLE DOT
    $line =~ s/\xB8/\\\|\[cedil \]\\\|/g;	# ISOdia : CEDILLA
    $line =~ s/\xB9/\\\|\[inodot\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER I DOT LESS
    $line =~ s/\xBA/\\\|\[scedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER S WITH CEDILLA
    $line =~ s/\xBB/\\\|\[gbreve\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER G WITH BREVE
    $line =~ s/\xBC/\\\|\[jcirc \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER J WITH CIRCUMFLEX
    $line =~ s/\xBD/\\\|\[frac12\]\\\|/g; 	# ISOnum : VULGAR FRACTION ONE HALF
    $line =~ s/\xBF/\\\|\[zdot  \]\\\|/g; 	# ISOlat2: LATIN SMALL LETTER Z WITH DOT ABOVE
    $line =~ s/\xC0/\\\|\[Agrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH GRAVE
    $line =~ s/\xC1/\\\|\[Aacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH ACUTE
    $line =~ s/\xC2/\\\|\[Acirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xC4/\\\|\[Auml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER A WITH DIERESIS
    $line =~ s/\xC5/\\\|\[Cdot  \]\\\|/g; 	# ISOlat2: LATIN CAPITAL LETTER C WITH DOT ABOVE
    $line =~ s/\xC6/\\\|\[Ccirc \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER C WITH CIRCUMFLEX
    $line =~ s/\xC7/\\\|\[Ccedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER C WITH CEDILLA
    $line =~ s/\xC8/\\\|\[Egrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH GRAVE
    $line =~ s/\xC9/\\\|\[Eacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH ACUTE
    $line =~ s/\xCA/\\\|\[Ecirc \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH CIRCUMFLEX
    $line =~ s/\xCB/\\\|\[Euml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER E WITH DIERESIS
    $line =~ s/\xCC/\\\|\[Igrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH GRAVE
    $line =~ s/\xCD/\\\|\[Iacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH ACUTE
    $line =~ s/\xCE/\\\|\[Icirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xCF/\\\|\[Iuml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER I WITH DIERESIS
    $line =~ s/\xD1/\\\|\[Ntilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER N WITH TILDE
    $line =~ s/\xD2/\\\|\[Ograve\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH GRAVE
    $line =~ s/\xD3/\\\|\[Oacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH ACUTE
    $line =~ s/\xD4/\\\|\[Ocirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xD5/\\\|\[Gdot  \]\\\|/g; 	# ISOlat2: LATIN CAPITAL LETTER G WITH DOT ABOVE
    $line =~ s/\xD6/\\\|\[Ouml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER O WITH DIERESIS
    $line =~ s/\xD7/\\\|\[times \]\\\|/g;	# ISOnum : MULTIPLICATION SIGN
    $line =~ s/\xD8/\\\|\[Gcirc \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER G WITH CIRCUMFLEX
    $line =~ s/\xD9/\\\|\[Ugrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH GRAVE ABOVE
    $line =~ s/\xDA/\\\|\[Uacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH ACUTE
    $line =~ s/\xDB/\\\|\[Ucirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xDC/\\\|\[Uuml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER U WITH DIERESIS
    $line =~ s/\xDD/\\\|\[Ubreve\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH BREVE
    $line =~ s/\xDE/\\\|\[Scirc \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH CIRCUMFLEX
    $line =~ s/\xDF/\\\|\[szlig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER SHARP S (German)
    $line =~ s/\xE0/\\\|\[agrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH GRAVE
    $line =~ s/\xE1/\\\|\[aacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH ACUTE
    $line =~ s/\xE2/\\\|\[acirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xE4/\\\|\[auml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER A WITH DIERESIS
    $line =~ s/\xE5/\\\|\[cdot  \]\\\|/g; 	# ISOlat2: LATIN SMALL LETTER C WITH DOT ABOVE
    $line =~ s/\xE6/\\\|\[ccirce\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER C WITH CIRCUMFLEX
    $line =~ s/\xE7/\\\|\[ccedil\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER C WITH CEDILLA
    $line =~ s/\xE8/\\\|\[egrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH GRAVE
    $line =~ s/\xE9/\\\|\[eacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH ACUTE
    $line =~ s/\xEA/\\\|\[ecirc \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH CIRCUMFLEX
    $line =~ s/\xEB/\\\|\[euml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER E WITH DIERESIS
    $line =~ s/\xEC/\\\|\[igrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH GRAVE
    $line =~ s/\xED/\\\|\[iacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH ACUTE
    $line =~ s/\xEE/\\\|\[icirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xEF/\\\|\[iuml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER I WITH DIERESIS
    $line =~ s/\xF1/\\\|\[ntilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER N WITH TILDE
    $line =~ s/\xF2/\\\|\[ograve\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH GRAVE
    $line =~ s/\xF3/\\\|\[oacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH ACUTE
    $line =~ s/\xF4/\\\|\[ocirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xF5/\\\|\[gdot  \]\\\|/g; 	# ISOlat2: LATIN SMALL LETTER G WITH DOT ABOVE
    $line =~ s/\xF6/\\\|\[ouml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER O WITH DIERESIS
    $line =~ s/\xF7/\\\|\[divide\]\\\|/g;	# ISOnum : DIVISION SIGN
    $line =~ s/\xF8/\\\|\[gcirc \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER G WITH CIRCUMFLEX
    $line =~ s/\xF9/\\\|\[ugrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH GRAVE
    $line =~ s/\xFA/\\\|\[uacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH ACUTE
    $line =~ s/\xFB/\\\|\[ucirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xFC/\\\|\[uuml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER U WITH DIERESIS
    $line =~ s/\xFD/\\\|\[ubreve\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER U WITH BREVE
    $line =~ s/\xFE/\\\|\[scirc \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER S WITH CIRCUMFLEX
    $line =~ s/\xFF/\\\|\[dot   \]\\\|/g;  	# ISOdia : DOT ABOVE

    return ($line);
}

#-----------------------------------------------------------------------
# ISO 8859-4 into SP SDATA entities.
#
# &iso_8859_4_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_4_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[Aogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER A WITH OGONEK
    $line =~ s/\xA2/\\\|\[kgreen\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER KRA (Greenlandic)
    $line =~ s/\xA3/\\\|\[Rcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER R WITH CEDILLA
    $line =~ s/\xA4/\\\|\[curren\]\\\|/g;	# ISOnum : CURRENCY SIGN
    $line =~ s/\xA5/\\\|\[Itilde\]\\\|/g;     	# ISOlat2: LATIN CAPITAL LETTER I WITH TILDE
    $line =~ s/\xA6/\\\|\[Lcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER L WITH CEDILLA
    $line =~ s/\xA7/\\\|\[sect  \]\\\|/g; 	# ISOnum : SECTION SIGN
    $line =~ s/\xA8/\\\|\[die   \]\\\|/g;  	# ISOdia : DIERESIS
    $line =~ s/\xA9/\\\|\[Scaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH CARON
    $line =~ s/\xAA/\\\|\[Emacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH MACRON
    $line =~ s/\xAB/\\\|\[Gcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER G WITH CEDILLA
    $line =~ s/\xAC/\\\|\[Tstrok\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER T WITH STROKE
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;  	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAE/\\\|\[Zcaron\]\\\|/g;     	# ISOlat2: LATIN CAPITAL LETTER Z WITH CARON
    $line =~ s/\xAF/\\\|\[macr  \]\\\|/g; 	# ISOdia : MACRON
    $line =~ s/\xB0/\\\|\[deg   \]\\\|/g;  	# ISOnum : DEGREE SIGN
    $line =~ s/\xB1/\\\|\[aogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER A WITH OGONEK
    $line =~ s/\xB2/\\\|\[ogon  \]\\\|/g; 	# ISOdia : OGONEK
    $line =~ s/\xB3/\\\|\[rcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER R WITH CEDILLA
    $line =~ s/\xB4/\\\|\[acute \]\\\|/g;	# ISOdia : ACUTE ACCENT
    $line =~ s/\xB5/\\\|\[itilde\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER I WITH TILDE
    $line =~ s/\xB6/\\\|\[lcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER L WITH CEDILLA
    $line =~ s/\xB7/\\\|\[caron \]\\\|/g;	# ISOdia : CARON
    $line =~ s/\xB8/\\\|\[cedil \]\\\|/g;	# ISOdia : CEDILLA
    $line =~ s/\xB9/\\\|\[scaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER S WITH CARON
    $line =~ s/\xBA/\\\|\[emacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH MACRON
    $line =~ s/\xBB/\\\|\[gcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER G WITH CEDILLA
    $line =~ s/\xBC/\\\|\[tstrok\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER J WITH STROKE
    $line =~ s/\xBD/\\\|\[ENG   \]\\\|/g;  	# ISOlat2: LATIN CAPITAL LETTER ENG (Lappish)
    $line =~ s/\xBE/\\\|\[zcaron\]\\\|/g;    	# ISOlat2: LATIN SMALL LETTER Z WITH CARON
    $line =~ s/\xBF/\\\|\[eng   \]\\\|/g;  	# ISOlat2: LATIN SMALL LETTER ENG (Lappish)
    $line =~ s/\xC0/\\\|\[Amacr \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH MACRON
    $line =~ s/\xC1/\\\|\[Aacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH ACUTE
    $line =~ s/\xC2/\\\|\[Acirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xC3/\\\|\[Atilde\]\\\|/g;     	# ISOlat1: LATIN CAPITAL LETTER A WITH TILDE
    $line =~ s/\xC4/\\\|\[Auml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER A WITH DIERESIS
    $line =~ s/\xC5/\\\|\[Aring \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH RING ABOVE
    $line =~ s/\xC6/\\\|\[AElig \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER AE
    $line =~ s/\xC7/\\\|\[Iogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER I WITH OGONEK
    $line =~ s/\xC8/\\\|\[Ccaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER C WITH CARON
    $line =~ s/\xC9/\\\|\[Eacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH ACUTE
    $line =~ s/\xCA/\\\|\[Eogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH OGONEK
    $line =~ s/\xCB/\\\|\[Euml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER E WITH DIERESIS
    $line =~ s/\xCC/\\\|\[Edot  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER E WITH DOT ABOVE
    $line =~ s/\xCD/\\\|\[Iacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH ACUTE
    $line =~ s/\xCE/\\\|\[Icirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xCF/\\\|\[Imacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER I WITH MACRON
    $line =~ s/\xD0/\\\|\[Dstrok\]\\\|/g;     	# ISOlat2: LATIN CAPITAL LETTER D WITH STROKE
    $line =~ s/\xD1/\\\|\[Ncedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER N WITH CEDILLA
    $line =~ s/\xD2/\\\|\[Omacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER O WITH MACRON
    $line =~ s/\xD3/\\\|\[Kcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER K WITH CEDILLA
    $line =~ s/\xD4/\\\|\[Ocirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xD5/\\\|\[Otilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH TILDE
    $line =~ s/\xD6/\\\|\[Ouml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER O WITH DIERESIS
    $line =~ s/\xD7/\\\|\[times \]\\\|/g;	# ISOnum : MULTIPLICATION SIGN
    $line =~ s/\xD8/\\\|\[Oslash\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH STROKE
    $line =~ s/\xD9/\\\|\[Uogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH OGONEK
    $line =~ s/\xDA/\\\|\[Uacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH ACUTE
    $line =~ s/\xDB/\\\|\[Ucirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xDC/\\\|\[Uuml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER U WITH DIERESIS
    $line =~ s/\xDD/\\\|\[Utilde\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH TILDE
    $line =~ s/\xDE/\\\|\[Umacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH MACRON
    $line =~ s/\xDF/\\\|\[szlig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER SHARP S (German)
    $line =~ s/\xE0/\\\|\[amacr \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH MACRON
    $line =~ s/\xE1/\\\|\[aacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH ACUTE
    $line =~ s/\xE2/\\\|\[acirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xE3/\\\|\[atilde\]\\\|/g;     	# ISOlat1: LATIN SMALL LETTER A WITH TILDE
    $line =~ s/\xE4/\\\|\[auml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER A WITH DIERESIS
    $line =~ s/\xE5/\\\|\[aring \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH RING ABOVE
    $line =~ s/\xE6/\\\|\[aelig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER AE
    $line =~ s/\xE7/\\\|\[iogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER I WITH OGONEK
    $line =~ s/\xE8/\\\|\[ccaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER C WITH CARON
    $line =~ s/\xE9/\\\|\[eacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH ACUTE
    $line =~ s/\xEA/\\\|\[eogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH OGONEK
    $line =~ s/\xEB/\\\|\[euml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER E WITH DIERESIS
    $line =~ s/\xEC/\\\|\[edot  \]\\\|/g; 	# ISOlat2: LATIN SMALL LETTER E WITH DOT ABOVE
    $line =~ s/\xED/\\\|\[iacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH ACUTE
    $line =~ s/\xEE/\\\|\[icirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xEF/\\\|\[imacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER I WITH MACRON
    $line =~ s/\xF0/\\\|\[dstrok\]\\\|/g;    	# ISOlat2: LATIN SMALL LETTER D WITH STROKE
    $line =~ s/\xF1/\\\|\[ncedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER N WITH CEDILLA
    $line =~ s/\xF2/\\\|\[omacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER O WITH MACRON
    $line =~ s/\xF3/\\\|\[kcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER K WITH CEDILLA
    $line =~ s/\xF4/\\\|\[ocirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xF5/\\\|\[otilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH TILDE
    $line =~ s/\xF6/\\\|\[ouml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER O WITH DIERESIS
    $line =~ s/\xF7/\\\|\[divide\]\\\|/g;	# ISOnum : DIVISION SIGN
    $line =~ s/\xF8/\\\|\[oslash\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH STROKE
    $line =~ s/\xF9/\\\|\[uogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER U WITH OGONEK
    $line =~ s/\xFA/\\\|\[uacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH ACUTE
    $line =~ s/\xFB/\\\|\[ucirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xFC/\\\|\[uuml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER U WITH DIERESIS
    $line =~ s/\xFD/\\\|\[utilde\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER U WITH TILDE
    $line =~ s/\xFE/\\\|\[umacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER U WITH MACRON
    $line =~ s/\xFF/\\\|\[dot   \]\\\|/g;  	# ISOdia : DOT ABOVE

    return ($line);
}


#-----------------------------------------------------------------------
# ISO 8859-5 into SP SDATA entities.
#
# &iso_8859_5_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_5_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[IOcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER IO
    $line =~ s/\xA2/\\\|\[DJcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER DJE (Serbocroatian)
    $line =~ s/\xA3/\\\|\[GJcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER GJE (Macedonian)
    $line =~ s/\xA4/\\\|\[IEcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER UKRAINIAN IE
    $line =~ s/\xA5/\\\|\[DScy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER DZE (Macedonian)
    $line =~ s/\xA6/\\\|\[Iukcy \]\\\|/g;	# ISOcyr2: CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
    $line =~ s/\xA7/\\\|\[YIcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER YI (Ukrainian)
    $line =~ s/\xA8/\\\|\[Jukcy \]\\\|/g;	# ISOcyr2: CYRILLIC CAPITAL LETTER JE
    $line =~ s/\xA9/\\\|\[LJcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER LJE
    $line =~ s/\xAA/\\\|\[NJcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER NJE
    $line =~ s/\xAB/\\\|\[TSHcy \]\\\|/g;	# ISOcyr2: CYRILLIC CAPITAL LETTER TSHE (Serbocroatian)
    $line =~ s/\xAC/\\\|\[KJcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER KJE (Macedonian)
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;  	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAE/\\\|\[Ubrcy \]\\\|/g;	# ISOcyr2: CYRILLIC CAPITAL LETTER SHORT U (Byelorussian)
    $line =~ s/\xAF/\\\|\[DZcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC CAPITAL LETTER DZHE
    $line =~ s/\xB0/\\\|\[Acy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER A
    $line =~ s/\xB1/\\\|\[Bcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER BE
    $line =~ s/\xB2/\\\|\[Vcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER VE
    $line =~ s/\xB3/\\\|\[Gcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER GHE
    $line =~ s/\xB4/\\\|\[Dcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER DE
    $line =~ s/\xB5/\\\|\[IEcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER IE
    $line =~ s/\xB6/\\\|\[ZHcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER ZHE
    $line =~ s/\xB7/\\\|\[Zcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER ZE
    $line =~ s/\xB8/\\\|\[Icy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER I
    $line =~ s/\xB9/\\\|\[Jcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER SHORT I
    $line =~ s/\xBA/\\\|\[Kcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER KA
    $line =~ s/\xBB/\\\|\[Lcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER EL
    $line =~ s/\xBC/\\\|\[Mcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER EM
    $line =~ s/\xBD/\\\|\[Ncy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER EN
    $line =~ s/\xBE/\\\|\[Ocy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER O
    $line =~ s/\xBF/\\\|\[Pcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER PE
    $line =~ s/\xC0/\\\|\[Rcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER ER
    $line =~ s/\xC1/\\\|\[Scy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER ES
    $line =~ s/\xC2/\\\|\[Tcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER TE
    $line =~ s/\xC3/\\\|\[Ucy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER U
    $line =~ s/\xC4/\\\|\[Fcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER EF
    $line =~ s/\xC5/\\\|\[KHcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER HA
    $line =~ s/\xC6/\\\|\[TScy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER TSE
    $line =~ s/\xC7/\\\|\[CHcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER CHE
    $line =~ s/\xC8/\\\|\[SHcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER SHA
    $line =~ s/\xC9/\\\|\[SHCHcy\]\\\|/g;	# ISOcyr1: CYRILLIC CAPITAL LETTER SHCHA
    $line =~ s/\xCA/\\\|\[HARDcy\]\\\|/g;	# ISOcyr1: CYRILLIC CAPITAL LETTER HARD SIGN
    $line =~ s/\xCB/\\\|\[Ycy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER YERU
    $line =~ s/\xCC/\\\|\[SOFTcy\]\\\|/g;	# ISOcyr1: CYRILLIC CAPITAL LETTER SOFT SIGN
    $line =~ s/\xCD/\\\|\[Ecy   \]\\\|/g;  	# ISOcyr1: CYRILLIC CAPITAL LETTER E
    $line =~ s/\xCE/\\\|\[YUcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER YU
    $line =~ s/\xCF/\\\|\[YAcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC CAPITAL LETTER YA
    $line =~ s/\xD0/\\\|\[acy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER A
    $line =~ s/\xD1/\\\|\[bcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER BE
    $line =~ s/\xD2/\\\|\[vcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER VE
    $line =~ s/\xD3/\\\|\[gcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER GHE
    $line =~ s/\xD4/\\\|\[dcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER DE
    $line =~ s/\xD5/\\\|\[iecy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER IE
    $line =~ s/\xD6/\\\|\[zhcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER ZHE
    $line =~ s/\xD7/\\\|\[zcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER ZE
    $line =~ s/\xD8/\\\|\[icy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER I
    $line =~ s/\xD9/\\\|\[jcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER SHORT I
    $line =~ s/\xDA/\\\|\[kcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER KA
    $line =~ s/\xDB/\\\|\[lcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER EL
    $line =~ s/\xDC/\\\|\[mcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER EM
    $line =~ s/\xDD/\\\|\[ncy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER EN
    $line =~ s/\xDE/\\\|\[ocy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER O
    $line =~ s/\xDF/\\\|\[pcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER PE
    $line =~ s/\xE0/\\\|\[rcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER ER
    $line =~ s/\xE1/\\\|\[scy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER ES
    $line =~ s/\xE2/\\\|\[tcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER TE
    $line =~ s/\xE3/\\\|\[ucy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER U
    $line =~ s/\xE4/\\\|\[fcy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER EF
    $line =~ s/\xE5/\\\|\[khcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER HA
    $line =~ s/\xE6/\\\|\[tscy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER TSE
    $line =~ s/\xE7/\\\|\[chcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER CHE
    $line =~ s/\xE8/\\\|\[shcy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER SHA
    $line =~ s/\xE9/\\\|\[shchcy\]\\\|/g;	# ISOcyr1: CYRILLIC SMALL LETTER SHCHA
    $line =~ s/\xEA/\\\|\[hardcy\]\\\|/g;	# ISOcyr1: CYRILLIC SMALL LETTER HARD SIGN
    $line =~ s/\xEB/\\\|\[ycy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER YERU
    $line =~ s/\xEC/\\\|\[softcy\]\\\|/g;	# ISOcyr1: CYRILLIC SMALL LETTER SOFT SIGN
    $line =~ s/\xED/\\\|\[ecy   \]\\\|/g;  	# ISOcyr1: CYRILLIC SMALL LETTER E
    $line =~ s/\xEE/\\\|\[yucy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER YU
    $line =~ s/\xEF/\\\|\[yacy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER YA
    $line =~ s/\xF0/\\\|\[numero\]\\\|/g;	# ISOcyr1: NUMERO SIGN
    $line =~ s/\xF1/\\\|\[iocy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER IO
    $line =~ s/\xF2/\\\|\[djcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER DJE (Serbocroatian)
    $line =~ s/\xF3/\\\|\[gjcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER GJE (Macedonian)
    $line =~ s/\xF4/\\\|\[iecy  \]\\\|/g; 	# ISOcyr1: CYRILLIC SMALL LETTER UKRAINIAN IE
    $line =~ s/\xF5/\\\|\[dscy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER DZE (Macedonian)
    $line =~ s/\xF6/\\\|\[iukcy \]\\\|/g;	# ISOcyr2: CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
    $line =~ s/\xF7/\\\|\[yicy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER YI (Ukrainian)
    $line =~ s/\xF8/\\\|\[jsercy\]\\\|/g;	# ISOcyr2: CYRILLIC SMALL LETTER JE
    $line =~ s/\xF9/\\\|\[ljcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER LJE
    $line =~ s/\xFA/\\\|\[njcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER NJE
    $line =~ s/\xFB/\\\|\[tshcy \]\\\|/g;	# ISOcyr2: CYRILLIC SMALL LETTER TSHE (Serbocroatian)
    $line =~ s/\xFC/\\\|\[kjcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER KJE (Macedonian)
    $line =~ s/\xFD/\\\|\[sect  \]\\\|/g; 	# ISOnum : SECTION SIGN
    $line =~ s/\xFE/\\\|\[ubrcy \]\\\|/g;	# ISOcyr2: CYRILLIC SMALL LETTER SHORT U (Byelorussian)
    $line =~ s/\xFF/\\\|\[dzcy  \]\\\|/g; 	# ISOcyr2: CYRILLIC SMALL LETTER DZHE

    return ($line);
}

#-----------------------------------------------------------------------
# ISO 8859-6 into SP SDATA entities.
#
# There is no ISO entities for arabic characters.
#
# &iso_8859_6_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_6_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA4/\\\|\[curren\]\\\|/g;	# ISOnum : CURRENCY SIGN
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;  	# ISOnum : SOFT HYPHEN

    return ($line);
}

#-----------------------------------------------------------------------
# ISO 8859-7 into SP SDATA entities.
#
# &iso_8859_7_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_7_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[lsquo \]\\\|/g;	# ISOnum : SINGLE HIGH-REVERSED-9 QUOTATION MARK
    $line =~ s/\xA2/\\\|\[rsquo \]\\\|/g;	# ISOnum : RIGHT SINGLE QUOTATION MARK
    $line =~ s/\xA3/\\\|\[pound \]\\\|/g;	# ISOnum : POUND SIGN
    $line =~ s/\xA6/\\\|\[brvbar\]\\\|/g;	# ISOnum : BROKEN BAR
    $line =~ s/\xA7/\\\|\[sect  \]\\\|/g; 	# ISOnum : SECTION SIGN
    $line =~ s/\xA8/\\\|\[die   \]\\\|/g;  	# ISOdia : DIERESIS
    $line =~ s/\xA9/\\\|\[copy  \]\\\|/g; 	# ISOnum : COPYRIGHT SIGN
    $line =~ s/\xAB/\\\|\[laquo \]\\\|/g;	# ISOnum : LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xAC/\\\|\[not   \]\\\|/g;  	# ISOnum : NOT SIGN
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;  	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAF/\\\|\[mdash \]\\\|/g;	# ISOpub : EM DASH
    $line =~ s/\xB0/\\\|\[deg   \]\\\|/g;  	# ISOnum : DEGREE SIGN
    $line =~ s/\xB1/\\\|\[plusmn\]\\\|/g;	# ISOnum : PLUS-MINUS SIGN
    $line =~ s/\xB2/\\\|\[sup2  \]\\\|/g; 	# ISOnum : SUPERSCRIPT TWO
    $line =~ s/\xB3/\\\|\[sup3  \]\\\|/g; 	# ISOnum : SUPERSCRIPT THREE
    $line =~ s/\xB4/\\\|\[acute \]\\\|/g;	# ISOdia : ACUTE ACCENT
    $line =~ s/\xB5/\\\|\[diagr \]\\\|/g;	# ISOgrk?: ACUTE ACCENT AND DIERESIS (Tonos and Dialytika)
    $line =~ s/\xB6/\\\|\[Aacgr \]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER ALPHA WITH ACUTE
    $line =~ s/\xB7/\\\|\[middot\]\\\|/g;	# ISOnum : MIDDLE DOT
    $line =~ s/\xB8/\\\|\[Eacgr \]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER EPSILON WITH ACUTE
    $line =~ s/\xB9/\\\|\[EEacgr\]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER ETA WITH ACUTE
    $line =~ s/\xBA/\\\|\[Iacgr \]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER IOTA WITH ACUTE
    $line =~ s/\xBB/\\\|\[raquo \]\\\|/g;	# ISOnum : RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xBC/\\\|\[Oacgr \]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER OMICRON WITH ACUTE
    $line =~ s/\xBD/\\\|\[frac12\]\\\|/g; 	# ISOnum : VULGAR FRACTION ONE HALF
    $line =~ s/\xBE/\\\|\[Uacgr \]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER UPSILON WITH ACUTE
    $line =~ s/\xBF/\\\|\[OHacgr\]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER OMEGA WITH ACUTE
    $line =~ s/\xC0/\\\|\[idiagr\]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER IOTA WITH ACUTE AND DIERESIS
    $line =~ s/\xC1/\\\|\[Agr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER ALPHA
    $line =~ s/\xC2/\\\|\[Bgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER BETA
    $line =~ s/\xC3/\\\|\[Ggr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER GAMMA
    $line =~ s/\xC4/\\\|\[Dgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER DELTA
    $line =~ s/\xC5/\\\|\[Egr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER EPSILON
    $line =~ s/\xC6/\\\|\[Zgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER ZETA
    $line =~ s/\xC7/\\\|\[EEgr  \]\\\|/g; 	# ISOgrk1: GREEK CAPITAL LETTER ETA
    $line =~ s/\xC8/\\\|\[THgr  \]\\\|/g; 	# ISOgrk1: GREEK CAPITAL LETTER THETA
    $line =~ s/\xC9/\\\|\[Igr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER IOTA
    $line =~ s/\xCA/\\\|\[Kgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER KAPPA
    $line =~ s/\xCB/\\\|\[Lgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER LAMBDA
    $line =~ s/\xCC/\\\|\[Mgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER MU
    $line =~ s/\xCD/\\\|\[Ngr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER NU
    $line =~ s/\xCE/\\\|\[Xgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER XI
    $line =~ s/\xCF/\\\|\[Ogr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER OMICRON
    $line =~ s/\xD0/\\\|\[Pgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER PI
    $line =~ s/\xD1/\\\|\[Rgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER RHO
    $line =~ s/\xD3/\\\|\[Sgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER SIGMA
    $line =~ s/\xD4/\\\|\[Tgr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER TAU
    $line =~ s/\xD5/\\\|\[Ugr   \]\\\|/g;  	# ISOgrk1: GREEK CAPITAL LETTER UPSILON
    $line =~ s/\xD6/\\\|\[PHgr  \]\\\|/g; 	# ISOgrk1: GREEK CAPITAL LETTER PHI
    $line =~ s/\xD7/\\\|\[KHgr  \]\\\|/g; 	# ISOgrk1: GREEK CAPITAL LETTER CHI
    $line =~ s/\xD8/\\\|\[PSgr  \]\\\|/g; 	# ISOgrk1: GREEK CAPITAL LETTER PSI
    $line =~ s/\xD9/\\\|\[OHgr  \]\\\|/g; 	# ISOgrk1: GREEK CAPITAL LETTER OMEGA
    $line =~ s/\xDA/\\\|\[Idigr \]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER IOTA WITH DIERESIS
    $line =~ s/\xDB/\\\|\[Udigr \]\\\|/g;	# ISOgrk2: GREEK CAPITAL LETTER UPSILON WITH DIERESIS
    $line =~ s/\xDC/\\\|\[aacgr \]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER ALPHA WITH ACUTE
    $line =~ s/\xDD/\\\|\[eacgr \]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER EPSILON WITH ACUTE
    $line =~ s/\xDE/\\\|\[eeacgr\]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER ETA WITH ACUTE
    $line =~ s/\xDF/\\\|\[iacgr \]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER IOTA WITH ACUTE
    $line =~ s/\xE0/\\\|\[udiagr\]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER UPSILON WITH ACUTE AND DIERESIS
    $line =~ s/\xE1/\\\|\[agr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER ALPHA
    $line =~ s/\xE2/\\\|\[bgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER BETA
    $line =~ s/\xE3/\\\|\[ggr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER GAMMA
    $line =~ s/\xE4/\\\|\[dgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER DELTA
    $line =~ s/\xE5/\\\|\[egr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER EPSILON
    $line =~ s/\xE6/\\\|\[zgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER ZETA
    $line =~ s/\xE7/\\\|\[eegr  \]\\\|/g; 	# ISOgrk1: GREEK SMALL LETTER ETA
    $line =~ s/\xE8/\\\|\[thgr  \]\\\|/g; 	# ISOgrk1: GREEK SMALL LETTER THETA
    $line =~ s/\xE9/\\\|\[igr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER IOTA
    $line =~ s/\xEA/\\\|\[kgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER KAPPA
    $line =~ s/\xEB/\\\|\[lgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER LAMBDA
    $line =~ s/\xEC/\\\|\[mgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER MU
    $line =~ s/\xED/\\\|\[ngr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER NU
    $line =~ s/\xEE/\\\|\[xgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER XI
    $line =~ s/\xEF/\\\|\[ogr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER OMICRON
    $line =~ s/\xF0/\\\|\[pgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER PI
    $line =~ s/\xF1/\\\|\[rgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER RHO
    $line =~ s/\xF2/\\\|\[sfgr  \]\\\|/g; 	# ISOgrk1: GREEK SMALL LETTER FINAL SIGMA
    $line =~ s/\xF3/\\\|\[sgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER SIGMA
    $line =~ s/\xF4/\\\|\[tgr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER TAU
    $line =~ s/\xF5/\\\|\[ugr   \]\\\|/g;  	# ISOgrk1: GREEK SMALL LETTER UPSILON
    $line =~ s/\xF6/\\\|\[phgr  \]\\\|/g; 	# ISOgrk1: GREEK SMALL LETTER PHI
    $line =~ s/\xF7/\\\|\[khgr  \]\\\|/g; 	# ISOgrk1: GREEK SMALL LETTER CHI
    $line =~ s/\xF8/\\\|\[psgr  \]\\\|/g; 	# ISOgrk1: GREEK SMALL LETTER PSI
    $line =~ s/\xF9/\\\|\[ohgr  \]\\\|/g; 	# ISOgrk1: GREEK SMALL LETTER OMEGA
    $line =~ s/\xFA/\\\|\[idigr \]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER IOTA WITH DIERESIS
    $line =~ s/\xFB/\\\|\[udigr \]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER UPSILON WITH DIERESIS
    $line =~ s/\xFC/\\\|\[oacgr \]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER OMICRON WITH ACUTE
    $line =~ s/\xFD/\\\|\[uacgr \]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER UPSILON WITH ACUTE
    $line =~ s/\xFE/\\\|\[ohacgr\]\\\|/g;	# ISOgrk2: GREEK SMALL LETTER OMEGA WITH ACUTE

    return ($line);
}

#-----------------------------------------------------------------------
# ISO 8859-8 into SP SDATA entities.
#
# There is no ISO entities for hebrew characters.
#
# &iso_8859_8_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_8_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA2/\\\|\[cent  \]\\\|/g; 	# ISOnum : CENT SIGN
    $line =~ s/\xA3/\\\|\[pound \]\\\|/g;	# ISOnum : POUND SIGN
    $line =~ s/\xA4/\\\|\[curren\]\\\|/g;	# ISOnum : CURRENCY SIGN
    $line =~ s/\xA5/\\\|\[yen   \]\\\|/g;  	# ISOnum : YEN SIGN
    $line =~ s/\xA6/\\\|\[brvbar\]\\\|/g;	# ISOnum : BROKEN BAR
    $line =~ s/\xA7/\\\|\[sect  \]\\\|/g; 	# ISOnum : SECTION SIGN
    $line =~ s/\xA8/\\\|\[die   \]\\\|/g;  	# ISOdia : DIERESIS
    $line =~ s/\xA9/\\\|\[copy  \]\\\|/g; 	# ISOnum : COPYRIGHT SIGN
    $line =~ s/\xAA/\\\|\[times \]\\\|/g;	# ISOnum : MULTIPLICATION SIGN
    $line =~ s/\xAB/\\\|\[laquo \]\\\|/g;	# ISOnum : LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xAC/\\\|\[not   \]\\\|/g;  	# ISOnum : NOT SIGN
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;  	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAE/\\\|\[reg   \]\\\|/g;  	# ISOnum : REGISTERED SIGN
    $line =~ s/\xAF/\\\|\[macr  \]\\\|/g; 	# ISOdia : OVERLINE (MACRON)
    $line =~ s/\xB0/\\\|\[deg   \]\\\|/g;  	# ISOnum : DEGREE SIGN
    $line =~ s/\xB1/\\\|\[plusmn\]\\\|/g;	# ISOnum : PLUS-MINUS SIGN
    $line =~ s/\xB2/\\\|\[sup2  \]\\\|/g; 	# ISOnum : SUPERSCRIPT TWO
    $line =~ s/\xB3/\\\|\[sup3  \]\\\|/g; 	# ISOnum : SUPERSCRIPT THREE
    $line =~ s/\xB4/\\\|\[acute \]\\\|/g;	# ISOdia : ACUTE ACCENT
    $line =~ s/\xB5/\\\|\[micro \]\\\|/g;	# ISOnum : MICRO SIGN
    $line =~ s/\xB6/\\\|\[para  \]\\\|/g; 	# ISOnum : PILCROW SIGN
    $line =~ s/\xB7/\\\|\[middot\]\\\|/g;	# ISOnum : MIDDLE DOT
    $line =~ s/\xB8/\\\|\[cedil \]\\\|/g;	# ISOdia : CEDILLA
    $line =~ s/\xB9/\\\|\[sup1  \]\\\|/g; 	# ISOnum : SUPERSCRIPT ONE
    $line =~ s/\xBA/\\\|\[divide\]\\\|/g;	# ISOlat1: DIVISION SIGN
    $line =~ s/\xBB/\\\|\[raquo \]\\\|/g;	# ISOnum : RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xBC/\\\|\[frac14\]\\\|/g;	# ISOnum : VULGAR FRACTION ONE QUARTER
    $line =~ s/\xBD/\\\|\[frac12\]\\\|/g; 	# ISOnum : VULGAR FRACTION ONE HALF
    $line =~ s/\xBE/\\\|\[frac34\]\\\|/g;	# ISOnum : VULGAR FRACTION THREE QUARTERS

    return ($line);
}


#-----------------------------------------------------------------------
# ISO 8859-9 into SP SDATA entities.
#
# &iso_8859_9_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_9_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[iexcl \]\\\|/g;	# ISOnum : INVERTED EXCLAMATION MARK
    $line =~ s/\xA2/\\\|\[cent  \]\\\|/g; 	# ISOnum : CENT SIGN
    $line =~ s/\xA3/\\\|\[pound \]\\\|/g;	# ISOnum : POUND SIGN
    $line =~ s/\xA4/\\\|\[curren\]\\\|/g;	# ISOnum : CURRENCY SIGN
    $line =~ s/\xA5/\\\|\[yen   \]\\\|/g;  	# ISOnum : YEN SIGN
    $line =~ s/\xA6/\\\|\[brvbar\]\\\|/g;	# ISOnum : BROKEN BAR
    $line =~ s/\xA7/\\\|\[sect  \]\\\|/g; 	# ISOnum : SECTION SIGN
    $line =~ s/\xA8/\\\|\[die   \]\\\|/g;  	# ISOdia : DIERESIS
    $line =~ s/\xA9/\\\|\[copy  \]\\\|/g; 	# ISOnum : COPYRIGHT SIGN
    $line =~ s/\xAA/\\\|\[ordf  \]\\\|/g; 	# ISOnum : FEMININE ORDINAL INDICATOR
    $line =~ s/\xAB/\\\|\[laquo \]\\\|/g;	# ISOnum : LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xAC/\\\|\[not   \]\\\|/g;  	# ISOnum : NOT SIGN
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;  	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAE/\\\|\[reg   \]\\\|/g;  	# ISOnum : REGISTERED SIGN
    $line =~ s/\xAF/\\\|\[macr  \]\\\|/g; 	# ISOdia : OVERLINE (MACRON)
    $line =~ s/\xB0/\\\|\[deg   \]\\\|/g;  	# ISOnum : DEGREE SIGN
    $line =~ s/\xB1/\\\|\[plusmn\]\\\|/g;	# ISOnum : PLUS-MINUS SIGN
    $line =~ s/\xB2/\\\|\[sup2  \]\\\|/g; 	# ISOnum : SUPERSCRIPT TWO
    $line =~ s/\xB3/\\\|\[sup3  \]\\\|/g; 	# ISOnum : SUPERSCRIPT THREE
    $line =~ s/\xB4/\\\|\[acute \]\\\|/g;	# ISOdia : ACUTE ACCENT
    $line =~ s/\xB5/\\\|\[micro \]\\\|/g;	# ISOnum : MICRO SIGN
    $line =~ s/\xB6/\\\|\[para  \]\\\|/g; 	# ISOnum : PILCROW SIGN
    $line =~ s/\xB7/\\\|\[middot\]\\\|/g;	# ISOnum : MIDDLE DOT
    $line =~ s/\xB8/\\\|\[cedil \]\\\|/g;	# ISOdia : CEDILLA
    $line =~ s/\xB9/\\\|\[sup1  \]\\\|/g; 	# ISOnum : SUPERSCRIPT ONE
    $line =~ s/\xBA/\\\|\[ordm  \]\\\|/g; 	# ISOnum : MASCULINE ORDINAL INDICATOR
    $line =~ s/\xBB/\\\|\[raquo \]\\\|/g;	# ISOnum : RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    $line =~ s/\xBC/\\\|\[frac14\]\\\|/g;	# ISOnum : VULGAR FRACTION ONE QUARTER
    $line =~ s/\xBD/\\\|\[frac12\]\\\|/g; 	# ISOnum : VULGAR FRACTION ONE HALF
    $line =~ s/\xBE/\\\|\[frac34\]\\\|/g;	# ISOnum : VULGAR FRACTION THREE QUARTERS
    $line =~ s/\xBF/\\\|\[iquest\]\\\|/g;	# ISOnum : INVERTED QUESTION MARK
    $line =~ s/\xC0/\\\|\[Agrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH GRAVE
    $line =~ s/\xC1/\\\|\[Aacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH ACUTE
    $line =~ s/\xC2/\\\|\[Acirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xC3/\\\|\[Atilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH TILDE
    $line =~ s/\xC4/\\\|\[Auml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER A WITH DIERESIS
    $line =~ s/\xC5/\\\|\[Aring \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH RING ABOVE
    $line =~ s/\xC6/\\\|\[AElig \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER AE
    $line =~ s/\xC7/\\\|\[Ccedil\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER C WITH CEDILLA
    $line =~ s/\xC8/\\\|\[Egrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH GRAVE
    $line =~ s/\xC9/\\\|\[Eacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH ACUTE
    $line =~ s/\xCA/\\\|\[Ecirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH CIRCUMFLEX
    $line =~ s/\xCB/\\\|\[Euml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER E WITH DIERESIS
    $line =~ s/\xCC/\\\|\[Igrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH GRAVE
    $line =~ s/\xCD/\\\|\[Iacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH ACUTE
    $line =~ s/\xCE/\\\|\[Icirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xCF/\\\|\[Iuml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER I WITH DIERESIS
    $line =~ s/\xD0/\\\|\[Gbreve\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER G WITH BREVE
    $line =~ s/\xD1/\\\|\[Ntilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER N WITH TILDE
    $line =~ s/\xD2/\\\|\[Ograve\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH GRAVE
    $line =~ s/\xD3/\\\|\[Oacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH ACUTE
    $line =~ s/\xD4/\\\|\[Ocirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xD5/\\\|\[Otilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH TILDE
    $line =~ s/\xD6/\\\|\[Ouml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER O WITH DIERESIS
    $line =~ s/\xD7/\\\|\[times \]\\\|/g;	# ISOnum : MULTIPLICATION SIGN
    $line =~ s/\xD8/\\\|\[Oslash\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH STROKE
    $line =~ s/\xD9/\\\|\[Ugrave\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH GRAVE
    $line =~ s/\xDA/\\\|\[Uacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH ACUTE
    $line =~ s/\xDB/\\\|\[Ucirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xDC/\\\|\[Uuml  \]\\\|/g; 	# ISOlat1: LATIN CAPITAL LETTER U WITH DIERESIS
    $line =~ s/\xDD/\\\|\[Idot  \]\\\|/g; 	# ISOlat2: LATIN CAPITAL LETTER I WITH DOT ABOVE
    $line =~ s/\xDE/\\\|\[Scedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH CEDILLA
    $line =~ s/\xDF/\\\|\[szlig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER SHARP S (German)
    $line =~ s/\xE0/\\\|\[agrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH GRAVE
    $line =~ s/\xE1/\\\|\[aacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH ACUTE
    $line =~ s/\xE2/\\\|\[acirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xE3/\\\|\[atilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH TILDE
    $line =~ s/\xE4/\\\|\[auml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER A WITH DIERESIS
    $line =~ s/\xE5/\\\|\[aring \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER A WITH RING ABOVE
    $line =~ s/\xE6/\\\|\[aelig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER AE
    $line =~ s/\xE7/\\\|\[ccedil\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER C WITH CEDILLA
    $line =~ s/\xE8/\\\|\[egrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH GRAVE
    $line =~ s/\xE9/\\\|\[eacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER E WITH ACUTE
    $line =~ s/\xEA/\\\|\[eogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER E WITH OGONEK
    $line =~ s/\xEB/\\\|\[euml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER E WITH DIERESIS
    $line =~ s/\xEC/\\\|\[edot  \]\\\|/g; 	# ISOlat2: LATIN SMALL LETTER E WITH DOT ABOVE
    $line =~ s/\xED/\\\|\[iacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH ACUTE
    $line =~ s/\xEE/\\\|\[icirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xEF/\\\|\[imacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER I WITH MACRON
    $line =~ s/\xF0/\\\|\[gbreve\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER G WITH BREVE
    $line =~ s/\xF1/\\\|\[ntilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER N WITH TILDE
    $line =~ s/\xF2/\\\|\[ograve\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH GRAVE
    $line =~ s/\xF3/\\\|\[oacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH ACUTE
    $line =~ s/\xF4/\\\|\[ocirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xF5/\\\|\[otilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH TILDE
    $line =~ s/\xF6/\\\|\[ouml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER O WITH DIERESIS
    $line =~ s/\xF7/\\\|\[divide\]\\\|/g;	# ISOlat1: DIVISION SIGN
    $line =~ s/\xF8/\\\|\[oslash\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER O WITH STROKE
    $line =~ s/\xF9/\\\|\[ugrave\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH GRAVE
    $line =~ s/\xFA/\\\|\[uacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH ACUTE
    $line =~ s/\xFB/\\\|\[ucirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xFC/\\\|\[uuml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER U WITH DIERESIS
    $line =~ s/\xFD/\\\|\[inodot\]\\\|/g;    	# ISOlat2: LATIN SMALL LETTER I DOTLESS
    $line =~ s/\xFE/\\\|\[scedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER S WITH CEDILLA
    $line =~ s/\xFF/\\\|\[yuml  \]\\\|/g; 	# ISOlat1: LATIN SMALL LETTER Y WITH DIERESIS

    return ($line);
}


#-----------------------------------------------------------------------
# ISO 8859-10 into SP SDATA entities.
#
# &iso_8859_10_sp_text_to_sdata (TEXT)
#-----------------------------------------------------------------------
sub iso_8859_10_sp_text_to_sdata
{
    local ($line) = $_[0];

    $line =~ s/\xA1/\\\|\[Aogon \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH OGONEK
    $line =~ s/\xA2/\\\|\[Emacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH MACRON
    $line =~ s/\xA3/\\\|\[Gcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER G WITH CEDILLA
    $line =~ s/\xA4/\\\|\[Imacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER I WITH MACRON
    $line =~ s/\xA5/\\\|\[Itilde\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER I WITH TILDE
    $line =~ s/\xA6/\\\|\[Kcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER K WITH CEDILLA
    $line =~ s/\xA7/\\\|\[Lcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER L WITH CEDILLA
    $line =~ s/\xA8/\\\|\[Nacute\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER N WITH ACUTE
    $line =~ s/\xA9/\\\|\[Rcedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER R WITH CEDILLA
    $line =~ s/\xAA/\\\|\[Scaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER S WITH CARON
    $line =~ s/\xAB/\\\|\[Tstrok\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER T WITH STROKE
    $line =~ s/\xAC/\\\|\[Zcaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER Z WITH CARON
    $line =~ s/\xAD/\\\|\[shy   \]\\\|/g;	# ISOnum : SOFT HYPHEN
    $line =~ s/\xAE/\\\|\[kgreen\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER KRA (Greenlandic)
    $line =~ s/\xAF/\\\|\[end   \]\\\|/g;	# ISOlat?: LATIN SMALL LETTER END (Lappish)
    $line =~ s/\xB0/\\\|\[dstrok\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER d WITH STROKE
    $line =~ s/\xB1/\\\|\[aogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER a WITH OGONEK
    $line =~ s/\xB2/\\\|\[emacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER e WITH MACRON
    $line =~ s/\xB3/\\\|\[gcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER g WITH CEDILLA
    $line =~ s/\xB4/\\\|\[imacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER i WITH MACRON
    $line =~ s/\xB5/\\\|\[itilde\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER i WITH TILDE
    $line =~ s/\xB6/\\\|\[kcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER k WITH CEDILLA
    $line =~ s/\xB7/\\\|\[lcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER l WITH CEDILLA
    $line =~ s/\xB8/\\\|\[nacute\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER n WITH ACUTE
    $line =~ s/\xB9/\\\|\[rcedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER r WITH CEDILLA
    $line =~ s/\xBA/\\\|\[scaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER s WITH CARON
    $line =~ s/\xBB/\\\|\[tstrok\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER t WITH STROKE
    $line =~ s/\xBC/\\\|\[zcaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER z WITH CARON
    $line =~ s/\xBD/\\\|\[sect  \]\\\|/g;	# ISOnum : SECTION SIGN
    $line =~ s/\xBE/\\\|\[szlig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER SHARP s (German)
    $line =~ s/\xBF/\\\|\[eng   \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER ENG (Lappish)
    $line =~ s/\xC0/\\\|\[Amacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER A WITH MACRON
    $line =~ s/\xC1/\\\|\[Aacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH ACUTE
    $line =~ s/\xC2/\\\|\[Acirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH CIRCUMFLEX
    $line =~ s/\xC3/\\\|\[Atilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH TILDE
    $line =~ s/\xC4/\\\|\[Auml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH DIERESIS
    $line =~ s/\xC5/\\\|\[Aring \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER A WITH RING ABOVE
    $line =~ s/\xC6/\\\|\[AElig \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER AE
    $line =~ s/\xC7/\\\|\[Iogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER I WITH OGONEK
    $line =~ s/\xC8/\\\|\[Ccaron\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER C WITH CARON
    $line =~ s/\xC9/\\\|\[Eacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH ACUTE
    $line =~ s/\xCA/\\\|\[Eogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH OGONEK
    $line =~ s/\xCB/\\\|\[Euml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER E WITH DIERESIS
    $line =~ s/\xCC/\\\|\[Edot  \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER E WITH DOT ABOVE
    $line =~ s/\xCD/\\\|\[Iacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH ACUTE
    $line =~ s/\xCE/\\\|\[Icirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH CIRCUMFLEX
    $line =~ s/\xCF/\\\|\[Iuml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER I WITH DIERESIS
    $line =~ s/\xD0/\\\|\[Dstrok\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER D WITH STROKE
    $line =~ s/\xD1/\\\|\[Ncedil\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER N WITH CEDILLA
    $line =~ s/\xD2/\\\|\[Omacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER O WITH MACRON
    $line =~ s/\xD3/\\\|\[Oacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH ACUTE
    $line =~ s/\xD4/\\\|\[Ocirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH CIRCUMFLEX
    $line =~ s/\xD5/\\\|\[Otilde\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH TILDE
    $line =~ s/\xD6/\\\|\[Ouml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH DIERESIS
    $line =~ s/\xD7/\\\|\[Utilde\]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH TILDE
    $line =~ s/\xD8/\\\|\[Oslash\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER O WITH STROKE
    $line =~ s/\xD9/\\\|\[Uogon \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH OGONEK
    $line =~ s/\xDA/\\\|\[Uacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH ACUTE
    $line =~ s/\xDB/\\\|\[Ucirc \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH CIRCUMFLEX
    $line =~ s/\xDC/\\\|\[Uuml  \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER U WITH DIERESIS
    $line =~ s/\xDD/\\\|\[Yacute\]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER Y WITH ACUTE
    $line =~ s/\xDE/\\\|\[THORN \]\\\|/g;	# ISOlat1: LATIN CAPITAL LETTER THORN (Icelandic)
    $line =~ s/\xDF/\\\|\[Umacr \]\\\|/g;	# ISOlat2: LATIN CAPITAL LETTER U WITH MACRON
    $line =~ s/\xE0/\\\|\[amacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER a WITH MACRON
    $line =~ s/\xE1/\\\|\[aacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER a WITH ACUTE
    $line =~ s/\xE2/\\\|\[acirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER a WITH CIRCUMFLEX
    $line =~ s/\xE3/\\\|\[atilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER a WITH TILDE
    $line =~ s/\xE4/\\\|\[auml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER a WITH DIERESIS
    $line =~ s/\xE5/\\\|\[aring \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER a WITH RING ABOVE
    $line =~ s/\xE6/\\\|\[aelig \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER ae
    $line =~ s/\xE7/\\\|\[iogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER i WITH OGONEK
    $line =~ s/\xE8/\\\|\[ccaron\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER c WITH CARON
    $line =~ s/\xE9/\\\|\[eacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER e WITH ACUTE
    $line =~ s/\xEA/\\\|\[eogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER e WITH OGONEK
    $line =~ s/\xEB/\\\|\[euml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER e WITH DIERESIS
    $line =~ s/\xEC/\\\|\[edot  \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER e WITH DOT ABOVE
    $line =~ s/\xED/\\\|\[iacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER i WITH ACUTE
    $line =~ s/\xEE/\\\|\[icirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER i WITH CIRCUMFLEX
    $line =~ s/\xEF/\\\|\[iuml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER i WITH DIERESIS
    $line =~ s/\xF0/\\\|\[eth   \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER ETH (Icelandic)
    $line =~ s/\xF1/\\\|\[ncedil\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER n WITH CEDILLA
    $line =~ s/\xF2/\\\|\[omacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER o WITH MACRON
    $line =~ s/\xF3/\\\|\[oacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER o WITH ACUTE
    $line =~ s/\xF4/\\\|\[ocirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER o WITH CIRCUMFLEX
    $line =~ s/\xF5/\\\|\[otilde\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER o WITH TILDE
    $line =~ s/\xF6/\\\|\[ouml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER o WITH DIERESIS
    $line =~ s/\xF7/\\\|\[utilde\]\\\|/g;	# ISOlat2: LATIN SMALL LETTER u WITH TILDE
    $line =~ s/\xF8/\\\|\[oslash\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER o WITH STROKE
    $line =~ s/\xF9/\\\|\[uogon \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER u WITH OGONEK
    $line =~ s/\xFA/\\\|\[uacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER u WITH ACUTE
    $line =~ s/\xFB/\\\|\[ucirc \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER u WITH CIRCUMFLEX
    $line =~ s/\xFC/\\\|\[uuml  \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER u WITH DIERESIS
    $line =~ s/\xFD/\\\|\[yacute\]\\\|/g;	# ISOlat1: LATIN SMALL LETTER y WITH ACUTE
    $line =~ s/\xFE/\\\|\[thorn \]\\\|/g;	# ISOlat1: LATIN SMALL LETTER THORN (Icelandic)
    $line =~ s/\xFF/\\\|\[umacr \]\\\|/g;	# ISOlat2: LATIN SMALL LETTER u WITH MACRON

    return ($line);
}


#-----------------------------------------------------------------------
# Convert an SP SDATA string into Texinfo back-end code.
#
# &sp_sdata_text_to_sp_texinfo (TEXT)
#-----------------------------------------------------------------------
sub sp_sdata_text_to_sp_texinfo
{
    local ($line) = $_[0];

    #ISOpub
    $line =~ s/\\\|\[emsp  \]\\\|/\[emsp  \]/g;		# em space
    $line =~ s/\\\|\[ensp  \]\\\|/\[ensp  \]/g;		# en space (1/2-em)
    $line =~ s/\\\|\[emsp3 \]\\\|/\[emsp3 \]/g;		# 1/3-em space
    $line =~ s/\\\|\[emsp4 \]\\\|/\[emsp4 \]/g;		# 1/4-em space
    $line =~ s/\\\|\[numsp \]\\\|/\[numsp \]/g;		# digit space (width of a number)
    $line =~ s/\\\|\[puncsp\]\\\|/\[puncsp\]/g;		# punctuation space (width of comma)
    $line =~ s/\\\|\[thinsp\]\\\|/\[thinsp\]/g;		# thin space (1/6-em)
    $line =~ s/\\\|\[hairsp\]\\\|/\[hairsp\]/g;		# hair space
    $line =~ s/\\\|\[mdash \]\\\|/\[mdash \]/g;		# em dash
    $line =~ s/\\\|\[ndash \]\\\|/\[ndash \]/g;		# en dash
    $line =~ s/\\\|\[dash  \]\\\|/\[dash  \]/g;		# hyphen (true graphic)
    $line =~ s/\\\|\[blank \]\\\|/\[blank \]/g;		# significant blank symbol
    $line =~ s/\\\|\[hellip\]\\\|/\[hellip\]/g;		# ellipsis (horizontal)
    $line =~ s/\\\|\[nldr  \]\\\|/\[nldr  \]/g;		# double baseline dot (en leader)
    $line =~ s/\\\|\[frac13\]\\\|/1\/3/g;		# fraction one-third
    $line =~ s/\\\|\[frac23\]\\\|/2\/3/g;		# fraction two-thirds
    $line =~ s/\\\|\[frac15\]\\\|/1\/5/g;		# fraction one-fifth
    $line =~ s/\\\|\[frac25\]\\\|/2\/5/g;		# fraction two-fifths
    $line =~ s/\\\|\[frac35\]\\\|/3\/5/g;		# fraction three-fifths
    $line =~ s/\\\|\[frac45\]\\\|/4\/5/g;		# fraction four-fifths
    $line =~ s/\\\|\[frac16\]\\\|/1\/6/g;		# fraction one-sixth
    $line =~ s/\\\|\[frac56\]\\\|/5\/6/g;		# fraction five-sixths
    $line =~ s/\\\|\[incare\]\\\|/\[incare\]/g;		# in-care-of symbol
    $line =~ s/\\\|\[block \]\\\|/\[block \]/g;		# full block
    $line =~ s/\\\|\[uhblk \]\\\|/\[uhblk \]/g;		# upper half block
    $line =~ s/\\\|\[lhblk \]\\\|/\[lhblk \]/g;		# lower half block
    $line =~ s/\\\|\[blk14 \]\\\|/\[blk14 \]/g;		# 25% shaded block
    $line =~ s/\\\|\[blk12 \]\\\|/\[blk12 \]/g;		# 50% shaded block
    $line =~ s/\\\|\[blk34 \]\\\|/\[blk34 \]/g;		# 75% shaded block
    $line =~ s/\\\|\[marker\]\\\|/\[marker\]/g;		# histogram marker
    $line =~ s/\\\|\[cir   \]\\\|/\[cir   \]/g;		# circle, open
    $line =~ s/\\\|\[squ   \]\\\|/\[squ   \]/g;		# square, open
    $line =~ s/\\\|\[rect  \]\\\|/\[rect  \]/g;		# rectangle, open
    $line =~ s/\\\|\[utri  \]\\\|/\[utri  \]/g;		# up triangle, open
    $line =~ s/\\\|\[dtri  \]\\\|/\[dtri  \]/g;		# down triangle, open
    $line =~ s/\\\|\[star  \]\\\|/\[star  \]/g;		# star, open
    $line =~ s/\\\|\[bull  \]\\\|/\@bullet\{\}/g;	# round bullet, filled
    $line =~ s/\\\|\[squf  \]\\\|/\[squf  \]/g;		# sq bullet, filled
    $line =~ s/\\\|\[utrif \]\\\|/\[utrif \]/g;		# up tri, filled
    $line =~ s/\\\|\[dtrif \]\\\|/\[dtrif \]/g;		# dn tri, filled
    $line =~ s/\\\|\[ltrif \]\\\|/\[ltrif \]/g;		# l tri, filled
    $line =~ s/\\\|\[rtrif \]\\\|/\[rtrif \]/g;		# r tri, filled
    $line =~ s/\\\|\[clubs \]\\\|/\[clubs \]/g;		# club suit symbol
    $line =~ s/\\\|\[diams \]\\\|/\[diams \]/g;		# diamond suit symbol
    $line =~ s/\\\|\[hearts\]\\\|/\[hearts\]/g;		# heart suit symbol
    $line =~ s/\\\|\[spades\]\\\|/\[spades\]/g;		# spades suit symbol
    $line =~ s/\\\|\[malt  \]\\\|/\[malt  \]/g;		# maltese cross
    $line =~ s/\\\|\[dagger\]\\\|/\[dagger\]/g;		# dagger
    $line =~ s/\\\|\[Dagger\]\\\|/\[Dagger\]/g;		# double dagger
    $line =~ s/\\\|\[check \]\\\|/\[check \]/g;		# tick, check mark
    $line =~ s/\\\|\[ballot\]\\\|/\[ballot\]/g;		# ballot cross
    $line =~ s/\\\|\[sharp \]\\\|/\[sharp \]/g;		# musical sharp
    $line =~ s/\\\|\[flat  \]\\\|/\[flat  \]/g;		# musical flat
    $line =~ s/\\\|\[male  \]\\\|/\[male  \]/g;		# male symbol
    $line =~ s/\\\|\[female\]\\\|/\[female\]/g;		# female symbol
    $line =~ s/\\\|\[phone \]\\\|/\[phone \]/g;		# telephone symbol
    $line =~ s/\\\|\[telrec\]\\\|/\[telrec\]/g;		# telephone recorder symbol
    $line =~ s/\\\|\[copysr\]\\\|/\[copysr\]/g;		# sound recording copyright sign
    $line =~ s/\\\|\[caret \]\\\|/\[caret \]/g;		# caret (insertion mark)
    $line =~ s/\\\|\[lsquor\]\\\|/\[lsquor\]/g;		# rising single quote, left (low)
    $line =~ s/\\\|\[ldquor\]\\\|/\[ldquor\]/g;		# rising dbl quote, left (low)

    $line =~ s/\\\|\[fflig \]\\\|/\[fflig \]/g;		# small ff ligature
    $line =~ s/\\\|\[filig \]\\\|/\[filig \]/g;		# small fi ligature
    $line =~ s/\\\|\[fjlig \]\\\|/\[fjlig \]/g;		# small fj ligature
    $line =~ s/\\\|\[ffilig\]\\\|/\[ffilig\]/g;		# small ffi ligature
    $line =~ s/\\\|\[ffllig\]\\\|/\[ffllig\]/g;		# small ffl ligature
    $line =~ s/\\\|\[fllig \]\\\|/\[fllig \]/g;		# small fl ligature

    $line =~ s/\\\|\[mldr  \]\\\|/\[mldr  \]/g;		# em leader
    $line =~ s/\\\|\[rdquor\]\\\|/\[rdquor\]/g;		# rising dbl quote, right (high)
    $line =~ s/\\\|\[rsquor\]\\\|/\[rsquor\]/g;		# rising single quote, right (high)
    $line =~ s/\\\|\[vellip\]\\\|/\[vellip\]/g;		# vertical ellipsis

    $line =~ s/\\\|\[hybull\]\\\|/\[hybull\]/g;		# rectangle, filled (hyphen bullet)
    $line =~ s/\\\|\[loz   \]\\\|/\[loz   \]/g;		# lozenge or total mark
    $line =~ s/\\\|\[lozf  \]\\\|/\[lozf  \]/g;		# lozenge, filled
    $line =~ s/\\\|\[ltri  \]\\\|/\[ltri  \]/g;		# l triangle, open
    $line =~ s/\\\|\[rtri  \]\\\|/\[rtri  \]/g;		# r triangle, open
    $line =~ s/\\\|\[starf \]\\\|/\[starf \]/g;		# star, filled

    $line =~ s/\\\|\[natur \]\\\|/\[natur \]/g;		# music natural
    $line =~ s/\\\|\[rx    \]\\\|/\[rx    \]/g;		# pharmaceutical prescription (Rx)
    $line =~ s/\\\|\[sext  \]\\\|/\[sext  \]/g;		# sextile (6-pointed star)

    $line =~ s/\\\|\[target\]\\\|/\[target\]/g;		# register mark or target
    $line =~ s/\\\|\[dlcrop\]\\\|/\[dlcrop\]/g;		# downward left crop mark 
    $line =~ s/\\\|\[drcrop\]\\\|/\[drcrop\]/g;		# downward right crop mark 
    $line =~ s/\\\|\[ulcrop\]\\\|/\[ulcrop\]/g;		# upward left crop mark 
    $line =~ s/\\\|\[urcrop\]\\\|/\[urcrop\]/g;		# upward right crop mark 


    # ISOnum
    $line =~ s/\\\|\[half  \]\\\|/1\/2/g;		# fraction one-half
    $line =~ s/\\\|\[frac12\]\\\|/1\/2/g;		# fraction one-half
    $line =~ s/\\\|\[frac14\]\\\|/1\/4/g;		# fraction one-quarter
    $line =~ s/\\\|\[frac34\]\\\|/3\/4/g;		# fraction three-quarters
    $line =~ s/\\\|\[frac18\]\\\|/1\/8/g;		# fraction one-eighth
    $line =~ s/\\\|\[frac38\]\\\|/3\/8/g;		# fraction three-eighths
    $line =~ s/\\\|\[frac58\]\\\|/5\/8/g;		# fraction five-eighths
    $line =~ s/\\\|\[frac78\]\\\|/7\/8/g;		# fraction seven-eighths

    $line =~ s/\\\|\[sup1  \]\\\|/\[sup1  \]/g;		# superscript one
    $line =~ s/\\\|\[sup2  \]\\\|/\[sup2  \]/g;		# superscript two
    $line =~ s/\\\|\[sup3  \]\\\|/\[sup3  \]/g;		# superscript three

    $line =~ s/\\\|\[plus  \]\\\|/+/g;			# plus sign
    $line =~ s/\\\|\[plusmn\]\\\|/+\/\@minus{}/g;	# plus-or-minus sign
    $line =~ s/\\\|\[lt    \]\\\|/</g;			# less-than sign
    $line =~ s/\\\|\[equals\]\\\|/=/g;			# equals sign
    $line =~ s/\\\|\[gt    \]\\\|/>/g;			# greater-than sign
    $line =~ s/\\\|\[divide\]\\\|/\[divide\]/g;		# divide sign
    $line =~ s/\\\|\[times \]\\\|/\[times \]/g;		# multiply sign

    $line =~ s/\\\|\[curren\]\\\|/\[curren\]/g;		# general currency sign
    $line =~ s/\\\|\[pound \]\\\|/\@pounds\{\}/g;	# pound sign
    $line =~ s/\\\|\[dollar\]\\\|/\$/g;			# dollar sign
    $line =~ s/\\\|\[cent  \]\\\|/\[cent  \]/g;		# cent sign
    $line =~ s/\\\|\[yen   \]\\\|/\[yen   \]/g;		# yen sign

    $line =~ s/\\\|\[num   \]\\\|/\#/g;			# number sign
    $line =~ s/\\\|\[percnt\]\\\|/%/g;			# percent sign
    $line =~ s/\\\|\[amp   \]\\\|/&/g;			# ampersand
    $line =~ s/\\\|\[ast   \]\\\|/*/g;			# asterisk
    $line =~ s/\\\|\[commat\]\\\|/\@@/g;		# commercial at
    $line =~ s/\\\|\[lsqb  \]\\\|/\[/g;			# left square bracket
    $line =~ s/\\\|\[bsol  \]\\\|/\\/g;			# reverse solidus
    $line =~ s/\\\|\[rsqb  \]\\\|/\]/g;			# right square bracket
    $line =~ s/\\\|\[lcub  \]\\\|/\@\{/g;		# left curly bracket
    $line =~ s/\\\|\[horbar\]\\\|/\[horbar\]/g;		# horizontal bar
    $line =~ s/\\\|\[verbar\]\\\|/\|/g;			# vertical bar
    $line =~ s/\\\|\[rcub  \]\\\|/\@\}/g;		# right curly bracket
    $line =~ s/\\\|\[micro \]\\\|/\[micro \]/g;		# micro sign
    $line =~ s/\\\|\[ohm   \]\\\|/\[ohm   \]/g;		# ohm sign
    $line =~ s/\\\|\[deg   \]\\\|/\[deg   \]/g;		# degree sign
    $line =~ s/\\\|\[ordm  \]\\\|/\[ordm  \]/g;		# ordinal indicator, masculine
    $line =~ s/\\\|\[ordf  \]\\\|/\[ordf  \]/g;		# ordinal indicator, feminine
    $line =~ s/\\\|\[sect  \]\\\|/\[sect  \]/g;		# section sign
    $line =~ s/\\\|\[para  \]\\\|/\[para  \]/g;		# pilcrow (paragraph sign)
    $line =~ s/\\\|\[middot\]\\\|/\@bullet\{\}/g;	# middle dot
    $line =~ s/\\\|\[larr  \]\\\|/\[larr  \]/g;		# leftward arrow
    $line =~ s/\\\|\[rarr  \]\\\|/\[rarr  \]/g;		# rightward arrow
    $line =~ s/\\\|\[uarr  \]\\\|/\[uarr  \]/g;		# upward arrow
    $line =~ s/\\\|\[darr  \]\\\|/\[darr  \]/g;		# downward arrow
    $line =~ s/\\\|\[copy  \]\\\|/\@copyright\{\}/g;	# copyright sign
    $line =~ s/\\\|\[reg   \]\\\|/\[reg   \]/g;		# registered sign
    $line =~ s/\\\|\[trade \]\\\|/\[trade \]/g;		# trade mark sign
    $line =~ s/\\\|\[brvbar\]\\\|/\[brvbar\]/g;		# broken (vertical) bar
    $line =~ s/\\\|\[not   \]\\\|/\[not   \]/g;		# not sign
    $line =~ s/\\\|\[sung  \]\\\|/\[sung  \]/g;		# music note (sung text sign)

    $line =~ s/\\\|\[excl  \]\\\|/!/g;			# exclamation mark
    $line =~ s/\\\|\[iexcl \]\\\|/\@exclamdown\{\}/g;	# inverted exclamation mark
    $line =~ s/\\\|\[quot  \]\\\|/"/g;			# quotation mark
    $line =~ s/\\\|\[apos  \]\\\|/'/g;			# apostrophe
    $line =~ s/\\\|\[lpar  \]\\\|/\(/g;			# left parenthesis
    $line =~ s/\\\|\[rpar  \]\\\|/\)/g;			# right parenthesis
    $line =~ s/\\\|\[comma \]\\\|/,/g;			# comma
    $line =~ s/\\\|\[lowbar\]\\\|/\_/g;			# low line
    $line =~ s/\\\|\[hyphen\]\\\|/-/g;			# hyphen
    $line =~ s/\\\|\[period\]\\\|/\./g;			# full stop, period
    $line =~ s/\\\|\[sol   \]\\\|/\//g;			# solidus
    $line =~ s/\\\|\[colon \]\\\|/:/g;			# colon
    $line =~ s/\\\|\[semi  \]\\\|/;/g;			# semicolon
    $line =~ s/\\\|\[quest \]\\\|/\?/g;			# question mark
    $line =~ s/\\\|\[iquest\]\\\|/\@questiondown\{\}/g;	# inverted question mark
    $line =~ s/\\\|\[laquo \]\\\|/\[laquo \]/g;		# angle quotation mark, left
    $line =~ s/\\\|\[raquo \]\\\|/\[raquo \]/g;		# angle quotation mark, right
    $line =~ s/\\\|\[lsquo \]\\\|/\[lsquo \]/g;		# single quotation mark, left
    $line =~ s/\\\|\[rsquo \]\\\|/\[rsquo \]/g;		# single quotation mark, right
    $line =~ s/\\\|\[ldquo \]\\\|/\[ldquo \]/g;		# double quotation mark, left
    $line =~ s/\\\|\[rdquo \]\\\|/\[rdquo \]/g;		# double quotation mark, right
    $line =~ s/\\\|\[nbsp  \]\\\|/\@ /g;		# no break (required) space
    $line =~ s/\\\|\[shy   \]\\\|/\[shy   \]/g;		# soft hyphen


    # ISOtech
    $line =~ s/\\\|\[aleph \]\\\|/\[aleph \]/g;		# aleph, Hebrew
    $line =~ s/\\\|\[and   \]\\\|/\[and   \]/g;		# logical and
    $line =~ s/\\\|\[ang90 \]\\\|/\[ang90 \]/g;		# right (90 degree) angle
    $line =~ s/\\\|\[angsph\]\\\|/\[angsph\]/g;		# angle-spherical
    $line =~ s/\\\|\[ap    \]\\\|/\[ap    \]/g;		# approximate
    $line =~ s/\\\|\[becaus\]\\\|/\[becaus\]/g;		# because
    $line =~ s/\\\|\[bottom\]\\\|/\[bottom\]/g;		# perpendicular
    $line =~ s/\\\|\[cap   \]\\\|/\[cap   \]/g;		# intersection
    $line =~ s/\\\|\[cong  \]\\\|/\[cong  \]/g;		# congruent with
    $line =~ s/\\\|\[conint\]\\\|/\[conint\]/g;		# contour integral operator
    $line =~ s/\\\|\[cup   \]\\\|/\[cup   \]/g;		# union or logical sum
    $line =~ s/\\\|\[equiv \]\\\|/\@equiv\{\}/g;	# identical with
    $line =~ s/\\\|\[exist \]\\\|/\[exist \]/g;		# at least one exists
    $line =~ s/\\\|\[forall\]\\\|/\[forall\]/g;		# for all
    $line =~ s/\\\|\[fnof  \]\\\|/\[fnof  \]/g;		# function of (italic small f)
    $line =~ s/\\\|\[ge    \]\\\|/\[ge    \]/g;		# greater-than-or-equal
    $line =~ s/\\\|\[iff   \]\\\|/\[iff   \]/g;		# if and only if
    $line =~ s/\\\|\[infin \]\\\|/\[infin \]/g;		# infinity
    $line =~ s/\\\|\[int   \]\\\|/\[int   \]/g;		# integral operator
    $line =~ s/\\\|\[isin  \]\\\|/\[isin  \]/g;		# set membership
    $line =~ s/\\\|\[lang  \]\\\|/\[lang  \]/g;		# left angle bracket
    $line =~ s/\\\|\[lArr  \]\\\|/\[lArr  \]/g;		# is implied by
    $line =~ s/\\\|\[le    \]\\\|/\[le    \]/g;		# less-than-or-equal
    $line =~ s/\\\|\[minus \]\\\|/\@minus\{\}/g;	# minus sign
    $line =~ s/\\\|\[mnplus\]\\\|/\[mnplus\]/g;		# minus-or-plus sign
    $line =~ s/\\\|\[nabla \]\\\|/\[nabla \]/g;		# del, Hamilton operator
    $line =~ s/\\\|\[ne    \]\\\|/\[ne    \]/g;		# not equal
    $line =~ s/\\\|\[ni    \]\\\|/\[ni    \]/g;		# contains
    $line =~ s/\\\|\[or    \]\\\|/\[or    \]/g;		# logical or
    $line =~ s/\\\|\[par   \]\\\|/\[par   \]/g;		# parallel
    $line =~ s/\\\|\[part  \]\\\|/\[part  \]/g;		# partial differential
    $line =~ s/\\\|\[permil\]\\\|/\[permil\]/g;		# per thousand
    $line =~ s/\\\|\[perp  \]\\\|/\[perp  \]/g;		# perpendicular
    $line =~ s/\\\|\[prime \]\\\|/\[prime \]/g;		# prime or minute
    $line =~ s/\\\|\[Prime \]\\\|/\[Prime \]/g;		# double prime or second
    $line =~ s/\\\|\[prop  \]\\\|/\[prop  \]/g;		# is proportional to
    $line =~ s/\\\|\[radic \]\\\|/\[radic \]/g;		# radical
    $line =~ s/\\\|\[rang  \]\\\|/\[rang  \]/g;		# right angle bracket
    $line =~ s/\\\|\[rArr  \]\\\|/\[rArr  \]/g;		# implies
    $line =~ s/\\\|\[sim   \]\\\|/\[sim   \]/g;		# similar
    $line =~ s/\\\|\[sime  \]\\\|/\[sime  \]/g;		# similar, equals
    $line =~ s/\\\|\[square\]\\\|/\[square\]/g;		# square
    $line =~ s/\\\|\[sub   \]\\\|/\[sub   \]/g;		# subset or is implied by
    $line =~ s/\\\|\[sube  \]\\\|/\[sube  \]/g;		# subset, equals
    $line =~ s/\\\|\[sup   \]\\\|/\[sup   \]/g;		# superset or implies
    $line =~ s/\\\|\[supe  \]\\\|/\[supe  \]/g;		# superset, equals
    $line =~ s/\\\|\[there4\]\\\|/\[there4\]/g;		# therefore
    $line =~ s/\\\|\[Verbar\]\\\|/\[Verbar\]/g;		# dbl vertical bar

    $line =~ s/\\\|\[angst \]\\\|/\[angst \]/g;		# capital A, ring
    $line =~ s/\\\|\[bernou\]\\\|/\[bernou\]/g;		# Bernoulli function (script capital B)
    $line =~ s/\\\|\[compfn\]\\\|/\[compfn\]/g;		# composite function (small circle)
    $line =~ s/\\\|\[Dot   \]\\\|/\[Dot   \]/g;		# dieresis or umlaut mark
    $line =~ s/\\\|\[DotDot\]\\\|/\[DotDot\]/g;		# four dots above
    $line =~ s/\\\|\[hamilt\]\\\|/\[hamilt\]/g;		# Hamiltonian (script capital H)
    $line =~ s/\\\|\[lagran\]\\\|/\[lagran\]/g;		# Lagrangian (script capital L)
    $line =~ s/\\\|\[lowast\]\\\|/\[lowast\]/g;		# low asterisk
    $line =~ s/\\\|\[notin \]\\\|/\[notin \]/g;		# negated set membership
    $line =~ s/\\\|\[order \]\\\|/\[order \]/g;		# order of (script small o)
    $line =~ s/\\\|\[phmmat\]\\\|/\[phmmat\]/g;		# physics M-matrix (script capital M)
    $line =~ s/\\\|\[tdot  \]\\\|/\[tdot  \]/g;		# three dots above
    $line =~ s/\\\|\[tprime\]\\\|/\[tprime\]/g;		# triple prime
    $line =~ s/\\\|\[wedgeq\]\\\|/\[wedgeq\]/g;		# corresponds to (wedge, equals)


    # ISOlat1
    $line =~ s/\\\|\[aacute\]\\\|/\@\'a/g;		# small a, acute accent
    $line =~ s/\\\|\[Aacute\]\\\|/\@\'A/g;		# capital A, acute accent
    $line =~ s/\\\|\[acirc \]\\\|/\@\^a/g;		# small a, circumflex accent
    $line =~ s/\\\|\[Acirc \]\\\|/\@\^A/g;		# capital A, circumflex accent
    $line =~ s/\\\|\[agrave\]\\\|/\@\`a/g;		# small a, grave accent
    $line =~ s/\\\|\[Agrave\]\\\|/\@\`A/g;		# capital A, grave accent
    $line =~ s/\\\|\[aring \]\\\|/\@ringaccent\{a\}/g;	# small a, ring
    $line =~ s/\\\|\[Aring \]\\\|/\@ringaccent\{A\}/g;	# capital A, ring
    $line =~ s/\\\|\[atilde\]\\\|/\@\~a/g;		# small a, tilde
    $line =~ s/\\\|\[Atilde\]\\\|/\@\~A/g;		# capital A, tilde
    $line =~ s/\\\|\[auml  \]\\\|/\@\"a/g;		# small a, dieresis or umlaut mark
    $line =~ s/\\\|\[Auml  \]\\\|/\@\"A/g;		# capital A, dieresis or umlaut mark
    $line =~ s/\\\|\[aelig \]\\\|/\@ae\{\}/g;		# small ae diphthong (ligature)
    $line =~ s/\\\|\[AElig \]\\\|/\@AE\{\}/g;		# capital AE diphthong (ligature)
    $line =~ s/\\\|\[ccedil\]\\\|/\@,\{c\}/g;		# small c, cedilla
    $line =~ s/\\\|\[Ccedil\]\\\|/\@,\{C\}/g;		# capital C, cedilla
    $line =~ s/\\\|\[eth   \]\\\|/\[eth   \]/g;		# small eth, Icelandic
    $line =~ s/\\\|\[ETH   \]\\\|/\[ETH   \]/g;		# capital Eth, Icelandic
    $line =~ s/\\\|\[eacute\]\\\|/\@\'e/g;		# small e, acute accent
    $line =~ s/\\\|\[Eacute\]\\\|/\@\'E/g;		# capital E, acute accent
    $line =~ s/\\\|\[ecirc \]\\\|/\@\^e/g;		# small e, circumflex accent
    $line =~ s/\\\|\[Ecirc \]\\\|/\@\^E/g;		# capital E, circumflex accent
    $line =~ s/\\\|\[egrave\]\\\|/\@\`e/g;		# small e, grave accent
    $line =~ s/\\\|\[Egrave\]\\\|/\@\`E/g;		# capital E, grave accent
    $line =~ s/\\\|\[euml  \]\\\|/\@\"e/g;		# small e, dieresis or umlaut mark
    $line =~ s/\\\|\[Euml  \]\\\|/\@\"E/g;		# capital E, dieresis or umlaut mark
    $line =~ s/\\\|\[iacute\]\\\|/\@\'i/g;		# small i, acute accent
    $line =~ s/\\\|\[Iacute\]\\\|/\@\'I/g;		# capital I, acute accent
    $line =~ s/\\\|\[icirc \]\\\|/\@\^i/g;		# small i, circumflex accent
    $line =~ s/\\\|\[Icirc \]\\\|/\@\^I/g;		# capital I, circumflex accent
    $line =~ s/\\\|\[igrave\]\\\|/\@\`i/g;		# small i, grave accent
    $line =~ s/\\\|\[Igrave\]\\\|/\@\`I/g;		# capital I, grave accent
    $line =~ s/\\\|\[iuml  \]\\\|/\@\"i/g;		# small i, dieresis or umlaut mark
    $line =~ s/\\\|\[Iuml  \]\\\|/\@\"I/g;		# capital I, dieresis or umlaut mark
    $line =~ s/\\\|\[ntilde\]\\\|/\@\~n/g;		# small n, tilde
    $line =~ s/\\\|\[Ntilde\]\\\|/\@\~N/g;		# capital N, tilde
    $line =~ s/\\\|\[oacute\]\\\|/\@\'o/g;		# small o, acute accent
    $line =~ s/\\\|\[Oacute\]\\\|/\@\'O/g;		# capital O, acute accent
    $line =~ s/\\\|\[ocirc \]\\\|/\@\^o/g;		# small o, circumflex accent
    $line =~ s/\\\|\[Ocirc \]\\\|/\@\^O/g;		# capital O, circumflex accent
    $line =~ s/\\\|\[ograve\]\\\|/\@\`o/g;		# small o, grave accent
    $line =~ s/\\\|\[Ograve\]\\\|/\@\`O/g;		# capital O, grave accent
    $line =~ s/\\\|\[oslash\]\\\|/\@o\{\}/g;		# small o, slash
    $line =~ s/\\\|\[Oslash\]\\\|/\@O\{\}/g;		# capital O, slash
    $line =~ s/\\\|\[otilde\]\\\|/\@\~o/g;		# small o, tilde
    $line =~ s/\\\|\[Otilde\]\\\|/\@\~O/g;		# capital O, tilde
    $line =~ s/\\\|\[ouml  \]\\\|/\@\"o/g;		# small o, dieresis or umlaut mark
    $line =~ s/\\\|\[Ouml  \]\\\|/\@\"O/g;		# capital O, dieresis or umlaut mark
    $line =~ s/\\\|\[szlig \]\\\|/\@ss\{\}/g;		# small sharp s, German (sz ligature)
    $line =~ s/\\\|\[thorn \]\\\|/\[thorn \]/g;		# small thorn, Icelandic
    $line =~ s/\\\|\[THORN \]\\\|/\[THORN \]/g;		# capital THORN, Icelandic
    $line =~ s/\\\|\[uacute\]\\\|/\@\'u/g;		# small u, acute accent
    $line =~ s/\\\|\[Uacute\]\\\|/\@\'U/g;		# capital U, acute accent
    $line =~ s/\\\|\[ucirc \]\\\|/\@\^u/g;		# small u, circumflex accent
    $line =~ s/\\\|\[Ucirc \]\\\|/\@\^U/g;		# capital U, circumflex accent
    $line =~ s/\\\|\[ugrave\]\\\|/\@\`u/g;		# small u, grave accent
    $line =~ s/\\\|\[Ugrave\]\\\|/\@\`U/g;		# capital U, grave accent
    $line =~ s/\\\|\[uuml  \]\\\|/\@\"u/g;		# small u, dieresis or umlaut mark
    $line =~ s/\\\|\[Uuml  \]\\\|/\@\"U/g;		# capital U, dieresis or umlaut mark
    $line =~ s/\\\|\[yacute\]\\\|/\@\'y/g;		# small y, acute accent
    $line =~ s/\\\|\[Yacute\]\\\|/\@\'Y/g;		# capital Y, acute accent
    $line =~ s/\\\|\[yuml  \]\\\|/\@\"y/g;		# small y, dieresis or umlaut mark

    # ISOlat2
    $line =~ s/\\\|\[abreve\]\\\|/\[abreve\]/g;		# small a, breve
    $line =~ s/\\\|\[Abreve\]\\\|/\[Abreve\]/g;		# capital A, breve
    $line =~ s/\\\|\[amacr \]\\\|/\[amacr \]/g;		# small a, macron
    $line =~ s/\\\|\[Amacr \]\\\|/\[Amacr \]/g;		# capital A, macron
    $line =~ s/\\\|\[aogon \]\\\|/\[aogon \]/g;		# small a, ogonek
    $line =~ s/\\\|\[Aogon \]\\\|/\[Aogon \]/g;		# capital A, ogonek
    $line =~ s/\\\|\[cacute\]\\\|/\@\'c/g;		# small c, acute accent
    $line =~ s/\\\|\[Cacute\]\\\|/\@\'C/g;		# capital C, acute accent
    $line =~ s/\\\|\[ccaron\]\\\|/\[ccaron\]/g;		# small c, caron
    $line =~ s/\\\|\[Ccaron\]\\\|/\[Ccaron\]/g;		# capital C, caron
    $line =~ s/\\\|\[ccirc \]\\\|/\@\^c/g;		# small c, circumflex accent
    $line =~ s/\\\|\[Ccirc \]\\\|/\@\^C/g;		# capital C, circumflex accent
    $line =~ s/\\\|\[cdot  \]\\\|/\@dotaccent\{c\}/g;	# small c, dot above
    $line =~ s/\\\|\[Cdot  \]\\\|/\@dotaccent\{C\}/g;	# capital C, dot above
    $line =~ s/\\\|\[dcaron\]\\\|/\[dcaron\]/g;		# small d, caron
    $line =~ s/\\\|\[Dcaron\]\\\|/\[Dcaron\]/g;		# capital D, caron
    $line =~ s/\\\|\[dstrok\]\\\|/\@d\{\}/g;		# small d, stroke
    $line =~ s/\\\|\[Dstrok\]\\\|/\[Dstrok\]/g;		# capital D, stroke
    $line =~ s/\\\|\[ecaron\]\\\|/\[ecaron\]/g;		# small e, caron
    $line =~ s/\\\|\[Ecaron\]\\\|/\[Ecaron\]/g;		# capital E, caron
    $line =~ s/\\\|\[edot  \]\\\|/\@dotaccent\{e\}/g;	# small e, dot above
    $line =~ s/\\\|\[Edot  \]\\\|/\@dotaccent\{E\}/g;	# capital E, dot above
    $line =~ s/\\\|\[emacr \]\\\|/\[emacr \]/g;		# small e, macron
    $line =~ s/\\\|\[Emacr \]\\\|/\[Emacr \]/g;		# capital E, macron
    $line =~ s/\\\|\[eogon \]\\\|/\[eogon \]/g;		# small e, ogonek
    $line =~ s/\\\|\[Eogon \]\\\|/\[Eogon \]/g;		# capital E, ogonek
    $line =~ s/\\\|\[gacute\]\\\|/\@\'g/g;		# small g, acute accent
    $line =~ s/\\\|\[gbreve\]\\\|/\[gbreve\]/g;		# small g, breve
    $line =~ s/\\\|\[Gbreve\]\\\|/\[Gbreve\]/g;		# capital G, breve
    $line =~ s/\\\|\[Gcedil\]\\\|/\@\,\{G\}/g;		# capital G, cedilla
    $line =~ s/\\\|\[gcirc \]\\\|/\@\^g/g;		# small g, circumflex accent
    $line =~ s/\\\|\[Gcirc \]\\\|/\@\^G/g;		# capital G, circumflex accent
    $line =~ s/\\\|\[gdot  \]\\\|/\@dotaccent\{g\}/g;	# small g, dot above
    $line =~ s/\\\|\[Gdot  \]\\\|/\@dotaccent\{G\}/g;	# capital G, dot above
    $line =~ s/\\\|\[hcirc \]\\\|/\@\^h/g;		# small h, circumflex accent
    $line =~ s/\\\|\[Hcirc \]\\\|/\@\^H/g;		# capital H, circumflex accent
    $line =~ s/\\\|\[hstrok\]\\\|/\[hstrok\]/g;		# small h, stroke
    $line =~ s/\\\|\[Hstrok\]\\\|/\@H\{\}/g;		# capital H, stroke
    $line =~ s/\\\|\[Idot  \]\\\|/\@dotaccent\{I\}/g;	# capital I, dot above
    $line =~ s/\\\|\[Imacr \]\\\|/\[Imacr \]/g;		# capital I, macron
    $line =~ s/\\\|\[imacr \]\\\|/\[imacr \]/g;		# small i, macron
    $line =~ s/\\\|\[ijlig \]\\\|/\[ijlig \]/g;		# small ij ligature
    $line =~ s/\\\|\[IJlig \]\\\|/\[IJlig \]/g;		# capital IJ ligature
    $line =~ s/\\\|\[inodot\]\\\|/\[inodot\]/g;		# small i without dot
    $line =~ s/\\\|\[iogon \]\\\|/\[iogon \]/g;		# small i, ogonek
    $line =~ s/\\\|\[Iogon \]\\\|/\[Iogon \]/g;		# capital I, ogonek
    $line =~ s/\\\|\[itilde\]\\\|/\@\~i/g;		# small i, tilde
    $line =~ s/\\\|\[Itilde\]\\\|/\@\~I/g;		# capital I, tilde
    $line =~ s/\\\|\[jcirc \]\\\|/\@\^j/g;		# small j, circumflex accent
    $line =~ s/\\\|\[Jcirc \]\\\|/\@\^J/g;		# capital J, circumflex accent
    $line =~ s/\\\|\[kcedil\]\\\|/\@\,\{k\}/g;		# small k, cedilla
    $line =~ s/\\\|\[Kcedil\]\\\|/\@\,\{K\}/g;		# capital K, cedilla
    $line =~ s/\\\|\[kgreen\]\\\|/\[kgreen\]/g;		# small k, Greenlandic
    $line =~ s/\\\|\[lacute\]\\\|/\@\'l/g;		# small l, acute accent
    $line =~ s/\\\|\[Lacute\]\\\|/\@\'L/g;		# capital L, acute accent
    $line =~ s/\\\|\[lcaron\]\\\|/\[lcaron\]/g;		# small l, caron
    $line =~ s/\\\|\[Lcaron\]\\\|/\[Lcaron\]/g;		# capital L, caron
    $line =~ s/\\\|\[lcedil\]\\\|/\@\,\{l\}/g;		# small l, cedilla
    $line =~ s/\\\|\[Lcedil\]\\\|/\@\,\{L\}/g;		# capital L, cedilla
    $line =~ s/\\\|\[lmidot\]\\\|/\[lmidot\]/g;		# small l, middle dot
    $line =~ s/\\\|\[Lmidot\]\\\|/\[Lmidot\]/g;		# capital L, middle dot
    $line =~ s/\\\|\[lstrok\]\\\|/\@l\{\}/g;		# small l, stroke
    $line =~ s/\\\|\[Lstrok\]\\\|/\@L\{\}/g;		# capital L, stroke
    $line =~ s/\\\|\[nacute\]\\\|/\@\'n/g;		# small n, acute accent
    $line =~ s/\\\|\[Nacute\]\\\|/\@\'N/g;		# capital N, acute accent
    $line =~ s/\\\|\[eng   \]\\\|/\[eng   \]/g;		# small eng, Lapp
    $line =~ s/\\\|\[ENG   \]\\\|/\[ENG   \]/g;		# capital ENG, Lapp
    $line =~ s/\\\|\[napos \]\\\|/\[napos \]/g;		# small n, apostrophe
    $line =~ s/\\\|\[ncaron\]\\\|/\[ncaron\]/g;		# small n, caron
    $line =~ s/\\\|\[Ncaron\]\\\|/\[Ncaron\]/g;		# capital N, caron
    $line =~ s/\\\|\[ncedil\]\\\|/\@\,\{n\}/g;		# small n, cedilla
    $line =~ s/\\\|\[Ncedil\]\\\|/\@\,\{N\}/g;		# capital N, cedilla
    $line =~ s/\\\|\[odblac\]\\\|/\@H\{o\}/g;		# small o, double acute accent
    $line =~ s/\\\|\[Odblac\]\\\|/\@H\{O\}/g;		# capital O, double acute accent
    $line =~ s/\\\|\[Omacr \]\\\|/\[Omacr \]/g;		# capital O, macron
    $line =~ s/\\\|\[omacr \]\\\|/\[omacr \]/g;		# small o, macron
    $line =~ s/\\\|\[oelig \]\\\|/\@oe\{\}/g;		# small oe ligature
    $line =~ s/\\\|\[OElig \]\\\|/\@OE\{\}/g;		# capital OE ligature
    $line =~ s/\\\|\[racute\]\\\|/\@\'r/g;		# small r, acute accent
    $line =~ s/\\\|\[Racute\]\\\|/\@\'R/g;		# capital R, acute accent
    $line =~ s/\\\|\[rcaron\]\\\|/\[rcaron\]/g;		# small r, caron
    $line =~ s/\\\|\[Rcaron\]\\\|/\[Rcaron\]/g;		# capital R, caron
    $line =~ s/\\\|\[rcedil\]\\\|/\@\,\{r\}/g;		# small r, cedilla
    $line =~ s/\\\|\[Rcedil\]\\\|/\@\,\{R\}/g;		# capital R, cedilla
    $line =~ s/\\\|\[sacute\]\\\|/\@\'s/g;		# small s, acute accent
    $line =~ s/\\\|\[Sacute\]\\\|/\@\'S/g;		# capital S, acute accent
    $line =~ s/\\\|\[scaron\]\\\|/\[scaron\]/g;		# small s, caron
    $line =~ s/\\\|\[Scaron\]\\\|/\[Scaron\]/g;		# capital S, caron
    $line =~ s/\\\|\[scedil\]\\\|/\@\,\{s\}/g;		# small s, cedilla
    $line =~ s/\\\|\[Scedil\]\\\|/\@\,\{S\}/g;		# capital S, cedilla
    $line =~ s/\\\|\[scirc \]\\\|/\@\^s/g;		# small s, circumflex accent
    $line =~ s/\\\|\[Scirc \]\\\|/\@\^S/g;		# capital S, circumflex accent
    $line =~ s/\\\|\[tcaron\]\\\|/\[tcaron\]/g;		# small t, caron
    $line =~ s/\\\|\[Tcaron\]\\\|/\[Tcaron\]/g;		# capital T, caron
    $line =~ s/\\\|\[tcedil\]\\\|/\@\,\{t\}/g;		# small t, cedilla
    $line =~ s/\\\|\[Tcedil\]\\\|/\@\,\{T\}/g;		# capital T, cedilla
    $line =~ s/\\\|\[tstrok\]\\\|/\@t\{\}/g;		# small t, stroke
    $line =~ s/\\\|\[Tstrok\]\\\|/\[Tstrok\]/g;		# capital T, stroke
    $line =~ s/\\\|\[ubreve\]\\\|/\[ubreve\]/g;		# small u, breve
    $line =~ s/\\\|\[Ubreve\]\\\|/\[Ubreve\]/g;		# capital U, breve
    $line =~ s/\\\|\[udblac\]\\\|/\@H\{u\}/g;		# small u, double acute accent
    $line =~ s/\\\|\[Udblac\]\\\|/\@H\{U\}/g;		# capital U, double acute accent
    $line =~ s/\\\|\[umacr \]\\\|/\[umacr \]/g;		# small u, macron
    $line =~ s/\\\|\[Umacr \]\\\|/\[Umacr \]/g;		# capital U, macron
    $line =~ s/\\\|\[uogon \]\\\|/\[uogon \]/g;		# small u, ogonek
    $line =~ s/\\\|\[Uogon \]\\\|/\[Uogon \]/g;		# capital U, ogonek
    $line =~ s/\\\|\[uring \]\\\|/\@ringaccent\{u\}/g;	# small u, ring
    $line =~ s/\\\|\[Uring \]\\\|/\@ringaccent\{U\}/g;	# capital U, ring
    $line =~ s/\\\|\[utilde\]\\\|/\@\~u/g;		# small u, tilde
    $line =~ s/\\\|\[Utilde\]\\\|/\@\~U/g;		# capital U, tilde
    $line =~ s/\\\|\[wcirc \]\\\|/\@\^w/g;		# small w, circumflex accent
    $line =~ s/\\\|\[Wcirc \]\\\|/\@\^W/g;		# capital W, circumflex accent
    $line =~ s/\\\|\[ycirc \]\\\|/\@\^y/g;		# small y, circumflex accent
    $line =~ s/\\\|\[Ycirc \]\\\|/\@\^Y/g;		# capital Y, circumflex accent
    $line =~ s/\\\|\[Yuml  \]\\\|/\@"Y/g;		# capital Y, dieresis or umlaut mark
    $line =~ s/\\\|\[zacute\]\\\|/\@\'z/g;		# small z, acute accent
    $line =~ s/\\\|\[Zacute\]\\\|/\@\'Z/g;		# capital Z, acute accent
    $line =~ s/\\\|\[zcaron\]\\\|/\[zcaron\]/g;		# small z, caron
    $line =~ s/\\\|\[Zcaron\]\\\|/\[Zcaron\]/g;		# capital Z, caron
    $line =~ s/\\\|\[zdot  \]\\\|/\@dotaccent\{z\}/g;	# small z, dot above
    $line =~ s/\\\|\[Zdot  \]\\\|/\@dotaccent\{Z\}/g;	# capital Z, dot above


    # Sgmltexi added entities for Texinfo compatibility.
    $line =~ s/\\\|\[3dots \]\\\|/\@dots\{\}/g;		# three dots
    $line =~ s/\\\|\[4dots \]\\\|/\@enddots\{\}/g;	# four dots
    $line =~ s/\\\|\[TeX   \]\\\|/\@TeX\{\}/g;		# TeX
    $line =~ s/\\\|\[result\]\\\|/\@result\{\}/g;	#
    $line =~ s/\\\|\[expans\]\\\|/\@expansion\{\}/g;	#
    $line =~ s/\\\|\[print \]\\\|/\@print\{\}/g;	#
    $line =~ s/\\\|\[error \]\\\|/\@error\{\}/g;	#
    $line =~ s/\\\|\[point \]\\\|/\@point\{\}/g;	#
    $line =~ s/\\\|\[today \]\\\|/\@today\{\}/g;	#
    $line =~ s/\\\|\[esexcl\]\\\|/\@\!/g;		# end of sentence exclamation mark
    $line =~ s/\\\|\[esperi\]\\\|/\@\./g;		# end of sentence period
    $line =~ s/\\\|\[nes   \]\\\|/\@\:/g;		# not ending sentence
    $line =~ s/\\\|\[esques\]\\\|/\@\?/g;		# end of sentence question mark

    return ($line);
}

#-----------------------------------------------------------------------
# Jump a %block; element that starts on its own line, and that
# terminates on a line by itself.
# This %block; element is meant in the way that it cannot contain
# itself recursively.
#
sub jump_block
{
    local ($input_stream)   = $_[0];
    local ($output_stream)  = $_[1];
    local ($line)           = $_[2];
    local ($termination_re) = $_[3];

    # Try to jump the block.
    while ($line !~ m/$termination_re/i)
      {
	# Print the line and read the next.
	print $output_stream "$line";
	$line = <$input_stream>;
      }
    # Print the last line.
    print $output_stream "$line";
}    

#-----------------------------------------------------------------------
# Diagnostic output; it depends on the following global variables:
#   $verbose
#   $root_file_name
#
sub diag_output
{
    local ($string)    = $_[0];

    # Append to the diagnostic file.
    open (DIAG, ">> $root_file_name.diag");
    
    if ($verbose)
      {
        print STDOUT ($string);
      }
    # In any case, print it on the DIAG file
    print DIAG ($string);

    # Close the file.
    close (DIAG);

}

#-----------------------------------------------------------------------
# First step filter.
#
# 1.1 Filter only one derivation.
#     The "MAIN" derivation is implied.
#
#     Inside the main source, SGML comments like these,
#     <!-- START FOO -->
#     <!-- STOP FOO -->
#     delimit the "FOO" derivation.
#
# 1.2 Find SYSTEM inclusions.
#     These files must be prepared in the same way as the
#     the main source, and the temporary source must point to
#     the transformed files.
#
# &step_1_filter (INPUT_FILE,
#                 TYPESETTING,
#                 DERIVATION_NAME)
#
sub step_1_filter
{
    local ($input_file) = $_[0];
    local ($typesetting) = $_[1];
    local ($derivation) = $_[2];
    local ($output_file) = &temporary_file;
    chomp ($output_file);
    local ($line) = "";
    local ($include) = 0;
    local ($external_system_file) = "";
    local ($before_name) = "";
    local ($after_name) = "";
    local ($step_1_system_file) = "";

    # Tell what we are doing.
    &diag_output (sprintf (gettext ("%s:%s: step 1: "),
                  $program_executable, $input_file));
    &diag_output (sprintf (gettext ("character transformation and derivation filtering\n")));

    # We need to define a reference for input and output stream.
    # The choice to use the same file names is just one way to
    # be sure to have ever different names.
    # We could use a random number, maybe.
    # This use of reference are necessary because we want to
    # make this subroutine recursive. Using plain handler names
    # is not possible: when we open again with the same handler
    # name, the previous file is closed!
    local ($input_stream) = "$input_file";
    local ($output_stream) = "$output_file";

    # If the derivation is "MAIN", we suppose that the start
    # comment was already reached.
    if ("$derivation" eq "MAIN")
      {
        $include = 1;
      }
    
    # Open input and output files.
    # Tab characters are expanded.
    open ($input_stream, " expand $input_file |");
    open ($output_stream, "> $output_file");

    # Do what is required
    while ($line = <$input_stream>)
      {
        # The line break is not removed.

        #---------------------------------------------------------------
	# Check if it is the beginning of a verbatim element
	# where nothing is to be done.
        #---------------------------------------------------------------

        if ($line =~ m/<!--\s+START\s+\S+\s+-->/i
	    || $line =~ m/<!--\s+STOP\s+\S+\s+-->/i)
	  {
	    # Don't touch this line
	  }
	else
	  {
	    # Eliminate inline comments.
	    $line =~ s/<!--(.*?)-->//gi;
	  }

        if ($line =~ m/<!--\s+START\s+\S+\s+-->/i
	    || $line =~ m/<!--\s+STOP\s+\S+\s+-->/i)
	  {
	    # Don't touch this line again.
	    ;
	  }
	elsif ($line =~ m/^\s*<!--.*$/)
	  {
	    # As it cannot be an in-line comment an cannot be a special
	    # command, it seems the beginning of a block comment.
	    # Jump it.
	    # We hope that there is nothing on the same
	    # line after the comment termination.
	    &jump_block ($input_stream,
                         $output_stream,
		         $line,
		         "-->");
	    # Need to restart the loop;
	    next;
	  }
	# There is no other verbatim block (the "texinfo" element is
	# in-line.  

        #---------------------------------------------------------------
        # Step 1.1
        # Filter only one derivation.
        #---------------------------------------------------------------

            # Check if it is an inclusion command.
            if ($line =~ m/<!--\s+START\s+$derivation\s+-->/i)
              {
                # The following lines must be included.
                $include = 1;
                # The directive is not removed fromoutput.
              }
            elsif ($line =~ m/<!--\s+STOP\s+$derivation\s+-->/i)
              {
                # The following lines must not be included.
                $include = 0;
                # The directive is not removed from output.
              }
            else
              {
                # It is a normal line. We have to decide what to do.
                if ($include)
                  {
                    # The line must not be removed.
                    ;
                  }
                else
                  {
                    # An empty line is transfered.
                    #
                    # It is important that the resulting file has text
                    # exactly in the same line number as the original
                    # source. This permits to understand SGML errors.
                    $line = "\n";
                  }
              }
    
        #---------------------------------------------------------------
        # Step 1.3
        # Find SYSTEM inclusions.
        # These files must be prepared in the same way as the
        # the main source, and the temporary source must point to
        # the transformed files.
        #---------------------------------------------------------------

            #-----------------------------------------------------------
            # Try to find SGML declarations for external files, like:
            # <!ENTITY COPYPART  SYSTEM "formal/COPYPART.sgml">
	    #
            if ($line =~ m/^(.*<!\s*ENTITY\s+.+\s+SYSTEM\s+\")(.+)(\"\s*>$)/i)
              {
                # Decompose the peaces of text.
                $before_name = $1;
                $external_system_file = $2;
                $after_name = $3;

                # Prepare this file with first step filter.
                # Recursive call!
                #
                # &step_1_filter (INPUT_FILE, TYPESETTING, DERIVATION_NAME)
                #
                $step_1_system_file
		  = &step_1_filter ("$external_system_file",
		                    "$typesetting",
				    "$derivation");

                # Save last temporary file names into the list.
                # These files will be deleted after the SGML parse.
                $temp_files_list
		  = "$temp_files_list" . " $step_1_system_file";

                # Modify the SYSTEM inclusion instruction.
                $line = "$before_name"
                        . "$step_1_system_file"
                        . "$after_name\n";
              }

        #---------------------------------------------------------------
        # All sub steps are terminated.
        #---------------------------------------------------------------

        # Print current re-elaborated line to the output file.
        print $output_stream ("$line");

        # Continue the cycle until the last main source line.
      } 

    # Close files.
    close ($input_stream);
    close ($output_stream);

    # Return the temporary file name.
    return ($output_file);

}

#-----------------------------------------------------------------------
# Fourth step filter.
#
# Transform SP output for some special character, depending on the
# back-end system limitations.
#
# &step_4_filter (INPUT_FILE, TYPESETTING,
#                 ORIGINAL_FILE_NAME) --> OUTPUT_FILE
#
sub step_4_filter
{
    local ($input_file) = $_[0];
    local ($typesetting) = $_[1];
    local ($original_file_name) = $_[2];
    local ($output_file) = &temporary_file;
    chomp ($output_file);
    local ($line) = "";

    local ($line_prefix) = "";
    local ($line_content) = "";

    # Tell what we are doing.
    &diag_output (sprintf (gettext ("%s:%s: step 4: "),
                  $program_executable, $original_file_name));
    &diag_output (sprintf (gettext ("post-SP re-elaborations\n")));

    # Here there is no need to use references for file handler names,
    # but this way we use uniform code.
    # See &step_1_filter() for explanation.
    local ($input_stream) = "$input_file";
    local ($output_stream) = "$output_file";


    #-------------------------------------------------------------------
    # Jump_sp_element.
    #
    # &jump_sp_element (INPUT_STREAM, OUTPUT_STREAM, LINE,
    #                   CONCLUSION_STRING)
    #
    sub jump_sp_element
    {
        local ($input_stream) = $_[0];
        local ($output_stream) = $_[1];
        local ($line) = $_[2];
        local ($conclusion) = $_[3];

        # Try to jump.
        while ($line !~ m/^$conclusion$/i)
	  {
            # Transfer the line, read the next and increase the counter.
            print $output_stream ("$line");
            $line = <$input_stream>;
          }

        # Last line (the one with the end string) must be transfered.
        print $output_stream ("$line");

    } # jump_sp_element

    #-------------------------------------------------------------------
    # Start of &step_4_filter()
    #-------------------------------------------------------------------

    # Open input and output files.
    open ($input_stream, "< $input_file");
    open ($output_stream, "> $output_file");

    # Do what is required
    while ($line = <$input_stream>)
      {
        # Literal text is jumped.
        if ($line =~ m/^\(TEXINFO$/i)
          {
            &jump_sp_element ($input_stream, $output_stream, $line,
                              "\\)TEXINFO\$");
          }
        elsif ($line =~ m/^\(TEX$/i)
          {
            &jump_sp_element ($input_stream, $output_stream, $line,
                              "\\)TEX\$");
          }
        elsif ($line =~ m/^\(HTML$/i)
          {
            &jump_sp_element ($input_stream, $output_stream, $line,
                              "\\)HTML\$");
          }
        elsif ($line =~ m/^(-)(.*)$/)
          {
            # This is a text line, because it starts with a "-".
	    # Must be re-elaborated.
            
            $line_prefix = $1;
            $line_content = $2;

            #-----------------------------------------------------------
            # Start converting special character into SDATA entities.
            #-----------------------------------------------------------

            $line_content = &minimal_sp_text_to_sdata ($line_content);

	    if ($input_encoding eq "ISO-8859-1")
	      {
		$line_content = &iso_8859_1_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-2")
	      {
		$line_content = &iso_8859_2_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-3")
	      {
		$line_content = &iso_8859_3_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-4")
	      {
		$line_content = &iso_8859_4_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-5")
	      {
		$line_content = &iso_8859_5_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-6")
	      {
		$line_content = &iso_8859_6_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-7")
	      {
		$line_content = &iso_8859_7_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-8")
	      {
		$line_content = &iso_8859_8_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-9")
	      {
		$line_content = &iso_8859_9_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-10")
	      {
		$line_content = &iso_8859_10_sp_text_to_sdata ($line_content);
	      }

            #-----------------------------------------------------------
            # Some special symbols for this transformation
            # are declared as SDATA entities, with the
            # form "[name  ]".
            # When SP insert these SDATA entities, they became
            # "\|[name  ]\|".
            # This ensure that the substitution mechanism
            # doesn't do mistakes.
            # Some special characters must be transformed
            # before into "\|[name  ]\|", then they are
            # translated back into the right way.
            # This way, characters that require a special
            # form when use with some programs, may be
            # inserted literally, as long that this
            # can be done for SGML, and also as SGML entities.
            #-----------------------------------------------------------

            $line_content = &sp_sdata_text_to_sp_texinfo ($line_content);
              
            # Rejoin the line.  
            $line = $line_prefix . $line_content . "\n";
    	    # The line is transfered.
    	    print $output_stream ($line);
          }
        elsif ($line =~ m/^(A.*?CDATA)(.*)$/ )
          {
            # This is a CDATA attribute, because it starts with a "A..CDATA".
	    # Must be re-elaborated.
            
            $line_prefix = $1;
            $line_content = $2;

            #-----------------------------------------------------------
            # Start converting special character into SDATA entities.
            #-----------------------------------------------------------

            $line_content = &minimal_sp_text_to_sdata ($line_content);

	    if ($input_encoding eq "ISO-8859-1")
	      {
		$line_content = &iso_8859_1_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-2")
	      {
		$line_content = &iso_8859_2_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-3")
	      {
		$line_content = &iso_8859_3_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-4")
	      {
		$line_content = &iso_8859_4_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-5")
	      {
		$line_content = &iso_8859_5_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-6")
	      {
		$line_content = &iso_8859_6_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-7")
	      {
		$line_content = &iso_8859_7_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-8")
	      {
		$line_content = &iso_8859_8_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-9")
	      {
		$line_content = &iso_8859_9_sp_text_to_sdata ($line_content);
	      }
	    elsif ($input_encoding eq "ISO-8859-10")
	      {
		$line_content = &iso_8859_10_sp_text_to_sdata ($line_content);
	      }

            #-----------------------------------------------------------
            # Start converting SDATA into back-end code.
            #-----------------------------------------------------------

            $line_content = &sp_sdata_text_to_sp_texinfo ($line_content);
              
            # Rejoin the line.  
            $line = $line_prefix . $line_content . "\n";
    	    # The line is transfered.
    	    print $output_stream ($line);
          }
	else
	  {
    	    # The line is transfered.
    	    print $output_stream ($line);
	  }
      }

    # Close files.
    close ($input_stream);
    close ($output_stream);

    # Return the temporary file name.
    return ($output_file);

} # step_4_filter

#======================================================================
# Start of program.
#----------------------------------------------------------------------

local ($source_file_name) = "";
local ($derivation) = "";
local ($input_encoding) = "";
local ($output_encoding) = "";
local ($action) = "";
local ($force) = 0;
local ($number_sections) = 0;
local ($paper) = "";
local ($setchapternewpage) = "";
local ($footnotestyle) = "";
local ($headings) = "";
local ($sgml_include) = ();
local ($nsgmls_include_options) = "";
local ($end_of_options) = 0;
local ($n) = 0;
local ($typesetting) = "TEXINFO";
local ($makeinfo_options) = "";

# used to tell what kind of target is the post-SP elaboration for.
local ($sgml_target) = $typesetting;

local ($root_file_name) = "";
local ($step_1_temp_file) = "";
local ($step_3_temp_file) = &temporary_file;
local ($step_4_temp_file) = "";

local ($verbose) = 0;


# Scan arguments.
for ($n = 0; $n <= $#ARGV; $n++)
  {
    # Analyze argument $n.
    if ($ARGV[$n] !~ m/^-/)
     {
        # Options are terminated as this argument has no minus at the
        # beginning. This must be a file name.
        if ($end_of_options)
          {
            # As options are already terminated, this is an extra
            # argument: a mistake.
            print STDERR (sprintf (gettext ("%s: no more arguments allowed after the file name: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
        else
          {
            # This is the first time that we encounter an argument
            # without "-". Must be the source file.
            $end_of_options = 1;
            $source_file_name = $ARGV[$n];
         }
        
      }
    elsif ($ARGV[$n] eq "--help")
      {
        # The user is asking for help.
        &help_syntax;
        exit 0;
      }
    elsif ($ARGV[$n] eq "--version")
      {
        # The user wants to know the program version.
        &version_info;
        exit 0;

      }
    elsif ($ARGV[$n] eq "--force")
      {
        # The user wants to get the output even with errors.
        $force = 1;
      }
    elsif ($ARGV[$n] eq "--number-sections")
      {
        # The user wants to get numbers on sections also with makeinfo.
        $number_sections = 1;
      }
    elsif ($ARGV[$n] eq "--sgml-syntax"
           || $ARGV[$n] eq "--sgml-check")
      {
        # The user wants to check the SGML source.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "sgml-check";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--sgml-syntax-hard"
           || $ARGV[$n] eq "--sgml-check-hard")
      {
        # The user wants to check all SGML aspects.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "sgml-check-hard";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] =~ m/^--deriv=(.*)$/)
      {
        # The user tells the name of the derivation.
        # We need to verify that the derivation wasn't already defined.
        if ($derivation eq "")
          {
            $derivation = $1;
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one derivation option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] =~ m/^--input-encoding=(.*)$/)
      {
        # The user tells the input encoding.
        # We need to verify that the derivation wasn't already defined.
        if ($input_encoding eq "")
          {
            $input_encoding = $1;
            $output_encoding = "ISO-646";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] =~ m/^--sgml-include=(.*)$/
           || $ARGV[$n] =~ m/^--include=(.*)$/)
      {
        # The user tells the name of an SGML parameter entity
        # that should be assigned with the word "INCLUDE". That
        # is, we want:
        #
        # <!ENTITY % name "INCLUDE">
        #
        # This option is cumulative; this way, we add to an array.
        $sgml_include[$#sgml_include+1] = $1;
      }
    elsif ( $ARGV[$n] =~ m/^--paper=(.+)$/ )
      {
        # The user tells what page size.
        # We need to verify that the dimensions weren't already defined.
        if ($paper eq "")
          {
            $paper = lc $1;
            if ($paper eq ""
                || $paper eq "a4"
                || $paper eq "a4latex"
                || $paper eq "a4wide"
                || $paper eq "letter"
                || $paper eq "small")
              {
                # The paper formats are ok.
                ;
              }
            else
              {
                print STDERR (sprintf (gettext ("%s: paper size unknown %s\n"),
	                      $program_executable, $ARGV[$n]));
                exit 1;
              }
            
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one paper size option is allowed %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ( $ARGV[$n] =~ m/^--setchapternewpage=(.+)$/ )
      {
        # The user tells to override the <setchapternewpage> tag.
        # We need to verify that it wasn't already defined.
        if ($setchapternewpage eq "")
          {
            $setchapternewpage = lc $1;
            if ($setchapternewpage eq ""
                || $setchapternewpage eq "on"
                || $setchapternewpage eq "off"
                || $setchapternewpage eq "odd")
              {
                # The setchapternewpage attribute is ok.
                ;
              }
            else
              {
                print STDERR (sprintf (gettext ("%s: setchapternewpage attribute unknown %s\n"),
	                               $program_executable, $ARGV[$n]));
                exit 1;
              }
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one setchapternewpage option is allowed %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ( $ARGV[$n] =~ m/^--footnotestyle=(.+)$/ )
      {
        # The user tells to override the <footnotestyle> tag.
        # We need to verify that it wasn't already defined.
        if ($footnotestyle eq "")
          {
            $footnotestyle = lc $1;
            if ($footnotestyle eq ""
                || $footnotestyle eq "end"
                || $footnotestyle eq "separate")
              {
                # The footnotestyle attribute is ok.
                ;
              }
            else
              {
                print STDERR (sprintf (gettext ("%s: footnotestyle attribute unknown %s\n"),
	                               $program_executable, $ARGV[$n]));
                exit 1;
              }
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one footnotestyle option is allowed %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ( $ARGV[$n] =~ m/^--headings=(.+)$/ )
      {
        # The user tells to override the <headings> tag.
        # We need to verify that it wasn't already defined.
        if ($headings eq "")
          {
            $headings = lc $1;
            if ($headings eq ""
                || $headings eq "on"
                || $headings eq "off"
                || $headings eq "single"
                || $headings eq "double"
                || $headings eq "singleafter"
                || $headings eq "doubleafter")
              {
                # The headings attribute is ok.
                ;
              }
            else
              {
                print STDERR (sprintf (gettext ("%s: headings attribute unknown %s\n"),
	                               $program_executable, $ARGV[$n]));
                exit 1;
              }
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one headings option is allowed %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--texi"
        || $ARGV[$n] eq "--texinfo")
      {
        # The user wants to generate a Texinfo source.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "texinfo";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ( $ARGV[$n] eq "--dvi" )
      {
        # The user wants to generate a DVI output.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "dvi";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ( $ARGV[$n] eq "--sp" )
      {
        # The user wants to generate a SP output for debugging.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "sp";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--ps"
           || $ARGV[$n] eq "--postscript")
      {
        # The user wants to generate a PostScript output.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "ps";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--info")
      {
        # The user wants to generate an Info output.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "info";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--text")
      {
        # The user wants to generate a pure text output.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "text";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--pdf")
      {
        # The user wants to generate a PDF output.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "pdf";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--html")
      {
        # The user wants to generate a DVI output.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "html";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    elsif ($ARGV[$n] eq "--verbose")
      {
	# Verbose mode was required.
	$verbose = 1;
      }
    elsif ($ARGV[$n] eq "--clean")
      {
        # The user wants to generate a DVI output.
        # We need to verify that the action wasn't already defined.
        if ($action eq "")
          {
            $action = "clean";
          }
        else
          {
            print STDERR (sprintf (gettext ("%s: only one action option is allowed: %s\n"),
	                           $program_executable, $ARGV[$n]));
            exit 1;
          }
      }
    else
      {
        # Must be an unknown option.
        print STDERR (sprintf (gettext ("%s: unknown option: %s\n"),
	              $program_executable, $ARGV[$n]));
        exit 1;
      }

  }

# Are arguments logical?
# Define default values an prepare some values.
if ($derivation eq "")
  {
    $derivation = "MAIN";
  }

if ($input_encoding eq ""
    || $input_encoding eq "ISO-8859-1"
    || $input_encoding eq "ISO-8859-2"
    || $input_encoding eq "ISO-8859-3"
    || $input_encoding eq "ISO-8859-4"
    || $input_encoding eq "ISO-8859-5"
    || $input_encoding eq "ISO-8859-6"
    || $input_encoding eq "ISO-8859-7"
    || $input_encoding eq "ISO-8859-8"
    || $input_encoding eq "ISO-8859-9"
    || $input_encoding eq "ISO-8859-10")
  {
    # OK
    ;
  }
else
  {
    print STDERR (sprintf (gettext ("%s: unsupported input encoding: %s\n"),
                           $program_executable, $input_encoding));
    exit 1;
  }

if ($action eq "")
  {
    $action = "texinfo";
  }

for ($n = 0 ; $n <= $#sgml_include ; $n++)
  {
    $nsgmls_include_options
      = $nsgmls_include_options . " -i" . $sgml_include[$n];
  }

#----------------------------------------------------------------------
# We assume that if we are here, all arguments are ok.
# If we are here, there is something to do.
#----------------------------------------------------------------------

# Define the root file name.
$root_file_name = &root_name ("$source_file_name", ".sgml");

# Prepare the diagnostic messages file. It will be reopened when
# necessary.
open (DIAG, "> $root_file_name.diag");
close (DIAG);

# If we have to clean from stale files; we do here:
if ($action eq "clean")
 {
    system( "mv $root_file_name.ps $root_file_name.ps1  > /dev/null 2>&1" );

    # This deletes also PostScript files.
    system( "rm $root_file_name.??  > /dev/null 2>&1" );
    system( "mv $root_file_name.ps1 $root_file_name.ps  > /dev/null 2>&1" );

    system( "rm $root_file_name.??s > /dev/null 2>&1" );
    system( "rm $root_file_name.??x > /dev/null 2>&1" );
    system( "rm $root_file_name.log > /dev/null 2>&1" );
    system( "rm $root_file_name.toc > /dev/null 2>&1" );
    system( "rm $root_file_name.diag > /dev/null 2>&1" );
    system( "rm $root_file_name.*.bak > /dev/null 2>&1" );

    exit 0;
  }

# First step filter.
# &step_1_filter (INPUT_FILE, TYPESETTING, DERIVATION_NAME)
$step_1_temp_file
  = &step_1_filter ("$source_file_name", "$typesetting", "$derivation");

# Second step filter.
# There isn't any more.

# Now we call nsgmls from the SP package and do what it is required.
if ($action eq "sgml-check")
  {
    # We just check the SGML. The output is controlled by less, so
    # we can read it well.
    system
      ("cat $step_1_temp_file | nsgmls $nsgmls_include_options -s -c $CATALOG 2>&1 | less");
  }
elsif ($action eq "sgml-check-hard")
  {
    # We just check the SGML in an hard way.
    # The output is controlled by less, so
    # we can read it well.
    system
      ("cat $step_1_temp_file | nsgmls $nsgmls_include_options -wall -s -c $CATALOG 2>&1 | less");
  }
else
  {
    # Tell what we are doing.
    &diag_output (sprintf (gettext ("%s:%s: step 3: SGML parse\n"),
                   $program_executable, $source_file_name));

    # We obtain a first pass SP output.
    system
      ("cat $step_1_temp_file | nsgmls $nsgmls_include_options -c $CATALOG > $step_3_temp_file");

    # Now we have to modify the SP output.
    $step_4_temp_file = &step_4_filter ($step_3_temp_file,
                                        $typesetting, $source_file_name);

    if ($action eq "sp")
      {
        # All done. The SP output is ready.
        # We just copy the temporary file into an appropriate name.
        system ("cp $step_4_temp_file $root_file_name.sp");

      }
    else
      {
        # We have to elaborate the post-SP output 
        # This elaboration will generate the file $root_file_name.texinfo
        #
        # We just need to call:
        #&sgml_post_sp_elab ($step_4_temp_file,
        #                    $sgml_target,
        #                    $source_file_name,
        #                    $root_file_name,
        #                    $paper,
        #                    $setchapternewpage,
        #                    $footnotestyle,
        #                    $headings,
	#                    $output_encoding);
        #
        # But we cannot, as this will take away all resources and
        # the system() function will not work well for further
        # elaborations (makeinfo and texi2dvi).
        #
        # So this function is inside a specific Perl program:
        # sgmltexi-sp2texi.
        #
        # Notice that arguments must be enclosed with double quotes
        # because these arguments may be empty.
        #
        # Last argument, $verbose, is meant to be like a global variable.
        #
        system ("sgmltexi-sp2texi \"$step_4_temp_file\" \"$sgml_target\" \"$source_file_name\" \"$root_file_name\" \"$paper\" \"$setchapternewpage\" \"$footnotestyle\" \"$headings\" \"$output_encoding\" \"$verbose\"");

        if ($action eq "texinfo"
            || $action eq "texi")
          {
            # All done. The Texinfo source is ready.
            ;   
          }
        elsif ($action eq "info")
          {
            if ($force)
              {
                $makeinfo_options
                  = $makeinfo_options . "--force";
              }
            if ($number_sections)
              {
                $makeinfo_options
                  = $makeinfo_options . "--number-sections";
              }
            # Run makeinfo.
            system ("makeinfo $makeinfo_options $root_file_name.texinfo");
          }
        elsif ($action eq "text")
          {
            if ($force)
              {
                $makeinfo_options
                  = $makeinfo_options . "--force";
              }
            if ($number_sections)
              {
                $makeinfo_options
                  = $makeinfo_options . "--number-sections";
              }
            # Run makeinfo.
            system ("makeinfo --no-headers --no-split $makeinfo_options --output=$root_file_name.txt $root_file_name.texinfo");
          }
        elsif ($action eq "html")
          {
            if ($force)
              {
                $makeinfo_options
                  = $makeinfo_options . "--force";
              }
            if ($number_sections)
              {
                $makeinfo_options
                  = $makeinfo_options . "--number-sections";
              }
            # Run makeinfo.
            system ("makeinfo --html $makeinfo_options $root_file_name.texinfo");
          }
        elsif ($action eq "dvi")
          {
            system ("texi2dvi $root_file_name.texinfo");
            # It seems that it is better to do it twice.
            system ("texi2dvi $root_file_name.texinfo");
          }
        elsif ($action eq "ps")
          {
            system ("texi2dvi $root_file_name.texinfo");
            # It seems that it is better to do it twice.
            system ("texi2dvi $root_file_name.texinfo");
            if ($paper eq "a4")
              {
                system ("dvips -K -t a4 -o $root_file_name.ps $root_file_name.dvi");
              }
            elsif ($paper eq "letter")
              {
                system ("dvips -K -t letter -o $root_file_name.ps $root_file_name.dvi");
              }
            else
              {
                system ("dvips -K -o $root_file_name.ps $root_file_name.dvi");
              }
          }
        elsif ($action eq "pdf")
          {
            system ("texi2dvi --pdf $root_file_name.texinfo");
            # It seems that it is better to do it twice.
            system ("texi2dvi --pdf $root_file_name.texinfo");
          }
      }
}

# Delete temporary files.
# It is strange, but sometimes, unlink() doesn't work as expected.
# This is because we use "rm" instead.
unlink ($step_1_temp_file);
unlink ($step_3_temp_file);
system ("rm -f $step_3_temp_file");
unlink ($step_4_temp_file);
system ("rm -f $temp_files_list");

#======================================================================

