You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.7 KiB
173 lines
4.7 KiB
// 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__
|