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

  Program:   WXDialog - wxWidgets X-platform GUI Front-End for CMake
  Module:    $RCSfile: CommandLineInfo.cpp,v $
  Language:  C++
  Date:      $Date: 2005/08/10 20:18:54 $
  Version:   $Revision: 1.4 $

  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;
}
