## -*- Mode: perl -*-
## ----------------------------------------------------------------------

## ----------------------------------------------------------------------
use POSIX;
use SGMLS::Refs;

## ----------------------------------------------------------------------
$format = '.text';

## ----------------------------------------------------------------------
## language definitions
%languages = (
	      'da' => 'Danish',
	      'de' => 'German',
	      'es' => 'Spanish',
	      'fr' => 'French',
	      'it' => 'English',
	      'nl' => 'Dutch'
	      );
( $lang = POSIX::setlocale( LANG ) ) =~ s/_.*//;
if ( -r $ENV{'DEBIANDOCSGMLSPEC'}.'/i18n/'.$lang.$format )
{
    $language = $languages{$lang};
    do $ENV{'DEBIANDOCSGMLSPEC'}.'/i18n/'.$lang.$format;
}
else
{
    $language = 'English';
    %lang = (
	     'Copyright Notice' => 'Copyright Notice',
	     'Copyright' => 'Copyright',
	     'Abstract' => 'Abstract',
	     'abstract' => 'abstract',
	     'toc' => "Table of contents\n",
	     'Contents' => 'Contents',
	     'next' => 'next',
	     'back' => 'back',
	     'footnotes' => 'footnotes',
	     'chapter' => 'chapter'
	     );
}

## ----------------------------------------------------------------------
## layout definitions
$perindent = 5;
$linewidth = 79;
$textwidth = 75;
$unbreakbackoff = 20;

## ----------------------------------------------------------------------
## overstrike definition
my $type = $ARGV[0];
$type eq 'plain' || $type eq 'overstrike' ||
    warn "want argument \`plain' or \`overstrike'\n";
$ov = 1 if $type eq 'overstrike';

## ----------------------------------------------------------------------
## tag processing
## ----------------------------------------------------------------------

## ----------------------------------------------------------------------
sub start
{
}
sub end
{
}

## ----------------------------------------------------------------------
sub start_element
{
    ( $element, $event ) = @_;
    my $name= $element->name;
    my $file= $event->file;
    my $line= $event->line;
    warn "unknown element $name at $file:$line\n"
	unless $unkwarndone{$name}++;
}

## ----------------------------------------------------------------------
sub start_debiandoc
{
}
sub end_debiandoc
{
}

## ----------------------------------------------------------------------
sub start_book
{
    output( "\n" );
}
sub end_book
{
    output( "\n\n" );
    _h_rule();
    output( "\n\n" );
    _para_new();
    output( $title );
    _para_end( 1 );
    my $spare;
    my $authors = join( ', ', @authors );
    if ( length( $version ) &&
        ( $spare = ( ( $textwidth -$perindent ) -
		    ( length( $authors ) + length( $version ) ) ) )
	>= 2 )
    {
        output( " "x$perindent );
        output( $authors );
        output( " "x$spare );
        output( $version );
        output( "\n" );
    }
    else
    {
        _para_new();
        output( $authors );
        output( " - ".$version ) if length( $version );
        _para_end( 1 );
    }
    output( "\n" );
}

## ----------------------------------------------------------------------
sub start_titlepag
{
}
sub end_titlepag
{
}

## ----------------------------------------------------------------------
sub start_title
{
    push_output( 'string' );
}
sub end_title
{
    $title = pop_output();
    _para_new();
    _push_style( 'b1' );
    output( $title );
    _para_end( 0, 'centre-underdash' );
}

## ----------------------------------------------------------------------
sub start_author
{
    push_output( 'string' );
}
sub end_author
{
    push( @authors, pop_output() );
    $verbatim--;
    _para_new();
    output( $authors[$#authors] );
    _para_end( 0, 'centre' );
}

## ----------------------------------------------------------------------
sub start_name
{
}
sub end_name
{
}

## ----------------------------------------------------------------------
sub start_email
{
    output( '<' );
}
sub end_email
{
    output( '>' );
}

## ----------------------------------------------------------------------
sub start_version
{
    push_output( 'string' );
}
sub end_version
{
    $version = pop_output();
    _para_new();
    output( $version );
    _para_end( 0,'centre' );
}

## ----------------------------------------------------------------------
sub start_date
{
    @_ = gmtime();
    $date = POSIX::strftime( "%d %B %Y", 0, 0, 0, $_[3], $_[4], $_[5] );
    $date =~ s/^0//;
    output( $date );
}
sub end_date
{
}

## ----------------------------------------------------------------------
sub start_abstract
{
    output( "\n" );
    _para_new();
    _push_style( 'b1' );
    output( _zero_num().' '.$lang{'Abstract'} );
    _end_heading();
    output( "\n" );
    _para_new();
}
sub end_abstract
{
    _para_end( 1 );
}

## ----------------------------------------------------------------------
sub start_copyright
{
    push_output( 'string' );
    $indentlevel = 1;
}
sub end_copyright
{
    $copyright = pop_output;
    $blanklinedone = 0;
}

## ----------------------------------------------------------------------
sub start_copyrightsummary
{
    _para_new();
}
sub end_copyrightsummary
{
    _para_end( $indentlevel );
}

## ----------------------------------------------------------------------
sub start_toc
{
    ( $element, $event ) = @_;
    $tocdetail = _num_level( _a( 'DETAIL' ) );
    output( "\n" );
    _para_new();
    _push_style( 'b1' );
    output( _zero_num().' '.$lang{'Contents'} );
    _end_heading();
    $indentlevel = 1;
    $noemph++;
}
sub end_toc
{
    if ( defined( $copyright ) )
    {
        $copynoticenum = _zero_num();
	output( "\n" );
        _para_new();
	_push_style( 'b1' );
        output( $copynoticenum.' '.$lang{'Copyright Notice'} );
	_end_heading();
        output( "\n" );
        output( $copyright );
    }
    $noemph--;
}

## ----------------------------------------------------------------------
sub start_tocentry
{
    ( $element, $event ) = @_;
    $toclevel = _num_level( _a( 'LEVEL' ) );
    if ( $toclevel <= $tocdetail )
    {
        output( "\n" ) if !$toclevel;
        _para_lhtag( _a( 'CHAPT' )._a( 'SECT' ).'.' );
	_para_lhtag( '' );
        _para_lhtag( '' ) if $toclevel > 1;
        _para_new();
	_push_style( 'u1' ) if !$toclevel;
    }
    else
    {
        push_output( 'nul' );
    }
}
sub end_tocentry
{
    if ( $toclevel <= $tocdetail )
    {
        _para_end( $toclevel > 1 ? 4 : 3 );
    }
    else
    {
        pop_output();
    }
}

## ----------------------------------------------------------------------
sub start_chapt
{
    ( $element, $event ) = @_;
    output( "\n\n" );
    _h_rule();
    output( "\n\n" );
    _para_new();
    _push_style( 'b1' );
    output( _a( 'CHAPT' ).'. ' );
}
sub end_chapt
{
}

## ----------------------------------------------------------------------
sub start_sect
{
    _sect( 2, @_ );
}
sub end_sect
{
}

## ----------------------------------------------------------------------
sub start_sect1
{
    _sect( 3, @_ );
}
sub end_sect1
{
}

## ----------------------------------------------------------------------
sub start_sect2
{
    _sect( 4, @_ );
}
sub end_sect2
{
}

## ----------------------------------------------------------------------
sub start_sect3
{
    _sect( 5, @_ );
}
sub end_sect3
{
}

## ----------------------------------------------------------------------
sub start_sect4
{
    _sect( 6, @_ );
}
sub end_sect4
{
}

## ----------------------------------------------------------------------
sub start_heading
{
}
sub end_heading
{
    _end_heading();
    $indentlevel = 1;
}

## ----------------------------------------------------------------------
sub start_p
{
    _insert_blankline();
    _para_new();
}
sub end_p
{
    _para_end( $indentlevel );
}

## ----------------------------------------------------------------------
sub start_example
{
    push_output( 'string' );
}
sub end_example
{
    my $example = pop_output();
    $example =~ s/[ \t]+\n/\n/g;
    $example =~ s/^\n+//;
    $example =~ s/\n+$//;
    my @el = split( /\n/, $example );
    my @ec = @el;
    grep( s/\0..\0//g, @ec );
    my @toolong = grep( length( $_ ) + ( $perindent * ( $indentlevel + 1 ) )
		       > $linewidth, @ec );
    if ( @toolong )
    {
        output( "\0=l\0" );
    }
    else
    {
        output( "\0=o\0" );
    }
    output( join( "\0=n\0", @el ) );
    output( "\0=c\0" );
}

## ----------------------------------------------------------------------
sub start_footnotes
{
}
sub end_footnotes
{
}

## ----------------------------------------------------------------------
sub start_footnote
{
}
sub end_footnote
{
}

## ----------------------------------------------------------------------
sub start_footnotebody
{
    ( $element, $event ) = @_;
    my $num = _a( 'NUMBER' );
    _para_lhtag( "[$num]" );
    $indentlevel++;
}
sub end_footnotebody
{
    $indentlevel--;
}

## ----------------------------------------------------------------------
sub start_footnoteref
{
    ( $element, $event ) = @_;
    my $num = _a( 'NUMBER' );
    output( "[$num]" );
}
sub end_footnoteref
{
}

## ----------------------------------------------------------------------
sub start_list
{
    _start_list( 'plain', @_ );
}
sub end_list
{
    _end_list();
}

## ----------------------------------------------------------------------
sub start_enumlist
{
    _start_list( 'enum', @_ );
}
sub end_enumlist
{
    _end_list();
}

## ----------------------------------------------------------------------
sub start_taglist
{
    _start_list( 'tag', @_ );
}
sub end_taglist
{
    _end_list();
}

## ----------------------------------------------------------------------
sub start_tag
{
    _insert_blankline();
    _para_new();
}
sub end_tag
{
    _para_end( $indentlevel - 1 );
    $blanklinedone = 1;
}

## ----------------------------------------------------------------------
sub start_item
{
    if ( $listtypes[0] eq 'enum' )
    {
        _para_lhtag( ++( $listcounters[0] ).'.' );
    }
    elsif ( $listtypes[0] eq 'plain' )
    {
        _para_lhtag( ( " "x( $perindent-2 ) )."*" );
    }
}
sub end_item
{
}

## ----------------------------------------------------------------------
sub start_em
{
    output( '*' );
}
sub end_em
{
    output( '*' );
}

## ----------------------------------------------------------------------
sub start_em_overstrike
{
    _push_style( 'u1' ) unless $noemph;
}
sub end_em_overstrike
{
    _pop_style() unless $noemph;
}

## ----------------------------------------------------------------------
sub start_strong
{
    output( '*' );
}
sub end_strong
{
    output( '*' );
}

## ----------------------------------------------------------------------
sub start_strong_overstrike
{
    _push_style( 'u1' ) unless $noemph;
}
sub end_strong_overstrike
{
    _pop_style() unless $noemph;
}

## ----------------------------------------------------------------------
sub start_var
{
    output( '<' );
}
sub end_var
{
    output( '>' );
}

## ----------------------------------------------------------------------
sub start_var_overstrike
{
    if ( ! $noemph )
    {
	_push_style( 'u1' );
	_push_style( 'b0' );
    }
}
sub end_var_overstrike
{
    if ( ! $noemph )
    {
	_pop_style();
	_pop_style();
    }
}

## ----------------------------------------------------------------------
sub start_prgn
{
}
sub end_prgn
{
}

## ----------------------------------------------------------------------
sub start_tt
{
    output( '`' );
}
sub end_tt
{
    output( "'" );
}

## ----------------------------------------------------------------------
sub start_tt_overstrike
{
    _push_style( 'b1' ) unless $noemph;
}
sub end_tt_overstrike
{
    _pop_style() unless $noemph;
}

## ----------------------------------------------------------------------
sub start_qref
{
}
sub end_qref
{
}

## ----------------------------------------------------------------------
sub start_ref
{
    ( $element, $event ) = @_;
    output( _a( 'HNAME' ).', `' );
}
sub end_ref
{
    output( "'" );
}

## ----------------------------------------------------------------------
sub start_manref
{
    ( $element, $event ) = @_;
    _push_style( 'b1' );
    output( _a( 'NAME' ) );
    _pop_style();
    _push_style( 'u1' );
    output( '('._a( 'SECTION' ).')' );
    _pop_style();
}
sub end_manref
{
}

## ----------------------------------------------------------------------
sub start_ftpsite
{
}
sub end_ftpsite
{
}

## ----------------------------------------------------------------------
sub start_ftppath
{
}
sub end_ftppath
{
}

## ----------------------------------------------------------------------
sub cdata
{
}

## ----------------------------------------------------------------------
sub sdata
{
}

## ----------------------------------------------------------------------
## helper definitions
## ----------------------------------------------------------------------

## ----------------------------------------------------------------------
sub _para_lhtag
{
    my ( $ntag ) = @_;
    $paralhindents++;
    $paralhtag .= $ntag;
    $paralhtag .= ' 'x( $paralhindents * $perindent 
		       - length( $paralhtag ) - 1 );
    $paralhtag .= ' ';
}

## ----------------------------------------------------------------------
sub _start_list
{
    ( $type, $element, $event ) = @_;
    unshift( @listtypes, $type );
    unshift( @listcounters, 0 );
    _para_end( $indentlevel, '', 1 );
    $indentlevel++;
    if ( $incompact || $element->attribute( 'COMPACT' )->type eq 'TOKEN' )
    {
	$incompact++;
    }
}
sub _end_list
{
    shift( @listtypes );
    shift( @listcounters );
    _insert_blankline();
    _para_new();
    $indentlevel--;
    $incompact-- if $incompact;
}

## ----------------------------------------------------------------------
sub _insert_blankline
{
    if ( !$incompact && ! $blanklinedone )
    {
	output( "\n" );
	$blanklinedone = 1;
    }
}

## ----------------------------------------------------------------------
sub _h_rule
{
    output( ( "-"x$linewidth )."\n" );
}

## ----------------------------------------------------------------------
sub _end_heading
{
    _para_end( 0, $ov ? '' : 'underdash' );
}

## ----------------------------------------------------------------------
sub _sect
{
    ( $hlevel, $element, $event ) = @_;
    output( "\n" );
    output( "\n" ) if $hlevel <= 2;
    _para_new();
    _push_style( 'b1' );
    output( _a( 'CHAPT' )._a( 'SECT' ).'. ' );
}

## ----------------------------------------------------------------------
sub _push_style
{
    return unless $ov;
    push( @stylestack, substr( $_[0], 0, 1 ) );
    output( "\0$_[0]\0" );
}
sub _pop_style
{
    return unless $ov;
    output( "\0".pop( @stylestack )."-\0" );
}

## ----------------------------------------------------------------------
sub _para_new
{
    push_output( 'string' );
    @stylestack = ();
}
sub _para_end
{
    my ( $inum, $fmt, $lhtagdefer ) = @_;
    # fmt is one of undef,'centre','centre-underdash','underdash'
    # lhtagdefer is 1 if we can safely defer a paralhtag til later
    my $pd = pop_output();
    local ( @b, @u );
    @b = @u = ( 0 );
    my $here, $maxwidth, $evstr, $pis, $pil, $npis, $av, $ls_pis, $ls_pil;
    my $nobreak, $code, $reducedwidth, $indentdone, $lhs;
    my $centre = ( $fmt eq 'centre' || $fmt eq 'centre-underdash' );
    my $udash = ( $fmt eq 'underdash' || $fmt eq 'centre-underdash' );
    $maxwidth = 0;
    return if $pd !~ m/\S/ && ( $lhtagdefer || ! length( $paralhtag ) );
    if ( length( $paralhtag ) )
    {
        output( " "x( $perindent * ( $inum - $paralhindents ) ) );
        output( _emph_string( $paralhtag ) );
        $reducedwidth = length( $paralhtag ) - ( $perindent * $paralhindents );
        $reducedwidth = 0 if $reducedwidth < 0;
        $paralhtag = '';
	$indentdone = 1;
	$paralhindents = 0;
    }
  outer:
    while ( length( $pd ) )
    {
        next if ! $nobreak && $pd =~ s/^\s+//;
        $pil = 0;
	$av = $textwidth - $perindent * $inum - $reducedwidth;
        $pis = 0;
	$reducedwidth = 0;
	$ls_pis = -1;
        while ( $pis < length( $pd ) && ( $nobreak || $pil <= $av ) )
	{
            $here = substr( $pd, $pis, 1 );
            if ( $here eq "\0" )
	    {
                $code = substr( $pd, $pis + 1, 2 );
                if ( $code eq '=o' )
		{
                    last if $pis;
                    $nobreak = 1;
		    $lhs = 0;
                }
		elsif ( $code eq '=l' )
		{
                    last if $pis || $indentdone;
                    $nobreak = 1;
		    $lhs = 1;
                }
		elsif ( $code eq '=c' )
		{
                    last if $pis;
                    $nobreak = 0;
		    $lhs = 0;
                }
		elsif ( $code eq '=n' )
		{
                    $pis += 4;
		    last;
                }
		else
		{
                    $pis += 4;
		    next;
                }
                $pd = substr( $pd, 4 );
		next outer;
            }
            if ( ! $nobreak && $here =~ m/^\s$/ )
	    {
                $here = substr( $pd, $pis );
		$here =~ s/^\s+/ /;
                $pd = substr( $pd, 0, $pis ).$here;
                $ls_pis = $pis;
		$ls_pil = $pil;
            }
            if ( $ls_pis < 0 && $pil >= $av - $unbreakbackoff )
	    {
                $ls_pis = $pis;
		$ls_pil = $pil;
            }
            $pis++;
	    $pil++;
        }
        if ( ! $nobreak && $pil > $av )
	{
	    $pis = $ls_pis;
	    $ls_pil = $pil;
	}
        $maxwidth = $pil if $pil > $maxwidth;
        output( " "x( ( $centre ? ( $textwidth - $pil ) / 2 : 0 )
		     + ( $lhs ? 0 : ( $inum + $nobreak ) * $perindent ) ) )
            if ! $indentdone;
        output( _emph_string( substr( $pd, 0, $pis ) ) );
        output( "\n" );
	$indentdone = 0;
        $pd = substr( $pd, $pis );
    }
    if ( $udash )
    {
        output( " "x( ( $centre ? ( $textwidth - $maxwidth ) / 2 : 0 )
		     + ( $inum * $perindent ) ) );
        output( ( $b[0] ? "--" : "-" )x$maxwidth."\n" );
    }
    $blanklinedone = 0;
}

## ----------------------------------------------------------------------
sub _emph_string
{
    my ( $string ) = @_;
    my $i, $here, $ar, $sv;
    for ( $i = 0; $i < length( $string ); $i++ )
    {
        $here = substr( $string,$i, 1 );
        if ( $here eq "\0" )
	{
            $ar = substr( $string, $i + 1, 1 );
	    $sv = substr( $string, $i + 2, 1 );
            if ( $sv eq '-' )
	    {
                $es = "shift(\@$ar);1;";
		eval $es || die "$@ / $es";
            }
	    elsif ( $sv ne '=' )
	    {
                $es = "unshift(\@$ar,\$sv);1;";
		eval $es || die "$@ / $es";
            }
            $i += 3;
	    next;
        }
        if ( $b[0] )
	{
	    output( "$here" );
	}
        elsif ( $u[0] )
	{
	    output( "_" );
	}
        output( $here );
    }
    return;
}

## ----------------------------------------------------------------------
sub _zero_num
{
    '0.'.++$czeronum;
}

## ----------------------------------------------------------------------
sub _a
{
    my $el = $element->attribute( $_[0] );
    return defined( $el ) ? $el->value : undef;
}

## ----------------------------------------------------------------------
sub _num_level
{
    my ( $d )= @_;
    return 0 if $d =~ m/^CHAPT/;
    return $1+1 if $d =~ m/^SECT(\d*)$/;
    warn "unknown toc detail token \`$d'\n";
}

## ----------------------------------------------------------------------
## SGML definitions
## ----------------------------------------------------------------------

## ----------------------------------------------------------------------
sgml( 'start', '' );
sgml( 'end', '' );

## ----------------------------------------------------------------------
sgml( 'start_element', \&start_element );

## ----------------------------------------------------------------------
sgml( '<DEBIANDOC>', '' );
sgml( '</DEBIANDOC>', '' );

## ----------------------------------------------------------------------
sgml( '<BOOK>', \&start_book );
sgml( '</BOOK>', \&end_book );

## ----------------------------------------------------------------------
sgml( '<TITLEPAG>', '' );
sgml( '</TITLEPAG>', \&end_titlepag );

## ----------------------------------------------------------------------
sgml( '<TITLE>', \&start_title );
sgml( '</TITLE>', \&end_title );

## ----------------------------------------------------------------------
sgml( '<AUTHOR>', \&start_author );
sgml( '</AUTHOR>', \&end_author );

## ----------------------------------------------------------------------
sgml( '<NAME>', '' );
sgml( '</NAME>', '' );

## ----------------------------------------------------------------------
sgml( '<EMAIL>', \&start_email );
sgml( '</EMAIL>', \&end_email );

## ----------------------------------------------------------------------
sgml( '<VERSION>', \&start_version );
sgml( '</VERSION>', \&end_version );

## ----------------------------------------------------------------------
sgml( '<DATE>', \&start_date );
sgml( '</DATE>', '' );

## ----------------------------------------------------------------------
sgml( '<ABSTRACT>', \&start_abstract );
sgml( '</ABSTRACT>', \&end_abstract );

## ----------------------------------------------------------------------
sgml( '<COPYRIGHT>', \&start_copyright );
sgml( '</COPYRIGHT>', \&end_copyright );

## ----------------------------------------------------------------------
sgml( '<COPYRIGHTSUMMARY>', \&start_copyrightsummary );
sgml( '</COPYRIGHTSUMMARY>', \&end_copyrightsummary );

## ----------------------------------------------------------------------
sgml( '<TOC>', \&start_toc );
sgml( '</TOC>', \&end_toc );

## ----------------------------------------------------------------------
sgml( '<TOCENTRY>', \&start_tocentry );
sgml( '</TOCENTRY>', \&end_tocentry );

## ----------------------------------------------------------------------
sgml( '<CHAPT>', \&start_chapt );
sgml( '</CHAPT>', '' );

## ----------------------------------------------------------------------
sgml( '<SECT>', \&start_sect );
sgml( '</SECT>', '' );

## ----------------------------------------------------------------------
sgml( '<SECT1>', \&start_sect1 );
sgml( '</SECT1>', '' );

## ----------------------------------------------------------------------
sgml( '<SECT2>', \&start_sect2 );
sgml( '</SECT2>', '' );

## ----------------------------------------------------------------------
sgml( '<SECT3>', \&start_sect3 );
sgml( '</SECT3>', '' );

## ----------------------------------------------------------------------
sgml( '<SECT4>', \&start_sect4 );
sgml( '</SECT4>', '' );

## ----------------------------------------------------------------------
sgml( '<HEADING>', '' );
sgml( '</HEADING>', \&end_heading );

## ----------------------------------------------------------------------
sgml( '<P>' , \&start_p );
sgml( '</P>', \&end_p );

## ----------------------------------------------------------------------
sgml( '<EXAMPLE>', \&start_example );
sgml( '</EXAMPLE>', \&end_example );

## ----------------------------------------------------------------------
sgml( '<FOOTNOTES>', '' );
sgml( '</FOOTNOTES>', '' );

## ----------------------------------------------------------------------
sgml( '<FOOTNOTE>', '' );
sgml( '</FOOTNOTE>', '' );

## ----------------------------------------------------------------------
sgml( '<FOOTNOTEBODY>', \&start_footnotebody );
sgml( '</FOOTNOTEBODY>', \&end_footnotebody );

## ----------------------------------------------------------------------
sgml( '<FOOTNOTEREF>', \&start_footnoteref );
sgml( '</FOOTNOTEREF>', \&end_footnoteref );

## ----------------------------------------------------------------------
sgml( '<LIST>', \&start_list );
sgml( '</LIST>', \&end_list );

## ----------------------------------------------------------------------
sgml( '<ENUMLIST>', \&start_enumlist );
sgml( '</ENUMLIST>', \&end_enumlist );

## ----------------------------------------------------------------------
sgml( '<TAGLIST>', \&start_taglist );
sgml( '</TAGLIST>', \&end_taglist );

## ----------------------------------------------------------------------
sgml( '<TAG>', \&start_tag );
sgml( '</TAG>', \&end_tag );

## ----------------------------------------------------------------------
sgml( '<ITEM>', \&start_item );
sgml( '</ITEM>', '' );

## ----------------------------------------------------------------------
if ( $ov )
{
    sgml( '<EM>',\&start_em_overstrike );
    sgml( '</EM>', \&end_em_overstrike );
}
else
{
    sgml( '<EM>',\&start_em );
    sgml( '</EM>', \&end_em );
}

## ----------------------------------------------------------------------
if ( $ov )
{
    sgml( '<STRONG>', \&start_strong_overstrike );
    sgml( '</STRONG>', \&end_strong_overstrike );
}
else
{
    sgml( '<STRONG>', \&start_strong );
    sgml( '</STRONG>', \&end_strong );
}

## ----------------------------------------------------------------------
if ( $ov )
{
    sgml( '<VAR>', \&start_var_overstrike );
    sgml( '</VAR>', \&end_var_overstrike );
}
else
{
    sgml( '<VAR>', \&start_var );
    sgml( '</VAR>', \&end_var );
}

## ----------------------------------------------------------------------
sgml( '<PRGN>', '' );
sgml( '</PRGN>', '' );

## ----------------------------------------------------------------------
if ( $ov )
{
    sgml( '<TT>', \&start_tt_overstrike );
    sgml( '</TT>', \&end_tt_overstrike );
}
else
{
    sgml( '<TT>', \&start_tt );
    sgml( '</TT>', \&end_tt );
}

## ----------------------------------------------------------------------
sgml( '<QREF>', '' );
sgml( '</QREF>', '' );

## ----------------------------------------------------------------------
sgml( '<REF>', \&start_ref );
sgml( '</REF>', \&end_ref );

## ----------------------------------------------------------------------
sgml( '<MANREF>', \&start_manref );
sgml( '</MANREF>', '' );

## ----------------------------------------------------------------------
sgml( '<FTPSITE>', '' );
sgml( '</FTPSITE>', '' );

## ----------------------------------------------------------------------
sgml( '<FTPPATH>', '' );
sgml( '</FTPPATH>', '' );

## ----------------------------------------------------------------------
#sgml( 'cdata', \&cdata );
#sgml( 'sdata', \&sdata );

## ----------------------------------------------------------------------
