#!/usr/bin/perl -w

# Script to check the FAQ source and make sure I have all the numbers
# in the right order without duplication. Also check the numbers of blank
# lines. It gives up on any error (other than bad blank line counts).

sub oops {
print "\nLine $line: $_[0]\n";
print;
exit 1;
}

sub poops {
print "\nLine $line: $_[0]\n";
print;
$precede_fail = 1;
}


$line = 0;
$section = -1;
$expect_answer = 0;
$precede_fail = 0;

while (<>)
  {
  $line++;
  if (/^\s*$/)
    {
    $blankcount++;
    next;
    }
  $preceded = $blankcount;
  $blankcount = 0;

  if (/^(\d+)\./)
    {
    &poops("$preceded empty lines precede (3 expected)") if $preceded != 3;
    &oops(sprint("Answer %02d%02d is missing\n", $section, $question))
      if $expect_answer;
    $section = $1;
    $question = ($section == 20)? 0 : 1;
    $expected = 1;
    if ($section == 99)
      {
      $c = 1;
      $f = 1;
      }
    next;
    }

  if ($section != 99)
    {
    if (/^Q(\d\d)(\d\d):/)
      {
      &poops("$preceded empty lines precede ($expected expected)")
        if $preceded != $expected;
      $expected = 2;

      &oops("Answer expected") if $expect_answer;
      &oops("Q$1$2 is in the wrong section") if ($1 != $section);
      &oops("Q$1$2 is out of order") if $2 != $question;

      $expect_answer = 1;
      next;
      }

    if (/^A(\d\d)(\d\d):/)
      {
      &poops("$preceded empty lines precede (1 expected)") if $preceded != 1;

      &oops("Question expected") if !$expect_answer;
      &oops("A$1$2 is in the wrong section") if $1 != $section;
      &oops("A$1$2 is out of order") if $2 != $question++;

      $expect_answer = 0;
      next;
      }
    }

  else
    {
    if (/^C(\d\d\d):/)
      {
      &oops("C$1 is mixed up in the Fs") if $f != 1;
      # Some Cxxx configs are omitted (not translated from Exim 3) so can
      # only check increasing number.
      &oops("C$1 is out of order") if $1 < $c;
      $c = $1;
      }
    elsif (/^F(\d\d\d):/)
      {
      &oops("F$1 is out of order") if $1 != $f++;
      next;
      }
    }
  }

exit 1 if $precede_fail;

# End
