|
Packit Service |
c3aa71 |
#! /usr/bin/perl -w
|
|
Packit Service |
c3aa71 |
# Extract all examples from the manual source.
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# This file is part of GNU Bison
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2015 Free Software
|
|
Packit Service |
c3aa71 |
# Foundation, Inc.
|
|
Packit Service |
c3aa71 |
#
|
|
Packit Service |
c3aa71 |
# This program is free software: you can redistribute it and/or modify
|
|
Packit Service |
c3aa71 |
# it under the terms of the GNU General Public License as published by
|
|
Packit Service |
c3aa71 |
# the Free Software Foundation, either version 3 of the License, or
|
|
Packit Service |
c3aa71 |
# (at your option) any later version.
|
|
Packit Service |
c3aa71 |
#
|
|
Packit Service |
c3aa71 |
# This program is distributed in the hope that it will be useful,
|
|
Packit Service |
c3aa71 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
c3aa71 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
c3aa71 |
# GNU General Public License for more details.
|
|
Packit Service |
c3aa71 |
#
|
|
Packit Service |
c3aa71 |
# You should have received a copy of the GNU General Public License
|
|
Packit Service |
c3aa71 |
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# Usage: extexi [OPTION...] input-file.texi ... -- [FILES to extract]
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# Look for @example environments preceded with lines such as:
|
|
Packit Service |
c3aa71 |
#
|
|
Packit Service |
c3aa71 |
# @comment file calc.y
|
|
Packit Service |
c3aa71 |
# or
|
|
Packit Service |
c3aa71 |
# @comment file calc.y: 3
|
|
Packit Service |
c3aa71 |
#
|
|
Packit Service |
c3aa71 |
# and output their content in that file (calc.y). When numbers are
|
|
Packit Service |
c3aa71 |
# provided, use them to decide the output order (block numbered 1 is
|
|
Packit Service |
c3aa71 |
# output before block 2, even if the latter appears before). The same
|
|
Packit Service |
c3aa71 |
# number may be used several time, in which case the order of
|
|
Packit Service |
c3aa71 |
# appearance is used.
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
use strict;
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# Whether we generate synclines.
|
|
Packit Service |
c3aa71 |
my $synclines = 0;
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# normalize($block)
|
|
Packit Service |
c3aa71 |
# -----------------
|
|
Packit Service |
c3aa71 |
# Remove Texinfo mark up.
|
|
Packit Service |
c3aa71 |
sub normalize($)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
local ($_) = @_;
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
s/^\@(c |comment|dots|end (ignore|group)|ignore|group).*//mg;
|
|
Packit Service |
c3aa71 |
s/\@value\{VERSION\}/$ENV{VERSION}/g;
|
|
Packit Service |
c3aa71 |
s/^\@(error|result)\{\}//mg;
|
|
Packit Service |
c3aa71 |
s/\@([{}@])/$1/g;
|
|
Packit Service |
c3aa71 |
s/\@comment.*//;
|
|
Packit Service |
c3aa71 |
$_;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# Print messages only once.
|
|
Packit Service |
c3aa71 |
my %msg;
|
|
Packit Service |
c3aa71 |
sub message($)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
my ($msg) = @_;
|
|
Packit Service |
c3aa71 |
if (! $msg{$msg})
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
print STDERR "extexi: $msg\n";
|
|
Packit Service |
c3aa71 |
$msg{$msg} = 1;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# basename => full file name for files we should extract.
|
|
Packit Service |
c3aa71 |
my %file_wanted;
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
sub process ($)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
my ($in) = @_;
|
|
Packit Service |
c3aa71 |
use IO::File;
|
|
Packit Service |
c3aa71 |
my $f = new IO::File($in)
|
|
Packit Service |
c3aa71 |
or die "$in: cannot open: $?";
|
|
Packit Service |
c3aa71 |
# FILE-NAME => { BLOCK-NUM => CODE }
|
|
Packit Service |
c3aa71 |
my %file;
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# The latest "@comment file: FILE [BLOCK-NUM]" arguments.
|
|
Packit Service |
c3aa71 |
my $file;
|
|
Packit Service |
c3aa71 |
my $block;
|
|
Packit Service |
c3aa71 |
# The @example block currently read.
|
|
Packit Service |
c3aa71 |
my $input;
|
|
Packit Service |
c3aa71 |
local $_;
|
|
Packit Service |
c3aa71 |
while (<$f>)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
if (/^\@comment file: ([^:\n]+)(?::\s*(\d+))?$/)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
my $f = $1;
|
|
Packit Service |
c3aa71 |
$block = $2 || 1;
|
|
Packit Service |
c3aa71 |
if ($file_wanted{$f})
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
$file = $file_wanted{$f};
|
|
Packit Service |
c3aa71 |
message(" GEN $file");
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
else
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
message("SKIP $f");
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
elsif ($file && /^\@(small)?example$/ .. /^\@end (small)?example$/)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
if (/^\@(small)?example$/)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
# Bison supports synclines, but not Flex.
|
|
Packit Service |
c3aa71 |
$input .= sprintf ("#line %s \"$in\"\n", $. + 1)
|
|
Packit Service |
c3aa71 |
if $synclines && $file =~ /\.[chy]*$/;
|
|
Packit Service |
c3aa71 |
next;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
elsif (/^\@end (small)?example$/)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
die "no contents: $file"
|
|
Packit Service |
c3aa71 |
if $input eq "";
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
$file{$file}{$block} .= normalize($input);
|
|
Packit Service |
c3aa71 |
$file = $input = undef;
|
|
Packit Service |
c3aa71 |
++$block;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
else
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
$input .= $_;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
# Output the files.
|
|
Packit Service |
c3aa71 |
for my $file (keys %file)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
# No spurious end of line: use printf.
|
|
Packit Service |
c3aa71 |
my $o = new IO::File(">$file")
|
|
Packit Service |
c3aa71 |
or die "$file: cannot create: $?";
|
|
Packit Service |
c3aa71 |
print $o $file{$file}{$_}
|
|
Packit Service |
c3aa71 |
for sort keys %{$file{$file}};
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
my @input;
|
|
Packit Service |
c3aa71 |
my $seen_dash = 0;
|
|
Packit Service |
c3aa71 |
for my $arg (@ARGV)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
if ($seen_dash)
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
use File::Basename;
|
|
Packit Service |
c3aa71 |
$file_wanted{basename($arg)} = $arg;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
elsif ($arg eq '--')
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
$seen_dash = 1;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
elsif ($arg eq '--synclines')
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
$synclines = 1;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
else
|
|
Packit Service |
c3aa71 |
{
|
|
Packit Service |
c3aa71 |
push @input, $arg;
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
}
|
|
Packit Service |
c3aa71 |
process $_
|
|
Packit Service |
c3aa71 |
foreach @input;
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
|
|
Packit Service |
c3aa71 |
### Setup "GNU" style for perl-mode and cperl-mode.
|
|
Packit Service |
c3aa71 |
## Local Variables:
|
|
Packit Service |
c3aa71 |
## perl-indent-level: 2
|
|
Packit Service |
c3aa71 |
## perl-continued-statement-offset: 2
|
|
Packit Service |
c3aa71 |
## perl-continued-brace-offset: 0
|
|
Packit Service |
c3aa71 |
## perl-brace-offset: 0
|
|
Packit Service |
c3aa71 |
## perl-brace-imaginary-offset: 0
|
|
Packit Service |
c3aa71 |
## perl-label-offset: -2
|
|
Packit Service |
c3aa71 |
## cperl-indent-level: 2
|
|
Packit Service |
c3aa71 |
## cperl-brace-offset: 0
|
|
Packit Service |
c3aa71 |
## cperl-continued-brace-offset: 0
|
|
Packit Service |
c3aa71 |
## cperl-label-offset: -2
|
|
Packit Service |
c3aa71 |
## cperl-extra-newline-before-brace: t
|
|
Packit Service |
c3aa71 |
## cperl-merge-trailing-else: nil
|
|
Packit Service |
c3aa71 |
## cperl-continued-statement-offset: 2
|
|
Packit Service |
c3aa71 |
## End:
|