summaryrefslogblamecommitdiffstats
path: root/private/unimodem/new/mic/sym.h
blob: 054fcb5691186170ebf4641ee92ff43efdac5bd5 (plain) (tree)






















































































































































































































                                                                                   
//
//		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_