//
// Copyright (c) 1996 Microsoft Corporation
//
//
// SYM.H -- Header for Classes:
// CInfSymbolTable
// CInfSymbol
//
// History:
// 05/21/96 JosephJ Created
//
//
#ifndef _SYM_H_
#define _SYM_H_
class CInfSymbolList;
///////////////////////////////////////////////////////////////////////////
// CLASS CInfSymbol
///////////////////////////////////////////////////////////////////////////
// Represents a symbol in the symbol table.
// Note: Only CInfSymbolTable member functions can construct/destruct these
// objects.
//
// Empty string maps to NULL symbol. So a NULL pointer is perfectly valid for
// all member functions.
// GetText(NULL) returns the empty string, and Checksum returns 0x0.
// Strcmpi treats NULL pointer as the empty string.
class CInfSymbol
{
public:
//-------------- GetText ------------------
// Return the text associated with this symbol as a null-terminated
// string
const TCHAR * GetText(void) const;
//-------------- GetTextLength ------------------
// Return the length of the text associated with this symbol,
// not counting terminating zero.
UINT GetTextLength() const;
//-------------- Strcmpi ------------------
// Case-insensitive equal
// -ve implies this is less-than pSym
int Strcmpi(const CInfSymbol *pSym) const
{
if (this && pSym)
{
return lstrcmpi(m_rgchText, pSym->m_rgchText);
}
else if (this && !pSym)
{
return 1;
}
else if (!this && pSym)
{
return -1;
}
else
{
return 0;
}
}
//-------------- Release ------------------
// Release (decrement ref-count) of this symbol
void Release(void) const;
//-------------- Dump ------------------
// Dump state
void Dump(void) const;
// --------------- Checksum ------------------
// Return checksum of contents
DWORD Checksum(void) const {return (this) ? m_dwChecksum : 0;}
// --------------- SetProp ------------------
BOOL SetProp(const CInfSymbol *pSymPropName, void *pvProp) const;
// --------------- GetProp ------------------
BOOL GetProp(const CInfSymbol *pSymPropName, void **ppvProp) const;
// --------------- GetOrCreatePropLoc --------------
BOOL
GetOrCreatePropLoc(
const CInfSymbol *pSymPropName,
void ***ppvProp,
BOOL *pfExists
)
const;
// --------------- DelProp ------------------
BOOL DelProp(const CInfSymbol *pSymPropName) const;
private:
friend class CInfSymbolTable;
CInfSymbol
(
const TCHAR rgchName[],
UINT cchName,
DWORD dwChecksum,
const CInfSymbol *pNext
);
~CInfSymbol();
const CInfSymbol *Next(void) const {return m_pNext;}
const TCHAR * m_rgchText;
const UINT m_cchText;
const DWORD m_dwChecksum;
const CInfSymbol * m_pNext;
CInfSymbolList * m_pPropList;
};
///////////////////////////////////////////////////////////////////////////
// CLASS CInfSymbolTable
///////////////////////////////////////////////////////////////////////////
// A symbol table.
static const UINT SYMTABSIZE = 1000;
static const UINT TEXTSTORESIZE = 1000*1000;
class CInfSymbolTable
{
public:
CInfSymbolTable(void);
~CInfSymbolTable();
// TODO -- add "context" parameter to symbols -- symbols with different
// context will be stored separately even if their name is the same.
// Context is not interpreted by the symbol table, except to test for
// equality. When implementing this, add a context parameter to
// InfSymbols's constructor, and a member fn "GetContext()" to InfSymbol.
//-------------- Lookup ------------------
// Look up and return the symbol with the specified text
// This symbol must be released by calling its Release function
// when it is no longer needed.
const CInfSymbol * Lookup(const TCHAR rgchName[], BOOL fInsert);
//-------------- Dump ------------------
// Dump state
void Dump(void) const;
private:
const CInfSymbol * m_rgpSym[SYMTABSIZE];
TCHAR m_rgchTextStore[TEXTSTORESIZE];
TCHAR * m_pchFree;
TCHAR * m_pchLastFree;
CSync m_sync;
UINT m_cSymbols;
void mfn_EnterCrit(void) const {m_sync.EnterCrit();}
void mfn_LeaveCrit(void) const {m_sync.LeaveCrit();}
};
class CInfSymbolList : private CInfList
{
CInfSymbolList
(
const CInfSymbol *pSym,
void *pvData,
const CInfSymbolList *pNext
)
: CInfList(pvData, pNext), m_pSym(pSym)
{
}
const CInfSymbolList *
Next (void)
const
{
return (const CInfSymbolList *) CInfList::Next();
}
const CInfSymbol * GetSym(void) {return m_pSym;}
~CInfSymbolList () {}
// --------------------------- Find -----------------------------
// Looks for the specified symbol, returns the list element with that
// symbol. If ppListPrev is non-NULL, sets it to the previous list element
// (if no previous element, sets it to NULL). If the symbol is not found,
// *ppListPrev is not touched.
static
const CInfSymbolList *
Find
(
const CInfSymbolList *pList,
const CInfSymbol *pSym,
const CInfSymbolList **ppListPrev
);
private:
const CInfSymbol *m_pSym;
};
#endif // _SYM_H_