mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-05-31 07:13:00 +00:00
DWORD→uint32_t, BYTE→uint8_t, HRESULT→int32_t, HANDLE→void*, UINT→uint32_t, INT→int32_t, WORD→uint16_t, LONG→int32_t, SHORT→int16_t, LONGLONG→int64_t, ULONG_PTR→uintptr_t, PBYTE→uint8_t*, LPWSTR/PWSTR→wchar_t*, FLOAT→float, CHAR→char, boolean→bool, CONST→const, TRUE→true, FALSE→false across 176 files (excluding vendor libs and Linux stubs).
157 lines
5.7 KiB
C++
157 lines
5.7 KiB
C++
// 4J-PB -
|
|
// The ATG Framework is a common set of C++ class libraries that is used by the samples in the XDK, and was developed by the Advanced Technology Group (ATG).
|
|
// The ATG Framework offers a clean and consistent format for the samples. These classes define functions used by all the samples.
|
|
// The ATG Framework together with the samples demonstrates best practices and innovative techniques for Xbox 360. There are many useful sections of code in the samples.
|
|
// You are encouraged to incorporate this code into your titles.
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// AtgXmlParser.h
|
|
//
|
|
// XMLParser and SAX interface declaration
|
|
//
|
|
// Xbox Advanced Technology Group
|
|
// Copyright (C) Microsoft Corporation. All rights reserved.
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
#ifndef ATGXMLPARSER_H
|
|
#define ATGXMLPARSER_H
|
|
|
|
namespace ATG
|
|
{
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// error returns from XMLParse
|
|
//-----------------------------------------------------------------------------
|
|
#define _ATGFAC 0x61B
|
|
#define E_COULD_NOT_OPEN_FILE MAKE_HRESULT(1, _ATGFAC, 0x0001 )
|
|
#define E_INVALID_XML_SYNTAX MAKE_HRESULT(1, _ATGFAC, 0x0002 )
|
|
|
|
|
|
const uint32_t XML_MAX_ATTRIBUTES_PER_ELEMENT = 32;
|
|
const uint32_t XML_MAX_NAME_LENGTH = 128;
|
|
const uint32_t XML_READ_BUFFER_SIZE = 2048;
|
|
const uint32_t XML_WRITE_BUFFER_SIZE = 2048;
|
|
|
|
// No tag can be longer than XML_WRITE_BUFFER_SIZE - an error will be returned if
|
|
// it is
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
struct XMLAttribute
|
|
{
|
|
wchar_t* strName;
|
|
uint32_t NameLen;
|
|
wchar_t* strValue;
|
|
uint32_t ValueLen;
|
|
};
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
class ISAXCallback
|
|
{
|
|
friend class XMLParser;
|
|
public:
|
|
ISAXCallback() {};
|
|
virtual ~ISAXCallback() {};
|
|
|
|
virtual int32_t StartDocument() = 0;
|
|
virtual int32_t EndDocument() = 0;
|
|
|
|
virtual int32_t ElementBegin( const wchar_t* strName, uint32_t NameLen,
|
|
const XMLAttribute *pAttributes, uint32_t NumAttributes ) = 0;
|
|
virtual int32_t ElementContent( const wchar_t *strData, uint32_t DataLen, bool More ) = 0;
|
|
virtual int32_t ElementEnd( const wchar_t *strName, uint32_t NameLen ) = 0;
|
|
|
|
virtual int32_t CDATABegin( ) = 0;
|
|
virtual int32_t CDATAData( const wchar_t *strCDATA, uint32_t CDATALen, bool bMore ) = 0;
|
|
virtual int32_t CDATAEnd( ) = 0;
|
|
|
|
virtual void Error( int32_t hError, const char *strMessage ) = 0;
|
|
|
|
virtual void SetParseProgress( uint32_t dwProgress ) { }
|
|
|
|
const char* GetFilename() { return m_strFilename; }
|
|
uint32_t GetLineNumber() { return m_LineNum; }
|
|
uint32_t GetLinePosition() { return m_LinePos; }
|
|
|
|
private:
|
|
const char *m_strFilename;
|
|
uint32_t m_LineNum;
|
|
uint32_t m_LinePos;
|
|
};
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
class XMLParser
|
|
{
|
|
public:
|
|
XMLParser();
|
|
~XMLParser();
|
|
|
|
// Register an interface inheiriting from ISAXCallback
|
|
void RegisterSAXCallbackInterface( ISAXCallback *pISAXCallback );
|
|
|
|
// Get the registered interface
|
|
ISAXCallback* GetSAXCallbackInterface();
|
|
|
|
// ParseXMLFile returns one of the following:
|
|
// E_COULD_NOT_OPEN_FILE - couldn't open the file
|
|
// E_INVALID_XML_SYNTAX - bad XML syntax according to this parser
|
|
// E_NOINTERFACE - RegisterSAXCallbackInterface not called
|
|
// E_ABORT - callback returned a fail code
|
|
// S_OK - file parsed and completed
|
|
|
|
int32_t ParseXMLFile( const char *strFilename );
|
|
|
|
// Parses from a buffer- if you pass a wchar_t buffer (and cast it), it will
|
|
// correctly detect it and use unicode instead. Return codes are the
|
|
// same as for ParseXMLFile
|
|
|
|
int32_t ParseXMLBuffer( const char* strBuffer, uint32_t uBufferSize );
|
|
|
|
private:
|
|
int32_t MainParseLoop();
|
|
|
|
int32_t AdvanceCharacter( bool bOkToFail = false );
|
|
void SkipNextAdvance();
|
|
|
|
int32_t ConsumeSpace();
|
|
int32_t ConvertEscape();
|
|
int32_t AdvanceElement();
|
|
int32_t AdvanceName();
|
|
int32_t AdvanceAttrVal();
|
|
int32_t AdvanceCDATA();
|
|
int32_t AdvanceComment();
|
|
|
|
void FillBuffer();
|
|
|
|
#ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation
|
|
void Error( int32_t hRet, _In_z_ _Printf_format_string_ const char* strFormat, ... );
|
|
#else
|
|
void Error( int32_t hRet, const char* strFormat, ... );
|
|
#endif
|
|
|
|
ISAXCallback* m_pISAXCallback;
|
|
|
|
void* m_hFile;
|
|
const char* m_pInXMLBuffer;
|
|
uint32_t m_uInXMLBufferCharsLeft;
|
|
uint32_t m_dwCharsTotal;
|
|
uint32_t m_dwCharsConsumed;
|
|
|
|
uint8_t m_pReadBuf[ XML_READ_BUFFER_SIZE + 2 ]; // room for a trailing NULL
|
|
wchar_t m_pWriteBuf[ XML_WRITE_BUFFER_SIZE ];
|
|
|
|
uint8_t* m_pReadPtr;
|
|
wchar_t* m_pWritePtr; // write pointer within m_pBuf
|
|
|
|
bool m_bUnicode; // true = 16-bits, false = 8-bits
|
|
bool m_bReverseBytes; // true = reverse bytes, false = don't reverse
|
|
|
|
bool m_bSkipNextAdvance;
|
|
wchar_t m_Ch; // Current character being parsed
|
|
};
|
|
|
|
} // namespace ATG
|
|
|
|
#endif
|