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

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

// cmGetFilenameComponentCommand
bool cmGetFilenameComponentCommand
::InitialPass(std::vector<std::string> const& args)
{
  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];
  cmSystemTools::ExpandRegistryValues(filename);
  std::string storeArgs;
  std::string programArgs;
  if (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")
    {
    // If the path given is relative evaluate it relative to the
    // current source directory.
    if(!cmSystemTools::FileIsFullPath(filename.c_str()))
      {
      std::string fname = this->Makefile->GetCurrentDirectory();
      if(!fname.empty())
        {
        fname += "/";
        fname += filename;
        filename = fname;
        }
      }

    // Collapse the path to its simplest form.
    result = cmSystemTools::CollapseFullPath(filename.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;
}

