| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /*=========================================================================
- 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 "cmIDEOptions.h"
- #include "cmSystemTools.h"
- //----------------------------------------------------------------------------
- cmIDEOptions::cmIDEOptions()
- {
- this->DoingDefine = false;
- this->AllowDefine = true;
- this->AllowSlash = false;
- for(int i=0; i < FlagTableCount; ++i)
- {
- this->FlagTable[i] = 0;
- }
- }
- //----------------------------------------------------------------------------
- cmIDEOptions::~cmIDEOptions()
- {
- }
- //----------------------------------------------------------------------------
- void cmIDEOptions::HandleFlag(const char* flag)
- {
- // If the last option was -D then this option is the definition.
- if(this->DoingDefine)
- {
- this->DoingDefine = false;
- this->Defines.push_back(flag);
- return;
- }
- // Look for known arguments.
- if(flag[0] == '-' || (this->AllowSlash && flag[0] == '/'))
- {
- // Look for preprocessor definitions.
- if(this->AllowDefine && flag[1] == 'D')
- {
- if(flag[2] == '\0')
- {
- // The next argument will have the definition.
- this->DoingDefine = true;
- }
- else
- {
- // Store this definition.
- this->Defines.push_back(flag+2);
- }
- return;
- }
- // Look through the available flag tables.
- bool flag_handled = false;
- for(int i=0; i < FlagTableCount && this->FlagTable[i]; ++i)
- {
- if(this->CheckFlagTable(this->FlagTable[i], flag, flag_handled))
- {
- return;
- }
- }
- // If any map entry handled the flag we are done.
- if(flag_handled)
- {
- return;
- }
- }
- // This option is not known. Store it in the output flags.
- this->StoreUnknownFlag(flag);
- }
- //----------------------------------------------------------------------------
- bool cmIDEOptions::CheckFlagTable(cmIDEFlagTable const* table,
- const char* flag, bool& flag_handled)
- {
- // Look for an entry in the flag table matching this flag.
- for(cmIDEFlagTable const* entry = table; entry->IDEName; ++entry)
- {
- bool entry_found = false;
- if(entry->special & cmIDEFlagTable::UserValue)
- {
- // This flag table entry accepts a user-specified value. If
- // the entry specifies UserRequired we must match only if a
- // non-empty value is given.
- int n = static_cast<int>(strlen(entry->commandFlag));
- if(strncmp(flag+1, entry->commandFlag, n) == 0 &&
- (!(entry->special & cmIDEFlagTable::UserRequired) ||
- static_cast<int>(strlen(flag+1)) > n))
- {
- if(entry->special & cmIDEFlagTable::UserIgnored)
- {
- // Ignore the user-specified value.
- this->FlagMap[entry->IDEName] = entry->value;
- }
- else if(entry->special & cmIDEFlagTable::SemicolonAppendable)
- {
- const char *new_value = flag+1+n;
- std::map<cmStdString,cmStdString>::iterator itr;
- itr = this->FlagMap.find(entry->IDEName);
- if(itr != this->FlagMap.end())
- {
- // Append to old value (if present) with semicolons;
- itr->second += ";";
- itr->second += new_value;
- }
- else
- {
- this->FlagMap[entry->IDEName] = new_value;
- }
- }
- else
- {
- // Use the user-specified value.
- this->FlagMap[entry->IDEName] = flag+1+n;
- }
- entry_found = true;
- }
- }
- else if(strcmp(flag+1, entry->commandFlag) == 0)
- {
- // This flag table entry provides a fixed value.
- this->FlagMap[entry->IDEName] = entry->value;
- entry_found = true;
- }
- // If the flag has been handled by an entry not requesting a
- // search continuation we are done.
- if(entry_found && !(entry->special & cmIDEFlagTable::Continue))
- {
- return true;
- }
- // If the entry was found the flag has been handled.
- flag_handled = flag_handled || entry_found;
- }
- return false;
- }
- //----------------------------------------------------------------------------
- void cmIDEOptions::AddDefine(const std::string& def)
- {
- this->Defines.push_back(def);
- }
- //----------------------------------------------------------------------------
- void cmIDEOptions::AddDefines(const char* defines)
- {
- if(defines)
- {
- // Expand the list of definitions.
- cmSystemTools::ExpandListArgument(defines, this->Defines);
- }
- }
- //----------------------------------------------------------------------------
- void cmIDEOptions::AddFlag(const char* flag, const char* value)
- {
- this->FlagMap[flag] = value;
- }
|