177 lines
5.4 KiB
C
177 lines
5.4 KiB
C
|
// 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
|