/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#include "cmConfigureFileCommand.h"

#include <cmsys/RegularExpression.hxx>

// cmConfigureFileCommand
bool cmConfigureFileCommand::InitialPass(std::vector<std::string> const& args)
{
  if(args.size() < 2 )
    {
    this->SetError("called with incorrect number of arguments, expected 2");
    return false;
    }
  this->InputFile = args[0];
  this->OuputFile = args[1];
  if ( !this->Makefile->CanIWriteThisFile(this->OuputFile.c_str()) )
    {
    std::string e = "attempted to configure a file: " + this->OuputFile 
      + " into a source directory.";
    this->SetError(e.c_str());
    cmSystemTools::SetFatalErrorOccured();
    return false;
    }
  this->CopyOnly = false;
  this->EscapeQuotes = false;

  
  // for CMake 2.0 and earlier CONFIGURE_FILE defaults to the FinalPass,
  // after 2.0 it only does InitialPass
  this->Immediate = false;
  const char* versionValue
    = this->Makefile->GetRequiredDefinition("CMAKE_BACKWARDS_COMPATIBILITY");
  if (atof(versionValue) > 2.0)
    {
    this->Immediate = true;
    }

  
  this->AtOnly = false;
  for(unsigned int i=2;i < args.size();++i)
    {
    if(args[i] == "COPYONLY")
      {
      this->CopyOnly = true;
      }
    else if(args[i] == "ESCAPE_QUOTES")
      {
      this->EscapeQuotes = true;
      }
    else if(args[i] == "@ONLY")
      {
      this->AtOnly = true;
      }
    else if(args[i] == "IMMEDIATE")
      {
      this->Immediate = true;
      }
    }
  
  // If we were told to copy the file immediately, then do it on the
  // first pass (now).
  if(this->Immediate)
    {
    if ( !this->ConfigureFile() )
      {
      this->SetError("Problem configuring file");
      return false;
      }
    }
  
  return true;
}

void cmConfigureFileCommand::FinalPass()
{
  if(!this->Immediate)
    {
    this->ConfigureFile();
    }
}

int cmConfigureFileCommand::ConfigureFile()
{
  std::string inFile = this->InputFile;
  if (!cmSystemTools::FileIsFullPath(inFile.c_str()))
    {
    inFile = this->Makefile->GetStartDirectory();
    inFile += "/";
    inFile += this->InputFile;
    }
  return this->Makefile->ConfigureFile(inFile.c_str(),
    this->OuputFile.c_str(),
    this->CopyOnly,
    this->AtOnly,
    this->EscapeQuotes);
}


