cmdline.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,228 行 · 第 1/3 页
CPP
1,228 行
///////////////////////////////////////////////////////////////////////////////
// Name: common/cmdline.cpp
// Purpose: wxCmdLineParser implementation
// Author: Vadim Zeitlin
// Modified by:
// Created: 05.01.00
// RCS-ID: $Id: cmdline.cpp,v 1.42 2005/08/16 10:08:04 VZ Exp $
// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "cmdline.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include "wx/cmdline.h"
#if wxUSE_CMDLINE_PARSER
#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/log.h"
#include "wx/intl.h"
#include "wx/app.h"
#include "wx/dynarray.h"
#endif //WX_PRECOMP
#include <ctype.h>
#include "wx/datetime.h"
#include "wx/msgout.h"
#include "wx/filename.h"
// ----------------------------------------------------------------------------
// private functions
// ----------------------------------------------------------------------------
static wxString GetTypeName(wxCmdLineParamType type);
static wxString GetOptionName(const wxChar *p, const wxChar *allowedChars);
static wxString GetShortOptionName(const wxChar *p);
static wxString GetLongOptionName(const wxChar *p);
// ----------------------------------------------------------------------------
// private structs
// ----------------------------------------------------------------------------
// an internal representation of an option
struct wxCmdLineOption
{
wxCmdLineOption(wxCmdLineEntryType k,
const wxString& shrt,
const wxString& lng,
const wxString& desc,
wxCmdLineParamType typ,
int fl)
{
wxASSERT_MSG( !shrt.empty() || !lng.empty(),
_T("option should have at least one name") );
wxASSERT_MSG
(
GetShortOptionName(shrt).Len() == shrt.Len(),
wxT("Short option contains invalid characters")
);
wxASSERT_MSG
(
GetLongOptionName(lng).Len() == lng.Len(),
wxT("Long option contains invalid characters")
);
kind = k;
shortName = shrt;
longName = lng;
description = desc;
type = typ;
flags = fl;
m_hasVal = false;
}
// can't use union easily here, so just store all possible data fields, we
// don't waste much (might still use union later if the number of supported
// types increases, so always use the accessor functions and don't access
// the fields directly!)
void Check(wxCmdLineParamType WXUNUSED_UNLESS_DEBUG(typ)) const
{
wxASSERT_MSG( type == typ, _T("type mismatch in wxCmdLineOption") );
}
long GetLongVal() const
{ Check(wxCMD_LINE_VAL_NUMBER); return m_longVal; }
const wxString& GetStrVal() const
{ Check(wxCMD_LINE_VAL_STRING); return m_strVal; }
#if wxUSE_DATETIME
const wxDateTime& GetDateVal() const
{ Check(wxCMD_LINE_VAL_DATE); return m_dateVal; }
#endif // wxUSE_DATETIME
void SetLongVal(long val)
{ Check(wxCMD_LINE_VAL_NUMBER); m_longVal = val; m_hasVal = true; }
void SetStrVal(const wxString& val)
{ Check(wxCMD_LINE_VAL_STRING); m_strVal = val; m_hasVal = true; }
#if wxUSE_DATETIME
void SetDateVal(const wxDateTime val)
{ Check(wxCMD_LINE_VAL_DATE); m_dateVal = val; m_hasVal = true; }
#endif // wxUSE_DATETIME
void SetHasValue(bool hasValue = true) { m_hasVal = hasValue; }
bool HasValue() const { return m_hasVal; }
public:
wxCmdLineEntryType kind;
wxString shortName,
longName,
description;
wxCmdLineParamType type;
int flags;
private:
bool m_hasVal;
long m_longVal;
wxString m_strVal;
#if wxUSE_DATETIME
wxDateTime m_dateVal;
#endif // wxUSE_DATETIME
};
struct wxCmdLineParam
{
wxCmdLineParam(const wxString& desc,
wxCmdLineParamType typ,
int fl)
: description(desc)
{
type = typ;
flags = fl;
}
wxString description;
wxCmdLineParamType type;
int flags;
};
WX_DECLARE_OBJARRAY(wxCmdLineOption, wxArrayOptions);
WX_DECLARE_OBJARRAY(wxCmdLineParam, wxArrayParams);
#include "wx/arrimpl.cpp"
WX_DEFINE_OBJARRAY(wxArrayOptions);
WX_DEFINE_OBJARRAY(wxArrayParams);
// the parser internal state
struct wxCmdLineParserData
{
// options
wxString m_switchChars; // characters which may start an option
bool m_enableLongOptions; // true if long options are enabled
wxString m_logo; // some extra text to show in Usage()
// cmd line data
wxArrayString m_arguments; // == argv, argc == m_arguments.GetCount()
wxArrayOptions m_options; // all possible options and switchrs
wxArrayParams m_paramDesc; // description of all possible params
wxArrayString m_parameters; // all params found
// methods
wxCmdLineParserData();
void SetArguments(int argc, char **argv);
#if wxUSE_UNICODE
void SetArguments(int argc, wxChar **argv);
#endif // wxUSE_UNICODE
void SetArguments(const wxString& cmdline);
int FindOption(const wxString& name);
int FindOptionByLongName(const wxString& name);
};
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// wxCmdLineParserData
// ----------------------------------------------------------------------------
wxCmdLineParserData::wxCmdLineParserData()
{
m_enableLongOptions = true;
#ifdef __UNIX_LIKE__
m_switchChars = _T("-");
#else // !Unix
m_switchChars = _T("/-");
#endif
}
void wxCmdLineParserData::SetArguments(int argc, char **argv)
{
m_arguments.clear();
for ( int n = 0; n < argc; n++ )
{
m_arguments.push_back(wxString::FromAscii(argv[n]));
}
}
#if wxUSE_UNICODE
void wxCmdLineParserData::SetArguments(int argc, wxChar **argv)
{
m_arguments.clear();
for ( int n = 0; n < argc; n++ )
{
m_arguments.push_back(argv[n]);
}
}
#endif // wxUSE_UNICODE
void wxCmdLineParserData::SetArguments(const wxString& cmdLine)
{
m_arguments.clear();
m_arguments.push_back(wxTheApp ? wxTheApp->argv[0] : _T(""));
wxArrayString args = wxCmdLineParser::ConvertStringToArgs(cmdLine);
WX_APPEND_ARRAY(m_arguments, args);
}
int wxCmdLineParserData::FindOption(const wxString& name)
{
if ( !name.empty() )
{
size_t count = m_options.GetCount();
for ( size_t n = 0; n < count; n++ )
{
if ( m_options[n].shortName == name )
{
// found
return n;
}
}
}
return wxNOT_FOUND;
}
int wxCmdLineParserData::FindOptionByLongName(const wxString& name)
{
size_t count = m_options.GetCount();
for ( size_t n = 0; n < count; n++ )
{
if ( m_options[n].longName == name )
{
// found
return n;
}
}
return wxNOT_FOUND;
}
// ----------------------------------------------------------------------------
// construction and destruction
// ----------------------------------------------------------------------------
void wxCmdLineParser::Init()
{
m_data = new wxCmdLineParserData;
}
void wxCmdLineParser::SetCmdLine(int argc, char **argv)
{
m_data->SetArguments(argc, argv);
}
#if wxUSE_UNICODE
void wxCmdLineParser::SetCmdLine(int argc, wxChar **argv)
{
m_data->SetArguments(argc, argv);
}
#endif // wxUSE_UNICODE
void wxCmdLineParser::SetCmdLine(const wxString& cmdline)
{
m_data->SetArguments(cmdline);
}
wxCmdLineParser::~wxCmdLineParser()
{
delete m_data;
}
// ----------------------------------------------------------------------------
// options
// ----------------------------------------------------------------------------
void wxCmdLineParser::SetSwitchChars(const wxString& switchChars)
{
m_data->m_switchChars = switchChars;
}
void wxCmdLineParser::EnableLongOptions(bool enable)
{
m_data->m_enableLongOptions = enable;
}
bool wxCmdLineParser::AreLongOptionsEnabled()
{
return m_data->m_enableLongOptions;
}
void wxCmdLineParser::SetLogo(const wxString& logo)
{
m_data->m_logo = logo;
}
// ----------------------------------------------------------------------------
// command line construction
// ----------------------------------------------------------------------------
void wxCmdLineParser::SetDesc(const wxCmdLineEntryDesc *desc)
{
for ( ;; desc++ )
{
switch ( desc->kind )
{
case wxCMD_LINE_SWITCH:
AddSwitch(desc->shortName, desc->longName, desc->description,
desc->flags);
break;
case wxCMD_LINE_OPTION:
AddOption(desc->shortName, desc->longName, desc->description,
desc->type, desc->flags);
break;
case wxCMD_LINE_PARAM:
AddParam(desc->description, desc->type, desc->flags);
break;
default:
wxFAIL_MSG( _T("unknown command line entry type") );
// still fall through
case wxCMD_LINE_NONE:
return;
}
}
}
void wxCmdLineParser::AddSwitch(const wxString& shortName,
const wxString& longName,
const wxString& desc,
int flags)
{
wxASSERT_MSG( m_data->FindOption(shortName) == wxNOT_FOUND,
_T("duplicate switch") );
wxCmdLineOption *option = new wxCmdLineOption(wxCMD_LINE_SWITCH,
shortName, longName, desc,
wxCMD_LINE_VAL_NONE, flags);
m_data->m_options.Add(option);
}
void wxCmdLineParser::AddOption(const wxString& shortName,
const wxString& longName,
const wxString& desc,
wxCmdLineParamType type,
int flags)
{
wxASSERT_MSG( m_data->FindOption(shortName) == wxNOT_FOUND,
_T("duplicate option") );
wxCmdLineOption *option = new wxCmdLineOption(wxCMD_LINE_OPTION,
shortName, longName, desc,
type, flags);
m_data->m_options.Add(option);
}
void wxCmdLineParser::AddParam(const wxString& desc,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?