# Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Used for helping remove extra blank lines from files when processing.
# see split-class for an example usage (or other scripts in bugzilla)

BEGIN {
   use Exporter   ();
   our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
   $VERSION     = 1.00;
   @ISA         = qw(Exporter);
   @EXPORT      = qw(&resetSpacingHeuristics &isOnlyWhiteSpace &applySpacingHeuristicsAndPrint &setPreviousAllowedLine &setPreviousAllowedLine &printPendingEmptyLines &ignoringLine);
   %EXPORT_TAGS = ();
   @EXPORT_OK   = ();
}

our @EXPORT_OK;

my $justFoundEmptyLine = 0;
my $previousLineWasDisallowed = 0;
my $previousAllowedLine = "";
my $pendingEmptyLines = "";

sub resetSpacingHeuristics
{
    $justFoundEmptyLine = 0;
    $previousLineWasDisallowed = 0;
    $previousAllowedLine = "";
    $pendingEmptyLines = "";
}

sub isOnlyWhiteSpace
{
    my $line = shift;
    my $isOnlyWhiteSpace = ($line =~ m/^\s+$/);
    $pendingEmptyLines .= $line if ($isOnlyWhiteSpace);
    return $isOnlyWhiteSpace;
}

sub applySpacingHeuristicsAndPrint
{
    my ($out, $line) = @_;

    printPendingEmptyLines($out, $line);
    $previousLineWasDisallowed = 0;
    print $out $line;
}

sub setPreviousAllowedLine
{
    my $line = shift;
    $previousAllowedLine = $line;
}

sub printPendingEmptyLines
{
    my $out = shift;
    my $line = shift;
    if ($previousLineWasDisallowed) {
        if (!($pendingEmptyLines eq "") && !($previousAllowedLine =~ m/{\s*$/) && !($line =~ m/^\s*}/)) {
            $pendingEmptyLines = "\n";
        } else {
            $pendingEmptyLines = "";
        }
    }
    print $out $pendingEmptyLines;
    $pendingEmptyLines = "";
}

sub ignoringLine
{
    # my $line = shift; # ignoring input argument
    $previousLineWasDisallowed = 1;
}

1;
