From nobody Mon Feb 9 18:19:20 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1601411644; cv=none; d=zohomail.com; s=zohoarc; b=FYVKcPeo/v3ijuQ9QAD3EUwx7myJHAEdBk5plaTEHoEiLwtLOnhCnCrFM5rgEE0p4pxqsiZuQSnQmuTM3TC0oodNx+U5bO1yhZVhW9vmGsLYi+YfK0ZSQyYTPDHKAoID6tN3UEPjOo8z7niNkjMgVWIXY6jALUBo26+N/aip5M8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601411644; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=dQ/dcPZ69BPaO7eoiLLFu9hcpkuJWDz3vhNKfiFxln4=; b=G4HLdJqjlXw50w54yPkMwj0hKrBu85u2/VU8H3tJuvervc8tM5dABmKuB7f+5NwwvfXB0c5rrNLjy+p7jZ3BgrABYNK+EAmSh+eL5QnoNzPXScDiN/jPgpJ589zJoKulOKelt781jPDpYLmnqUYlnn4Zx/CD4g1SZohJhdME9rA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1601411644115654.1225782014795; Tue, 29 Sep 2020 13:34:04 -0700 (PDT) Received: from localhost ([::1]:44488 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kNMK2-0004Kq-DT for importer@patchew.org; Tue, 29 Sep 2020 16:34:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:59856) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kNM6J-0001vq-MR for qemu-devel@nongnu.org; Tue, 29 Sep 2020 16:19:51 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:48189) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kNM68-0003Va-5O for qemu-devel@nongnu.org; Tue, 29 Sep 2020 16:19:51 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-545-CLnpzKJ6NGGyF8-KHen64g-1; Tue, 29 Sep 2020 16:19:34 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 2151818BE160; Tue, 29 Sep 2020 20:19:33 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-101.ams2.redhat.com [10.36.112.101]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 998DC5D9E4; Tue, 29 Sep 2020 20:19:32 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id F17EB11358D9; Tue, 29 Sep 2020 22:19:26 +0200 (CEST) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1601410778; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=dQ/dcPZ69BPaO7eoiLLFu9hcpkuJWDz3vhNKfiFxln4=; b=Ub5WltixsjLt4id6H6qVS8RNrGJFhvURvibmTO1GGgT5XvtghWe+PRxUMywZMM8Y5LW83C Umq8tiZRl4pVoULI8Nsdvv9mYpX9nE5vYfV1vuexVtRfBQ1Md5UHHUzi3b8Cb55VCnhX6M ivGC8y/UZGeA/zhYyeJ8Je6Mn+zsz/E= X-MC-Unique: CLnpzKJ6NGGyF8-KHen64g-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 26/29] scripts/texi2pod: Delete unused script Date: Tue, 29 Sep 2020 22:19:23 +0200 Message-Id: <20200929201926.2155622-27-armbru@redhat.com> In-Reply-To: <20200929201926.2155622-1-armbru@redhat.com> References: <20200929201926.2155622-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=216.205.24.124; envelope-from=armbru@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/29 02:22:44 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.687, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Peter Maydell We no longer need the texi2pod script, so we can delete it, and the special-casing it had in the checkpatch script. Reviewed-by: Richard Henderson Signed-off-by: Peter Maydell Message-Id: <20200925162316.21205-19-peter.maydell@linaro.org> Reviewed-by: Markus Armbruster Signed-off-by: Markus Armbruster --- scripts/checkpatch.pl | 2 +- scripts/texi2pod.pl | 536 ------------------------------------------ 2 files changed, 1 insertion(+), 537 deletions(-) delete mode 100755 scripts/texi2pod.pl diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 50910899f2..1ba8a3810b 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -1659,7 +1659,7 @@ sub process { # tabs are only allowed in assembly source code, and in # some scripts we imported from other projects. next if ($realfile =3D~ /\.(s|S)$/); - next if ($realfile =3D~ /(checkpatch|get_maintainer|texi2pod)\.pl$/); + next if ($realfile =3D~ /(checkpatch|get_maintainer)\.pl$/); =20 if ($rawline =3D~ /^\+.*\t/) { my $herevet =3D "$here\n" . cat_vet($rawline) . "\n"; diff --git a/scripts/texi2pod.pl b/scripts/texi2pod.pl deleted file mode 100755 index 8bfc6f6f4c..0000000000 --- a/scripts/texi2pod.pl +++ /dev/null @@ -1,536 +0,0 @@ -#! /usr/bin/env perl - -# Copyright (C) 1999, 2000, 2001, 2003 Free Software Foundation, Inc. - -# This file is part of GCC. - -# GCC is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# GCC 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 GCC; see the file COPYING. If not, -# see . - -# This does trivial (and I mean _trivial_) conversion of Texinfo -# markup to Perl POD format. It's intended to be used to extract -# something suitable for a manpage from a Texinfo document. - -use warnings; - -$output =3D 0; -$skipping =3D 0; -%sects =3D (); -$section =3D ""; -@icstack =3D (); -@endwstack =3D (); -@skstack =3D (); -@instack =3D (); -$shift =3D ""; -%defs =3D (); -$fnno =3D 1; -$inf =3D ""; -$ibase =3D ""; -@ipath =3D (); -$encoding =3D undef; -@args =3D (); - -while ($_ =3D shift) { - if (/^-D(.*)$/) { - if ($1 ne "") { - $flag =3D $1; - } else { - $flag =3D shift; - } - $value =3D ""; - ($flag, $value) =3D ($flag =3D~ /^([^=3D]+)(?:=3D(.+))?/); - die "no flag specified for -D\n" - unless $flag ne ""; - die "flags may only contain letters, digits, hyphens, dashes and undersco= res\n" - unless $flag =3D~ /^[a-zA-Z0-9_-]+$/; - $defs{$flag} =3D $value; - } elsif (/^-I(.*)$/) { - if ($1 ne "") { - $flag =3D $1; - } else { - $flag =3D shift; - } - push (@ipath, $flag); - } elsif (/^-/) { - usage(); - } else { - $in =3D $_, next unless defined $in; - $out =3D $_, next unless defined $out; - usage(); - } -} - -if (defined $in) { - $inf =3D gensym(); - open($inf, "<$in") or die "opening \"$in\": $!\n"; - $ibase =3D $1 if $in =3D~ m|^(.+)/[^/]+$|; -} else { - $inf =3D \*STDIN; -} - -if (defined $out) { - open(STDOUT, ">$out") or die "opening \"$out\": $!\n"; -} - -while(defined $inf) { -while(<$inf>) { - # Certain commands are discarded without further processing. - /^\@(?: - [a-z]+index # @*index: useful only in complete manual - |need # @need: useful only in printed manual - |(?:end\s+)?group # @group .. @end group: ditto - |page # @page: ditto - |node # @node: useful only in .info file - |(?:end\s+)?ifnottex # @ifnottex .. @end ifnottex: use contents - )\b/x and next; - - chomp; - - # Look for filename and title markers. - /^\@setfilename\s+([^.]+)/ and $fn =3D $1, next; - /^\@settitle\s+([^.]+)/ and $tl =3D postprocess($1), next; - - # Look for document encoding - /^\@documentencoding\s+([^.]+)/ and do { - $encoding =3D $1 unless defined $encoding; - next; - }; - - # Identify a man title but keep only the one we are interested in. - /^\@c\s+man\s+title\s+([A-Za-z0-9-]+)\s+(.+)/ and do { - if (exists $defs{$1}) { - $fn =3D $1; - $tl =3D postprocess($2); - } - next; - }; - - # Look for blocks surrounded by @c man begin SECTION ... @c man end. - # This really oughta be @ifman ... @end ifman and the like, but such - # would require rev'ing all other Texinfo translators. - /^\@c\s+man\s+begin\s+([A-Z]+)\s+([A-Za-z0-9-]+)/ and do { - $output =3D 1 if exists $defs{$2}; - $sect =3D $1; - next; - }; - /^\@c\s+man\s+begin\s+([A-Z]+)/ and $sect =3D $1, $output =3D 1, next; - /^\@c\s+man\s+end/ and do { - $sects{$sect} =3D "" unless exists $sects{$sect}; - $sects{$sect} .=3D postprocess($section); - $section =3D ""; - $output =3D 0; - next; - }; - - # handle variables - /^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and do { - $defs{$1} =3D $2; - next; - }; - /^\@clear\s+([a-zA-Z0-9_-]+)/ and do { - delete $defs{$1}; - next; - }; - - # Single line command handlers. - - /^\@include\s+(.+)$/ and do { - push @instack, $inf; - $inf =3D gensym(); - $file =3D postprocess($1); - - # Try cwd and $ibase, then explicit -I paths. - $done =3D 0; - foreach $path ("", $ibase, @ipath) { - $mypath =3D $file; - $mypath =3D $path . "/" . $mypath if ($path ne ""); - open($inf, "<" . $mypath) and ($done =3D 1, last); - } - die "cannot find $file" if !$done; - next; - }; - - next unless $output; - - # Discard comments. (Can't do it above, because then we'd never see - # @c man lines.) - /^\@c\b/ and next; - - # End-block handler goes up here because it needs to operate even - # if we are skipping. - /^\@end\s+([a-z]+)/ and do { - # Ignore @end foo, where foo is not an operation which may - # cause us to skip, if we are presently skipping. - my $ended =3D $1; - next if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex|copyi= ng)$/; - - die "\@end $ended without \@$ended at line $.\n" unless defined $endw; - die "\@$endw ended by \@end $ended at line $.\n" unless $ended eq $endw; - - $endw =3D pop @endwstack; - - if ($ended =3D~ /^(?:ifset|ifclear|ignore|menu|iftex)$/) { - $skipping =3D pop @skstack; - next; - } elsif ($ended =3D~ /^(?:example|smallexample|display - |quotation|deftp|deftypefn)$/x) { - $shift =3D ""; - $_ =3D ""; # need a paragraph break - } elsif ($ended =3D~ /^(?:itemize|enumerate|[fv]?table)$/) { - $_ =3D "\n=3Dback\n"; - $ic =3D pop @icstack; - } elsif ($ended eq "multitable") { - $_ =3D "\n=3Dback\n"; - } else { - die "unknown command \@end $ended at line $.\n"; - } - }; - - # We must handle commands which can cause skipping even while we - # are skipping, otherwise we will not process nested conditionals - # correctly. - /^\@ifset\s+([a-zA-Z0-9_-]+)/ and do { - push @endwstack, $endw; - push @skstack, $skipping; - $endw =3D "ifset"; - $skipping =3D 1 unless exists $defs{$1}; - next; - }; - - /^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do { - push @endwstack, $endw; - push @skstack, $skipping; - $endw =3D "ifclear"; - $skipping =3D 1 if exists $defs{$1}; - next; - }; - - /^\@(ignore|menu|iftex|copying)\b/ and do { - push @endwstack, $endw; - push @skstack, $skipping; - $endw =3D $1; - $skipping =3D 1; - next; - }; - - next if $skipping; - - # Character entities. First the ones that can be replaced by raw text - # or discarded outright: - s/\@copyright\{\}/(c)/g; - s/\@dots\{\}/.../g; - s/\@enddots\{\}/..../g; - s/\@([.!? ])/$1/g; - s/\@[:-]//g; - s/\@bullet(?:\{\})?/*/g; - s/\@TeX\{\}/TeX/g; - s/\@pounds\{\}/\#/g; - s/\@minus(?:\{\})?/-/g; - s/\\,/,/g; - - # Now the ones that have to be replaced by special escapes - # (which will be turned back into text by unmunge()) - s/&/&/g; - s/\@\{/{/g; - s/\@\}/}/g; - s/\@\@/&at;/g; - - # Inside a verbatim block, handle @var specially. - if ($shift ne "") { - s/\@var\{([^\}]*)\}/<$1>/g; - } - - # POD doesn't interpret E<> inside a verbatim block. - if ($shift eq "") { - s//>/g; - } else { - s//>/g; - } - - /^\@(?:section|unnumbered|unnumberedsec|center)\s+(.+)$/ - and $_ =3D "\n=3Dhead2 $1\n"; - /^\@subsection\s+(.+)$/ - and $_ =3D "\n=3Dhead3 $1\n"; - /^\@subsubsection\s+(.+)$/ - and $_ =3D "\n=3Dhead4 $1\n"; - - # Block command handlers: - /^\@itemize(?:\s+(\@[a-z]+|\*|-))?/ and do { - push @endwstack, $endw; - push @icstack, $ic; - if (defined $1) { - $ic =3D $1; - } else { - $ic =3D '*'; - } - $_ =3D "\n=3Dover 4\n"; - $endw =3D "itemize"; - }; - - /^\@enumerate(?:\s+([a-zA-Z0-9]+))?/ and do { - push @endwstack, $endw; - push @icstack, $ic; - if (defined $1) { - $ic =3D $1 . "."; - } else { - $ic =3D "1."; - } - $_ =3D "\n=3Dover 4\n"; - $endw =3D "enumerate"; - }; - - /^\@multitable\s.*/ and do { - push @endwstack, $endw; - $endw =3D "multitable"; - $_ =3D "\n=3Dover 4\n"; - }; - - /^\@([fv]?table)\s+(\@[a-z]+)/ and do { - push @endwstack, $endw; - push @icstack, $ic; - $endw =3D $1; - $ic =3D $2; - $ic =3D~ s/\@(?:samp|strong|key|gcctabopt|option|env)/B/; - $ic =3D~ s/\@(?:code|kbd)/C/; - $ic =3D~ s/\@(?:dfn|var|emph|cite|i)/I/; - $ic =3D~ s/\@(?:file)/F/; - $ic =3D~ s/\@(?:asis)//; - $_ =3D "\n=3Dover 4\n"; - }; - - /^\@((?:small)?example|display)/ and do { - push @endwstack, $endw; - $endw =3D $1; - $shift =3D "\t"; - $_ =3D ""; # need a paragraph break - }; - - /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do { - @columns =3D (); - for $column (split (/\s*\@tab\s*/, $1)) { - # @strong{...} is used a @headitem work-alike - $column =3D~ s/^\@strong\{(.*)\}$/$1/; - push @columns, $column; - } - $_ =3D "\n=3Ditem ".join (" : ", @columns)."\n"; - }; - - /^\@(quotation)\s*(.+)?$/ and do { - push @endwstack, $endw; - $endw =3D $1; - $_ =3D "\n$2:" - }; - - /^{(.*)}$|^(.*)$/ and $#args > 0 and do { - $kind =3D $args[0]; - $arguments =3D $1 // ""; - if ($endw eq "deftypefn") { - $ret =3D $args[1]; - $fname =3D "B<$args[2]>"; - $_ =3D $ret ? "$ret " : ""; - $_ .=3D "$fname $arguments ($kind)"; - } else { - $_ =3D "B<$args[1]> ($kind)\n\n$arguments"; - } - @args =3D (); - }; - - /^\@(deftp)\s*(.+)?$/ and do { - push @endwstack, $endw; - $endw =3D $1; - $arg =3D $2; - $arg =3D~ s/{([^}]*)}/$1/g; - $arg =3D~ s/\@$//; - @args =3D split (/ /, $arg); - $_ =3D ""; - }; - - /^\@(deftypefn)\s*(.+)?$/ and do { - push @endwstack, $endw; - $endw =3D $1; - $arg =3D $2; - $arg =3D~ s/{([^}]*)}/$1/g; - $arg =3D~ s/\@$//; - @args =3D split (/ /, $arg); - $_ =3D ""; - }; - - /^\@itemx?\s*(.+)?$/ and do { - if (defined $1) { - if ($ic eq "") { - $_ =3D "\n=3Ditem $1\n"; - } else { - # Entity escapes prevent munging by the <> processing belo= w. - $_ =3D "\n=3Ditem $ic\<$1\>\n"; - } - } else { - $_ =3D "\n=3Ditem $ic\n"; - $ic =3D~ y/A-Ya-y/B-Zb-z/; - $ic =3D~ s/(\d+)/$1 + 1/eg; - } - }; - - $section .=3D $shift.$_."\n"; -} -# End of current file. -close($inf); -$inf =3D pop @instack; -} - -die "No filename or title\n" unless defined $fn && defined $tl; - -print "=3Dencoding $encoding\n\n" if defined $encoding; - -$sects{NAME} =3D "$fn \- $tl\n"; -$sects{FOOTNOTES} .=3D "=3Dback\n" if exists $sects{FOOTNOTES}; - -for $sect (qw(NAME SYNOPSIS DESCRIPTION OPTIONS ENVIRONMENT FILES - BUGS NOTES FOOTNOTES EXAMPLES SEEALSO AUTHOR COPYRIGHT)) { - if(exists $sects{$sect}) { - $head =3D $sect; - $head =3D~ s/SEEALSO/SEE ALSO/; - print "=3Dhead1 $head\n\n"; - print scalar unmunge ($sects{$sect}); - print "\n"; - } -} - -sub usage -{ - die "usage: $0 [-D toggle...] [infile [outfile]]\n"; -} - -sub postprocess -{ - local $_ =3D $_[0]; - - # @value{foo} is replaced by whatever 'foo' is defined as. - while (m/(\@value\{([a-zA-Z0-9_-]+)\})/g) { - if (! exists $defs{$2}) { - print STDERR "Option $2 not defined\n"; - s/\Q$1\E//; - } else { - $value =3D $defs{$2}; - s/\Q$1\E/$value/; - } - } - - # Formatting commands. - # Temporary escape for @r. - s/\@r\{([^\}]*)\}/R<$1>/g; - s/\@(?:dfn|var|emph|cite|i)\{([^\}]*)\}/I<$1>/g; - s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g; - s/\@(?:gccoptlist|samp|strong|key|option|env|command|b)\{([^\}]*)\}/B<= $1>/g; - s/\@sc\{([^\}]*)\}/\U$1/g; - s/\@file\{([^\}]*)\}/F<$1>/g; - s/\@w\{([^\}]*)\}/S<$1>/g; - s/\@t\{([^\}]*)\}/$1/g; - s/\@(?:dmn|math)\{([^\}]*)\}/$1/g; - - # keep references of the form @ref{...}, print them bold - s/\@(?:ref)\{([^\}]*)\}/B<$1>/g; - - # Change double single quotes to double quotes. - s/''/"/g; - s/``/"/g; - - # Cross references are thrown away, as are @noindent and @refill. - # (@noindent is impossible in .pod, and @refill is unnecessary.) - # @* is also impossible in .pod; we discard it and any newline that - # follows it. Similarly, our macro @gol must be discarded. - - s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g; - s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g; - s/;\s+\@pxref\{(?:[^\}]*)\}//g; - s/\@noindent\s*//g; - s/\@refill//g; - s/\@gol//g; - s/\@\*\s*\n?//g; - - # Anchors are thrown away - s/\@anchor\{(?:[^\}]*)\}//g; - - # @uref can take one, two, or three arguments, with different - # semantics each time. @url and @email are just like @uref with - # one argument, for our purposes. - s/\@(?:uref|url|email)\{([^\},]*)\}/<B<$1>>/g; - s/\@uref\{([^\},]*),([^\},]*)\}/$2 (C<$1>)/g; - s/\@uref\{([^\},]*),([^\},]*),([^\},]*)\}/$3/g; - - # Un-escape <> at this point. - s/<//g; - - # Now un-nest all B<>, I<>, R<>. Theoretically we could have - # indefinitely deep nesting; in practice, one level suffices. - 1 while s/([BIR])<([^<>]*)([BIR])<([^<>]*)>/$1<$2>$3<$4>$1 with bare ...; eliminate empty markup, B<>; - # shift white space at the ends of [BI]<...> expressions outside - # the expression. - s/R<([^<>]*)>/$1/g; - s/[BI]<>//g; - s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g; - s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g; - - # Extract footnotes. This has to be done after all other - # processing because otherwise the regexp will choke on formatting - # inside @footnote. - while (/\@footnote/g) { - s/\@footnote\{([^\}]+)\}/[$fnno]/; - add_footnote($1, $fnno); - $fnno++; - } - - return $_; -} - -sub unmunge -{ - # Replace escaped symbols with their equivalents. - local $_ =3D $_[0]; - - s/</E/g; - s/>/E/g; - s/{/\{/g; - s/}/\}/g; - s/&at;/\@/g; - s/&/&/g; - return $_; -} - -sub add_footnote -{ - unless (exists $sects{FOOTNOTES}) { - $sects{FOOTNOTES} =3D "\n=3Dover 4\n\n"; - } - - $sects{FOOTNOTES} .=3D "=3Ditem $fnno.\n\n"; $fnno++; - $sects{FOOTNOTES} .=3D $_[0]; - $sects{FOOTNOTES} .=3D "\n\n"; -} - -# stolen from Symbol.pm -{ - my $genseq =3D 0; - sub gensym - { - my $name =3D "GEN" . $genseq++; - my $ref =3D \*{$name}; - delete $::{$name}; - return $ref; - } -} --=20 2.26.2