/*============================================================================
  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 "cmGetFilenameComponentCommand.h"
#include "cmSystemTools.h"

// cmGetFilenameComponentCommand
bool cmGetFilenameComponentCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
  if(args.size() < 3)
    {
    this->SetError("called with incorrect number of arguments");
    return false;
    }

  // Check and see if the value has been stored in the cache
  // already, if so use that value
  if(args.size() == 4 && args[3] == "CACHE")
    {
    const char* cacheValue = this->Makefile->GetDefinition(args[0].c_str());
    if(cacheValue && !cmSystemTools::IsNOTFOUND(cacheValue))
      {
      return true;
      }
    }

  std::string result;
  std::string filename = args[1];
  if(filename.find("[HKEY") != filename.npos)
    {
    // Check the registry as the target application would view it.
    cmSystemTools::KeyWOW64 view = cmSystemTools::KeyWOW64_32;
    cmSystemTools::KeyWOW64 other_view = cmSystemTools::KeyWOW64_64;
    if(this->Makefile->PlatformIs64Bit())
      {
      view = cmSystemTools::KeyWOW64_64;
      other_view = cmSystemTools::KeyWOW64_32;
      }
    cmSystemTools::ExpandRegistryValues(filename, view);
    if(filename.find("/registry") != filename.npos)
      {
      std::string other = args[1];
      cmSystemTools::ExpandRegistryValues(other, other_view);
      if(other.find("/registry") == other.npos)
        {
        filename = other;
        }
      }
    }
  std::string storeArgs;
  std::string programArgs;
  if (args[2] == "DIRECTORY" || args[2] == "PATH")
    {
    result = cmSystemTools::GetFilenamePath(filename);
    }
  else if (args[2] == "NAME")
    {
    result = cmSystemTools::GetFilenameName(filename);
    }
  else if (args[2] == "PROGRAM")
    {
    for(unsigned int i=2; i < args.size(); ++i)
      {
      if(args[i] == "PROGRAM_ARGS")
        {
        i++;
        if(i < args.size())
          {
          storeArgs = args[i];
          }
        }
      }
    cmSystemTools::SplitProgramFromArgs(filename.c_str(),
                                        result, programArgs);
    }
  else if (args[2] == "EXT")
    {
    result = cmSystemTools::GetFilenameExtension(filename);
    }
  else if (args[2] == "NAME_WE")
    {
    result = cmSystemTools::GetFilenameWithoutExtension(filename);
    }
  else if (args[2] == "ABSOLUTE" ||
           args[2] == "REALPATH")
    {
    // Collapse the path to its simplest form.
    // If the path given is relative evaluate it relative to the
    // current source directory.
    result = cmSystemTools::CollapseFullPath(
      filename.c_str(), this->Makefile->GetCurrentDirectory());
    if(args[2] == "REALPATH")
      {
      // Resolve symlinks if possible
      result = cmSystemTools::GetRealPath(result.c_str());
      }
    }
  else
    {
    std::string err = "unknown component " + args[2];
    this->SetError(err.c_str());
    return false;
    }

  if(args.size() == 4 && args[3] == "CACHE")
    {
    if(programArgs.size() && storeArgs.size())
      {
      this->Makefile->AddCacheDefinition
        (storeArgs.c_str(), programArgs.c_str(),
         "", args[2] == "PATH" ? cmCacheManager::FILEPATH
         : cmCacheManager::STRING);
      }
    this->Makefile->AddCacheDefinition
      (args[0].c_str(), result.c_str(), "",
       args[2] == "PATH" ? cmCacheManager::FILEPATH
       : cmCacheManager::STRING);
    }
  else
    {
    if(programArgs.size() && storeArgs.size())
      {
      this->Makefile->AddDefinition(storeArgs.c_str(), programArgs.c_str());
      }
    this->Makefile->AddDefinition(args[0].c_str(), result.c_str());
    }

  return true;
}

