mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
5.7 KiB
224 lines
5.7 KiB
/*****************************************************************************\
|
|
|
|
Author: Corey Morgan (coreym)
|
|
|
|
Copyright (c) 1998-2000 Microsoft Corporation
|
|
|
|
|
|
\*****************************************************************************/
|
|
|
|
#ifndef _VARG_H_012599_
|
|
#define _VARG_H_012599_
|
|
|
|
#define MAXSTR 1025
|
|
|
|
|
|
|
|
|
|
//Class CToken
|
|
//It represents a Single Token.
|
|
class CToken
|
|
{
|
|
public:
|
|
CToken(LPWSTR psz, BOOL bQuote);
|
|
CToken();
|
|
~CToken();
|
|
VOID Init(LPWSTR psz, BOOL bQuote);
|
|
LPWSTR GetToken();
|
|
BOOL IsSwitch();
|
|
BOOL IsSlash();
|
|
private:
|
|
LPWSTR m_pszToken;
|
|
BOOL m_bInitQuote;
|
|
};
|
|
typedef CToken * LPTOKEN;
|
|
|
|
|
|
|
|
#define ARG_TYPE_INT 0
|
|
#define ARG_TYPE_BOOL 1
|
|
#define ARG_TYPE_STR 2
|
|
#define ARG_TYPE_HELP 3
|
|
#define ARG_TYPE_DEBUG 4
|
|
#define ARG_TYPE_MSZ 5
|
|
#define ARG_TYPE_INTSTR 6
|
|
#define ARG_TYPE_LAST 7
|
|
|
|
|
|
#define ARG_FLAG_OPTIONAL 0x00000001
|
|
#define ARG_FLAG_REQUIRED 0x00000002
|
|
#define ARG_FLAG_DEFAULTABLE 0x00000004
|
|
#define ARG_FLAG_NOFLAG 0x00000008 //For parameters like target name
|
|
#define ARG_FLAG_HIDDEN 0x00000010
|
|
#define ARG_FLAG_VERB 0x00000020
|
|
#define ARG_FLAG_STDIN 0x00000040 //This must be Required. If not sepcified read from standard input
|
|
#define ARG_FLAG_ATLEASTONE 0x00000080 //If this flag is specified on one or more switch, at
|
|
//least one of those switches must be defined
|
|
#define ARG_FLAG_DN 0x00000100 //JonN 4/26/01 256583 add ADSI escaping
|
|
|
|
|
|
#define ARG_TERMINATOR 0,NULL,0,NULL,ARG_TYPE_LAST,0,(CMD_TYPE)0,FALSE,NULL
|
|
#define ID_ARG2_NULL (LONG)-1
|
|
|
|
#define CMD_TYPE void*
|
|
|
|
typedef struct _ARG_RECORD
|
|
{
|
|
LONG idArg1;
|
|
LPTSTR strArg1;
|
|
LONG idArg2;
|
|
LPTSTR strArg2;
|
|
int fType;
|
|
DWORD fFlag;
|
|
union{
|
|
void* vValue;
|
|
LPTSTR strValue;
|
|
int nValue;
|
|
BOOL bValue;
|
|
};
|
|
BOOL bDefined;
|
|
DWORD (*fntValidation)(PVOID pArg);
|
|
} ARG_RECORD, *PARG_RECORD;
|
|
|
|
|
|
//Error Source
|
|
#define ERROR_FROM_PARSER 1
|
|
#define ERROR_FROM_VLDFN 2
|
|
#define ERROR_WIN32_ERROR 3
|
|
|
|
//Parse Errors for when ERROR_SOURCE is ERROR_FROM_PARSER
|
|
/*
|
|
SWITCH value is incorrect.
|
|
ArgRecIndex is index of record.
|
|
ArgvIndex is index of token.
|
|
*/
|
|
#define PARSE_ERROR_SWITCH_VALUE 1
|
|
/*No Value is given for a swich when one is expected.
|
|
ArgRecIndex is index of record.
|
|
ArgvIndex is -1.
|
|
*/
|
|
#define PARSE_ERROR_SWICH_NO_VALUE 2
|
|
/*
|
|
Invalid Input
|
|
ArgRecIndex is -1,
|
|
ArgvIndex is index of token.
|
|
*/
|
|
#define PARSE_ERROR_UNKNOWN_INPUT_PARAMETER 3
|
|
/*
|
|
Required switch is not defined.
|
|
ArgRecIndex is index of record.
|
|
ArgvIndex is -1.
|
|
*/
|
|
#define PARSE_ERROR_SWITCH_NOTDEFINED 4
|
|
/*
|
|
Switch or Parameter is defined twice.
|
|
ArgRecIndex is index of record.
|
|
ArgvIndex is -1
|
|
*/
|
|
#define PARSE_ERROR_MULTIPLE_DEF 5
|
|
/*
|
|
Error Reading From STDIN.
|
|
ArgRecIndex is -1.
|
|
ArgvIndex is -1.
|
|
*/
|
|
#define ERROR_READING_FROM_STDIN 6
|
|
/*
|
|
Parser Encountered Help Switch
|
|
ArgRecIndex is index of record.
|
|
ArgvIndex is -1
|
|
*/
|
|
#define PARSE_ERROR_HELP_SWITCH 7
|
|
/*
|
|
The ARG_FLAG_ATLEASTONE flag was
|
|
defined on one or more switch yet
|
|
none of these switches were defined
|
|
ArgRecIndex is -1
|
|
ArgvIndex is -1
|
|
*/
|
|
#define PARSE_ERROR_ATLEASTONE_NOTDEFINED 8
|
|
|
|
|
|
//Parse Errors for when ERROR_SOURCE is VLDFN
|
|
|
|
/*
|
|
Use this error code when Validation Function has handled the error and
|
|
Shown appropriate error message.
|
|
*/
|
|
#define VLDFN_ERROR_NO_ERROR 1
|
|
|
|
|
|
//Error is returned by Parser in PARSE_ERROR structure
|
|
//ErrorSource: Source of Error. Parser or Validation Function
|
|
//Error This is the actual error code. Its value depend on ErrorSource value.
|
|
// if( ErrorSource == PARSE_ERROR )
|
|
// possible values are ERROR_FROM_PARSER ERROR_FROM_VLDFN
|
|
// if( ErrorSource == ERROR_FROM_VLDFN )
|
|
// depends on the function
|
|
// ArgRecIndex is appropriate index in the ARG_RECORD, if applicable else -1
|
|
// ArgvIndex is approproate index in the agrv array, if applicable else -1
|
|
typedef struct _PARSE_ERROR
|
|
{
|
|
INT ErrorSource;
|
|
DWORD Error;
|
|
INT ArgRecIndex;
|
|
INT ArgvIndex;
|
|
} PARSE_ERROR, *PPARSE_ERROR;
|
|
|
|
BOOL ParseCmd(IN ARG_RECORD *Commands,
|
|
IN int argc,
|
|
IN CToken *pToken,
|
|
IN DWORD UsageMessageId,
|
|
OUT PPARSE_ERROR pError,
|
|
IN BOOL bValidate = TRUE);
|
|
|
|
void FreeCmd(ARG_RECORD *Commands);
|
|
|
|
DWORD GetCommandInput(OUT int *pargc, //Number of Tokens
|
|
OUT LPTOKEN *ppToken); //Array of CToken
|
|
|
|
|
|
DWORD Tokenize(IN LPWSTR pBuf,
|
|
IN LONG BufLen,
|
|
IN LPWSTR pszDelimiters,
|
|
OUT CToken **ppToken,
|
|
OUT int *argc);
|
|
|
|
LONG GetToken(IN LPWSTR pBuf,
|
|
IN LONG BufLen,
|
|
IN LPWSTR pszDelimiters,
|
|
OUT BOOL *bQuote,
|
|
OUT LPWSTR *ppToken);
|
|
|
|
BOOL DisplayParseError(IN PPARSE_ERROR pError,
|
|
IN ARG_RECORD *Commands,
|
|
IN CToken *pToken);
|
|
|
|
|
|
//Function to display string to STDERR
|
|
VOID DisplayError(IN LPWSTR pszError);
|
|
//Function to display string to STDOUT, appending newline
|
|
VOID DisplayOutput(IN LPWSTR pszOut);
|
|
//Function to display string to STDOUT, without newline
|
|
VOID DisplayOutputNoNewline(IN LPWSTR pszOut);
|
|
//Function to display Message to Standard Error.
|
|
VOID DisplayMessage(DWORD MessageId,...);
|
|
|
|
|
|
|
|
// Copied from JSchwart on 2/19/2001
|
|
|
|
void
|
|
MyWriteConsole(
|
|
HANDLE fp,
|
|
LPWSTR lpBuffer,
|
|
DWORD cchBuffer
|
|
);
|
|
|
|
|
|
void
|
|
WriteStandardOut(PCWSTR pszFormat, ...);
|
|
|
|
void
|
|
WriteStandardError(PCWSTR pszFormat, ...);
|
|
|
|
#endif //_VARG_H_012599_
|