From dee72d2925b82fbf1e2ebf186ba84ccac699e98f Mon Sep 17 00:00:00 2001 From: Darryl Pogue Date: Fri, 6 Feb 2015 21:56:21 -0800 Subject: [PATCH] Remove pnUtCmd. --- .../Plasma/NucleusLib/pnUtils/CMakeLists.txt | 2 - .../NucleusLib/pnUtils/pnUtAllIncludes.h | 1 - Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.cpp | 650 ------------------ Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.h | 136 ---- 4 files changed, 789 deletions(-) delete mode 100644 Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.cpp delete mode 100644 Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.h diff --git a/Sources/Plasma/NucleusLib/pnUtils/CMakeLists.txt b/Sources/Plasma/NucleusLib/pnUtils/CMakeLists.txt index 6196649f..b1fac80f 100644 --- a/Sources/Plasma/NucleusLib/pnUtils/CMakeLists.txt +++ b/Sources/Plasma/NucleusLib/pnUtils/CMakeLists.txt @@ -7,7 +7,6 @@ set(pnUtils_HEADERS pnUtCoreLib.h pnUtAllIncludes.h pnUtArray.h - pnUtCmd.h pnUtCrypt.h pnUtHash.h pnUtList.h @@ -21,7 +20,6 @@ set(pnUtils_HEADERS set(pnUtils_SOURCES pnUtArray.cpp - pnUtCmd.cpp pnUtCrypt.cpp pnUtHash.cpp pnUtList.cpp diff --git a/Sources/Plasma/NucleusLib/pnUtils/pnUtAllIncludes.h b/Sources/Plasma/NucleusLib/pnUtils/pnUtAllIncludes.h index ebc16979..f36cfd36 100644 --- a/Sources/Plasma/NucleusLib/pnUtils/pnUtAllIncludes.h +++ b/Sources/Plasma/NucleusLib/pnUtils/pnUtAllIncludes.h @@ -58,7 +58,6 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "pnUtPriQ.h" #include "pnUtTime.h" #include "pnUtStr.h" -#include "pnUtCmd.h" #include "pnUtMisc.h" #include "pnUtCrypt.h" diff --git a/Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.cpp b/Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.cpp deleted file mode 100644 index a11dca75..00000000 --- a/Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.cpp +++ /dev/null @@ -1,650 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ -/***************************************************************************** -* -* $/Plasma20/Sources/Plasma/NucleusLib/pnUtils/Private/pnUtCmd.cpp -* -***/ - -#include "pnUtCmd.h" -#include "pnUtMisc.h" - - -/***************************************************************************** -* -* Private -* -***/ - -#define WHITESPACE L" \"\t\r\n\x1A" -#define FLAGS L"-/" -#define SEPARATORS L"=:" -#define TOGGLES L"+-" -#define ALL WHITESPACE FLAGS SEPARATORS TOGGLES - -#if HS_BUILD_FOR_WIN32 -static const unsigned kMaxTokenLength = MAX_PATH; -#else -static const unsigned kMaxTokenLength = 1024; -#endif - -struct CmdArgData { - CmdArgDef def; - union { - bool boolVal; - float floatVal; - int intVal; - const wchar_t * strVal; - unsigned unsignedVal; - } val; - wchar_t * buffer; - unsigned nameChars; - bool isSpecified; - - ~CmdArgData () { - if (buffer) - free(buffer); - } -}; - -struct CmdTokState { - CCmdParser * parser; - unsigned pendingIndex; - unsigned unflaggedIndex; -}; - -class CICmdParser { -private: - FARRAYOBJ(CmdArgData) m_argArray; - FARRAY(unsigned) m_idLookupArray; - unsigned m_requiredCount; - FARRAY(unsigned) m_unflaggedArray; - - inline bool CheckFlag (unsigned flags, unsigned flag, unsigned mask) const; - void Error (const CmdTokState * state, ECmdError errorCode, const wchar_t arg[], const wchar_t value[]) const; - bool LookupFlagged (const wchar_t ** name, unsigned * lastIndex) const; - bool ProcessValue (CmdTokState * state, unsigned index, const wchar_t str[]); - void SetDefaultValue (CmdArgData & arg); - bool TokenizeFlags (CmdTokState * state, const wchar_t str[]); - -public: - CICmdParser (const CmdArgDef def[], unsigned defCount); - bool CheckAllRequiredArguments (CmdTokState * state); - const CmdArgData * FindArgById (unsigned id) const; - const CmdArgData * FindArgByName (const wchar_t name[]) const; - bool Tokenize (CmdTokState * state, const wchar_t str[]); - -}; - - -/***************************************************************************** -* -* CICmdParser implementation -* -***/ - -//=========================================================================== -bool CICmdParser::CheckFlag (unsigned flags, unsigned flag, unsigned mask) const { - return ((flags & mask) == flag); -} - -//=========================================================================== -bool CICmdParser::CheckAllRequiredArguments (CmdTokState * state) { - bool result = (state->unflaggedIndex >= m_requiredCount); - if (!result) - Error(state, kCmdErrorTooFewArgs, nil, nil); - return result; -} - -//=========================================================================== -CICmdParser::CICmdParser (const CmdArgDef def[], unsigned defCount) { - unsigned loop; - - // Save the argument definitions - unsigned maxId = 0; - unsigned unflaggedCount = 0; - m_argArray.SetCount(defCount); - for (loop = 0; loop < defCount; ++loop) { - - // Check whether this argument is flagged - bool flagged = CheckFlag(def[loop].flags, kCmdArgFlagged, kCmdMaskArg); - - // Disallow names on unflagged arguments - ASSERT(flagged || !def[loop].name); - - // Store the argument data - CmdArgData & arg = m_argArray[loop]; - arg.def = def[loop]; - arg.buffer = nil; - arg.nameChars = def[loop].name ? StrLen(def[loop].name) : 0; - arg.isSpecified = false; - SetDefaultValue(arg); - maxId = std::max(maxId, def[loop].id); - - // Track the number of unflagged arguments - if (!flagged) - ++unflaggedCount; - - } - - // Build the id lookup table - unsigned idTableSize = std::min(maxId + 1, defCount * 2); - m_idLookupArray.SetCount(idTableSize); - m_idLookupArray.Zero(); - for (loop = 0; loop < defCount; ++loop) - if (def[loop].id < idTableSize) - m_idLookupArray[def[loop].id] = loop; - - // Build the unflagged array - unsigned unflaggedIndex = 0; - m_unflaggedArray.SetCount(unflaggedCount); - for (loop = 0; loop < defCount; ++loop) - if (CheckFlag(def[loop].flags, kCmdArgRequired, kCmdMaskArg)) - m_unflaggedArray[unflaggedIndex++] = loop; - m_requiredCount = unflaggedIndex; - for (loop = 0; loop < defCount; ++loop) - if (!(CheckFlag(def[loop].flags, kCmdArgFlagged, kCmdMaskArg) || - CheckFlag(def[loop].flags, kCmdArgRequired, kCmdMaskArg))) - m_unflaggedArray[unflaggedIndex++] = loop; - -} - -//=========================================================================== -void CICmdParser::Error (const CmdTokState * state, ECmdError errorCode, const wchar_t arg[], const wchar_t value[]) const { - - // Compose the error text - // (This text is only provided as a shortcut for trivial applications that - // don't want to compose their own text. Normally, an application would - // compose error text using its own localized strings.) - unsigned chars = 256 + (arg ? StrLen(arg) : 0) + (value ? StrLen(value) : 0); - wchar_t * buffer = (wchar_t *)malloc(chars * sizeof(wchar_t)); - switch (errorCode) { - - case kCmdErrorInvalidArg: - StrPrintf(buffer, chars, L"Invalid argument: %s", arg); - break; - - case kCmdErrorInvalidValue: - StrPrintf(buffer, chars, L"Argument %s invalid value: %s", arg, value); - break; - - case kCmdErrorTooFewArgs: - StrPrintf(buffer, chars, L"Too few arguments"); - break; - - case kCmdErrorTooManyArgs: - StrPrintf(buffer, chars, L"Too many arguments: %s", arg); - break; - - DEFAULT_FATAL(errorCode); - } - - // Call the error handler - state->parser->OnError(buffer, errorCode, arg, value); - - // Free memory - free(buffer); - -} - -//=========================================================================== -const CmdArgData * CICmdParser::FindArgById (unsigned id) const { - - // Search for the argument with this id - unsigned index; - if (id < m_idLookupArray.Count()) - index = m_idLookupArray[id]; - else - for (index = 0; index < m_argArray.Count(); ++index) - if (m_argArray[index].def.id == id) - break; - - // Verify that we found the correct argument - if ( (index >= m_argArray.Count()) || - (m_argArray[index].def.id != id) ) - return nil; - - // Return the argument data - return &m_argArray[index]; - -} - -//=========================================================================== -const CmdArgData * CICmdParser::FindArgByName (const wchar_t name[]) const { - - // Search for an argument with this name - unsigned index = (unsigned)-1; - if (!LookupFlagged(&name, &index)) - return nil; - - // Return the argument data - return &m_argArray[index]; - -} - -//=========================================================================== -bool CICmdParser::LookupFlagged (const wchar_t ** name, unsigned * lastIndex) const { - unsigned argCount = m_argArray.Count(); - unsigned chars = StrLen(*name); - unsigned bestIndex = (unsigned)-1; - unsigned bestChars = 0; - - // Check whether this argument is a suffix to any previously - // provided prefix in this token - for (unsigned prevChars = (*lastIndex != (unsigned)-1) ? m_argArray[*lastIndex].nameChars : 0; - (prevChars != (unsigned)-1) && !bestChars; - --prevChars) { - const CmdArgData & prev = prevChars ? m_argArray[*lastIndex] : *(const CmdArgData *)nil; - - // Find this argument in the list - for (unsigned index = 0; index < argCount; ++index) { - const CmdArgData & arg = m_argArray[index]; - - // Ignore non-flagged arguments - if (!CheckFlag(arg.def.flags, kCmdArgFlagged, kCmdMaskArg)) - continue; - - // Ignore this argument if it wouldn't beat the previous best match - if (arg.nameChars < bestChars + prevChars) - continue; - - // Ignore this argument if it doesn't match the prefix - bool caseSensitive = CheckFlag(arg.def.flags, kCmdCaseSensitive, kCmdCaseSensitive); - if ( prevChars && - ( (prevChars >= arg.nameChars) || - ( caseSensitive && StrCmp(arg.def.name, prev.def.name, prevChars)) || - (!caseSensitive && StrCmpI(arg.def.name, prev.def.name, prevChars)) ) ) - continue; - - // Ignore this argument if it doesn't match the suffix - if ( ( caseSensitive && StrCmp(*name, arg.def.name + prevChars, arg.nameChars - prevChars)) || - (!caseSensitive && StrCmpI(*name, arg.def.name + prevChars, arg.nameChars - prevChars)) ) - continue; - - // Track the best match - bestIndex = index; - bestChars = arg.nameChars - prevChars; - if (bestChars == chars) - break; - - } - - } - - // Return the result - *name += bestChars; - *lastIndex = bestIndex; - return (bestChars != 0); -} - -//=========================================================================== -bool CICmdParser::ProcessValue (CmdTokState * state, unsigned index, const wchar_t str[]) { - CmdArgData & arg = m_argArray[index]; - arg.isSpecified = true; - unsigned argType = arg.def.flags & kCmdMaskType; - switch (argType) { - - case kCmdTypeBool: - if (*str == '+') - arg.val.boolVal = true; - else if (*str == '-') - arg.val.boolVal = false; - else if (!*str) - arg.val.boolVal = CheckFlag(arg.def.flags, kCmdBoolSet, kCmdMaskBool); - else - Error(state, kCmdErrorInvalidValue, arg.def.name, str); - break; - - case kCmdTypeFloat: - { - const wchar_t * endPtr; - arg.val.floatVal = StrToFloat(str, &endPtr); - if (*endPtr) - Error(state, kCmdErrorInvalidValue, arg.def.name, str); - } - break; - - case kCmdTypeInt: - { - const wchar_t * endPtr; - arg.val.intVal = StrToInt(str, &endPtr); - if (*endPtr) - Error(state, kCmdErrorInvalidValue, arg.def.name, str); - } - break; - - case kCmdTypeString: - if (arg.buffer) - free(arg.buffer); - arg.buffer = StrDup(str); - arg.val.strVal = arg.buffer; - break; - - case kCmdTypeUnsigned: - { - const wchar_t * endPtr; - arg.val.unsignedVal = StrToUnsigned(str, &endPtr, 10); - if (*endPtr) - Error(state, kCmdErrorInvalidValue, arg.def.name, str); - } - break; - - DEFAULT_FATAL(argType); - - } - return true; -} - -//=========================================================================== -void CICmdParser::SetDefaultValue (CmdArgData & arg) { - unsigned argType = arg.def.flags & kCmdMaskType; - switch (argType) { - - case kCmdTypeBool: - arg.val.boolVal = !CheckFlag(arg.def.flags, kCmdBoolSet, kCmdMaskBool); - break; - - case kCmdTypeInt: - arg.val.intVal = 0; - break; - - case kCmdTypeUnsigned: - arg.val.unsignedVal = 0; - break; - - case kCmdTypeFloat: - arg.val.floatVal = 0.0f; - break; - - case kCmdTypeString: - arg.val.strVal = L""; - break; - - DEFAULT_FATAL(argType); - - } -} - -//=========================================================================== -bool CICmdParser::Tokenize (CmdTokState * state, const wchar_t str[]) { - wchar_t buffer[kMaxTokenLength]; - bool result = true; - while (result && StrTokenize(&str, buffer, arrsize(buffer), WHITESPACE)) { - - // If the previous argument is awaiting a value, then use this token - // as the value - if (state->pendingIndex != (unsigned)-1) { - result = ProcessValue(state, state->pendingIndex, buffer); - state->pendingIndex = (unsigned)-1; - continue; - } - - // Identify and process flagged parameters - if (StrChr(FLAGS, buffer[0]) && TokenizeFlags(state, buffer)) - continue; - - // Process unflagged parameters - if (state->unflaggedIndex < m_unflaggedArray.Count()) { - result = ProcessValue(state, m_unflaggedArray[state->unflaggedIndex++], buffer); - continue; - } - - // Process extra parameters - if (state->parser->OnExtra(buffer)) - continue; - - // Process invalid parameters - Error(state, kCmdErrorTooManyArgs, buffer, nil); - result = false; - break; - - } - return result; -} - -//=========================================================================== -bool CICmdParser::TokenizeFlags (CmdTokState * state, const wchar_t str[]) { - - // Process each separately flagged token within the string - wchar_t buffer[kMaxTokenLength]; - bool result = true; - while (result && StrTokenize(&str, buffer, arrsize(buffer), ALL)) { - if (!buffer[0]) - continue; - - // Process each flag within the token - unsigned lastIndex = (unsigned)-1; - const wchar_t * bufferPtr = buffer; - while (result) { - - // Lookup the argument name - result = LookupFlagged(&bufferPtr, &lastIndex); - if (!result) { - Error(state, kCmdErrorInvalidArg, bufferPtr, nil); - result = false; - break; - } - - // If this argument is boolean, allow it to share a common prefix - // with the next argument. In this case there is no place for - // the user to provide a value, so use the default value. - if (*bufferPtr && - CheckFlag(m_argArray[lastIndex].def.flags, kCmdTypeBool, kCmdMaskType)) { - result = ProcessValue(state, lastIndex, L""); - continue; - } - - break; - } - if (!result) - break; - - // Check for an argument value provided using a separator - if (*str && StrChr(SEPARATORS, *str)) { - result = ProcessValue(state, lastIndex, str + 1); - break; - } - - // Process values for boolean arguments - if (CheckFlag(m_argArray[lastIndex].def.flags, kCmdTypeBool, kCmdMaskType)) { - - // Check for a value provided with a toggle - if (*str && StrChr(TOGGLES, *str)) { - wchar_t tempStr[] = {*str, 0}; - result = ProcessValue(state, lastIndex, tempStr); - ++str; - continue; - } - - // Check for a default value - else { - result = ProcessValue(state, lastIndex, L""); - continue; - } - - } - - // Process values for non-boolean arguments - else { - - // Check for an argument value immediately following the name - if (*bufferPtr) { - result = ProcessValue(state, lastIndex, bufferPtr); - break; - } - - // Check for an argument value in the next token - else { - state->pendingIndex = lastIndex; - break; - } - - } - - } - return result; -} - - -/***************************************************************************** -* -* CCmdParser implementation -* -***/ - -//=========================================================================== -CCmdParser::CCmdParser () { - fParser = nil; -} - -//=========================================================================== -CCmdParser::CCmdParser (const CmdArgDef def[], unsigned defCount) { - Initialize(def, defCount); -} - -//=========================================================================== -CCmdParser::~CCmdParser () { - delete fParser; -} - -//=========================================================================== -bool CCmdParser::GetBool (unsigned id) const { - return fParser->FindArgById(id)->val.boolVal; -} - -//=========================================================================== -bool CCmdParser::GetBool (const wchar_t name[]) const { - return fParser->FindArgByName(name)->val.boolVal; -} - -//=========================================================================== -float CCmdParser::GetFloat (unsigned id) const { - return fParser->FindArgById(id)->val.floatVal; -} - -//=========================================================================== -float CCmdParser::GetFloat (const wchar_t name[]) const { - return fParser->FindArgByName(name)->val.floatVal; -} - -//=========================================================================== -int CCmdParser::GetInt (unsigned id) const { - return fParser->FindArgById(id)->val.intVal; -} - -//=========================================================================== -int CCmdParser::GetInt (const wchar_t name[]) const { - return fParser->FindArgByName(name)->val.intVal; -} - -//=========================================================================== -const wchar_t * CCmdParser::GetString (unsigned id) const { - return fParser->FindArgById(id)->val.strVal; -} - -//=========================================================================== -const wchar_t * CCmdParser::GetString (const wchar_t name[]) const { - return fParser->FindArgByName(name)->val.strVal; -} - -//=========================================================================== -unsigned CCmdParser::GetUnsigned (unsigned id) const { - return fParser->FindArgById(id)->val.unsignedVal; -} - -//=========================================================================== -unsigned CCmdParser::GetUnsigned (const wchar_t name[]) const { - return fParser->FindArgByName(name)->val.unsignedVal; -} - -//=========================================================================== -void CCmdParser::Initialize (const CmdArgDef def[], unsigned defCount) { - fParser = new CICmdParser(def, defCount); -} - -//=========================================================================== -bool CCmdParser::IsSpecified (unsigned id) const { - if (const CmdArgData * data = fParser->FindArgById(id)) - return data->isSpecified; - return false; -} - -//=========================================================================== -bool CCmdParser::IsSpecified (const wchar_t name[]) const { - if (const CmdArgData * data = fParser->FindArgByName(name)) - return data->isSpecified; - return false; -} - -//=========================================================================== -void CCmdParser::OnError (const wchar_t str[], ECmdError errorCode, const wchar_t arg[], const wchar_t value[]) { -} - -//=========================================================================== -bool CCmdParser::OnExtra (const wchar_t str[]) { - return false; -} - -//=========================================================================== -bool CCmdParser::Parse (const wchar_t cmdLine[]) { - // If no command line was passed, use the application's command line, - // skipping past the program name - if (!cmdLine) { - cmdLine = AppGetCommandLine(); - StrTokenize(&cmdLine, nil, 0, WHITESPACE); - while (*cmdLine == L' ') - ++cmdLine; - } - - // Process the command line - CmdTokState state = { - this, - (unsigned)-1, // pending index - 0 // unflagged index - }; - bool result; - result = fParser->Tokenize(&state, cmdLine); - if (result) - result = fParser->CheckAllRequiredArguments(&state); - - return result; -} diff --git a/Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.h b/Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.h deleted file mode 100644 index bed775d6..00000000 --- a/Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.h +++ /dev/null @@ -1,136 +0,0 @@ -/*==LICENSE==* - -CyanWorlds.com Engine - MMOG client, server and tools -Copyright (C) 2011 Cyan Worlds, Inc. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -Additional permissions under GNU GPL version 3 section 7 - -If you modify this Program, or any covered work, by linking or -combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, -NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent -JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK -(or a modified version of those libraries), -containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, -PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG -JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the -licensors of this Program grant you additional -permission to convey the resulting work. Corresponding Source for a -non-source form of such a combination shall include the source code for -the parts of OpenSSL and IJG JPEG Library used as well as that of the covered -work. - -You can contact Cyan Worlds, Inc. by email legal@cyan.com - or by snail mail at: - Cyan Worlds, Inc. - 14617 N Newport Hwy - Mead, WA 99021 - -*==LICENSE==*/ -/***************************************************************************** -* -* $/Plasma20/Sources/Plasma/NucleusLib/pnUtils/Private/pnUtCmd.h -* -***/ - -#ifndef PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNUTILS_PRIVATE_PNUTCMD_H -#define PLASMA20_SOURCES_PLASMA_NUCLEUSLIB_PNUTILS_PRIVATE_PNUTCMD_H - -#include "Pch.h" -#include "pnUtArray.h" -#include "pnUtStr.h" - -/***************************************************************************** -* -* Constants -* -***/ - -// Sets of mutually exclusive flags -const unsigned kCmdArgFlagged = 0x0 << 0; // default -const unsigned kCmdArgOptional = 0x1 << 0; -const unsigned kCmdArgRequired = 0x2 << 0; -const unsigned kCmdMaskArg = 0xf << 0; - -const unsigned kCmdTypeBool = 0x0 << 4; // default -const unsigned kCmdTypeInt = 0x1 << 4; -const unsigned kCmdTypeUnsigned = 0x2 << 4; -const unsigned kCmdTypeFloat = 0x3 << 4; -const unsigned kCmdTypeString = 0x4 << 4; -const unsigned kCmdMaskType = 0xf << 4; - -const unsigned kCmdBoolSet = 0x0 << 8; // default -const unsigned kCmdBoolUnset = 0x1 << 8; -const unsigned kCmdMaskBool = 0xf << 8; - -// Other flags -const unsigned kCmdCaseSensitive = 0x1 << 28; - - -// Error codes -enum ECmdError { - kCmdErrorInvalidArg, - kCmdErrorInvalidValue, - kCmdErrorTooFewArgs, - kCmdErrorTooManyArgs, - kNumCmdErrors -}; - - -/***************************************************************************** -* -* Types -* -***/ - -struct CmdArgDef { - unsigned flags; - const wchar_t * name; // must be compile-time constant - unsigned id; -}; - -class CCmdParser { - class CICmdParser * fParser; - - static void DispatchError (const wchar_t str[], ECmdError errorCode, const wchar_t arg[], const wchar_t value[], void * param); - static bool DispatchExtra (const wchar_t str[], void * param); - -protected: - CCmdParser (); - void Initialize (const CmdArgDef def[], unsigned defCount); - -public: - CCmdParser (const CmdArgDef def[], unsigned defCount); - virtual ~CCmdParser (); - - bool GetBool (unsigned id) const; - bool GetBool (const wchar_t name[]) const; - float GetFloat (unsigned id) const; - float GetFloat (const wchar_t name[]) const; - int GetInt (unsigned id) const; - int GetInt (const wchar_t name[]) const; - const wchar_t * GetString (unsigned id) const; - const wchar_t * GetString (const wchar_t name[]) const; - unsigned GetUnsigned (unsigned id) const; - unsigned GetUnsigned (const wchar_t name[]) const; - bool IsSpecified (unsigned id) const; - bool IsSpecified (const wchar_t name[]) const; - - virtual void OnError (const wchar_t str[], ECmdError errorCode, const wchar_t arg[], const wchar_t value[]); - virtual bool OnExtra (const wchar_t str[]); - - bool Parse (const wchar_t cmdLine[] = nil); -}; -#endif