blob: 81191d8329d8e162ed1965101bfa8b213b854d68 [file] [log] [blame]
/*=========================================================================
Program: WXDialog - wxWidgets X-platform GUI Front-End for CMake
Module: $RCSfile: CommandLineInfo.cpp,v $
Language: C++
Date: $Date: 2012/03/29 17:21:10 $
Version: $Revision: 1.1.1.1 $
Author: Jorgen Bodde
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.
=========================================================================*/
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "CommandLineInfo.h"
#include "cmSystemTools.h"
///////////////////////////////////////////////////////////////
// cmCommandLineInfo
cmCommandLineInfo::cmCommandLineInfo()
{
m_WhereSource = _("");
m_WhereBuild = _("");
m_AdvancedValues = false;
m_GeneratorChoiceString.Empty();
m_LastUnknownParameter = "";
m_ValidArguments = "";
m_ExitAfterLoad = false;
}
///////////////////////////////////////////////////////////////
cmCommandLineInfo::~cmCommandLineInfo()
{
}
///////////////////////////////////////////////////////////////
bool cmCommandLineInfo::ParseCommandLine(int argc, char* argv[])
{
bool result = true;
wxString cachePath;
// parse all commands
int cc = 1;
if(argc < cc)
return true; // no command line options
while(cc < argc)
{
wxString arg = argv[cc];
// if we have a switch
if(arg.Len() > 1 && arg.GetChar(0) == '-')
{
int next_argc = ParseSwitch(argv, cc, argc);
if(next_argc > 0)
cc += next_argc;
else
return false; // sorry error while parsing
}
else
{
// gather all what is left
for(int leftcc = cc; leftcc < argc; leftcc++)
{
if(cc != leftcc)
m_WhereBuild << _(" ");
m_WhereBuild << argv[leftcc];
}
break;
}
}
m_ExecutablePath = cmSystemTools::GetFilenamePath(argv[0]).c_str();
return true;
}
///////////////////////////////////////////////////////////////
int cmCommandLineInfo::GetBoolValue(const wxString& v) {
wxString value = v.Lower();
if (!value.Cmp("1") ||
!value.Cmp("on") ||
!value.Cmp("true") ||
!value.Cmp("yes"))
{
// true
return 1;
}
else if (!value.Cmp("0") ||
!value.Cmp("off") ||
!value.Cmp("false") ||
!value.Cmp("no"))
{
// false
return -1;
}
// not recognised
return 0;
}
///////////////////////////////////////////////////////////////
// Parse param
size_t cmCommandLineInfo::ParseSwitch(char **argv, int arg_index, int argc)
{
wxString param = argv[arg_index];
// we need this for a switch, at least 2
if(param.Len() > 1)
{
// determine switch type
switch (param.GetChar(1))
{
case 'G':
// when it's G<.....> we split else we take the
// other argc
if(param.Len() > 2)
{
m_GeneratorChoiceString = GetStringParam(param.Mid(2));
return 1; // one arg is passed
}
else
{
if((arg_index+1) < argc)
{
m_GeneratorChoiceString = GetStringParam(wxString(argv[arg_index+1]));
return 2; // two args are passed
}
}
// no luck
return 0;
case 'Q':
m_ExitAfterLoad = true;
return 1;
// unknown param
default:
break;
}
}
// error, unrecognised or too small arg
return 0;
}
// When the string param given has string quotes around it
// we remove them and we pass back the string. If not, we
// simply pass back the string as-is
wxString cmCommandLineInfo::GetStringParam(const wxString &str)
{
wxString mystr = str.Strip(wxString::both);
// if we have only one (or no chars return the current string)
if(mystr.Len() < 2)
return str;
// if we have quotes
if(mystr.GetChar(0) == '\"' && mystr.Last() == '\"')
{
// when we only have 2 in size, return empty string
if(mystr.Len() == 2)
return wxEmptyString;
// now remove the outer and inner, and return
return mystr.Mid(1, mystr.Len()-1);
}
return str;
}