/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "cmIncludeDirectoryCommand.h"

// cmIncludeDirectoryCommand
bool cmIncludeDirectoryCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
  if(args.size() < 1 )
    {
    return true;
    }

  std::vector<std::string>::const_iterator i = args.begin();

  bool before = this->Makefile->IsOn("CMAKE_INCLUDE_DIRECTORIES_BEFORE");
  bool system = false;

  if ((*i) == "BEFORE")
    {
    before = true;
    ++i;
    }
  else if ((*i) == "AFTER")
    {
    before = false;
    ++i;
    }

  for(; i != args.end(); ++i)
    {
    if(*i == "SYSTEM")
      {
      system = true;
      continue;
      }
    if(i->size() == 0)
      {
      this->SetError("given empty-string as include directory.");
      return false;
      }

    this->AddDirectory(i->c_str(),before,system);

    }
  return true;
}

static bool StartsWithGeneratorExpression(const std::string &input)
{
  return input[0] == '$' && input[1] == '<';
}

// do a lot of cleanup on the arguments because this is one place where folks
// sometimes take the output of a program and pass it directly into this
// command not thinking that a single argument could be filled with spaces
// and newlines etc liek below:
//
// "   /foo/bar
//    /boo/hoo /dingle/berry "
//
// ideally that should be three separate arguments but when sucking the
// output from a program and passing it into a command the cleanup doesn't
// always happen
//
void cmIncludeDirectoryCommand::AddDirectory(const char *i,
                                             bool before,
                                             bool system)
{
  // break apart any line feed arguments
  std::string ret = i;
  std::string::size_type pos = 0;
  if((pos = ret.find('\n', pos)) != std::string::npos)
    {
    if (pos)
      {
      this->AddDirectory(ret.substr(0,pos).c_str(), before, system);
      }
    if (ret.size()-pos-1)
      {
      this->AddDirectory(ret.substr(pos+1,ret.size()-pos-1).c_str(),
                         before, system);
      }
    return;
    }

  // remove any leading or trailing spaces and \r
  std::string::size_type b = ret.find_first_not_of(" \r");
  std::string::size_type e = ret.find_last_not_of(" \r");
  if ((b!=ret.npos) && (e!=ret.npos))
    {
    ret.assign(ret, b, 1+e-b);   // copy the remaining substring
    }
  else
    {
    return;         // if we get here, we had only whitespace in the string
    }

  if (!cmSystemTools::IsOff(ret.c_str()))
    {
    cmSystemTools::ConvertToUnixSlashes(ret);
    if(!cmSystemTools::FileIsFullPath(ret.c_str()))
      {
      if(!StartsWithGeneratorExpression(ret))
        {
        std::string tmp = this->Makefile->GetStartDirectory();
        tmp += "/";
        tmp += ret;
        ret = tmp;
        }
      }
    }
  this->Makefile->AddIncludeDirectory(ret.c_str(), before);
  if(system)
    {
    this->Makefile->AddSystemIncludeDirectory(ret.c_str());
    }
}

