| #!/bin/sh |
| # -*- AWK -*- |
| # Extract all examples from the manual source. |
| # Copyright (C) 1992, 2005-2014, 2016-2017, 2020-2025 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 <https://www.gnu.org/licenses/>. |
| |
| # This script was designed under GNU awk, but hopefully portable to |
| # other implementations. |
| |
| FILE=${1-/dev/null} |
| : ${AWK=awk} |
| |
| $AWK ' |
| |
| BEGIN { |
| node = ""; |
| seq = -1; |
| count = 0; |
| file = "NONE"; |
| status = 0; |
| options = ""; |
| xout = ""; |
| xerr = ""; |
| } |
| |
| /^@node / { |
| if (seq > 0) |
| printf(" -- %d file%s", seq, seq == 1 ? "" : "s"); |
| if (seq >= 0) |
| printf("\n"); |
| |
| split($0, tmp, ","); |
| node = substr(tmp[1], 7); |
| if (length(node) > 10) |
| printf("Node: %s - truncated", node); |
| else |
| printf("Node: %s ", node); |
| gsub(" ", "_", node); |
| node = tolower(substr(node, 1, 10)); |
| seq = 0; |
| } |
| |
| /^@comment ignore$/ { |
| getline; |
| status = 0; |
| options = ""; |
| xout = ""; |
| xerr = ""; |
| next; |
| } |
| |
| /^@comment status: / { |
| status = $3; |
| } |
| |
| /^@comment options: / { |
| options = $0; |
| gsub ("@comment options:", "", options); |
| } |
| |
| /^@comment xout: / { |
| xout = $0; |
| gsub ("@comment xout: ", "", xout); |
| } |
| |
| /^@comment xerr: / { |
| xerr = $0; |
| gsub ("@comment xerr: ", "", xerr); |
| } |
| |
| /^@example$/, /^@end example$/ { |
| if (seq < 0) |
| next; |
| if ($0 ~ /^@example$/) { |
| if (count > 0) |
| close (file); |
| seq++; |
| count++; |
| file = sprintf("%03d.%s", count, node); |
| printf("dnl @ %s:%d: Origin of test\n"\ |
| "dnl @ expected status: %d\n"\ |
| "dnl @ extra options: %s\n"\ |
| "dnl @ Copyright (C) 2006, 2007, 2008, 2009 Free Software\n"\ |
| "dnl @ Foundation, Inc.\n"\ |
| "dnl @ This file is free software; the Free Software Foundation\n"\ |
| "dnl @ gives unlimited permission to copy and/or distribute it\n"\ |
| "dnl @ with or without modifications, as long as this notice\n"\ |
| "dnl @ is preserved.\n", FILENAME, NR, status, options) > file; |
| if (xout) |
| printf("dnl @ expected output: %s\n", xout) > file; |
| if (xerr) |
| printf("dnl @ expected error: %s\n", xerr) > file; |
| status = 0; |
| options = ""; |
| xout = ""; |
| xerr = ""; |
| next; |
| } |
| if ($0 ~ /^@end example$/) { |
| next; |
| } |
| if ($0 ~ /^\^D$/) |
| next; |
| if ($0 ~ /^\$ @kbd\{/) |
| next; |
| if ($0 ~ /^@result\{\}/ || $0 ~ /^@error\{\}/) |
| prefix = "dnl "; |
| else |
| prefix = ""; |
| gsub("@@", "@", $0); |
| gsub("@[{]", "{", $0); |
| gsub("@}", "}", $0); |
| gsub("@w[{] }", " ", $0); |
| gsub("@tabchar[{]}", "\t", $0); |
| printf("%s%s\n", prefix, $0) >> file; |
| } |
| |
| END { |
| printf("\n"); |
| if (count > 0) |
| close(file); |
| } |
| ' $FILE |