--result of cpp expat.h from expat 2.1.0
local ffi = require'ffi'

ffi.cdef[[
typedef char XML_Char;
typedef char XML_LChar;
typedef long XML_Index;
typedef unsigned long XML_Size;
typedef unsigned char XML_Bool;

struct XML_ParserStruct;
typedef struct XML_ParserStruct *XML_Parser;

enum XML_Status {
  XML_STATUS_ERROR = 0,
  XML_STATUS_OK = 1,
  XML_STATUS_SUSPENDED = 2
};

enum XML_Error {
  XML_ERROR_NONE,
  XML_ERROR_NO_MEMORY,
  XML_ERROR_SYNTAX,
  XML_ERROR_NO_ELEMENTS,
  XML_ERROR_INVALID_TOKEN,
  XML_ERROR_UNCLOSED_TOKEN,
  XML_ERROR_PARTIAL_CHAR,
  XML_ERROR_TAG_MISMATCH,
  XML_ERROR_DUPLICATE_ATTRIBUTE,
  XML_ERROR_JUNK_AFTER_DOC_ELEMENT,
  XML_ERROR_PARAM_ENTITY_REF,
  XML_ERROR_UNDEFINED_ENTITY,
  XML_ERROR_RECURSIVE_ENTITY_REF,
  XML_ERROR_ASYNC_ENTITY,
  XML_ERROR_BAD_CHAR_REF,
  XML_ERROR_BINARY_ENTITY_REF,
  XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF,
  XML_ERROR_MISPLACED_XML_PI,
  XML_ERROR_UNKNOWN_ENCODING,
  XML_ERROR_INCORRECT_ENCODING,
  XML_ERROR_UNCLOSED_CDATA_SECTION,
  XML_ERROR_EXTERNAL_ENTITY_HANDLING,
  XML_ERROR_NOT_STANDALONE,
  XML_ERROR_UNEXPECTED_STATE,
  XML_ERROR_ENTITY_DECLARED_IN_PE,
  XML_ERROR_FEATURE_REQUIRES_XML_DTD,
  XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING,
  XML_ERROR_UNBOUND_PREFIX,
  XML_ERROR_UNDECLARING_PREFIX,
  XML_ERROR_INCOMPLETE_PE,
  XML_ERROR_XML_DECL,
  XML_ERROR_TEXT_DECL,
  XML_ERROR_PUBLICID,
  XML_ERROR_SUSPENDED,
  XML_ERROR_NOT_SUSPENDED,
  XML_ERROR_ABORTED,
  XML_ERROR_FINISHED,
  XML_ERROR_SUSPEND_PE,
  XML_ERROR_RESERVED_PREFIX_XML,
  XML_ERROR_RESERVED_PREFIX_XMLNS,
  XML_ERROR_RESERVED_NAMESPACE_URI
};

enum XML_Content_Type {
  XML_CTYPE_EMPTY = 1,
  XML_CTYPE_ANY,
  XML_CTYPE_MIXED,
  XML_CTYPE_NAME,
  XML_CTYPE_CHOICE,
  XML_CTYPE_SEQ
};

enum XML_Content_Quant {
  XML_CQUANT_NONE,
  XML_CQUANT_OPT,
  XML_CQUANT_REP,
  XML_CQUANT_PLUS
};

typedef struct XML_cp XML_Content;

struct XML_cp {
  enum XML_Content_Type type;
  enum XML_Content_Quant quant;
  XML_Char * name;
  unsigned int numchildren;
  XML_Content * children;
};

typedef void (*XML_ElementDeclHandler) (void *userData, const XML_Char *name, XML_Content *model);

void XML_SetElementDeclHandler(XML_Parser parser, XML_ElementDeclHandler eldecl);

typedef void (*XML_AttlistDeclHandler) (
                                    void *userData,
                                    const XML_Char *elname,
                                    const XML_Char *attname,
                                    const XML_Char *att_type,
                                    const XML_Char *dflt,
                                    int isrequired);

void XML_SetAttlistDeclHandler(XML_Parser parser, XML_AttlistDeclHandler attdecl);

typedef void (*XML_XmlDeclHandler) (void *userData, const XML_Char *version, const XML_Char *encoding, int standalone);

void XML_SetXmlDeclHandler(XML_Parser parser, XML_XmlDeclHandler xmldecl);

typedef struct {
  void *(*malloc_fcn)(size_t size);
  void *(*realloc_fcn)(void *ptr, size_t size);
  void (*free_fcn)(void *ptr);
} XML_Memory_Handling_Suite;

XML_Parser XML_ParserCreate(const XML_Char *encoding);
XML_Parser XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator);
XML_Parser XML_ParserCreate_MM(const XML_Char *encoding, const XML_Memory_Handling_Suite *memsuite,
											const XML_Char *namespaceSeparator);
XML_Bool XML_ParserReset(XML_Parser parser, const XML_Char *encoding);

typedef void (*XML_StartElementHandler) (void *userData, const XML_Char *name, const XML_Char **atts);

typedef void (*XML_EndElementHandler) (void *userData, const XML_Char *name);

typedef void (*XML_CharacterDataHandler) (void *userData, const XML_Char *s, int len);

typedef void (*XML_ProcessingInstructionHandler) (void *userData, const XML_Char *target, const XML_Char *data);

typedef void (*XML_CommentHandler) (void *userData, const XML_Char *data);

typedef void (*XML_StartCdataSectionHandler) (void *userData);

typedef void (*XML_EndCdataSectionHandler) (void *userData);

typedef void (*XML_DefaultHandler) (void *userData, const XML_Char *s, int len);

typedef void (*XML_StartDoctypeDeclHandler) (
                                            void *userData,
                                            const XML_Char *doctypeName,
                                            const XML_Char *sysid,
                                            const XML_Char *pubid,
                                            int has_internal_subset);

typedef void (*XML_EndDoctypeDeclHandler)(void *userData);

typedef void (*XML_EntityDeclHandler) (
                              void *userData,
                              const XML_Char *entityName,
                              int is_parameter_entity,
                              const XML_Char *value,
                              int value_length,
                              const XML_Char *base,
                              const XML_Char *systemId,
                              const XML_Char *publicId,
                              const XML_Char *notationName);

void XML_SetEntityDeclHandler(XML_Parser parser, XML_EntityDeclHandler handler);

typedef void (*XML_UnparsedEntityDeclHandler) (
                                    void *userData,
                                    const XML_Char *entityName,
                                    const XML_Char *base,
                                    const XML_Char *systemId,
                                    const XML_Char *publicId,
                                    const XML_Char *notationName);

typedef void (*XML_NotationDeclHandler) (
                                    void *userData,
                                    const XML_Char *notationName,
                                    const XML_Char *base,
                                    const XML_Char *systemId,
                                    const XML_Char *publicId);

typedef void (*XML_StartNamespaceDeclHandler) (
                                    void *userData,
                                    const XML_Char *prefix,
                                    const XML_Char *uri);

typedef void (*XML_EndNamespaceDeclHandler) (
                                    void *userData,
                                    const XML_Char *prefix);

typedef int (*XML_NotStandaloneHandler) (void *userData);

typedef int (*XML_ExternalEntityRefHandler) (
                                    XML_Parser parser,
                                    const XML_Char *context,
                                    const XML_Char *base,
                                    const XML_Char *systemId,
                                    const XML_Char *publicId);

typedef void (*XML_SkippedEntityHandler) (
                                    void *userData,
                                    const XML_Char *entityName,
                                    int is_parameter_entity);

typedef struct {
  int map[256];
  void *data;
  int (*convert)(void *data, const char *s);
  void (*release)(void *data);
} XML_Encoding;

typedef int (*XML_UnknownEncodingHandler) (void *encodingHandlerData, const XML_Char *name, XML_Encoding *info);

void XML_SetElementHandler(XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end);
void XML_SetStartElementHandler(XML_Parser parser, XML_StartElementHandler handler);
void XML_SetEndElementHandler(XML_Parser parser, XML_EndElementHandler handler);
void XML_SetCharacterDataHandler(XML_Parser parser, XML_CharacterDataHandler handler);
void XML_SetProcessingInstructionHandler(XML_Parser parser, XML_ProcessingInstructionHandler handler);
void XML_SetCommentHandler(XML_Parser parser, XML_CommentHandler handler);
void XML_SetCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start, XML_EndCdataSectionHandler end);
void XML_SetStartCdataSectionHandler(XML_Parser parser, XML_StartCdataSectionHandler start);
void XML_SetEndCdataSectionHandler(XML_Parser parser, XML_EndCdataSectionHandler end);
void XML_SetDefaultHandler(XML_Parser parser, XML_DefaultHandler handler);
void XML_SetDefaultHandlerExpand(XML_Parser parser, XML_DefaultHandler handler);
void XML_SetDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start, XML_EndDoctypeDeclHandler end);
void XML_SetStartDoctypeDeclHandler(XML_Parser parser, XML_StartDoctypeDeclHandler start);
void XML_SetEndDoctypeDeclHandler(XML_Parser parser, XML_EndDoctypeDeclHandler end);
void XML_SetUnparsedEntityDeclHandler(XML_Parser parser, XML_UnparsedEntityDeclHandler handler);
void XML_SetNotationDeclHandler(XML_Parser parser, XML_NotationDeclHandler handler);
void XML_SetNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start, XML_EndNamespaceDeclHandler end);
void XML_SetStartNamespaceDeclHandler(XML_Parser parser, XML_StartNamespaceDeclHandler start);
void XML_SetEndNamespaceDeclHandler(XML_Parser parser, XML_EndNamespaceDeclHandler end);
void XML_SetNotStandaloneHandler(XML_Parser parser, XML_NotStandaloneHandler handler);
void XML_SetExternalEntityRefHandler(XML_Parser parser, XML_ExternalEntityRefHandler handler);
void XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg);
void XML_SetSkippedEntityHandler(XML_Parser parser, XML_SkippedEntityHandler handler);
void XML_SetUnknownEncodingHandler(XML_Parser parser, XML_UnknownEncodingHandler handler, void *encodingHandlerData);
void XML_DefaultCurrent(XML_Parser parser);
void XML_SetReturnNSTriplet(XML_Parser parser, int do_nst);
void XML_SetUserData(XML_Parser parser, void *userData);
enum XML_Status XML_SetEncoding(XML_Parser parser, const XML_Char *encoding);
void XML_UseParserAsHandlerArg(XML_Parser parser);
enum XML_Error XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);
enum XML_Status XML_SetBase(XML_Parser parser, const XML_Char *base);
const XML_Char * XML_GetBase(XML_Parser parser);
int XML_GetSpecifiedAttributeCount(XML_Parser parser);
int XML_GetIdAttributeIndex(XML_Parser parser);
enum XML_Status XML_Parse(XML_Parser parser, const char *s, int len, int isFinal);
void* XML_GetBuffer(XML_Parser parser, int len);
enum XML_Status XML_ParseBuffer(XML_Parser parser, int len, int isFinal);
enum XML_Status XML_StopParser(XML_Parser parser, XML_Bool resumable);
enum XML_Status XML_ResumeParser(XML_Parser parser);

enum XML_Parsing {
  XML_INITIALIZED,
  XML_PARSING,
  XML_FINISHED,
  XML_SUSPENDED
};

typedef struct {
  enum XML_Parsing parsing;
  XML_Bool finalBuffer;
} XML_ParsingStatus;

void XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status);

XML_Parser XML_ExternalEntityParserCreate(XML_Parser parser, const XML_Char *context, const XML_Char *encoding);

enum XML_ParamEntityParsing {
  XML_PARAM_ENTITY_PARSING_NEVER,
  XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE,
  XML_PARAM_ENTITY_PARSING_ALWAYS
};

int XML_SetParamEntityParsing(XML_Parser parser, enum XML_ParamEntityParsing parsing);
int XML_SetHashSalt(XML_Parser parser, unsigned long hash_salt);
enum XML_Error XML_GetErrorCode(XML_Parser parser);
XML_Size XML_GetCurrentLineNumber(XML_Parser parser);
XML_Size XML_GetCurrentColumnNumber(XML_Parser parser);
XML_Index XML_GetCurrentByteIndex(XML_Parser parser);
int XML_GetCurrentByteCount(XML_Parser parser);
const char * XML_GetInputContext(XML_Parser parser, int *offset, int *size);
void XML_FreeContentModel(XML_Parser parser, XML_Content *model);
void * XML_MemMalloc(XML_Parser parser, size_t size);
void * XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);
void XML_MemFree(XML_Parser parser, void *ptr);
void XML_ParserFree(XML_Parser parser);
const XML_LChar* XML_ErrorString(enum XML_Error code);
const XML_LChar* XML_ExpatVersion(void);

typedef struct {
  int major;
  int minor;
  int micro;
} XML_Expat_Version;

XML_Expat_Version XML_ExpatVersionInfo(void);

enum XML_FeatureEnum {
  XML_FEATURE_END = 0,
  XML_FEATURE_UNICODE,
  XML_FEATURE_UNICODE_WCHAR_T,
  XML_FEATURE_DTD,
  XML_FEATURE_CONTEXT_BYTES,
  XML_FEATURE_MIN_SIZE,
  XML_FEATURE_SIZEOF_XML_CHAR,
  XML_FEATURE_SIZEOF_XML_LCHAR,
  XML_FEATURE_NS,
  XML_FEATURE_LARGE_SIZE,
  XML_FEATURE_ATTR_INFO
};

typedef struct {
  enum XML_FeatureEnum feature;
  const XML_LChar *name;
  long int value;
} XML_Feature;

const XML_Feature* XML_GetFeatureList(void);
]]

