mirror of https://github.com/lianthony/NT4.0
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.
398 lines
7.5 KiB
398 lines
7.5 KiB
/**********************************************************************/
|
|
/** Microsoft LAN Manager **/
|
|
/** Copyright(c) Microsoft Corp., 1987-1990 **/
|
|
/**********************************************************************/
|
|
|
|
/*
|
|
|
|
symtable.cxx
|
|
MIDL Compiler Symbol Table Implementation
|
|
|
|
This class centralizes access to the symbol table throughout the
|
|
compiler.
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
FILE HISTORY :
|
|
|
|
DonnaLi 08-25-1990 Created.
|
|
|
|
*/
|
|
|
|
#include "nulldefs.h"
|
|
extern "C" {
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
}
|
|
#include "errors.hxx"
|
|
#include "symtable.hxx"
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: SymEntry
|
|
|
|
SYNOPSIS: Defines an entry in the symbol table.
|
|
|
|
INTERFACE:
|
|
|
|
CAVEATS: This is an internal class used by the symbol table only.
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-25-1990 Initial creation
|
|
|
|
\**********************************************************************/
|
|
|
|
class SymEntry : public SymKey
|
|
{
|
|
node_skl * pTypeGraph; // pointer to type graph associated with entry
|
|
SymTable * pNextScope; // pointer to next scope associated with entry
|
|
|
|
public:
|
|
|
|
SymEntry(void)
|
|
{
|
|
pTypeGraph = (node_skl *)0;
|
|
pNextScope = (SymTable *)0;
|
|
}
|
|
|
|
SymEntry(
|
|
SymKey NewKey,
|
|
SymTable * pNext,
|
|
node_skl * pNode) : SymKey(NewKey.GetString(), NewKey.GetKind())
|
|
{
|
|
pTypeGraph = pNode;
|
|
pNextScope = pNext;
|
|
}
|
|
|
|
void SetTypeGraph (node_skl * pNode)
|
|
{
|
|
pTypeGraph = pNode;
|
|
}
|
|
|
|
node_skl * GetTypeGraph (void)
|
|
{
|
|
return pTypeGraph;
|
|
}
|
|
|
|
void SetNextScope (SymTable * pNext)
|
|
{
|
|
pNextScope = pNext;
|
|
}
|
|
|
|
SymTable * GetNextScope (void)
|
|
{
|
|
return pNextScope;
|
|
}
|
|
|
|
} ;
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: PrintSymbol
|
|
|
|
SYNOPSIS: Prints out the name of a symbol table entry.
|
|
|
|
ENTRY: sym - the key to symbol table entry to be printed.
|
|
|
|
EXIT:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
void
|
|
PrintSymbol(
|
|
void * sym
|
|
)
|
|
{
|
|
printf ("%s", ((SymKey *)sym)->name);
|
|
}
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: CompareSymbol
|
|
|
|
SYNOPSIS: Compares keys to two symbol table entries.
|
|
|
|
ENTRY: sym1 - the key to 1st symbol table entry to be compared.
|
|
sym2 - the key to 2nd symbol table entry to be compared.
|
|
|
|
EXIT: Returns a positive number if sym1 > sym2.
|
|
Returns a negative number if sym1 < sym2.
|
|
Returns 0 if sym1 = sym2.
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
int
|
|
CompareSymbol(
|
|
void * sym1,
|
|
void * sym2
|
|
)
|
|
{
|
|
int result;
|
|
|
|
result = strcmp(((SymKey *)sym1)->name,
|
|
((SymKey *)sym2)->name);
|
|
if (!result)
|
|
{
|
|
return (((SymKey *)sym1)->kind -
|
|
((SymKey *)sym2)->kind);
|
|
}
|
|
else
|
|
{
|
|
return result;
|
|
}
|
|
}
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: SymTable::SymTable
|
|
|
|
SYNOPSIS: Constructor.
|
|
|
|
ENTRY: Passes the compare and print functions to base class.
|
|
|
|
EXIT:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
SymTable::SymTable(
|
|
int (* pfnCompare)(void *, void *),
|
|
void (* pfnPrint)(void *)
|
|
) : Dictionary(pfnCompare, pfnPrint)
|
|
{
|
|
pPrevScope = (SymTable *)0;
|
|
}
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: SymTable::SymInsert
|
|
|
|
SYNOPSIS: Inserts a symbol into the symbol table.
|
|
|
|
ENTRY: NewKey - identifies the symbol table entry.
|
|
pNext - points to the next scope.
|
|
pNode - points to the type graph.
|
|
|
|
EXIT:
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
node_skl *
|
|
SymTable::SymInsert(
|
|
SymKey NewKey,
|
|
SymTable * pNext,
|
|
node_skl * pNode
|
|
)
|
|
{
|
|
SymEntry TempEntry;
|
|
SymEntry * NewSymbol;
|
|
Dict_Status Status;
|
|
|
|
TempEntry.SetString (NewKey.GetString());
|
|
TempEntry.SetKind (NewKey.GetKind());
|
|
Status = Dict_Find(&TempEntry);
|
|
switch (Status)
|
|
{
|
|
case EMPTY_DICTIONARY:
|
|
case ITEM_NOT_FOUND:
|
|
NewSymbol = new SymEntry(NewKey, pNext, pNode);
|
|
(void) Dict_Insert(NewSymbol);
|
|
return pNode;
|
|
default:
|
|
return (node_skl *)0;
|
|
}
|
|
}
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: SymTable::SymDelete
|
|
|
|
SYNOPSIS: Deletes a symbol from the symbol table.
|
|
|
|
ENTRY: OldKey - identifies the symbol table entry.
|
|
|
|
EXIT: Returns the type graph associated with the entry.
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
node_skl *
|
|
SymTable::SymDelete(
|
|
SymKey OldKey
|
|
)
|
|
{
|
|
SymEntry TempEntry;
|
|
SymEntry * OldSymbol = &TempEntry;
|
|
node_skl * pNode;
|
|
Dict_Status Status;
|
|
|
|
TempEntry.SetString (OldKey.GetString());
|
|
TempEntry.SetKind (OldKey.GetKind());
|
|
Status = Dict_Delete((void ** )&OldSymbol);
|
|
if (Status == SUCCESS)
|
|
{
|
|
pNode = OldSymbol->GetTypeGraph();
|
|
delete OldSymbol;
|
|
return pNode;
|
|
}
|
|
else
|
|
{
|
|
return (node_skl *)0;
|
|
}
|
|
}
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: SymTable::SymSearch
|
|
|
|
SYNOPSIS: Searches the symbol table for a symbol.
|
|
|
|
ENTRY: OldKey - identifies the symbol table entry.
|
|
|
|
EXIT: Returns the type graph associated with the entry.
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
node_skl *
|
|
SymTable::SymSearch(
|
|
SymKey OldKey
|
|
)
|
|
{
|
|
SymEntry TempEntry;
|
|
Dict_Status Status;
|
|
|
|
TempEntry.SetString (OldKey.GetString());
|
|
TempEntry.SetKind (OldKey.GetKind());
|
|
Status = Dict_Find(&TempEntry);
|
|
if (Status == SUCCESS)
|
|
{
|
|
return ((SymEntry * )Dict_Curr_Item())->GetTypeGraph();
|
|
}
|
|
else
|
|
{
|
|
return (node_skl *)0;
|
|
}
|
|
}
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: SymTable::EnterScope
|
|
|
|
SYNOPSIS: Transition from current scope to inner scope.
|
|
|
|
ENTRY: key - identifies the symbol table entry.
|
|
|
|
EXIT: ContainedDict - returns the inner scope.
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
STATUS_T
|
|
SymTable::EnterScope(
|
|
SymKey key,
|
|
SymTable ** ContainedDict
|
|
)
|
|
{
|
|
SymEntry ContainerNode;
|
|
Dict_Status Status;
|
|
|
|
if (ContainedDict == (SymTable **)0)
|
|
{
|
|
return I_ERR_NULL_OUT_PARAM;
|
|
}
|
|
|
|
ContainerNode.SetString (key.GetString());
|
|
ContainerNode.SetKind (key.GetKind());
|
|
Status = Dict_Find(&ContainerNode);
|
|
if (Status != SUCCESS)
|
|
{
|
|
return I_ERR_SYMBOL_NOT_FOUND;
|
|
}
|
|
else if (((SymEntry * )Dict_Curr_Item())->GetNextScope() == (SymTable *)0)
|
|
{
|
|
return I_ERR_NO_NEXT_SCOPE;
|
|
}
|
|
else
|
|
{
|
|
* ContainedDict = ((SymEntry * )Dict_Curr_Item())->GetNextScope();
|
|
(*ContainedDict)->pPrevScope = this;
|
|
return STATUS_OK;
|
|
}
|
|
}
|
|
|
|
/**********************************************************************\
|
|
|
|
NAME: SymTable::ExitScope
|
|
|
|
SYNOPSIS: Transition from current scope to outer scope.
|
|
|
|
ENTRY:
|
|
|
|
EXIT: ContainerDict - returns the outer scope.
|
|
|
|
NOTES:
|
|
|
|
HISTORY:
|
|
Donnali 08-06-1991 Move to LM/90 UI Coding Style
|
|
|
|
\**********************************************************************/
|
|
|
|
STATUS_T
|
|
SymTable::ExitScope(
|
|
SymTable ** ContainerDict
|
|
)
|
|
{
|
|
if (ContainerDict == (SymTable **)0)
|
|
{
|
|
return I_ERR_NULL_OUT_PARAM;
|
|
}
|
|
else if (pPrevScope == (SymTable *)0)
|
|
{
|
|
return I_ERR_NO_PREV_SCOPE;
|
|
}
|
|
else
|
|
{
|
|
* ContainerDict = pPrevScope;
|
|
pPrevScope = (SymTable *)0;
|
|
return STATUS_OK;
|
|
}
|
|
}
|
|
|