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 /^@(small)?example$/, /^@end (small)?example$/ {
59 if ($0 ~ /^@(small)?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 (small)?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) {