You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
3.1 KiB
C

2 years ago
// XTPMarkupParser.h: interface for the CXTPMarkupParser class.
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
//{{AFX_CODEJOCK_PRIVATE
#if !defined(__XTPMARKUPPARSER_H__)
#define __XTPMARKUPPARSER_H__
//}}AFX_CODEJOCK_PRIVATE
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//{{AFX_CODEJOCK_PRIVATE
// Internal class used to parse XAML text to Markup tree
#define XTP_MAX_TOKEN_SIZE 1024
#define XTP_MAX_NAME_SIZE 128
class _XTP_EXT_CLASS CXTPMarkupParser
{
public:
CXTPMarkupParser();
virtual ~CXTPMarkupParser();
public:
enum TokenType
{
tokenError = -1,
tokenEof = 0,
tokenTagStart,
tokenTagEnd,
tokenAttribute,
tokenWord,
tokenSpace,
tokenData,
tokenCommentStart,
tokenCommentEnd,
tokenCDataStart,
tokenCDataEnd,
tokenPIStart,
tokenPIEnd
};
void SetBuffer(LPCSTR lpszStart, LPCSTR lpszEnd);
void SetBuffer(LPCWSTR lpszStart, LPCWSTR lpszEnd);
public:
TokenType GetNextToken();
const WCHAR* GetValue();
const WCHAR* GetAttributeName();
const WCHAR* GetTagName();
// should be overrided to resolve entities, e.g.  
virtual WCHAR ResolveEntity(const WCHAR* buf, int buf_size);
int GetLine() const;
int GetPosition() const;
BOOL FindFirstTag();
void SetEncoding(int nEncoding);
private:
typedef TokenType (CXTPMarkupParser::*PFNSCANNEXTTOKEN)();
PFNSCANNEXTTOKEN m_scan;
// content 'readers'
TokenType ScanBody();
TokenType ScanHead();
TokenType ScanComment();
TokenType ScanCData();
TokenType ScanPI();
TokenType ScanTag();
WCHAR SkipWhitespace();
void PushBack(WCHAR c);
WCHAR GetChar();
WCHAR ScanEntity();
BOOL IsWhitespace(WCHAR c) const;
void AppendValue(WCHAR c);
void AppendAttributeName(WCHAR c);
void AppendTagName(WCHAR c);
WCHAR GetNextChar();
TokenType ReportError(LPCWSTR lpszError);
private:
TokenType m_token;
WCHAR* m_lpszValue;
int m_nValueAlloc;
int m_nValueLength;
WCHAR m_lpszTagName[XTP_MAX_NAME_SIZE];
int m_nTagNameLength;
WCHAR m_lpszAttributeName[XTP_MAX_NAME_SIZE];
int m_nAttributeNameLength;
WCHAR m_cInputChar;
BOOL m_bGotTail;
int m_nLine;
int m_nPosition;
private:
BOOL m_bUnicode;
int m_nEncoding;
LPCSTR m_lpszEnd;
LPCSTR m_lpszPos;
};
AFX_INLINE int CXTPMarkupParser::GetLine() const {
return m_nLine;
}
AFX_INLINE int CXTPMarkupParser::GetPosition() const {
return m_nPosition;
}
AFX_INLINE void CXTPMarkupParser::SetEncoding(int nEncoding) {
m_nEncoding = nEncoding;
}
//}}AFX_CODEJOCK_PRIVATE
#endif // !defined(__XTPMARKUPPARSER_H__)