#!/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
