1 # Extract all examples from the manual source.            -*- AWK -*-
 
   3 # This file is part of GNU Bison
 
   5 # Copyright (C) 1992, 2000-2001, 2005-2006, 2009-2012 Free Software
 
   8 # This program is free software: you can redistribute it and/or modify
 
   9 # it under the terms of the GNU General Public License as published by
 
  10 # the Free Software Foundation, either version 3 of the License, or
 
  11 # (at your option) any later version.
 
  13 # This program is distributed in the hope that it will be useful,
 
  14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  16 # GNU General Public License for more details.
 
  18 # You should have received a copy of the GNU General Public License
 
  19 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
  21 # This script is for use with any Awk that conforms to POSIX.
 
  22 # It was derived from a similar script tests/generate.awk in GNU m4.
 
  24 # Usage: extexi input-file.texi ... -- [FILES to extract]
 
  28   for (argc = 1; argc < ARGC; ++argc)
 
  29     if (ARGV[argc] == "--")
 
  31   for (i = argc + 1; i < ARGC; ++i)
 
  32     file_wanted[ARGV[i]] = 1;
 
  41   node = substr(tmp[1], 7);
 
  47     message("ignoring " $3);
 
  50       message("extracting " $3);
 
  55 /^@example$/, /^@end example$/ {
 
  59   if ($0 ~ /^@example$/)
 
  61       input = files_output[file] ? "\n" : "";
 
  63       # FNR is starting at 0 instead of 1, and
 
  64       # #line report the line number of the *next* line.
 
  66       # Note that recent Bison support it, but not Flex.
 
  67       if (file ~ /\.[chy]*$/)
 
  68         input = "#line " (FNR + 1) " \"" FILENAME "\"\n";
 
  72   if ($0 ~ /^@end example$/)
 
  75         fatal("no contents: " file);
 
  77       input = normalize(input);
 
  78       # No spurious end of line: use printf.
 
  79       if (files_output[file])
 
  80         # The parens around the output file seem to be required
 
  81         # by awk on Mac OS X Tiger (darwin 8.4.6).
 
  82         printf ("%s", input) >> (output_dir "/" file);
 
  84         printf ("%s", input) > (output_dir "/" file);
 
  85       close (output_dir "/" file);
 
  86       files_output[file] = 1;
 
  92   input = input $0 "\n";
 
  96 # We have to handle CONTENTS line per line, since anchors in AWK are
 
  97 # referring to the whole string, not the lines.
 
  98 function normalize(contents,    i, lines, n, line, res) {
 
  99   # Remove the Texinfo tags.
 
 100   n = split (contents, lines, "\n");
 
 101   # We don't want the last field which empty: it's behind the last \n.
 
 102   for (i = 1; i < n; ++i)
 
 106       # Whole line commands.
 
 107       if (line ~ /^@(c |comment|dots|end (ignore|group)|ignore|group)/)
 
 108         # Gperf accepts empty lines as valid input!!!
 
 109         if (file ~ /\.gperf$/)
 
 114       gsub (/"@value\{VERSION\}"/, "\"" VERSION "\"", line)
 
 115       gsub (/^@result\{\}/, "", line);
 
 116       gsub (/^@error\{\}/,  "", line);
 
 117       gsub ("@[{]", "{", line);
 
 118       gsub ("@}", "}", line);
 
 119       gsub ("@@", "@", line);
 
 120       gsub ("@comment.*", "", line);
 
 128 function message(msg) {
 
 129   if (! message_printed[msg])
 
 131       print "extexi: " msg > "/dev/stderr";
 
 132       message_printed[msg] = 1;
 
 136 function fatal(msg) {