/*****************************************************************************\ Author: Corey Morgan (coreym) Copyright (c) 1998-2001 Microsoft Corporation \*****************************************************************************/ #ifndef _VARG_H_012599_ #define _VARG_H_012599_ #define MAXSTR 1025 //Class CToken //It represents a Single Token. class CToken { public: CToken(PCWSTR psz, BOOL bQuote); CToken(); ~CToken(); BOOL Init(PCWSTR psz, BOOL bQuote); PWSTR GetToken() const; BOOL IsSwitch() const; BOOL IsSlash() const; 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_VERB 7 // Verbs are not preceeded by a switch character #define ARG_TYPE_LAST 8 #define ARG_FLAG_OPTIONAL 0x00000001 #define ARG_FLAG_REQUIRED 0x00000002 #define ARG_FLAG_DEFAULTABLE 0x00000004 //#define ARG_FLAG_NOFLAG 0x00000008 // unused. #define ARG_FLAG_HIDDEN 0x00000010 #define ARG_FLAG_VERB 0x00000020 // For operation and sub-operation params that do not have a switch char. // Verbs are two state: present or not present; they do not have qualifers such as a user-entered string. #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_OBJECT 0x00000100 // The object arg is the 3rd param for most commands. #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 bool fSkipObject, OUT PPARSE_ERROR pError, IN BOOL bValidate = FALSE); void FreeCmd(ARG_RECORD *Commands); DWORD GetCommandInput(OUT int *pargc, //Number of Tokens OUT LPTOKEN *ppToken); //Array of CToken BOOL LoadCmd(ARG_RECORD *Commands); 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_