#!/usr/bin/perl
# ========================================================= #
#                                                           #
#   File      : postxslt.pl                                 #
#   Purpose   : abort if xslt printed warnings              #
#                                                           #
#   Coded by Ralf Westram (coder@reallysoft.de) in Aug 25   #
#   http://www.arb-home.de/                                 #
#                                                           #
# ========================================================= #

use strict;
use warnings;

my $exitcode = 0;

sub die_usage($) {
  my ($err) = @_;
  print "Usage: postxslt.pl [Options] sourcefile\n";
  print "Used as compilation output filter for xsltproc\n";
  print "Options:\n";
  print "    --fail-if-warning             if warnings occur => fail with error\n";
  print "    --hide-warnings               hide warnings (will override --fail-if-warning)\n";

  if (defined $err) {
    die "Error in postxslt.pl: $err";
  }
}

sub main() {
  my $args = scalar(@ARGV);
  my $fail_if_warning = 0;
  my $hide_warnings = 0;
  my $sourcefile = undef;

  while ($args>0) {
    my $arg = shift(@ARGV);
    if    ($arg eq '--fail-if-warning') { $fail_if_warning = 1; }
    elsif ($arg eq '--hide-warnings') { $hide_warnings = 1; }
    elsif (not defined $sourcefile) { $sourcefile = $arg; }
    else {
      die_usage("Unknown argument '$arg'");
    }
    $args--;
  }

  # dynamic configuration:
  if (defined $sourcefile) {
    if ($sourcefile =~ /\/agde_/o) {
      print "activating --hide_warnings for '$sourcefile' (generated from foreign source)\n";
      $hide_warnings = 1;
    }
  }
  else {
    $sourcefile = 'unknown';
  }
  if ($hide_warnings) {
    if ($fail_if_warning) { print "disabling --fail-if-warning (caused by --hide_warnings)\n"; }
    $fail_if_warning = 0;
  }

  eval {
    my $warnings = 0;
    while (defined($_=<STDIN>)) {
      if (/^Warning:/o) {
        $warnings++;
        if (not $hide_warnings) {
          print $sourcefile.':0: '.$_;
        }
      }
      else {
        print $_;
      }
    }
    if ($warnings>0) {
      if ($fail_if_warning) {
        die "$sourcefile:0: Error: $warnings warnings encountered\n";
      }
    }
  };
  my $err = $@;
  if ($err) { die $err; }
}

main();
exit $exitcode;

