blob: 692e21b672ec647f6c64883757b4b363e3dc5772 [file] [log] [blame]
# Extract all examples from the manual source. -*- AWK -*-
# Copyright (C) 1992, 2000, 2001, 2006, 2007, 2008 Free Software
# Foundation, Inc.
#
# This file is part of GNU M4.
#
# GNU M4 is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GNU M4 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This script is for use with any New AWK.
BEGIN {
seq = -1;
status = xfail = examples = 0;
file = options = "";
print "# This file is part of the GNU m4 test suite. -*- Autotest -*-";
# I don't know how to get this file's name, so it's hard coded :(
print "# Do not edit by hand, it was generated by generate.awk.";
print "#";
print "# Copyright (C) 1992, 2000, 2001, 2006 Free Software Foundation, Inc.";
print ;
print "AT_BANNER([Documentation examples.])";
print ;
print ;
}
/^@node / { # Start a new test group.
if (seq > 0)
print "AT_CLEANUP";
split ($0, tmp, ",");
node = substr(tmp[1], 7);
seq = 0;
}
/^@comment file: / { # Produce a data file instead of a test.
file = $3;
}
/^@comment options: / { # Pass additional options to m4.
options = $0;
gsub ("@comment options:", "", options);
}
/^@comment xfail$/ { # Expect the test to fail.
xfail = 1;
}
/^@comment examples$/ { # The test uses files from the examples dir.
examples = 1;
}
/^@comment ignore$/ { # This is just formatted doc text, not an actual test.
getline;
status = xfail = examples = 0;
options = file = "";
next;
}
/^@comment status: / { # Expected exit status of a test.
status = $3;
}
/^@example$/, /^@end example$/ { # The body of the test.
if (seq < 0)
next;
if ($0 ~ /^@example$/)
{
if (seq == 0)
new_group(node);
seq++;
printf ("echo \"$at_srcdir/%s:%d:\"\n", FILENAME, NR)
next;
}
if ($0 ~ /^@end example$/)
{
if (file != "")
{
if (output || error)
{
fatal("while getting file " file \
" found output = " output "," \
" found error = " error);
}
input = normalize(input);
printf ("AT_DATA([[%s]],\n[[%s]])\n\n", file, input);
}
else
{
new_test(input, status, output, error, options, xfail, examples);
}
status = xfail = examples = 0;
file = input = output = error = options = "";
next;
}
if ($0 ~ /^\^D$/)
next;
if ($0 ~ /^\$ @kbd/)
next;
if ($0 ~ /^@result\{\}/)
output = output $0 "\n";
else if ($0 ~ /^@error\{\}/)
error = error $0 "\n";
else
input = input $0 "\n";
}
END {
if (seq > 0)
print "AT_CLEANUP";
}
# We have to handle CONTENTS line per line, since anchors in AWK are
# referring to the whole string, not the lines.
function normalize(contents, i, lines, n, line, res) {
# Remove the Texinfo tags.
n = split (contents, lines, "\n");
# We don't want the last field which empty: it's behind the last \n.
for (i = 1; i < n; ++i)
{
line = lines[i];
gsub (/^@result\{\}/, "", line);
gsub (/^@error\{\}/, "", line);
gsub ("@[{]", "{", line);
gsub ("@}", "}", line);
gsub ("@@", "@", line);
gsub ("@tabchar{}", "\t", line);
gsub ("@w{ }", " @\\&t@", line);
gsub ("m4_", "m@\\&t@4_", line);
# Some of the examples have improperly balanced square brackets.
gsub ("[[]", "@<:@", line);
gsub ("[]]", "@:>@", line);
res = res line "\n";
}
return res;
}
function new_group(node) {
banner = node ". ";
gsub (/./, "-", banner);
printf ("\n\n");
printf ("## %s ##\n", banner);
printf ("## %s. ##\n", node);
printf ("## %s ##\n", banner);
printf ("\n");
printf ("AT_SETUP([%s])\n", node);
printf ("AT_KEYWORDS([[documentation]])\n\n");
}
function new_test(input, status, output, error, options, xfail, examples) {
input = normalize(input);
output = normalize(output);
error = normalize(error);
if (options ~ /-m/)
printf ("AT_CHECK_DYNAMIC_MODULE\n");
if (options ~ /-m mpeval/)
printf ("AT_CHECK_GMP\n");
if (xfail == 1)
printf ("AT_XFAIL_IF([:])\n");
if (examples == 1)
{
printf ("AT_DATA([expout1],\n[[%s]])\n", output);
printf ("sed -e \"s|examples|$abs_top_srcdir/examples|g\" \\\n");
printf (" < expout1 > expout\n\n");
if (error)
{
printf ("AT_DATA([experr1],\n[[%s]])\n", error);
printf ("sed \"s|examples|$abs_top_srcdir/examples|g\" \\\n");
printf (" < experr1 > experr\n\n");
}
options = options " -I\"$abs_top_srcdir/examples\"";
}
printf ("AT_DATA([[input.m4]],\n[[%s]])\n\n", input);
# Some of these tests `include' files from tests/.
printf ("AT_CHECK_M4([[%s]], %s,", options, status);
if (examples == 1)
printf ("\n[expout]");
else if (output)
printf ("\n[[%s]]", output);
else
printf (" []");
if (examples == 1 && error)
printf (",\n[experr]");
else if (error)
printf (",\n[[%s]]", error);
else
printf (", []");
printf (", [[input.m4]])\n\n");
}
function fatal(msg) {
print "generate.awk: " FILENAME ":" NR ": " msg > "/dev/stderr"
exit 1
}