/* $Id: XeroXMB.h,v 1.3 2004/07/10 20:55:55 philip Exp $
Xeromyces - XMB reading library
Philip Taylor (philip@zaynar.demon.co.uk / @wildfiregames.com)
*/
/*
Brief outline:
XMB is a binary representation of XML, with some limitations
but much more efficiency (particularly for loading simple data
classes that don't need much initialisation).
Main limitations:
* Only handles UTF16 internally. (It's meant to be a feature, but
can be detrimental if it's always being converted back to
ASCII.)
* Can't correctly handle mixed text/elements inside elements -
"
Text
" and " Text
" are
considered identical.
* Tries to avoid using strings - you usually have to load the
numeric IDs and use them instead.
* Case-sensitive (but converts all element/attribute names in
the XML file to lowercase, so you only have to be careful in
the code)
Theoretical file structure:
XMB_File {
char Header[4]; // because everyone has one; currently "XMB0"
int Checksum; // CRC32 of original XML file, to detect changes
int ElementNameCount;
ZStrA ElementNames[];
int AttributeNameCount;
ZStrA AttributeNames[];
XMB_Node Root;
}
XMB_Node {
0) int Length; // of entire struct, so it can be skipped over
4) int ElementName;
8) int AttributeCount;
12) int ChildCount;
16) int ChildrenOffset; // == sizeof(Text)+sizeof(Attributes)
20) ZStrW Text;
XMB_Attribute Attributes[];
XMB_Node Children[];
}
XMB_Attribute {
int Name;
ZStrW Value;
}
XMB_ZStrA {
int Length; // in bytes
char* Text; // null-terminated ASCII
}
XMB_ZStrW {
int Length; // in bytes
char* Text; // null-terminated UTF16
}
*/
#ifndef _XEROXMB_H_
#define _XEROXMB_H_
// Define to use a std::map for name lookups rather than a linear search.
// (The map is usually slower.)
//#define XERO_USEMAP
#include
#include "ps/utf16string.h"
#ifdef XERO_USEMAP
# include