Blame examples/extexi

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: