]> git.saurik.com Git - bison.git/blobdiff - examples/extexi
bison: avoid warnings from static code analysis
[bison.git] / examples / extexi
index 6315479c4957ae94567179c5944b15c15b508aed..f7c443f2f90c908317c8ff881479f8a1aa5003fa 100755 (executable)
@@ -3,7 +3,7 @@
 
 # This file is part of GNU Bison
 
-# Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2012 Free Software
+# Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2015 Free Software
 # Foundation, Inc.
 #
 # This program is free software: you can redistribute it and/or modify
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# Usage: extexi input-file.texi ... -- [FILES to extract]
+# Usage: extexi [OPTION...] input-file.texi ... -- [FILES to extract]
+
+# Look for @example environments preceded with lines such as:
+#
+#      @comment file calc.y
+# or
+#      @comment file calc.y: 3
+#
+# and output their content in that file (calc.y).  When numbers are
+# provided, use them to decide the output order (block numbered 1 is
+# output before block 2, even if the latter appears before).  The same
+# number may be used several time, in which case the order of
+# appearance is used.
 
 use strict;
 
+# Whether we generate synclines.
+my $synclines = 0;
+
 # normalize($block)
 # -----------------
 # Remove Texinfo mark up.
@@ -52,9 +67,6 @@ sub message($)
 
 # basename => full file name for files we should extract.
 my %file_wanted;
-# Whether we already say that file (in which case, append instead of
-# create).
-my %file_output;
 
 sub process ($)
 {
@@ -62,16 +74,21 @@ sub process ($)
   use IO::File;
   my $f = new IO::File($in)
     or die "$in: cannot open: $?";
-  # The latest "@comment file: " argument.
+  # FILE-NAME => { BLOCK-NUM => CODE }
+  my %file;
+
+  # The latest "@comment file: FILE [BLOCK-NUM]" arguments.
   my $file;
+  my $block;
   # The @example block currently read.
   my $input;
   local $_;
   while (<$f>)
     {
-      if (/^\@comment file: (.*)/)
+      if (/^\@comment file: ([^:\n]+)(?::\s*(\d+))?$/)
         {
           my $f = $1;
+          $block = $2 || 1;
           if ($file_wanted{$f})
             {
               $file = $file_wanted{$f};
@@ -86,10 +103,9 @@ sub process ($)
         {
           if (/^\@(small)?example$/)
             {
-              $input = $file_output{$file} ? "\n" : "";
               # Bison supports synclines, but not Flex.
               $input .= sprintf ("#line %s \"$in\"\n", $. + 1)
-                if $file =~ /\.[chy]*$/;
+                if $synclines && $file =~ /\.[chy]*$/;
               next;
             }
           elsif (/^\@end (small)?example$/)
@@ -97,22 +113,25 @@ sub process ($)
               die "no contents: $file"
                 if $input eq "";
 
-              $input = normalize($input);
-              # No spurious end of line: use printf.
-              my $o =
-                ($file_output{$file}
-                 ? new IO::File(">>$file")
-                 : new IO::File(">$file"));
-              print $o $input;
-              $file_output{$file} = 1;
+              $file{$file}{$block} .= normalize($input);
               $file = $input = undef;
+              ++$block;
             }
           else
             {
               $input .= $_;
             }
         }
+    }
 
+  # Output the files.
+  for my $file (keys %file)
+    {
+      # No spurious end of line: use printf.
+      my $o = new IO::File(">$file")
+        or die "$file: cannot create: $?";
+      print $o $file{$file}{$_}
+        for sort keys %{$file{$file}};
     }
 }
 
@@ -120,14 +139,18 @@ my @input;
 my $seen_dash = 0;
 for my $arg (@ARGV)
 {
-  if ($arg eq '--')
+  if ($seen_dash)
+    {
+      use File::Basename;
+      $file_wanted{basename($arg)} = $arg;
+    }
+  elsif ($arg eq '--')
     {
       $seen_dash = 1;
     }
-  elsif ($seen_dash)
+  elsif ($arg eq '--synclines')
     {
-      use File::Basename;
-      $file_wanted{basename($arg)} = $arg;
+      $synclines = 1;
     }
   else
     {