📄 undname.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// This source code is licensed under Microsoft Shared Source License
// Version 1.0 for Windows CE.
// For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223.
//
// Make sure all dependent defines exist and have a valid value
#ifndef NO_COMPILER_NAMES
#define NO_COMPILER_NAMES 0
#endif
#ifndef VERS_32BIT
#define VERS_32BIT 1
#endif
#ifndef PACK_SIZE
#if !VERS_32BIT
#define PACK_SIZE 2
#elif defined(_X86_)
#define PACK_SIZE 4
#else
#define PACK_SIZE 8
#endif
#endif
// Check for version inconsistancies, and setup version flags
#ifdef VERS_BSC
#undef NO_COMPILER_NAMES
#define NO_COMPILER_NAMES 1
#pragma inline_depth ( 3 )
#pragma check_stack ( off )
#else
#pragma inline_depth ( 3 )
#pragma check_stack ( off )
#endif
#define PURE =0
// #include <stddef.h>
#include <stdlib.h>
#include "undname.hxx"
#pragma warning(disable:4291) // No matching operator delete
class DName;
class DNameNode;
class Replicator;
class HeapManager;
class UnDecorator;
const unsigned int memBlockSize = 508; // A '512' byte block including the header
class HeapManager
{
private:
Alloc_t pOpNew;
Free_t pOpDelete;
struct Block
{
Block * next;
char memBlock[ memBlockSize ];
__near Block () { next = 0; }
};
Block * head;
Block * tail;
unsigned int blockLeft;
public:
void __near Constructor ( Alloc_t pAlloc, Free_t pFree )
{ pOpNew = pAlloc;
pOpDelete = pFree;
blockLeft = 0;
head = 0;
tail = 0;
}
void __far * __near getMemory ( unsigned int, int );
void __near Destructor ( void )
{ if ( pOpDelete != 0 )
while ( tail = head )
{
head = tail->next;
( *pOpDelete )( tail );
}
}
#define gnew new(heap,0)
#define rnew new(heap,1)
};
void * __near __pascal operator new ( unsigned int, HeapManager &, int = 0 );
static HeapManager heap;
// The MS Token table
enum Tokens
{
#if !VERS_32BIT
TOK_near,
TOK_nearSp,
TOK_nearP,
TOK_far,
TOK_farSp,
TOK_farP,
TOK_huge,
TOK_hugeSp,
TOK_hugeP,
#endif
TOK_basedLp,
TOK_cdecl,
TOK_pascal,
TOK_stdcall,
TOK_thiscall,
TOK_fastcall,
TOK_cocall,
TOK_ptr64,
TOK_restrict,
#if !VERS_32BIT
TOK_interrupt,
TOK_saveregs,
TOK_self,
TOK_segment,
TOK_segnameLpQ,
#endif
TOK__last
};
static const pcchar_t __near tokenTable[] =
{
#if !VERS_32BIT
"__near", // TOK_near
"__near ", // TOK_nearSp
"__near*", // TOK_nearP
"__far", // TOK_far
"__far ", // TOK_farSp
"__far*", // TOK_farP
"__huge", // TOK_huge
"__huge ", // TOK_hugeSp
"__huge*", // TOK_hugeP
#endif
"__based(", // TOK_basedLp
"__cdecl", // TOK_cdecl
"__pascal", // TOK_pascal
"__stdcall", // TOK_stdcall
"__thiscall", // TOK_thiscall
"__fastcall", // TOK_fastcall
"__cocall", // TOK_cocall
"__ptr64", // TOK_ptr64
"__restrict", // TOK_restrict
#if !VERS_32BIT
"__interrupt", // TOK_interrupt
"__saveregs", // TOK_saveregs
"__self", // TOK_self
"__segment", // TOK_segment
"__segname(\"", // TOK_segnameLpQ
#endif
""
};
// The operator mapping table
static const pcchar_t __near nameTable[] =
{
" new",
" delete",
"=",
">>",
"<<",
"!",
"==",
"!=",
"[]",
"operator",
"->",
"*",
"++",
"--",
"-",
"+",
"&",
"->*",
"/",
"%",
"<",
"<=",
">",
">=",
",",
"()",
"~",
"^",
"|",
"&&",
"||",
"*=",
"+=",
"-=",
"/=",
"%=",
">>=",
"<<=",
"&=",
"|=",
"^=",
#if ( !NO_COMPILER_NAMES )
"`vftable'",
"`vbtable'",
"`vcall'",
"`typeof'",
"`local static guard'",
"`string'",
"`vbase destructor'",
"`vector deleting destructor'",
"`default constructor closure'",
"`scalar deleting destructor'",
"`vector constructor iterator'",
"`vector destructor iterator'",
"`vector vbase constructor iterator'",
"`virtual displacement map",
"`eh vector constructor iterator'",
"`eh vector destructor iterator'",
"`eh vector vbase constructor iterator'",
"`copy constructor closure'",
"`udt returning'",
"`EH", //eh initialized struct
"`RTTI", //rtti initialized struct
"`local vftable'",
"`local vftable constructor closure'",
#endif // !NO_COMPILER_NAMES
" new[]",
" delete[]",
#if ( !NO_COMPILER_NAMES )
"`omni callsig'",
"`placement delete closure'",
"`placement delete[] closure'",
#endif
""
};
static const pcchar_t __near ehTable[] =
{
" Ptr to Member Data'",
" Catchable Type'",
" Catchable Type Array'",
" ThrowInfo'",
};
static const pcchar_t __near rttiTable[] =
{
" Type Descriptor'",
" Base Class Descriptor at (",
" Base Class Array'",
" Class Hierarchy Descriptor'",
" Complete Object Locator'",
};
// The following 'enum' should really be nested inside 'class DName', but to
// make the code compile better with Glockenspiel, I have extracted it
enum DNameStatus
{
DN_valid,
DN_invalid,
DN_truncated,
DN_error
};
class DName
{
public:
__near DName ();
__near DName ( char );
#if 1
__near DName ( const DName & ); // Shallow copy
#endif
__near DName ( DNameNode * );
__near DName ( pcchar_t );
__near DName ( pcchar_t&, char );
__near DName ( DNameStatus );
__near DName ( DName * );
__near DName ( unsigned long );
int __near isValid () const;
int __near isEmpty () const;
DNameStatus __near status () const;
DName & __near setPtrRef ();
int __near isPtrRef () const;
int __near isUDC () const;
void __near setIsUDC ();
int __near isUDTThunk () const;
void __near setIsUDTThunk ();
int isNoTE () const;
void setIsNoTE ();
int __near length () const;
char __near getLastChar () const;
pchar_t __near getString ( pchar_t, int ) const;
DName __near operator + ( pcchar_t ) const;
DName __near operator + ( const DName & ) const;
DName __near operator + ( char ) const;
DName __near operator + ( DName * ) const;
DName __near operator + ( DNameStatus ) const;
DName & __near operator += ( char );
DName & __near operator += ( pcchar_t );
DName & __near operator += ( DName * );
DName & __near operator += ( DNameStatus );
DName & __near operator += ( const DName & );
DName & __near operator |= ( const DName & );
DName & __near operator = ( pcchar_t );
DName & __near operator = ( const DName & );
DName & __near operator = ( char );
DName & __near operator = ( DName * );
DName & __near operator = ( DNameStatus );
// Friends :
friend DName __near __pascal operator + ( char, const DName & );
friend DName __near __pascal operator + ( pcchar_t, const DName & );
friend DName __near __pascal operator + ( DNameStatus, const DName & );
private:
DNameNode * node;
DNameStatus stat : 4;
unsigned int isIndir : 1;
unsigned int isAUDC : 1;
unsigned int isAUDTThunk : 1;
unsigned int NoTE : 1;
void __near doPchar ( pcchar_t, int );
};
class Replicator
{
private:
// Declare, in order to suppress automatic generation
void operator = ( const Replicator& );
int index;
DName * dNameBuffer[ 10 ];
const DName ErrorDName;
const DName InvalidDName;
public:
__near Replicator ();
int __near isFull () const;
Replicator & __near operator += ( const DName & );
const DName & __near operator [] ( int ) const;
};
class UnDecorator
{
private:
// Declare, in order to suppress automatic generation
void operator = ( const UnDecorator& );
Replicator ArgList;
static Replicator * pArgList;
Replicator ZNameList;
static Replicator * pZNameList;
static Replicator * pTemplateArgList;
static pcchar_t gName;
static pcchar_t name;
static pchar_t outputString;
static int maxStringLength;
static unsigned long disableFlags;
static DName __near getDecoratedName ( void );
static DName __near getSymbolName ( void );
static DName __near getZName ( void );
static DName __near getOperatorName ( void );
static DName __near getScope ( void );
static DName getScopedName ( void );
static DName __near getSignedDimension ( void );
static DName __near getDimension ( void );
static int __near getNumberOfDimensions ( void );
static DName __near getTemplateName ( void );
static DName __near getTemplateArgumentList( void );
static DName __near getTemplateConstant( void );
static DName __near composeDeclaration ( const DName & );
static int __near getTypeEncoding ( void );
static DName __near getBasedType ( void );
static DName __near getECSUName ( void );
static DName __near getEnumType ( void );
static DName __near getCallingConvention ( void );
static DName __near getReturnType ( DName * = 0 );
static DName __near getDataType ( DName * );
static DName __near getPrimaryDataType ( const DName & );
static DName __near getDataIndirectType ( const DName &, char, const DName &, int = FALSE );
static DName __near getDataIndirectType ();
static DName __near getBasicDataType ( const DName & );
static DName __near getECSUDataType ( void );
static DName __near getPtrRefType ( const DName &, const DName &, int );
static DName __near getPtrRefDataType ( const DName &, int );
static DName __near getArrayType ( const DName& );
static DName getFunctionIndirectType( const DName & superType );
static DName __near getArgumentTypes ( void );
static DName __near getArgumentList ( void );
static DName __near getThrowTypes ( void );
static DName __near getLexicalFrame ( void );
static DName __near getStorageConvention ( void );
static DName __near getThisType ( void );
static DName __near getPointerType ( const DName &, const DName & );
static DName __near getReferenceType ( const DName &, const DName & );
static DName __near getExternalDataType ( const DName & );
static DName __near getSegmentName ( void );
#if ( !NO_COMPILER_NAMES )
static DName __near getDisplacement ( void );
static DName __near getCallIndex ( void );
static DName __near getGuardNumber ( void );
static DName __near getVfTableType ( const DName & );
static DName __near getVbTableType ( const DName & );
static DName __near getVCallThunkType ( void );
#endif // !NO_COMPILER_NAMES
static DName getStringEncoding ( char *prefix, int wantBody );
static GetParameter_t m_pGetParameter;
public:
__near UnDecorator ( pchar_t, pcchar_t, int, GetParameter_t, unsigned long );
static int __near doUnderScore ();
static int __near doMSKeywords ();
static int __near doFunctionReturns ();
static int __near doAllocationModel ();
static int __near doAllocationLanguage ();
#if 0
static int __near doMSThisType ();
static int __near doCVThisType ();
#endif
static int __near doThisTypes ();
static int __near doAccessSpecifiers ();
static int __near doThrowTypes ();
static int __near doMemberTypes ();
static int __near doReturnUDTModel ();
static int __near do32BitNear ();
static int __near doNameOnly ();
static int __near doTypeOnly ();
static int __near haveTemplateParameters ();
static int __near doEcsu ();
static int __near doNoIdentCharCheck ();
static pcchar_t __near UScore ( Tokens );
__near operator pchar_t ();
};
Replicator * UnDecorator::pArgList;
Replicator * UnDecorator::pZNameList = 0;
Replicator * UnDecorator::pTemplateArgList = 0;
pcchar_t UnDecorator::gName = 0;
pcchar_t UnDecorator::name = 0;
pchar_t UnDecorator::outputString = 0;
int UnDecorator::maxStringLength = 0;
unsigned long UnDecorator::disableFlags = 0;
GetParameter_t UnDecorator::m_pGetParameter = 0;
// #ifdef _CRTBLD
pchar_t __far _CRTIMP __loadds __unDName ( pchar_t outputString,
// #else
// pchar_t __far __cdecl __loadds unDName ( pchar_t outputString,
// #endif
pcchar_t name,
int maxStringLength, // Note, COMMA is leading following optional arguments
Alloc_t pAlloc,
Free_t pFree,
unsigned short disableFlags
)
/*
* This function will undecorate a name, returning the string corresponding to
* the C++ declaration needed to produce the name. Its has a similar interface
* to 'strncpy'.
*
* If the target string 'outputString' is specified to be NULL, a string of
* suitable length will be allocated and its address returned. If the returned
* string is allocated by 'unDName', then it is the programmers responsibility
* to deallocate it. It will have been allocated on the far heap.
*
* If the target string is not NULL, then the parameter 'maxStringLength' will
* specify the maximum number of characters which may be placed in the string.
* In this case, the returned value is the same as 'outputString'.
*
* Both the input parameter 'name' and the returned string are NULL terminated
* strings of characters.
*
* If the returned value is NULL, it indicates that the undecorator ran out of
* memory, or an internal error occurred, and was unable to complete its task.
*/
{
// Must have an allocator and a deallocator (and we MUST trust them)
if ( !( pAlloc ))
return 0;
else
heap.Constructor ( pAlloc, pFree );
// Create the undecorator object, and get the result
UnDecorator unDecorate ( outputString,
name,
maxStringLength,
0,
disableFlags
);
pchar_t unDecoratedName = unDecorate;
// Destruct the heap (would use a destructor, but that causes DLL problems)
heap.Destructor ();
// And return the composed name
return unDecoratedName;
} // End of FUNCTION "unDName"
// #ifdef _CRTBLD
pchar_t __far _CRTIMP __loadds __unDNameEx ( pchar_t outputString,
// #else
// pchar_t __far __cdecl __loadds unDNameEx ( pchar_t outputString,
// #endif
pcchar_t name,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -