|
|
// HTML lexer tables
// Copyright (c)1997-1999 Microsoft Corporation, All Rights Reserved
#ifndef __HLTABLE_H__
#define __HLTABLE_H__
#include "lexhtml.h"
#ifndef PURE
#define PURE =0
#endif
// These values must match the number of built-in tables (CV_FIXED),
// and the capacity of the inVariant bits of the lex state (CV_MAX).
const UINT CV_FIXED = 4; // Count Variants in Fixed tables
const UINT CV_MAX = 16; // Count variants maximum total
// Macro for determining number of elements in an array
#define CELEM_ARRAY(a) (sizeof(a) / sizeof(a[0]))
// length-limited string compare function pointer (e.g. strncmp/strnicmp)
typedef int (_cdecl* PFNNCMP)(LPCTSTR, LPCTSTR, size_t);
#define CASE (TRUE)
#define NOCASE (FALSE)
#define NOT_FOUND (-1)
////////////////////////////////////////////////////////////////////////////
// return A-Z[a-z] index if alpha, else -1
inline int PeekIndex(TCHAR c, BOOL bCase /*= NOCASE*/) { if ((c >= _T('A')) && (c <= _T('Z'))) return c - _T('A'); else if ((c >= _T('a')) && (c <= _T('z'))) return c - _T('a') + (bCase ? 26 : 0); else return -1; }
// static table lookups
int LookupLinearKeyword(ReservedWord *rwTable, int cel, RWATT_T att, LPCTSTR pchLine, int cbLen, BOOL bCase = NOCASE); int LookupIndexedKeyword(ReservedWord *rwTable, int cel, int * indexTable, RWATT_T att, LPCTSTR pchLine, int cbLen, BOOL bCase = NOCASE);
// content model
// Map between element / lex state
//
struct ELLEX { LPCTSTR sz; int cb; DWORD lxs; };
DWORD TextStateFromElement(LPCTSTR szEl, int cb); ELLEX * pellexFromTextState(DWORD state); inline LPCTSTR ElementFromTextState(DWORD state) { ELLEX *pellex = pellexFromTextState(state); return pellex ? pellex->sz : 0; }
#ifdef _DEBUG
int CheckWordTable(ReservedWord *arw, int cel, LPCTSTR szName = NULL); int CheckWordTableIndex(ReservedWord *arw, int cel, int *ai, BOOL bCase = FALSE, LPCTSTR szName = NULL); int MakeIndexHere(ReservedWord *arw, int cel, int *ab, BOOL bCase = FALSE, LPCTSTR szName = NULL); #endif
int MakeIndex(ReservedWord *arw, int cel, int **pab, BOOL bCase = FALSE, LPCTSTR szName = NULL);
////////////////////////////////////////////////////////////////////////////
// test for SGML identifier character:
// alphanumeric or '-' or '.'
inline BOOL IsIdChar(TCHAR ch) { return IsCharAlphaNumeric(ch) || ch == _T('-') || ch == _T('.') || ch == _T(':'); }
////////////////////////////////////////////////////////////////////////////
// Abstract Base Classes
//
class CTable { public: virtual ~CTable() {} virtual int Find(LPCTSTR pch, int cb) PURE; };
class CTableSet { public: virtual ~CTableSet() {} virtual int FindElement(LPCTSTR pch, int cb) PURE; virtual int FindAttribute(LPCTSTR pch, int cb) PURE; virtual int FindEntity(LPCTSTR pch, int cb) PURE; const TCHAR* Name() const { return m_strName; }
protected: TCHAR m_strName[1024];
};
typedef CTable *PTABLE; typedef CTableSet * PTABLESET; typedef const CTableSet * PCTABLESET;
// static, built-in table
class CStaticTable : public CTable { public: CStaticTable( RWATT_T att, ReservedWord *prgrw, UINT cel, int *prgi = NULL, BOOL bCase = FALSE, LPCTSTR szName = NULL); virtual ~CStaticTable() {} // nothing to delete
BOOL Find(LPCTSTR pch, int cb); private: ReservedWord *m_prgrw; // reserved word table
UINT m_cel; // element count (size)
int *m_prgi; // index table
BOOL m_bCase; // case sensitive?
RWATT_T m_att; // attribute mask for table lookup
};
class CStaticTableSet : public CTableSet { public: CStaticTableSet(RWATT_T att, UINT nIdName); virtual ~CStaticTableSet() {} int FindElement(LPCTSTR pch, int cb); int FindAttribute(LPCTSTR pch, int cb); int FindEntity(LPCTSTR pch, int cb); private: CStaticTable m_Elements; CStaticTable m_Attributes; CStaticTable m_Entities; };
////////////////////////////////////////////////////////////////////////////
// CLStr
// A very simple length-and-buffer string representation
// with just enough functionality for our purpose.
class CLStr { public: CLStr() : m_cb(0), m_rgb(0) {} CLStr(const BYTE * rgb, DWORD cb) : m_rgb(rgb), m_cb(cb) {} BOOL Compare(const BYTE * rgb, DWORD cb, BOOL bCase) { int r; if (bCase) r = memcmp(rgb, m_rgb, __min(m_cb, cb)); else r = _memicmp(rgb, m_rgb, __min(m_cb, cb)); return (0 == r) ? (cb - m_cb) : r; } // data
DWORD m_cb; const BYTE * m_rgb; }; typedef CLStr * PLSTR; typedef const CLStr * PCLSTR; typedef const CLStr & RCLSTR;
extern CStaticTableSet * g_pTabDefault; extern PTABLESET g_pTable; extern HINT g_hintTable[];
#endif // __HLTABLE_H__
|