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

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile: cmDefinePropertyCommand.cxx,v $
  Language:  C++
  Date:      $Date: 2012/03/29 17:21:08 $
  Version:   $Revision: 1.1.1.1 $

  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 "cmDefinePropertyCommand.h"
#include "cmake.h"

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

  // Get the scope in which to define the property.
  cmProperty::ScopeType scope;
  if(args[0] == "GLOBAL")
    {
    scope = cmProperty::GLOBAL;
    }
  else if(args[0] == "DIRECTORY")
    {
    scope = cmProperty::DIRECTORY;
    }
  else if(args[0] == "TARGET")
    {
    scope = cmProperty::TARGET;
    }
  else if(args[0] == "SOURCE")
    {
    scope = cmProperty::SOURCE_FILE;
    }
  else if(args[0] == "TEST")
    {
    scope = cmProperty::TEST;
    }
  else if(args[0] == "VARIABLE")
    {
    scope = cmProperty::VARIABLE;
    }
  else if (args[0] == "CACHED_VARIABLE")
    {
    scope = cmProperty::CACHED_VARIABLE;
    }
  else
    {
    cmOStringStream e;
    e << "given invalid scope " << args[0] << ".  "
      << "Valid scopes are "
      << "GLOBAL, DIRECTORY, TARGET, SOURCE, "
      << "TEST, VARIABLE, CACHED_VARIABLE.";
    this->SetError(e.str().c_str());
    return false;
    }

  // Parse remaining arguments.
  bool inherited = false;
  enum Doing { DoingNone, DoingProperty, DoingBrief, DoingFull };
  Doing doing = DoingNone;
  for(unsigned int i=1; i < args.size(); ++i)
    {
    if(args[i] == "PROPERTY")
      {
      doing = DoingProperty;
      }
    else if(args[i] == "BRIEF_DOCS")
      {
      doing = DoingBrief;
      }
    else if(args[i] == "FULL_DOCS")
      {
      doing = DoingFull;
      }
    else if(args[i] == "INHERITED")
      {
      doing = DoingNone;
      inherited = true;
      }
    else if(doing == DoingProperty)
      {
      doing = DoingNone;
      this->PropertyName = args[i];
      }
    else if(doing == DoingBrief)
      {
      doing = DoingNone;
      this->BriefDocs = args[i];
      }
    else if(doing == DoingFull)
      {
      doing = DoingNone;
      this->FullDocs = args[i];
      }
    else
      {
      cmOStringStream e;
      e << "given invalid argument \"" << args[i] << "\".";
      this->SetError(e.str().c_str());
      return false;
      }
    }

  // Make sure a property name was found.
  if(this->PropertyName.empty())
    {
    this->SetError("not given a PROPERTY <name> argument.");
    return false;
    }

  // Make sure documentation was given.
  if(this->BriefDocs.empty())
    {
    this->SetError("not given a BRIEF_DOCS <brief-doc> argument.");
    return false;
    }
  if(this->FullDocs.empty())
    {
    this->SetError("not given a FULL_DOCS <full-doc> argument.");
    return false;
    }

  // Actually define the property.
  this->Makefile->GetCMakeInstance()->DefineProperty
    (this->PropertyName.c_str(), scope,
     this->BriefDocs.c_str(), this->FullDocs.c_str(), inherited);

  return true;
}

