#!/usr/bin/env perl

# 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;
use warnings;

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;
}
