|
|
// Copyright (C) Microsoft Corporation 1993-1997
#if _MSC_VER > 1000
#pragma once
#endif
#ifdef DESCRIPTION
The CTable class is used for storing strings or data which will be freed in one call when the destructor is called.
#endif // DESCRIPTION
#ifndef _CTABLE_INCLUDED
#define _CTABLE_INCLUDED
typedef struct { int cb; PCSTR pMem; } TABLE_FREED_MEMORY;
const int OFF_FILENAME = 5; // offset to filename
class CTable ;
class CTable SI_COUNT(CTable) { public: CTable(); CTable(int cbStrings); // cbStrings == maximum memory allocated for strings
virtual ~CTable(); const CTable& operator=(const CTable& tblSrc); // copy constructor
UINT GetPosFromPtr(PCSTR psz);
// Used for ALink -- adds index, hit number, and string
void AddIndexHitString(UINT index, UINT hit, PCSTR pszString); UINT GetIndex(int pos) { ASSERT(pos > 0 && pos < endpos); return *(UINT*) ppszTable[pos]; }; UINT GetHit(int pos) { ASSERT(pos > 0 && pos < endpos); return *(UINT*) (ppszTable[pos] + sizeof(UINT)); }; PSTR GetIHPointer(int pos) { ASSERT(pos > 0 && pos < endpos); return (ppszTable[pos] + (sizeof(UINT) * 2)); };
/*
REVIEW: this is the complete set from ..\common\ctable.h. We use very few of these. Theoretically, this shouldn't have any impact on the size of WinHelp (linker should toss all non-used functions). One alternative would be to create a derived class from the ctable.h/ctable.cpp in the ..\common directory, and add the above functions to the derived class. */
int AddData(int cb, const void* pdata); int AddIntAndString(int lVal, PCSTR psz); int AddString(PCSTR pszString); int AddString(PCWSTR pszString); int AddString(PCSTR pszStr1, PCSTR pszStr2); int AddString(HASH hash, PCSTR psz) { return AddIntAndString((int) hash, psz); }; int CountStrings(void) const { return endpos - 1; } void Empty(void); void FreeMemory(PCSTR psz, int cb); BOOL GetIntAndString(int* plVal, PSTR pszDst); int GetInt(int pos) { return *(int *) ppszTable[pos]; } BOOL GetHashAndString(HASH* phash, PSTR pszDst) { return GetIntAndString((int*) phash, pszDst); }; BOOL GetHashAndString(HASH* phash, PSTR pszDst, int pos) { SetPosition(pos); return GetIntAndString((int*) phash, pszDst); }; PSTR GetHashStringPointer(int pos) { return ppszTable[pos] + sizeof(HASH); }; PSTR GetPointer(int pos) const { return ppszTable[pos]; }; int GetPosition(void) const { return curpos; } BOOL GetString(PSTR pszDst); BOOL GetString(PSTR pszDst, int pos) const; int IsPrimaryStringInTable(PCSTR pszString) const; int IsSecondaryStringInTable(PCSTR pszString) const; int IsStringInTable(PCSTR pszString) const; int IsStringInTable(HASH hash, PCSTR pszString) const; int IsCSStringInTable(PCSTR pszString) const; BOOL ReplaceString(PCSTR pszNewString, int pos); BOOL FASTCALL SetPosition(int pos = 1); virtual void SortTable(int sortoffset = 0); void FASTCALL SetSorting(LCID lcid, DWORD fsCompareI = 0, DWORD fsCompare = 0); void SortTablei(int sortoffset = 0); PSTR TableMalloc(int cb); void IncreaseTableBuffer(void); int IsHashInTable(HASH hash); __inline PCSTR* GetStringPointers() { return (PCSTR*) ppszTable; }
/*
* Use this for efficient memory allocation for strings that will not * be freed until the entire CIndex is freed. */
__inline PCSTR StrDup(PCSTR psz) { return strcpy(TableMalloc((int)strlen(psz) + 1), psz); }
// Warning! all variables must match hha\ctable.h
PSTR pszBase; PSTR * ppszTable;
int cbMaxBase; int cbMaxTable;
int endpos; int maxpos;
protected: int curpos; int CurOffset; int cbStrings; int cbPointers; int SortColumn; LCID lcid; DWORD fsCompareI; DWORD fsCompare; DWORD fsSortFlags; int m_sortoffset;
TABLE_FREED_MEMORY* m_pFreed; // pointer to freed memory
int m_cFreedMax; // number of allocated items
int m_cFreedItems; // current number of freed items
// following are used by sort
PSTR pszTmp; int j, sTmp;
void doSort(int left, int right); void doLcidSort(int left, int right); void doSorti(int left, int right); void InitializeTable(); void Cleanup(void);
};
// retrieves only MBCS strings from the base CTable
// and converts them to Unicode according to the codepage
//
class CWTable : private CTable { public:
CWTable( UINT CodePage ); CWTable( int cbStrings, UINT CodePage ); virtual ~CWTable();
// new methods that return Unicode buffers
HRESULT GetStringW( int pos, WCHAR* pwsz, int cch ); HRESULT GetHashStringW( int pos, WCHAR* pwsz, int cch ); inline UINT GetCodePage() { return m_CodePage; }
// stuff from CTable we want to give access to
CTable::CountStrings; CTable::AddString; CTable::IsStringInTable; CTable::AddIntAndString; CTable::SetSorting; CTable::SortTable; CTable::GetInt;
// stuff from CTable that returns the MBCS string--BEWARE!!!
CTable::GetString; CTable::GetStringPointers; CTable::GetHashStringPointer;
private:
void _CWTable( UINT CodePage );
UINT m_CodePage;
};
#endif // _CTABLE_INCLUDED
|