windows-nt/Source/XPSP1/NT/com/oleutest/stgbvt/comtools/h/cmdlinew.hxx
2020-09-26 16:20:57 +08:00

527 lines
17 KiB
C++

//+------------------------------------------------------------------
//
// File: cmdlinew.hxx
//
// Contents: class definitions for command line parsing
//
// Classes: CBaseCmdline
// CBaseCmdlineObj
// CIntCmdlineObj
// CUlongCmdlineObj
// CBoolCmdlineObj
// CStrLengthCmdlineObj
// CCmdlineArg
// CCmdline
//
// History: 23 Dec 91 Lizch Created.
// 28 Jul 92 Davey Added changes to support a
// formatted usage display.
// 28 Aug 92 GeordiS Changed nlsNULL to nlsNULLSTR
// 09 Sep 92 Lizch Removed definition of SUCCESS
// 10 Sep 92 DonCl removed extern "C" from around
// windows.h and commnot.h
// 21 Sep 92 Davey Added ifdef of ANYSTRICT around
// debug macros.
// 13 Oct 93 DeanE Converted to WCHAR
//
//-------------------------------------------------------------------
#ifndef __CMDLINEW_HXX__
#define __CMDLINEW_HXX__
#include <windows.h>
#include <nchar.h>
#ifdef WIN16
#include <ptypes16.h>
#include <types16.h>
#endif
#include <wstrlist.hxx>
#define MAX_ERROR_STRING 100
// Cmdline Success/Error values
#define CMDLINE_NO_ERROR 0
#define CMDLINE_ERROR_BASE 10000
#define CMDLINE_ERROR_OUT_OF_MEMORY CMDLINE_ERROR_BASE+2
#define CMDLINE_ERROR_ARGUMENT_MISSING CMDLINE_ERROR_BASE+3
#define CMDLINE_ERROR_INVALID_VALUE CMDLINE_ERROR_BASE+4
#define CMDLINE_ERROR_TOO_BIG CMDLINE_ERROR_BASE+5
#define CMDLINE_ERROR_UNRECOGNISED_ARG CMDLINE_ERROR_BASE+6
#define CMDLINE_ERROR_DISPLAY_PARAMS CMDLINE_ERROR_BASE+7
#define CMDLINE_ERROR_USAGE_FOUND CMDLINE_ERROR_BASE+8
// Typedef for a void function pointer
typedef void (__cdecl *PFVOID) (VOID);
//+------------------------------------------------------------------
//
// Class: CBaseCmdline
//
// Purpose: implementation for base class for all command line
// classes, both the individual command line object
// classes and the overall parsing class
//
// It contains the print function pointer
// the default print implementation and the constructor
// error value.
//
// History: 05/17/92 Lizch Created
// 08/11/92 Davey Added declaration of constructor
//
//-------------------------------------------------------------------
class CBaseCmdline
{
public:
CBaseCmdline();
static void SetDisplayMethod(
void (* pfnNewDisplayMethod)(LPCNSTR nszMessage));
INT QueryError(void);
static void (* _pfnDisplay)(LPCNSTR nszMessage);
protected:
void SetError(INT iLastError);
static NCHAR _nszErrorBuf[MAX_ERROR_STRING+1];
private:
INT _iLastError;
};
//+------------------------------------------------------------------
//
// Class: CBaseCmdlineObj
//
// Purpose: Provides the basic structure for a command line argument
//
// History: 12/27/91 Lizch Created.
// 07/31/92 Davey Added QueryCmdlineType, QueryLineArgType
// Added linearg parameter to constructors.
// Added Display... functions to support
// usage output.
// Removed DisplayCmdlineObjType()
// 06/13/97 MariusB ResetValue added.
//
//-------------------------------------------------------------------
class CBaseCmdlineObj : public CBaseCmdline
{
public:
CBaseCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
LPCNSTR nszDefault,
LPCNSTR nszLineArg = NULL);
CBaseCmdlineObj (LPCNSTR nszSwitch,
LPCNSTR nszUsage,
BOOL fMustHave = FALSE,
LPCNSTR nszLineArg = NULL);
~CBaseCmdlineObj ();
virtual INT SetValue (LPCNSTR nszArg);
virtual void ResetValue ();
virtual INT SetValueToDefault(void);
virtual void DisplayValue (void);
LPCNSTR GetValue (void);
BOOL IsFound (void);
BOOL IsRequired (void);
BOOL IsDefaultSpecified(void);
LPCNSTR QuerySwitchString (void);
void SetFoundFlag (BOOL fFound);
INT DisplayUsageLine(USHORT *pusWidth,
USHORT usDisplayWidth,
USHORT usIndent);
INT DisplayUsageDescr(USHORT usSwitchIndent,
USHORT usDisplayWidth,
USHORT usIndent);
NCHAR SetSeparator(NCHAR nchSeparator);
NCHAR SetEquater (NCHAR nchEquater);
NCHAR GetSeparator(void);
NCHAR GetEquater (void);
BOOL SecondArg (void) { return(_fSecondArg); };
protected:
void DisplayNoValue(void);
virtual INT DisplaySpecialUsage(USHORT usDisplayWidth,
USHORT usIndent,
USHORT *pusWidth);
virtual LPCNSTR QueryCmdlineType(void) const;
virtual LPCNSTR QueryLineArgType(void) const;
INT DisplayStringByWords(LPCNSTR nszString,
USHORT usDisplayWidth,
USHORT usIndent,
USHORT *pusWidth);
INT CopyWord(LPCNSTR pnchWord,
ULONG cchWord,
LPNSTR *ppnszWord);
INT DisplayWord(LPCNSTR nszWord,
USHORT usDisplayWidth,
USHORT usIndent,
USHORT *pusWidth);
void *_pValue;
NCHAR _nchSeparator;
NCHAR _nchEquater;
LPNSTR _pnszUsageString;
LPNSTR _pnszSwitch; // the switch on the command line.
LPNSTR _pnszDefaultValue; // default value if none specified.
LPNSTR _pnszLineArgType;
BOOL _fDefaultSpecified; // TRUE if user specified a default
BOOL _fMandatory;
BOOL _fSecondArg; // TRUE if should parse for second arg.
// mainly needed for boolean type.
private:
void Init(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
BOOL fMustHave,
LPCNSTR nszDefault,
LPCNSTR nszLineArg);
BOOL _fFoundSwitch;
};
//+------------------------------------------------------------------
//
// Class: CIntCmdlineObj
//
// Purpose: Provides the basic structure for an integer
// command line argument
//
// Derivation: CBaseCmdlineObj
//
// History: 12/27/91 Lizch Created.
// 07/31/92 Davey Added QueryCmdlineType, QueryLineArgType
// Added linearg parameter to constructors.
//
//-------------------------------------------------------------------
class CIntCmdlineObj : public CBaseCmdlineObj
{
public:
CIntCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
BOOL fMustHave = FALSE,
LPCNSTR nszLineArg = NULL) :
CBaseCmdlineObj(nszSwitch, nszUsage, fMustHave, nszLineArg)
{
};
CIntCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
LPCNSTR nszDefault,
LPCNSTR nszLineArg = NULL) :
CBaseCmdlineObj(nszSwitch, nszUsage, nszDefault, nszLineArg)
{
};
~CIntCmdlineObj(void);
const INT * GetValue (void);
virtual INT SetValue (LPCNSTR nszArg);
virtual void DisplayValue(void);
protected:
virtual LPCNSTR QueryCmdlineType(void) const;
virtual LPCNSTR QueryLineArgType(void) const;
};
//+------------------------------------------------------------------
//
// Class: CUlongCmdlineObj
//
// Purpose: Provides the basic structure for an unsigned long
// command line argument
//
// Derivation: CBaseCmdlineObj
//
// History: 6/15/92 DeanE Created: Cut and paste from CIntCmdLine
// 07/31/92 Davey Added QueryCmdlineType, QueryLineArgType
// Added linearg parameter to constructors.
//
//-------------------------------------------------------------------
class CUlongCmdlineObj : public CBaseCmdlineObj
{
public:
CUlongCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
BOOL fMustHave = FALSE,
LPCNSTR nszLineArg = NULL) :
CBaseCmdlineObj(nszSwitch, nszUsage, fMustHave, nszLineArg)
{
};
CUlongCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
LPCNSTR nszDefault,
LPCNSTR nszLineArg = NULL) :
CBaseCmdlineObj(nszSwitch, nszUsage, nszDefault, nszLineArg)
{
};
~CUlongCmdlineObj(void);
const ULONG *GetValue (void);
virtual INT SetValue (LPCNSTR nszArg);
virtual void DisplayValue(void);
protected:
virtual LPCNSTR QueryCmdlineType(void) const;
virtual LPCNSTR QueryLineArgType(void) const;
};
//+------------------------------------------------------------------
//
// Class: CBoolCmdlineObj
//
// Purpose: Provides the basic structure for a Boolean
// command line argument
//
// Derivation: CBaseCmdlineObj
//
// History: 6/15/92 DeanE Created: Obtained from security project
// 07/31/92 Davey Added QueryCmdlineType, QueryLineArgType
// Modified constructor.
//
//-------------------------------------------------------------------
class CBoolCmdlineObj : public CBaseCmdlineObj
{
public :
CBoolCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
LPCNSTR nszDefault = _TEXTN("FALSE"));
~CBoolCmdlineObj (void);
virtual INT SetValue (LPCNSTR nszString);
virtual void DisplayValue (void);
const BOOL * GetValue (void);
protected :
virtual LPCNSTR QueryCmdlineType(void) const;
virtual LPCNSTR QueryLineArgType(void) const;
};
//+------------------------------------------------------------------
//
// Class: CStrLengthCmdlineObj
//
// Purpose: Provides the basic structure for an string
// command line argument whose length lies within
// a specified range.
//
// Derivation: CBaseCmdlineObj
//
// History: 12/27/91 Lizch Created.
// 07/31/92 Davey Added QueryCmdlineType, QueryLineArgType
// Added linearg parameter to constructors.
//
//-------------------------------------------------------------------
class CStrLengthCmdlineObj : public CBaseCmdlineObj
{
public:
CStrLengthCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
UINT uiMin,
UINT uiMax,
BOOL fMustHave = FALSE,
LPCNSTR nszLineArg = NULL) :
CBaseCmdlineObj(nszSwitch, nszUsage, fMustHave, nszLineArg)
{
_uiMinLength = uiMin;
_uiMaxLength = uiMax;
};
CStrLengthCmdlineObj(LPCNSTR nszSwitch,
LPCNSTR nszUsage,
UINT uiMin,
UINT uiMax,
LPCNSTR nszDefault,
LPCNSTR nszLineArg = NULL) :
CBaseCmdlineObj(nszSwitch, nszUsage, nszDefault, nszLineArg)
{
_uiMinLength = uiMin;
_uiMaxLength = uiMax;
};
virtual INT SetValue(LPCNSTR nszArg);
protected:
virtual INT DisplaySpecialUsage(USHORT usDisplayWidth,
USHORT usIndent,
USHORT *pusWidth);
virtual LPCNSTR QueryCmdlineType(void) const;
virtual LPCNSTR QueryLineArgType(void) const;
private:
UINT _uiMinLength;
UINT _uiMaxLength;
};
//+------------------------------------------------------------------
//
// Class: CStrListCmdlineObj
//
// Purpose: Provides the basic structure for a
// command line argument that takes a list of strings
//
// Derivation: CBaseCmdlineObj
//
// History: 12/31/91 Lizch Created.
// 07/31/92 Davey Added QueryCmdlineType, QueryLineArgType
// Added linearg parameter to constructors.
// 12/23/93 XimingZ Converted to CNStrList
// 06/13/97 MariusB ResetValue added.
//
//-------------------------------------------------------------------
class CStrListCmdlineObj:public CBaseCmdlineObj
{
public:
CStrListCmdlineObj (LPCNSTR pnszSwitch,
LPCNSTR pnszUsage,
LPCNSTR pnszDefault,
LPCNSTR pnszLineArg = NULL);
CStrListCmdlineObj (LPCNSTR pnszSwitch,
LPCNSTR pnszUsage,
BOOL fMustHave,
LPCNSTR pnszLineArg = NULL);
~CStrListCmdlineObj(void);
virtual INT SetValue(LPCNSTR pnszArg);
virtual void ResetValue();
VOID Reset(void);
LPCNSTR GetValue(void);
virtual void DisplayValue();
INT SetDelims(LPCNSTR pnszDelims);
protected:
virtual INT DisplaySpecialUsage(USHORT usDisplayWidth,
USHORT usIndent,
USHORT *pusWidth);
virtual LPCNSTR QueryCmdlineType() const;
virtual LPCNSTR QueryLineArgType() const;
private:
LPNSTR _pnszListDelims;
CnStrList *_pNStrList;
};
//+------------------------------------------------------------------
//
// Class: CCmdlineArg
//
// Purpose: Encapsulates one command line argument and indicates
// found/not found
//
//-------------------------------------------------------------------
class CCmdlineArg : public CBaseCmdline
{
public:
CCmdlineArg(LPCNSTR nszArg);
~CCmdlineArg(void);
const BOOL IsProcessed (void);
void SetProcessedFlag(BOOL fProcessed);
LPCNSTR QueryArg (void);
private:
LPNSTR _pnszArgument;
BOOL _fProcessed;
};
//+------------------------------------------------------------------
//
// Class: CCmdLine
//
// Purpose: Parses command line arguments
//
// Created: 12/23/91 Lizch
// 07/28/92 Davey Added extra usage function pointer.
// Also added _usIndent, _usDisplayUsage.
// Also changed SetProgName. Also added
// QueryDisplayParamerters, SetIndent,
// SetDisplayWidth, and SetSwitchIndent
// Changed SetSeparators/SetEquators to
// only take one character. Changed the
// names to singular instead of plural
// Added fCheckForExtras to FindSwitch.
// 02/15/95 jesussp
// Added contructor for Windows programs.
//
//-------------------------------------------------------------------
class CCmdline : public CBaseCmdline
{
public:
CCmdline (BOOL fInternalUsage = FALSE);
CCmdline (int argc, char *argv[], BOOL fInternalUsage = FALSE);
~CCmdline(void);
INT Parse(CBaseCmdlineObj * apExpectedArgs[],
UINT uiMaxArgs,
BOOL fCheckForExtras = TRUE);
INT DisplayUsage(CBaseCmdlineObj * const apExpectedArgs[],
UINT uiMaxArgs);
INT SetProgName (LPNSTR pnszProgName);
LPCNSTR GetProgName (void);
void SetExtraUsage (PFVOID pfUsage);
INT SetIndent (USHORT usIndent);
INT SetSwitchIndent (USHORT usSwitchIndent);
INT SetDisplayWidth (USHORT usDisplayWidth);
void QueryDisplayParameters (USHORT *pusDisplayWidth,
USHORT *pusSwitchIndent,
USHORT *pusIndent) const ;
private:
INT CheckParameterConsistency(void) const;
INT FindSwitch(CBaseCmdlineObj * const pArg, BOOL fCheckForExtras);
INT ConfirmArgs(CBaseCmdlineObj *apExpectedArgs[], UINT cMaxArgs);
INT SetInternalUsage(void);
CCmdlineArg **_apArgs;
UINT _uiNumArgs;
LPNSTR _pnszProgName;
CBoolCmdlineObj *_pbcInternalUsage;
PFVOID _pfExtraUsage;
USHORT _usIndent; // indention of usage display
USHORT _usSwitchIndent; // indention of switch
USHORT _usDisplayWidth; // width for usage display
};
#endif // __CMDLINEW_HXX__