#!/usr/bin/perl -w

# Copyright 2009 Apple 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.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR
# 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.

# Helper script to add includes to source files.

use strict;

my $headerPattern = '[\"<][A-Za-z][A-Za-z0-9_/]+(\.h)?[\">]'; # " Make Xcode formatter happy.

my $headerToAdd = shift @ARGV or die;
$headerToAdd =~ /^([A-Za-z][A-Za-z0-9]+)\.h$/ or die "Header to add must be a .h file: $headerToAdd.\n";

sub includesParagraph;

FILE: for my $filename (@ARGV) {
    unless ($filename =~ /(\w+)\.cpp$/) { print STDERR "Command line args must be .cpp files: $filename.\n"; next FILE; }

    my $base = $1;

    my $sawConfig = 0;
    my $sawSelfInclude = 0;

    my $pastIncludes = 0;
    my %includes;

    my $beforeIncludes = "";
    my $afterIncludes = "";

    my $currentCondition = "";

    my $entireFileCondition = "";

    unless (open INPUT, "<", $filename) { print STDERR "File does not exist: $filename\n"; next FILE; }
    while (my $line = <INPUT>) {
        if ($line =~ /^\s*#(include|import)\s*($headerPattern)\s*\n/) {
            my $include = $2;
            if ($pastIncludes) { print STDERR "Saw more includes after include section in $filename, line $.\n"; next FILE; }
            if ($include eq "\"config.h\"") {
                $sawConfig = 1;
            } else {
                unless ($sawConfig) { print STDERR "First include must be config.h in $filename, line $.\n"; next FILE; }
                if ($include eq "\"$base.h\"") {
                    $sawSelfInclude = 1;
                } else {
                    unless ($sawSelfInclude) { print STDERR "Second include must be $base.h in $filename, line $.\n"; next FILE; }
                    $includes{$currentCondition}{$include} = 1;
                }
            }
        } else {
            if ($sawConfig && !$pastIncludes) {
                if ($line =~ /^\s*#\s*if\s+(.+?)\s*$/) {
                    my $condition = $1;
                    if (!$sawSelfInclude) {
                        $entireFileCondition = $1;
                        next;
                    }
                    unless ($currentCondition eq "") { print STDERR "Nested #if in include section in $filename, line $.\n"; next FILE; }
                    $currentCondition = $condition;
                    next;
                }
                if ($line =~ /^\s*#\s*endif\s*$/) {
                    unless ($currentCondition ne "") { print STDERR "Extra #endif in include section in $filename, line $.\n"; next FILE; }
                    $currentCondition = "";
                    next;
                }
            }
            if (!$sawConfig) {
                $beforeIncludes .= $line;
            } else {
                $pastIncludes = 1 if $line !~ /^\s*$/;
                if ($pastIncludes) {
                    unless ($currentCondition eq "") { print STDERR "Unterminated #if in include section in $filename, line $.\n"; next FILE; }
                    $afterIncludes .= $line;
                }
            }
        }
    }
    close INPUT or die;

    $includes{""}{"\"$headerToAdd\""} = 1;

    $beforeIncludes =~ s/\n+$//;
    $afterIncludes =~ s/^\n+//;

    my $contents = $beforeIncludes;
    $contents .= "\n\n#include \"config.h\"\n";
    $contents .= "\n#if $entireFileCondition\n" if $entireFileCondition ne "";
    $contents .= "#include \"$base.h\"\n\n";
    for my $condition (sort keys %includes) {
        $contents .= "#if $condition\n" unless $condition eq "";
        $contents .= includesParagraph($includes{$condition});
        $contents .= "#endif\n" unless $condition eq "";
        $contents .= "\n";
    }
    $contents .= $afterIncludes;

    unless (open OUTPUT, ">", $filename) { print STDERR "Could not open file for writing: $filename\n"; next FILE; };
    print OUTPUT $contents;
    close OUTPUT or die;
}

sub includesParagraph()
{
    my ($includes) = @_;

    my $paragraph = "";

    for my $include (sort keys %{$includes}) {
        $paragraph .= "#include $include\n";
    }

    return $paragraph;
}
