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.
1552 lines
54 KiB
1552 lines
54 KiB
// Copyright (c) 1993-1999 Microsoft Corporation
|
|
|
|
#ifndef __CMDANA_HXX__
|
|
#define __CMDANA_HXX__
|
|
|
|
#include "common.hxx"
|
|
#include "errors.hxx"
|
|
#include <stream.hxx>
|
|
|
|
class ISTREAM;
|
|
|
|
enum _swenum
|
|
{
|
|
SWITCH_NOTHING
|
|
,BASE_FILENAME = SWITCH_NOTHING
|
|
,SWITCH_D
|
|
,SWITCH_I
|
|
,SWITCH_U
|
|
,SWITCH_W
|
|
,SWITCH_CONFIRM
|
|
,SWITCH_NOLOGO
|
|
,SWITCH_CPP_CMD
|
|
,SWITCH_CPP_OPT
|
|
,SWITCH_MSC_VER
|
|
,SWITCH_CSTUB
|
|
,SWITCH_ENV
|
|
,SWITCH_ERROR
|
|
,SWITCH_ROBUST
|
|
,SWITCH_NO_ROBUST
|
|
,SWITCH_HEADER
|
|
,SWITCH_NO_HEADER
|
|
,SWITCH_NO_CPP
|
|
,SWITCH_NO_DEF_IDIR
|
|
,SWITCH_NO_ENUM_LIT
|
|
,SWITCH_USE_EPV
|
|
,SWITCH_NO_DEFAULT_EPV
|
|
,SWITCH_NO_WARN
|
|
,SWITCH_OUT
|
|
,SWITCH_SSTUB
|
|
,SWITCH_STUB
|
|
,SWITCH_SYNTAX_CHECK
|
|
,SWITCH_TARGET_SYSTEM
|
|
,SWITCH_ZS
|
|
,SWITCH_V
|
|
,SWITCH_VERSION
|
|
,SWITCH_DEBUGEXC
|
|
,SWITCH_DEBUGLINE
|
|
,SWITCH_DEBUG64_OPT
|
|
,SWITCH_DEBUG64
|
|
,SWITCH_APPEND64
|
|
,SWITCH_ACF
|
|
,SWITCH_PACK
|
|
,SWITCH_ZP
|
|
,SWITCH_CLIENT
|
|
,SWITCH_NO_CLIENT
|
|
,SWITCH_SERVER
|
|
,SWITCH_NO_SERVER
|
|
,SWITCH_PREFIX
|
|
,SWITCH_SUFFIX
|
|
,SWITCH_DUMP
|
|
,SWITCH_SAVEPP
|
|
,SWITCH_CHAR
|
|
,SWITCH_HELP
|
|
,SWITCH_WX
|
|
,SWITCH_X
|
|
,SWITCH_MS_EXT
|
|
,SWITCH_MS_CONF_STRUCT
|
|
,SWITCH_APP_CONFIG
|
|
,SWITCH_INTERNAL
|
|
,SWITCH_NO_STAMP
|
|
,SWITCH_C_EXT
|
|
,SWITCH_O
|
|
// files for proxies
|
|
,SWITCH_IID
|
|
,SWITCH_NO_IID
|
|
,SWITCH_PROXY
|
|
,SWITCH_NO_PROXY
|
|
,SWITCH_PROXY_DEF
|
|
,SWITCH_NO_PROXY_DEF
|
|
,SWITCH_DLLDATA
|
|
,SWITCH_NO_DLLDATA
|
|
// files for inprocserver32s
|
|
,SWITCH_DLL_SERVER_DEF
|
|
,SWITCH_NO_DLL_SERVER_DEF
|
|
,SWITCH_DLL_SERVER_CLASS_GEN
|
|
,SWITCH_NO_DLL_SERVER_CLASS_GEN
|
|
// files for localserver32s
|
|
,SWITCH_EXE_SERVER_MAIN
|
|
,SWITCH_NO_EXE_SERVER_MAIN
|
|
,SWITCH_EXE_SERVER
|
|
,SWITCH_NO_EXE_SERVER
|
|
// files for both
|
|
,SWITCH_TESTCLIENT
|
|
,SWITCH_NO_TESTCLIENT
|
|
,SWITCH_SERVER_REG
|
|
,SWITCH_NO_SERVER_REG
|
|
// files for com class servers
|
|
,SWITCH_CLASS_METHODS
|
|
,SWITCH_NO_CLASS_METHODS
|
|
,SWITCH_CLASS_IUNKNOWN
|
|
,SWITCH_NO_CLASS_IUNKNOWN
|
|
,SWITCH_CLASS_HEADER
|
|
,SWITCH_NO_CLASS_HEADER
|
|
|
|
,SWITCH_MS_UNION
|
|
,SWITCH_OVERRIDE
|
|
,SWITCH_GUARD_DEFS
|
|
,SWITCH_OLDNAMES
|
|
,SWITCH_RPCSS
|
|
,SWITCH_NO_FMT_OPT
|
|
,SWITCH_OSF // disables setting /ms_ext and /c_ext as default
|
|
,SWITCH_HOOKOLE
|
|
,SWITCH_NETMON
|
|
,SWITCH_NETMON_STUB_OUTPUT_FILE
|
|
,SWITCH_NETMON_STUB_OBJ_OUTPUT_FILE
|
|
,SWITCH_VERSION_STAMP
|
|
|
|
// MKTYPLIB switches
|
|
,SWITCH_TLIB
|
|
,SWITCH_TLIB64
|
|
,SWITCH_REDIRECT_OUTPUT
|
|
,SWITCH_ODL_ENV
|
|
,SWITCH_MKTYPLIB
|
|
,SWITCH_OLD_TLB
|
|
,SWITCH_NEW_TLB
|
|
,SWITCH_LOCALE_ID
|
|
|
|
,SWITCH_NOREUSE_BUFFER
|
|
,SWITCH_USE_VT_INT_PTR
|
|
,SWITCH_NO_TLIB
|
|
|
|
,SWITCH_TRANSFER_SYNTAX
|
|
,SWITCH_MS_EXT64
|
|
|
|
,SWITCH_DEBUGINFO
|
|
|
|
,SWITCH_WIRE_COMPAT
|
|
|
|
//
|
|
// enter all new switches before this label
|
|
//
|
|
,SW_VALUE_MAX
|
|
};
|
|
|
|
/*** client : can take values "stub", "none" ***/
|
|
|
|
#define CLNT_STUB (0x0)
|
|
#define CLNT_NONE (0x2)
|
|
|
|
/*** server : can take values "stub", "none" ***/
|
|
|
|
#define SRVR_STUB (0x0)
|
|
#define SRVR_NONE (0x2)
|
|
|
|
/** env switch values **/
|
|
|
|
#define ENV_WIN32 (0x4)
|
|
#define ENV_WIN64 (0x20)
|
|
#define ENV_OBSOLETE (0)
|
|
|
|
/** targeted system switch values **/
|
|
|
|
typedef enum _target_enum
|
|
{
|
|
NOTARGET = 0,
|
|
NT40 = 40,
|
|
NT50 = 50,
|
|
NT51 = 51
|
|
} TARGET_ENUM;
|
|
|
|
|
|
#define DEFAULT_ZEEPEE (8)
|
|
|
|
/** error switch values **/
|
|
|
|
#define ERROR_NONE (0x0000)
|
|
#define ERROR_BOUNDS_CHECK (0x0001)
|
|
#define ERROR_ENUM (0x0002)
|
|
#define ERROR_ALLOCATION (0x0004)
|
|
#define ERROR_REF (0x0008)
|
|
#define ERROR_STUB_DATA (0x0010)
|
|
|
|
#define ERROR_ALL (ERROR_BOUNDS_CHECK | \
|
|
ERROR_ENUM | \
|
|
ERROR_ALLOCATION | \
|
|
ERROR_REF | \
|
|
ERROR_STUB_DATA \
|
|
)
|
|
|
|
/** char switch values **/
|
|
|
|
#define CHAR_SIGNED (0x1)
|
|
#define CHAR_UNSIGNED (0x2)
|
|
#define CHAR_ANSI7 (0x3)
|
|
|
|
/** rpc ss allocate **/
|
|
|
|
#define RPC_SS_ALLOCATE_DISABLED (0x0)
|
|
#define RPC_SS_ALLOCATE_ENABLED (0x1)
|
|
|
|
/** manifests defining prefix arguments **/
|
|
|
|
#define PREFIX_CLIENT_STUB (0x0)
|
|
#define PREFIX_SERVER_MGR (0x1)
|
|
#define PREFIX_SWICH_PROTOTYPE (0x2)
|
|
#define PREFIX_ALL (0x3)
|
|
|
|
/** wire compatibility options (allocated as bitfields) **/
|
|
|
|
#define WIRE_COMPAT_ENUM16UNIONALIGN (0x0001)
|
|
|
|
|
|
/*****************************************************************************
|
|
* some data structures used.
|
|
*****************************************************************************/
|
|
|
|
// basically a singly linked list implementation,
|
|
// used for switches which can be specified multiply like -D / -I etc
|
|
|
|
typedef struct _optlist
|
|
{
|
|
char * pStr; // pointer to argument string
|
|
struct _optlist * pNext; // pointer to the next argument
|
|
size_t ActualOffset;
|
|
bool NeedsQuotes;
|
|
} OptList;
|
|
|
|
|
|
/*****************************************************************************
|
|
* class defintions used by the command analyser.
|
|
*****************************************************************************/
|
|
//
|
|
// the multiple occurence switch class
|
|
// This class of switches are ones which can be specified multiple times
|
|
// on the command line. Examples of such switches are -D / -U à/ -I etc
|
|
// This switch really keeps a linked list of all arguments specified for
|
|
// the switch.
|
|
//
|
|
|
|
class multiple_switch
|
|
{
|
|
private:
|
|
OptList * pFirst, // first of the list of arguments.
|
|
* pCurrent; // current in the scan of list of args.
|
|
public:
|
|
|
|
// constructor
|
|
multiple_switch( ) : pFirst(NULL), pCurrent(NULL) {};
|
|
multiple_switch( char *pArg, size_t ActualOffset );
|
|
|
|
// add the arguments of another occurence of this switch
|
|
|
|
void Add( char *, size_t ActualOffset );
|
|
|
|
// initialise the scan of the list. Called before any GetNextIsDone
|
|
|
|
void Init();
|
|
|
|
// Get the argument to the next occurence of the switch
|
|
|
|
char * GetNext( size_t *pActualOffset = NULL, bool *pNeedQuotes = NULL );
|
|
|
|
// Collect all the arguments into a buffer
|
|
|
|
char * GetConsolidatedOptions( bool NeedsQuotes = false );
|
|
|
|
// return the length of all the arguments. Generally used to allocate
|
|
// a buffer size for a GetConsolidatedOptions call.
|
|
|
|
short GetConsolidatedLength( bool NeedsQuotes = false );
|
|
|
|
void StreamIn( char*& );
|
|
void StreamOut( STREAM* );
|
|
};
|
|
|
|
|
|
//
|
|
// the onetime_switch class.
|
|
// such a switch can occur only once, and takes just one argument. We need
|
|
// to hold on to the argument during compilation.
|
|
//
|
|
|
|
class onetime_switch
|
|
{
|
|
char * pOpt; // the user argument
|
|
|
|
public:
|
|
|
|
// the constructor.
|
|
|
|
onetime_switch(
|
|
char * pArg = 0 // argument to switch
|
|
);
|
|
|
|
// the destructor
|
|
|
|
~onetime_switch();
|
|
|
|
// get the user option
|
|
|
|
char * GetOption();
|
|
|
|
// get length of the user option string
|
|
|
|
short GetLength();
|
|
|
|
void StreamIn( char*& pBuffer );
|
|
void StreamOut( STREAM* );
|
|
};
|
|
|
|
|
|
//
|
|
// the filename_switch
|
|
//
|
|
// There are a lot of switches which have filenames as arguments. This
|
|
// class exists to ease processing of such switches, all of whom behave more
|
|
// or less the same way. Only the -out switch is a little different.
|
|
// We need to access the filename components too, so we store both as
|
|
// components and as the full name.
|
|
//
|
|
|
|
class filename_switch
|
|
{
|
|
private:
|
|
char * pFullName;
|
|
public:
|
|
|
|
// the constructor. Takes an argument as the switch it is defining, so that
|
|
// it can check for a redef.
|
|
|
|
filename_switch(
|
|
char * pThisArg = 0 // this argument is supplied
|
|
);
|
|
|
|
// the constructor. It takes a set of filename components. This is not
|
|
// called as a result of a user switch, but by internal routines which
|
|
// do not need to check for duplicate definitions.
|
|
|
|
filename_switch(
|
|
char * pD, // drive
|
|
char * pP, // path
|
|
char * pN, // base name
|
|
char * pE, // extension
|
|
char * pS // suffix ("_c/_s") etc to name
|
|
// etc.
|
|
);
|
|
|
|
// the destructor
|
|
|
|
~filename_switch();
|
|
|
|
// Set file name components , given a full name.
|
|
|
|
void SetFileName(
|
|
char * pName // full name
|
|
);
|
|
|
|
// set file name and components, given the components. Note that some
|
|
// components may be null, indicating that they are absent.
|
|
|
|
void SetFileName(
|
|
char * pD, // drive
|
|
char * pP, // path
|
|
char * pN, // base name
|
|
char * pE, // extension
|
|
char * pS // suffix to name
|
|
);
|
|
|
|
// the the full filename
|
|
|
|
char * GetFileName( void );
|
|
|
|
// Get the file name components. If an input pointer is NULL, it means the
|
|
// user is not interested in that component of the filename.
|
|
|
|
void GetFileNameComponents(
|
|
char * pD, // buffer for drive
|
|
char * pP, // buffer for path
|
|
char * pN, // buffer for name
|
|
char * pE // buffer for ext
|
|
);
|
|
|
|
void TransformFileNameForOut(
|
|
char * pD, // drive
|
|
char * pP // path
|
|
);
|
|
|
|
void StreamIn( char*& pBuffer );
|
|
void StreamOut( STREAM* );
|
|
};
|
|
|
|
// This data structure is used for specifying data for switches which can take
|
|
// different user specification, eg -mode ( osf | msft | c_port ) etc.
|
|
|
|
typedef struct _choice
|
|
{
|
|
const char * pChoice; // user input
|
|
short Choice; // internal compiler code.
|
|
} CHOICE;
|
|
|
|
class CommandLine;
|
|
// this data structure is for paired items, like prefix
|
|
class pair_switch
|
|
{
|
|
private:
|
|
CHOICE * pArrayOfChoices;
|
|
char ** pUserStrings;
|
|
long ArraySize;
|
|
|
|
short Current;
|
|
|
|
public:
|
|
// get the index of a particular system string
|
|
short GetIndex( char * pSys );
|
|
|
|
// constructor
|
|
|
|
pair_switch( const CHOICE * pValidChoices );
|
|
|
|
// construction functions
|
|
|
|
// void CmdProcess( CommandLine*, char *pF);
|
|
|
|
void AddPair( short index, char * pUser );
|
|
|
|
// get the user defined equivalent of this system defined prefix string
|
|
|
|
char * GetUserDefinedEquivalent( short );
|
|
|
|
// iteration functions ( for printout )
|
|
void Init()
|
|
{
|
|
Current = -1;
|
|
}
|
|
|
|
short GetNext( char ** pSys, char ** pUser );
|
|
|
|
void StreamIn( char*& );
|
|
void StreamOut( STREAM* );
|
|
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Class for Ndr stub version control
|
|
// - what compiler guesses from the usage.
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class NdrVersionControl
|
|
{
|
|
// NT 3.51 or Win95
|
|
// VTable size limit is 32
|
|
unsigned long fHasStublessProxies : 1;
|
|
unsigned long fHasCommFaultStatusInOi12 : 1;
|
|
// NT 4.0 or DCOM Win95
|
|
unsigned long fHasOi2 : 1;
|
|
unsigned long fHasUserMarshal : 1;
|
|
unsigned long fHasRawPipes : 1;
|
|
unsigned long fHasFloatOrDoubleInOi : 1;
|
|
unsigned long fHasMoreThan64DelegatedProcs : 1;
|
|
unsigned long fHasNT4VTableSize : 1; // 110 methods
|
|
// NT 4.0 + SP3
|
|
unsigned long fHasMessageAttr : 1;
|
|
unsigned long fHasNT43VTableSize : 1; // 512 methods
|
|
// NT 5.0
|
|
// fHasObjectPipes // revoked later.
|
|
unsigned long fHasAsyncHandleRpc : 1;
|
|
unsigned long fHasNT5VTableSize : 1; // 1024 methods
|
|
// NT 5.0 Beta 2
|
|
unsigned long fHasDOA : 1;
|
|
unsigned long fHasAsyncUUID : 1;
|
|
unsigned long fHasInterpretedNotify : 1;
|
|
unsigned long fHasContextSerialization : 1;
|
|
// Unlimited number of methods
|
|
// NT 5.0 Beta 3
|
|
unsigned long fHasOicfPickling : 1;
|
|
|
|
// NT 6.0
|
|
unsigned long f64BitSupport : 1;
|
|
unsigned long fHasStructPadN : 1;
|
|
unsigned long fMultiTransferSyntax : 1;
|
|
unsigned long fHasMsExt64 : 1;
|
|
unsigned long fHasPartialIgnore : 1;
|
|
unsigned long fHasForceAllocate : 1;
|
|
unsigned long fInterpretedComplexReturns : 1;
|
|
|
|
unsigned long Unused : 8;
|
|
|
|
TARGET_ENUM TargetSystem;
|
|
|
|
public:
|
|
NdrVersionControl()
|
|
{
|
|
ClearNdrVersionControl();
|
|
}
|
|
|
|
void SetHasStublessProxies()
|
|
{
|
|
fHasStublessProxies = 1;
|
|
}
|
|
|
|
unsigned long HasStublessProxies()
|
|
{
|
|
return fHasStublessProxies;
|
|
}
|
|
|
|
void SetHasOi2()
|
|
{
|
|
fHasOi2 = 1;
|
|
}
|
|
|
|
unsigned long HasOi2()
|
|
{
|
|
return fHasOi2;
|
|
}
|
|
|
|
void SetHasUserMarshal()
|
|
{
|
|
fHasUserMarshal = 1;
|
|
}
|
|
|
|
unsigned long HasUserMarshal()
|
|
{
|
|
return fHasUserMarshal;
|
|
}
|
|
|
|
void SetHasRawPipes()
|
|
{
|
|
fHasRawPipes = 1;
|
|
}
|
|
|
|
unsigned long HasRawPipes()
|
|
{
|
|
return fHasRawPipes;
|
|
}
|
|
|
|
void SetHasMessageAttr()
|
|
{
|
|
fHasMessageAttr = 1;
|
|
}
|
|
|
|
unsigned long HasMessageAttr()
|
|
{
|
|
return fHasMessageAttr;
|
|
}
|
|
|
|
void SetHasAsyncHandleRpc()
|
|
{
|
|
fHasAsyncHandleRpc = 1;
|
|
}
|
|
|
|
unsigned long HasAsyncHandleRpc()
|
|
{
|
|
return fHasAsyncHandleRpc;
|
|
}
|
|
|
|
void SetHasMoreThan64DelegatedProcs()
|
|
{
|
|
fHasMoreThan64DelegatedProcs = 1;
|
|
}
|
|
|
|
unsigned long HasMoreThan64DelegatedProcs()
|
|
{
|
|
return fHasMoreThan64DelegatedProcs;
|
|
}
|
|
|
|
void SetHasNT4VTableSize()
|
|
{
|
|
fHasNT4VTableSize = 1;
|
|
}
|
|
|
|
unsigned long HasNT4VTableSize()
|
|
{
|
|
return fHasNT4VTableSize;
|
|
}
|
|
|
|
void SetHasNT43VTableSize()
|
|
{
|
|
fHasNT43VTableSize = 1;
|
|
}
|
|
|
|
unsigned long HasNT43VTableSize()
|
|
{
|
|
return fHasNT43VTableSize;
|
|
}
|
|
|
|
void SetHasNT5VTableSize()
|
|
{
|
|
fHasNT5VTableSize = 1;
|
|
}
|
|
|
|
unsigned long HasNT5VTableSize()
|
|
{
|
|
return fHasNT5VTableSize;
|
|
}
|
|
|
|
void SetHasFloatOrDoubleInOi()
|
|
{
|
|
fHasFloatOrDoubleInOi = 1;
|
|
}
|
|
|
|
unsigned long HasFloatOrDoubleInOi()
|
|
{
|
|
return fHasFloatOrDoubleInOi;
|
|
}
|
|
|
|
void SetHasCommFaultStatusInOi12()
|
|
{
|
|
fHasCommFaultStatusInOi12 = 1;
|
|
}
|
|
|
|
unsigned long HasCommFaultStatusInOi12()
|
|
{
|
|
return fHasCommFaultStatusInOi12;
|
|
}
|
|
|
|
void SetHasDOA()
|
|
{
|
|
fHasDOA = 1;
|
|
}
|
|
|
|
unsigned long HasDOA()
|
|
{
|
|
return fHasDOA;
|
|
}
|
|
|
|
void SetHasAsyncUUID()
|
|
{
|
|
fHasAsyncUUID = 1;
|
|
}
|
|
|
|
unsigned long HasAsyncUUID()
|
|
{
|
|
return fHasAsyncUUID;
|
|
}
|
|
|
|
void SetHasInterpretedNotify()
|
|
{
|
|
fHasInterpretedNotify = 1;
|
|
}
|
|
|
|
unsigned long HasInterpretedNotify()
|
|
{
|
|
return fHasInterpretedNotify;
|
|
}
|
|
|
|
void SetHasContextSerialization()
|
|
{
|
|
fHasContextSerialization = 1;
|
|
}
|
|
|
|
unsigned long HasContextSerialization()
|
|
{
|
|
return fHasContextSerialization;
|
|
}
|
|
|
|
void SetHasOicfPickling()
|
|
{
|
|
fHasOicfPickling = 1;
|
|
}
|
|
|
|
unsigned long HasOicfPickling()
|
|
{
|
|
return fHasOicfPickling;
|
|
}
|
|
|
|
void SetHas64BitSupport()
|
|
{
|
|
f64BitSupport = 1;
|
|
}
|
|
|
|
unsigned long Has64BitSupport()
|
|
{
|
|
return f64BitSupport;
|
|
}
|
|
|
|
void SetHasStructPadN()
|
|
{
|
|
fHasStructPadN = 1;
|
|
}
|
|
|
|
unsigned long HasStructPadN()
|
|
{
|
|
return fHasStructPadN;
|
|
}
|
|
|
|
void SetHasMultiTransferSyntax()
|
|
{
|
|
fMultiTransferSyntax = 1;
|
|
}
|
|
|
|
unsigned long HasMultiTransferSyntax()
|
|
{
|
|
return fMultiTransferSyntax;
|
|
}
|
|
|
|
void SetHasMsExt64()
|
|
{
|
|
fHasMsExt64 = 1;
|
|
}
|
|
|
|
unsigned long HasMsExt64()
|
|
{
|
|
return fHasMsExt64;
|
|
}
|
|
|
|
void SetHasPartialIgnore()
|
|
{
|
|
fHasPartialIgnore = 1;
|
|
}
|
|
|
|
unsigned long HasPartialIgnore()
|
|
{
|
|
return fHasPartialIgnore;
|
|
}
|
|
|
|
void SetHasForceAllocate()
|
|
{
|
|
fHasForceAllocate = 1;
|
|
}
|
|
|
|
unsigned long HasForceAllocate()
|
|
{
|
|
return fHasForceAllocate;
|
|
}
|
|
|
|
void ClearNdrVersionControl()
|
|
{
|
|
fHasStublessProxies = 0;
|
|
fHasCommFaultStatusInOi12 = 0;
|
|
fHasOi2 = 0;
|
|
fHasUserMarshal = 0;
|
|
fHasRawPipes = 0;
|
|
fHasFloatOrDoubleInOi = 0;
|
|
fHasMessageAttr = 0;
|
|
fHasMoreThan64DelegatedProcs = 0;
|
|
fHasAsyncHandleRpc = 0;
|
|
fHasNT4VTableSize = 0;
|
|
fHasNT43VTableSize = 0;
|
|
fHasNT5VTableSize = 0;
|
|
fHasDOA = 0;
|
|
fHasAsyncUUID = 0;
|
|
fHasInterpretedNotify = 0;
|
|
fHasContextSerialization = 0;
|
|
fHasOicfPickling = 0;
|
|
f64BitSupport = 0;
|
|
fHasStructPadN = 0;
|
|
fMultiTransferSyntax = 0;
|
|
fHasMsExt64 = 0;
|
|
fHasForceAllocate = 0;
|
|
fHasPartialIgnore = 0;
|
|
Unused = 0;
|
|
TargetSystem = NOTARGET;
|
|
}
|
|
|
|
void AddtoNdrVersionControl(
|
|
NdrVersionControl & VC )
|
|
{
|
|
fHasStublessProxies |= VC.HasStublessProxies();
|
|
fHasCommFaultStatusInOi12 |= VC.HasCommFaultStatusInOi12();
|
|
fHasOi2 |= VC.HasOi2();
|
|
fHasUserMarshal |= VC.HasUserMarshal();
|
|
fHasRawPipes |= VC.HasRawPipes();
|
|
fHasMoreThan64DelegatedProcs |= VC.HasMoreThan64DelegatedProcs();
|
|
fHasFloatOrDoubleInOi |= VC.HasFloatOrDoubleInOi();
|
|
fHasMessageAttr |= VC.HasMessageAttr();
|
|
fHasAsyncHandleRpc |= VC.HasAsyncHandleRpc();
|
|
fHasNT4VTableSize |= VC.HasNT4VTableSize();
|
|
fHasNT43VTableSize |= VC.HasNT43VTableSize();
|
|
fHasNT5VTableSize |= VC.HasNT5VTableSize();
|
|
fHasDOA |= VC.HasDOA();
|
|
fHasAsyncUUID |= VC.HasAsyncUUID();
|
|
fHasInterpretedNotify |= VC.HasInterpretedNotify();
|
|
fHasContextSerialization |= VC.HasContextSerialization();
|
|
fHasOicfPickling |= VC.HasOicfPickling();
|
|
f64BitSupport |= VC.Has64BitSupport();
|
|
fHasStructPadN |= VC.HasStructPadN();
|
|
fMultiTransferSyntax |= VC.HasMultiTransferSyntax();
|
|
fHasMsExt64 |= VC.HasMsExt64();
|
|
fHasForceAllocate |= VC.HasForceAllocate();
|
|
|
|
// REVIEW
|
|
if (VC.TargetSystem > TargetSystem)
|
|
TargetSystem = VC.TargetSystem;
|
|
}
|
|
|
|
BOOL HasNdr11Feature()
|
|
{
|
|
return ( fHasStublessProxies ||
|
|
fHasCommFaultStatusInOi12 );
|
|
}
|
|
|
|
BOOL HasNdr20Feature()
|
|
{
|
|
return ( fHasOi2 ||
|
|
fHasUserMarshal ||
|
|
fHasRawPipes ||
|
|
fHasMoreThan64DelegatedProcs ||
|
|
fHasFloatOrDoubleInOi ||
|
|
fHasMessageAttr ||
|
|
TargetSystem >= NT40 );
|
|
}
|
|
|
|
BOOL HasNdr50Feature()
|
|
{
|
|
return ( fHasAsyncHandleRpc ||
|
|
fHasDOA ||
|
|
fHasAsyncUUID ||
|
|
fHasInterpretedNotify ||
|
|
fHasContextSerialization ||
|
|
fHasOicfPickling ||
|
|
f64BitSupport ||
|
|
TargetSystem >= NT50 );
|
|
}
|
|
|
|
// Note, "ndr60" is kind of confusing. This is the
|
|
// version of ndr that shipped with NT 5.1
|
|
// (aka "Whistler").
|
|
|
|
BOOL HasNdr60Feature()
|
|
{
|
|
return HasStructPadN() ||
|
|
fMultiTransferSyntax ||
|
|
fHasMsExt64 ||
|
|
fHasForceAllocate ||
|
|
fHasPartialIgnore ||
|
|
TargetSystem >= NT51;
|
|
}
|
|
|
|
BOOL IsNdr60orLaterRequired()
|
|
{
|
|
return HasNdr60Feature();
|
|
}
|
|
|
|
BOOL IsNdr50orLaterRequired()
|
|
{
|
|
return HasNdr50Feature();
|
|
}
|
|
|
|
void SetTargetSystem( TARGET_ENUM target )
|
|
{
|
|
TargetSystem = target;
|
|
}
|
|
|
|
TARGET_ENUM GetTargetSystem()
|
|
{
|
|
return TargetSystem;
|
|
}
|
|
|
|
BOOL TargetIsNT40OrLater()
|
|
{
|
|
return (TargetSystem >= NT40);
|
|
}
|
|
|
|
BOOL TargetIsNT50OrLater()
|
|
{
|
|
return (TargetSystem >= NT50);
|
|
}
|
|
|
|
BOOL TargetIsLessThanNT50()
|
|
{
|
|
return ( NOTARGET != TargetSystem )
|
|
&& ( TargetSystem < NT50 );
|
|
}
|
|
|
|
BOOL TargetIsNT51OrLater()
|
|
{
|
|
return (TargetSystem >= NT51);
|
|
}
|
|
|
|
BOOL TargetIsLessThanNT51()
|
|
{
|
|
return ( NOTARGET != TargetSystem )
|
|
&& ( TargetSystem < NT51 );
|
|
}
|
|
|
|
BOOL AllowIntrepretedComplexReturns()
|
|
{
|
|
return HasMultiTransferSyntax();
|
|
}
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// the big boy - the command analyser object
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
typedef class _cmd_arg
|
|
{
|
|
protected:
|
|
unsigned long switch_def_vector[ 5 ]; // switch definition vector
|
|
unsigned char fClient; // client switch options
|
|
unsigned char fServer; // server switch options
|
|
unsigned char Env; // env - flat /segmented
|
|
unsigned char CharOption; // char option
|
|
unsigned char fMintRun; // this is a mint ( MIDL-lint) run
|
|
unsigned short MajorVersion; // major version
|
|
unsigned short MinorVersion; // minor version
|
|
unsigned short UpdateNumber; // update
|
|
unsigned short ErrorOption; // error option
|
|
unsigned short WireCompatOption; // wire_compat options
|
|
unsigned short ConfigMask; // configuration mask for error reporting
|
|
unsigned short MSCVersion; // MS C Compiler version
|
|
bool fShowLogo;
|
|
|
|
NdrVersionControl VersionControl; // compiler evaluation
|
|
|
|
unsigned short OptimFlags; // optimization flags from user
|
|
OPT_LEVEL_ENUM OptimLevel; // internal optimization level
|
|
TARGET_ENUM TargetSystem; // targeted system
|
|
SYNTAX_ENUM TargetSyntax;
|
|
|
|
short iArgV; // index into the argument vector
|
|
short cArgs; // count of arguments
|
|
|
|
short WLevel; // warning level
|
|
|
|
unsigned short ZeePee; // the Zp switch option value
|
|
unsigned short EnumSize; // memory size of enum16
|
|
unsigned long LocaleId; // the lcid for MBCS
|
|
|
|
BOOL fDoubleFor64; // double run marker
|
|
BOOL fHasAppend64; // the 64 append run
|
|
BOOL fIsNDR64Run; // NDR64 run
|
|
BOOL fIsNDRRun; // NDR run
|
|
BOOL fIs2ndCodegenRun; // protocol all
|
|
BOOL fNeedsNDR64Header; // protocol all, no -env, 32bit
|
|
|
|
char szCompileTime[32];
|
|
char szCompilerVersion[32];
|
|
|
|
filename_switch * pInputFNSwitch, // input file name
|
|
* pOutputPathSwitch, // output path
|
|
* pCStubSwitch, // cstub
|
|
* pSStubSwitch, // sstub
|
|
* pHeaderSwitch, // header
|
|
* pAcfSwitch, // acf
|
|
* pIIDSwitch, // iid
|
|
* pDllDataSwitch, // dlldata
|
|
* pProxySwitch, // proxy
|
|
* pProxyDefSwitch, // proxy
|
|
* pTlibSwitch, // Type Library file name
|
|
* pNetmonStubSwitch, // Netmon stub file
|
|
* pNetmonStubObjSwitch, // Netmon stub file
|
|
* pRedirectOutputSwitch; // redirect stdout to this file
|
|
|
|
pair_switch * pSwitchPrefix; // -prefix
|
|
pair_switch * pSwitchSuffix; // -suffix
|
|
|
|
multiple_switch * pDSwitch, // -D
|
|
* pISwitch, // -I
|
|
* pUSwitch; // -U
|
|
|
|
onetime_switch * pCppCmdSwitch, // cpp_cmd
|
|
* pCppOptSwitch, // cpp_opt
|
|
* pMSCVerSwitch, // msc_ver
|
|
* pDebug64Switch, // debug64
|
|
* pDebug64OptSwitch; // debug64_opt
|
|
|
|
public:
|
|
_cmd_arg();
|
|
|
|
// Is the switch defined ?
|
|
|
|
BOOL IsSwitchDefined( short SWNo )
|
|
{
|
|
unsigned long sw = switch_def_vector[ SWNo / 32 ];
|
|
unsigned long temp = SWNo % 32;
|
|
|
|
sw = sw & ( (unsigned long)1 << temp );
|
|
return sw ? (BOOL)1 : (BOOL)0;
|
|
}
|
|
|
|
// Set the switch to be defined.
|
|
void SwitchDefined( short );
|
|
|
|
// Get filename.
|
|
char * GetInputFileName()
|
|
{
|
|
return pInputFNSwitch->GetFileName();
|
|
}
|
|
|
|
void GetInputFileNameComponents(
|
|
char *pD, // drive buffer
|
|
char *pP, // path buffer
|
|
char *pN, // base name buffer
|
|
char *pE // extension buffer
|
|
)
|
|
{
|
|
pInputFNSwitch->GetFileNameComponents( pD,
|
|
pP,
|
|
pN,
|
|
pE );
|
|
}
|
|
|
|
char * GetAcfFileName()
|
|
{
|
|
return pAcfSwitch->GetFileName();
|
|
}
|
|
|
|
void GetAcfFileNameComponents(
|
|
char *pD,
|
|
char *pP,
|
|
char *pN,
|
|
char *pE )
|
|
{
|
|
pAcfSwitch->GetFileNameComponents( pD,
|
|
pP,
|
|
pN,
|
|
pE );
|
|
}
|
|
|
|
char * GetOutputPath();
|
|
|
|
char * GetCstubFName()
|
|
{
|
|
return pCStubSwitch->GetFileName();
|
|
}
|
|
|
|
void GetCstubFileNameComponents(
|
|
char *pD,
|
|
char *pP,
|
|
char *pN,
|
|
char *pE )
|
|
{
|
|
pCStubSwitch->GetFileNameComponents( pD,
|
|
pP,
|
|
pN,
|
|
pE );
|
|
}
|
|
|
|
char * GetSstubFName()
|
|
{
|
|
return pSStubSwitch->GetFileName();
|
|
}
|
|
|
|
void GetSstubFileNameComponents(
|
|
char *pD,
|
|
char *pP,
|
|
char *pN,
|
|
char *pE )
|
|
{
|
|
pSStubSwitch->GetFileNameComponents( pD,
|
|
pP,
|
|
pN,
|
|
pE );
|
|
}
|
|
|
|
char * GetHeader()
|
|
{
|
|
return pHeaderSwitch->GetFileName();
|
|
}
|
|
|
|
void GetHeaderFileNameComponents(
|
|
char *pD,
|
|
char *pP,
|
|
char *pN,
|
|
char *pE )
|
|
{
|
|
pHeaderSwitch->GetFileNameComponents( pD,
|
|
pP,
|
|
pN,
|
|
pE );
|
|
}
|
|
|
|
char * GetIIDFName()
|
|
{
|
|
return pIIDSwitch->GetFileName();
|
|
}
|
|
|
|
char * GetDllDataFName()
|
|
{
|
|
return pDllDataSwitch->GetFileName();
|
|
}
|
|
|
|
char * GetProxyFName()
|
|
{
|
|
return pProxySwitch->GetFileName();
|
|
}
|
|
|
|
char * GetTypeLibraryFName()
|
|
{
|
|
return pTlibSwitch->GetFileName();
|
|
}
|
|
|
|
char * GetNetmonStubFName()
|
|
{
|
|
return pNetmonStubSwitch->GetFileName();
|
|
}
|
|
|
|
char * GetNetmonStubObjFName()
|
|
{
|
|
return pNetmonStubObjSwitch->GetFileName();
|
|
}
|
|
|
|
// get preprocessor command
|
|
char * GetCPPCmd()
|
|
{
|
|
return pCppCmdSwitch->GetOption();
|
|
}
|
|
|
|
// get preprocessor options
|
|
char * GetCPPOpt()
|
|
{
|
|
return pCppOptSwitch->GetOption();
|
|
}
|
|
|
|
bool ShowLogo()
|
|
{
|
|
return fShowLogo;
|
|
}
|
|
|
|
unsigned short GetMSCVer()
|
|
{
|
|
return MSCVersion;
|
|
}
|
|
|
|
char * GetDebug64()
|
|
{
|
|
return pDebug64Switch->GetOption();
|
|
}
|
|
|
|
char * GetDebug64Opt()
|
|
{
|
|
return pDebug64OptSwitch->GetOption();
|
|
}
|
|
|
|
// get warning level
|
|
short GetWarningLevel() { return WLevel; };
|
|
|
|
// get env switch value
|
|
short GetEnv()
|
|
{
|
|
return (short)Env;
|
|
}
|
|
|
|
void SetEnv( int env )
|
|
{
|
|
Env = (unsigned char) env;
|
|
}
|
|
|
|
TARGET_ENUM GetTargetSystem()
|
|
{
|
|
return TargetSystem;
|
|
}
|
|
|
|
BOOL Is32BitEnv()
|
|
{
|
|
return (BOOL) (Env == ENV_WIN32);
|
|
}
|
|
|
|
BOOL Is32BitDefaultEnv()
|
|
{
|
|
return (BOOL) (Env == ENV_WIN32) &&
|
|
! IsSwitchDefined( SWITCH_ENV );
|
|
}
|
|
|
|
BOOL Is64BitEnv()
|
|
{
|
|
return (BOOL) (Env == ENV_WIN64);
|
|
}
|
|
|
|
BOOL IsDoubleRunFor64()
|
|
{
|
|
return fDoubleFor64;
|
|
}
|
|
|
|
void SetDoubleRunFor64()
|
|
{
|
|
fDoubleFor64 = HasAppend64();
|
|
}
|
|
|
|
BOOL HasAppend64()
|
|
{
|
|
return fHasAppend64;
|
|
}
|
|
|
|
void SetHasAppend64( BOOL NeedsAppending )
|
|
{
|
|
fHasAppend64 = NeedsAppending;
|
|
}
|
|
|
|
BOOL Needs64Run()
|
|
{
|
|
return fHasAppend64;
|
|
}
|
|
|
|
BOOL IsNDR64Run()
|
|
{
|
|
return fIsNDR64Run;
|
|
}
|
|
|
|
void SetIsNDR64Run()
|
|
{
|
|
fIsNDR64Run = TRUE;
|
|
}
|
|
|
|
void ResetIsNDR64Run()
|
|
{
|
|
fIsNDR64Run = FALSE;
|
|
}
|
|
|
|
BOOL IsNDRRun()
|
|
{
|
|
return fIsNDRRun;
|
|
}
|
|
|
|
void SetIsNDRRun()
|
|
{
|
|
fIsNDRRun = TRUE;
|
|
}
|
|
|
|
void ResetIsNDRRun()
|
|
{
|
|
fIsNDRRun = FALSE;
|
|
}
|
|
|
|
void SetIs2ndCodegenRun()
|
|
{
|
|
fIs2ndCodegenRun = TRUE;
|
|
}
|
|
|
|
BOOL Is2ndCodegenRun()
|
|
{
|
|
return fIs2ndCodegenRun;
|
|
}
|
|
|
|
BOOL NeedsNDR64Run()
|
|
{
|
|
if ( TargetSyntax == SYNTAX_BOTH ||
|
|
TargetSyntax == SYNTAX_NDR64 )
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
void SetNeedsNDR64Header()
|
|
{
|
|
fNeedsNDR64Header = TRUE;
|
|
}
|
|
|
|
BOOL NeedsNDR64Header()
|
|
{
|
|
return fNeedsNDR64Header;
|
|
}
|
|
|
|
BOOL IsFinalProtocolRun()
|
|
{
|
|
if ( SYNTAX_BOTH == TargetSyntax && !fIsNDR64Run )
|
|
return FALSE;
|
|
else
|
|
return TRUE;
|
|
}
|
|
|
|
// TODO: yongqu: might consider an compiler option.
|
|
SYNTAX_ENUM GetDefaultSyntax()
|
|
{
|
|
if ( TargetSyntax == SYNTAX_DCE ||
|
|
TargetSyntax == SYNTAX_BOTH )
|
|
return SYNTAX_DCE;
|
|
else
|
|
return SYNTAX_NDR64;
|
|
}
|
|
|
|
BOOL NeedsNDRRun()
|
|
{
|
|
if ( TargetSyntax == SYNTAX_BOTH ||
|
|
TargetSyntax == SYNTAX_DCE )
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL NeedsBothSyntaxes()
|
|
{
|
|
return ( TargetSyntax == SYNTAX_BOTH );
|
|
}
|
|
|
|
BOOL UseExprFormatString()
|
|
{
|
|
return IsNDR64Run();
|
|
}
|
|
|
|
BOOL NeedsNDR64DebugInfo()
|
|
{
|
|
return IsSwitchDefined(SWITCH_DEBUGINFO);
|
|
}
|
|
|
|
// get error options
|
|
short GetErrorOption()
|
|
{
|
|
return ErrorOption;
|
|
}
|
|
|
|
short WireCompat( short checkoption )
|
|
{
|
|
return WireCompatOption & checkoption;
|
|
}
|
|
|
|
// get the switch values
|
|
short GetClientSwitchValue()
|
|
{
|
|
return (short)fClient;
|
|
}
|
|
|
|
void SetClientSwitchValue( short s )
|
|
{
|
|
fClient = (unsigned char) s;
|
|
}
|
|
|
|
short GetServerSwitchValue()
|
|
{
|
|
return (short)fServer;
|
|
}
|
|
|
|
void SetServerSwitchValue( short s )
|
|
{
|
|
fServer = (unsigned char) s;
|
|
}
|
|
|
|
BOOL GenerateSStub()
|
|
{
|
|
return (fServer == SRVR_STUB) && !IsSwitchDefined( SWITCH_NO_SERVER );
|
|
}
|
|
|
|
BOOL GenerateCStub()
|
|
{
|
|
return (fClient == CLNT_STUB) && !IsSwitchDefined( SWITCH_NO_CLIENT );
|
|
}
|
|
|
|
BOOL GenerateStubs()
|
|
{
|
|
return GenerateSStub() || GenerateCStub();
|
|
}
|
|
|
|
BOOL GenerateHeader()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_HEADER );
|
|
}
|
|
|
|
BOOL GenerateIID()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_IID );
|
|
}
|
|
|
|
BOOL GenerateDllData()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_DLLDATA );
|
|
}
|
|
|
|
BOOL GenerateProxy()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_PROXY );
|
|
}
|
|
|
|
BOOL GenerateProxyDefFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_PROXY_DEF );
|
|
}
|
|
|
|
BOOL GenerateServerFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_CLASS_METHODS );
|
|
}
|
|
|
|
BOOL GenerateServerUnkFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_CLASS_IUNKNOWN );
|
|
}
|
|
|
|
BOOL GenerateServerHeaderFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_CLASS_HEADER );
|
|
}
|
|
|
|
BOOL GenerateDllServerDefFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_DLL_SERVER_DEF );
|
|
}
|
|
|
|
BOOL GenerateDllServerClassGenFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_DLL_SERVER_CLASS_GEN );
|
|
}
|
|
|
|
BOOL GenerateServerRegFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_SERVER_REG );
|
|
}
|
|
|
|
BOOL GenerateExeServerFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_EXE_SERVER );
|
|
}
|
|
|
|
BOOL GenerateExeServerMainFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_EXE_SERVER_MAIN );
|
|
}
|
|
|
|
BOOL GenerateTestFile()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_TESTCLIENT );
|
|
}
|
|
|
|
BOOL GenerateTypeLibrary()
|
|
{
|
|
return !IsSwitchDefined( SWITCH_NO_TLIB );
|
|
}
|
|
|
|
BOOL IsValidZeePee(long NewZeePee);
|
|
|
|
short GetZeePee()
|
|
{
|
|
return ZeePee;
|
|
}
|
|
|
|
unsigned short GetEnumSize()
|
|
{
|
|
return EnumSize;
|
|
}
|
|
|
|
void SetEnumSize(unsigned short sEnumSize)
|
|
{
|
|
EnumSize = sEnumSize;
|
|
}
|
|
|
|
unsigned long GetLocaleId()
|
|
{
|
|
return LocaleId;
|
|
}
|
|
|
|
void GetCompilerVersion(
|
|
unsigned short *pMajor,
|
|
unsigned short *pMinor,
|
|
unsigned short *pUpdate )
|
|
{
|
|
*pMajor = MajorVersion;
|
|
*pMinor = MinorVersion;
|
|
*pUpdate= UpdateNumber;
|
|
}
|
|
|
|
unsigned short GetOptimizationFlags()
|
|
{
|
|
// Don't propagate the optimize _IX flag out.
|
|
return (unsigned short) (OptimFlags & 0xff);
|
|
}
|
|
|
|
// destroys previous flags
|
|
unsigned short SetOptimizationFlags( unsigned short f )
|
|
{
|
|
return ( OptimFlags = f );
|
|
}
|
|
|
|
// preserves previous flags
|
|
unsigned short AddOptimizationFlags( unsigned short f )
|
|
{
|
|
return ( OptimFlags |= f );
|
|
}
|
|
|
|
OPT_LEVEL_ENUM GetOptimizationLevel()
|
|
{
|
|
return OptimLevel;
|
|
}
|
|
|
|
// miscellaneous flags
|
|
|
|
// get the minus I specified by the user as 1 single buffer. If the -i
|
|
// is not defined, return a null.
|
|
|
|
char * GetMinusISpecification();
|
|
|
|
BOOL IsMintRun()
|
|
{
|
|
return fMintRun;
|
|
}
|
|
|
|
unsigned short GetModeSwitchConfigMask()
|
|
{
|
|
return (unsigned short)ConfigMask;
|
|
}
|
|
|
|
void SetModeSwitchConfigMask()
|
|
{
|
|
unsigned short M = (unsigned short) ( IsSwitchDefined(SWITCH_MS_EXT) ?1:0 );
|
|
unsigned short C = (unsigned short) ( IsSwitchDefined(SWITCH_C_EXT) ?1:0 );
|
|
unsigned short A = (unsigned short) ( IsSwitchDefined(SWITCH_APP_CONFIG)?1:0 );
|
|
|
|
ConfigMask = unsigned short ( 1 << ( A * 4 + C * 2 + M ) );
|
|
}
|
|
|
|
unsigned short GetCharOption()
|
|
{
|
|
return (unsigned short)CharOption;
|
|
}
|
|
|
|
BOOL IsRpcSSAllocateEnabled()
|
|
{
|
|
return IsSwitchDefined( SWITCH_RPCSS );
|
|
}
|
|
|
|
BOOL IsNetmonStubGenerationEnabled()
|
|
{
|
|
return IsSwitchDefined( SWITCH_NETMON )
|
|
&& IsSwitchDefined( SWITCH_INTERNAL );
|
|
}
|
|
|
|
char * GetUserPrefix( short index )
|
|
{
|
|
return pSwitchPrefix->GetUserDefinedEquivalent( index );
|
|
}
|
|
|
|
BOOL IsPrefixDefinedForCStub()
|
|
{
|
|
return (BOOL)
|
|
( GetUserPrefix( PREFIX_CLIENT_STUB ) != 0 );
|
|
}
|
|
|
|
BOOL IsPrefixDefinedForSStub()
|
|
{
|
|
return (BOOL)
|
|
( GetUserPrefix( PREFIX_SERVER_MGR ) != 0 );
|
|
}
|
|
|
|
char* GetCompilerVersion()
|
|
{
|
|
return szCompilerVersion;
|
|
}
|
|
|
|
// note that this string ends with a newline.
|
|
char* GetCompileTime()
|
|
{
|
|
return szCompileTime;
|
|
}
|
|
|
|
BOOL IsPrefixDifferentForStubs();
|
|
void EmitConfirm( ISTREAM * pStream );
|
|
|
|
STATUS_T StreamIn( char* );
|
|
void StreamOut( STREAM* );
|
|
|
|
NdrVersionControl & GetNdrVersionControl()
|
|
{
|
|
return VersionControl;
|
|
}
|
|
} CMD_ARG;
|
|
|
|
typedef unsigned long ulong;
|
|
|
|
extern CMD_ARG* pCommand;
|
|
|
|
#endif // __CMDANA_HXX__
|