]> git.saurik.com Git - bison.git/blame - examples/extexi
Encapsulate the push parser state variables into an M4 macro so the
[bison.git] / examples / extexi
CommitLineData
1c59e0a1
AD
1# Extract all examples from the manual source. -*- AWK -*-
2
b34d96c1 3# This file is part of GNU Bison
3cf084ec 4# Copyright 1992, 2000, 2001, 2005, 2006 Free Software Foundation, Inc.
1c59e0a1
AD
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19# 02111-1307 USA
20
b34d96c1
PE
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.
1c59e0a1
AD
23#
24# Usage: extexi input-file.texi ... -- [FILES to extract]
25BEGIN {
26 if (!output_dir)
27 output_dir = ".";
28 for (argc = 1; argc < ARGC; ++argc)
29 if (ARGV[argc] == "--")
30 break;
31 for (i = argc + 1; i < ARGC; ++i)
32 file_wanted[ARGV[i]] = 1;
33 ARGC = argc;
34}
35
36/^@node / {
37 if (seq > 0)
38 print "AT_CLEANUP";
39
40 split ($0, tmp, ",");
41 node = substr(tmp[1], 7);
42 seq = 0;
43}
44
45/^@comment file: / {
46 if (!file_wanted[$3])
47 message("ignoring " $3);
48 else
49 {
50 message("extracting " $3);
51 file = $3;
52 }
53}
54
55/^@example$/, /^@end example$/ {
56 if (!file)
57 next;
58
59 if ($0 ~ /^@example$/)
60 {
61 input = files_output[file] ? "\n" : "";
62
63 # FNR is starting at 0 instead of 1, and
64 # #line report the line number of the *next* line.
65 # => + 2.
66 # Note that recent Bison support it, but not Flex.
5215c87f
AD
67 if (file ~ /\.[chy]*$/)
68 input = "#line " (FNR + 1) " \"" FILENAME "\"\n";
1c59e0a1
AD
69 next;
70 }
71
72 if ($0 ~ /^@end example$/)
73 {
74 if (input == "")
75 fatal("no contents: " file);
76
77 input = normalize(input);
78 # No spurious end of line: use printf.
79 if (files_output[file])
3cf084ec
AD
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);
1c59e0a1 83 else
3cf084ec 84 printf ("%s", input) > (output_dir "/" file);
1c59e0a1
AD
85 close (output_dir "/" file);
86 files_output[file] = 1;
87
88 file = input = "";
89 next;
90 }
91
92 input = input $0 "\n";
93}
94
95
96# We have to handle CONTENTS line per line, since anchors in AWK are
97# referring to the whole string, not the lines.
98function 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)
103 {
104 line = lines[i];
105
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$/)
110 continue;
111 else
112 line = "";
113
e6e704dc 114 gsub (/"@value\{VERSION\}"/, "\"" VERSION "\"", line)
1c59e0a1
AD
115 gsub (/^@result\{\}/, "", line);
116 gsub (/^@error\{\}/, "", line);
117 gsub ("@[{]", "{", line);
118 gsub ("@}", "}", line);
119 gsub ("@@", "@", line);
120 gsub ("@comment.*", "", line);
121
122 res = res line "\n";
123 }
124 return res;
125}
126
127
128function message(msg) {
f938a7e7
PE
129 if (! message_printed[msg])
130 {
131 print "extexi: " msg > "/dev/stderr";
132 message_printed[msg] = 1;
133 }
1c59e0a1
AD
134}
135
136function fatal(msg) {
137 message(msg);
138 exit 1
139}