You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by da...@apache.org on 2004/03/19 14:45:58 UTC
cvs commit: ws-axis/c/src/xml/txpp/lib xpp.c xpp.h
damitha 2004/03/19 05:45:58
Added: c/src/xml/txpp xpp_config.h
c/src/xml/txpp/examples build_test1.sh build_test2.sh
file_xml run_test1.sh run_test2.sh test1.c test2.c
c/src/xml/txpp/lib xpp.c xpp.h
Log:
Initial checkin of typed xml-soap pull parser.
Thanks Dasarath for valuble contribution.
Revision Changes Path
1.1 ws-axis/c/src/xml/txpp/xpp_config.h
Index: xpp_config.h
===================================================================
/* expat_config.h. Generated by configure. */
/* expat_config.h.in. Generated from configure.in by autoheader. */
/* 1234 = LIL_ENDIAN, 4321 = BIGENDIAN */
#define BYTEORDER 1234
/* Define to 1 if you have the `bcopy' function. */
#define HAVE_BCOPY 1
/* Define to 1 if you have the <check.h> header file. */
/* #undef HAVE_CHECK_H */
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define to 1 if you have the `getpagesize' function. */
#define HAVE_GETPAGESIZE 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `memmove' function. */
#define HAVE_MEMMOVE 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have a working `mmap' system call. */
#define HAVE_MMAP 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org"
/* Define to the full name of this package. */
#define PACKAGE_NAME "expat"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "expat 1.95.7"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "expat"
/* Define to the version of this package. */
#define PACKAGE_VERSION "1.95.7"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* whether byteorder is bigendian */
/* #undef WORDS_BIGENDIAN */
/* Define to specify how much context to retain around the current parse
point. */
#define XML_CONTEXT_BYTES 4
/* Define to make parameter entity parsing functionality available. */
#define XML_DTD 1
/* Define to make XML Namespaces functionality available. */
#define XML_NS 1
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `long' if <sys/types.h> does not define. */
/* #undef off_t */
/* Define to `unsigned' if <sys/types.h> does not define. */
/* #undef size_t */
1.1 ws-axis/c/src/xml/txpp/examples/build_test1.sh
Index: build_test1.sh
===================================================================
gcc -g -L$TXPP_HOME -ltxpp -otest1 test1.c
1.1 ws-axis/c/src/xml/txpp/examples/build_test2.sh
Index: build_test2.sh
===================================================================
gcc -g -L../lib -ltxpp -otest2 test2.c
1.1 ws-axis/c/src/xml/txpp/examples/file_xml
Index: file_xml
===================================================================
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:C="http://xml.apache.org/axis/wsdd/providers/c">
<globalConfiguration>
<requestFlow>
<handler name="TestHandler1" type="/usr/local/apache/Axis/handlers/global/testhandler1/libtesthandler1.so">
<parameter name="parm1">global input test handler</parameter>
</handler>
</requestFlow>
</globalConfiguration>
<service name="InteropBase" provider="C:RPC" description="SOAPBuilders Interoperability Lab Round 2 base test suite described at http://www.whitemesa.com/interop/proposal2.html ">
<requestFlow name="calchandlers">
<handler name="LogAccessCount" type="/usr/local/apache/Axis/handlers/custom/loghandler/libloghandler.so">
<parameter name="logAccessCountFile" value="/usr/local/apache/Axis/handlers/custom/loghandler/LogAccessCountFile"/>
</handler>
</requestFlow> <parameter name="allowedMethods" value="echoString EchoInt echoStringArray echoInteger echoIntegerArray echoFloat echoFloatArray echoStruct echoStructArray echoVoid echoBase64 echoDate echoHexBinary echoDecimal echoBoolean "/>
<parameter name="className" value="/usr/local/apache/Axis/webservices/libinteropbase.so"/>
</service>
<service name="InteropGroupB" provider="C:RPC" description="SOAPBuilders Interoperability Lab Round 2 GroupB test suite described at http://www.whitemesa.com/interop/proposal2.html ">
<parameter name="allowedMethods" value="echoSimpleTypesAsStruct echoNestedStruct echoNestedArray echoStructAsSimpleTypes "/>
<parameter name="className" value="/usr/local/apache/Axis/webservices/libinteropgroupb.so"/>
</service>
<transport name="http" >
<requestFlow>
<handler name="TestHandler2" type="/usr/local/apache/Axis/handlers/transport/testhandler2/libtesthandler2.so">
<parameter name="parm1">Http transport test handler</parameter>
</handler>
</requestFlow>
</transport>
</deployment>
1.1 ws-axis/c/src/xml/txpp/examples/run_test1.sh
Index: run_test1.sh
===================================================================
./test1 < file_xml
1.1 ws-axis/c/src/xml/txpp/examples/run_test2.sh
Index: run_test2.sh
===================================================================
./test2 < file_xml
1.1 ws-axis/c/src/xml/txpp/examples/test1.c
Index: test1.c
===================================================================
#include "../lib/xpp.h"
char *tn[] = {"START_TAG", "END_TAG", "EMPTY_ELEMENT_TAG", "PCDATA"};
int main()
{
//xpp_context_t* ct = (xpp_context_t*) parser_create("ISO-8859-1");
xpp_context_t* ct = (xpp_context_t*) parser_create("UTF-8");
//xpp_context_t* ct = (xpp_context_t*) parser_create(NULL);
//xpp_context_t* ct = (xpp_context_t*) parser_create("UTF-16");
data_t* data;
while(data = (data_t*) next(ct))
{
printf("\n%s\n", tn[data->type]);
int ii = 0;
char temp;
while (ii < data->num_ptrs_utf8)
{
temp = data->utf8ptrs[ii+1][1];
data->utf8ptrs[ii+1][1] = '\0';
printf("%s\n", data->utf8ptrs[ii]);
data->utf8ptrs[ii+1][1] = temp;
ii += 2;
}
}
//free(buff);
parser_free(ct);
return 1;
}
1.1 ws-axis/c/src/xml/txpp/examples/test2.c
Index: test2.c
===================================================================
#include "../lib/xpp.h"
char *tn[] = {"START_TAG", "END_TAG", "EMPTY_ELEMENT_TAG", "PCDATA"};
int main()
{
//xpp_context_t* ct = (xpp_context_t*) parser_create("ISO-8859-1");
xpp_context_t* ct = (xpp_context_t*) parser_create("UTF-8");
//xpp_context_t* ct = (xpp_context_t*) parser_create(NULL);
//xpp_context_t* ct = (xpp_context_t*) parser_create("UTF-16");
data_t* data;
int* intError = (int*) malloc(sizeof(int));
data = (data_t*) next(ct);
data = (data_t*) next(ct);
//printf("\n%s\n", tn[data->type]);
data = (data_t*) next(ct);
//printf("\n%s\n", tn[data->type]);
data = (data_t*) next(ct);
//printf("\n%s\n", tn[data->type]);
data = (data_t*) next(ct);
//printf("\n%s\n", tn[data->type]);
int intTemp = get_next_element_as_int(ct, intError);
printf("intTemp:%d\n", intTemp);
//free(buff);
parser_free(ct);
return 1;
}
1.1 ws-axis/c/src/xml/txpp/lib/xpp.c
Index: xpp.c
===================================================================
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "internal.h"
#include "xpp.h"
#include "xmltok.h"
#include "xmlrole.h"
#ifdef HAVE_XPP_CONFIG_H
#include "../xpp_config.h"
#endif
#include "tag.h"
typedef const XML_Char *KEY;
#define MALLOC(s) (ct->m_mem.malloc_fcn((s)))
#define MEMMOVE(p1, p2, s) (ct->m_mem.memmove_fcn((p1), (p2), (s)))
#define REALLOC(p,s) (ct->m_mem.realloc_fcn((p),(s)))
#define FREE(p) (ct->m_mem.free_fcn((p)))
#define MIN_BUFF_SZ 64//0x10000
#define INIT_BUFFER_SIZE 256
#define INIT_TAG_SIZE 64
#define protocolEncodingName (ct->m_protocolEncodingName)
#define initEncoding (ct->m_initEncoding)
#define encoding (ct->m_encoding)
#define ns (ct->m_ns)
#define tok_state (ct->m_tok_state)
#define state (ct->m_state)
#define num_chars (ct->m_num_chars)
#define XmlParseXmlDeclNS XmlParseXmlDecl
#define eventPtr (ct->m_eventPtr)
#define eventEndPtr (ct->m_eventEndPtr)
#define XmlConvert XmlUtf8Convert
#define data_counter (ct->m_data_counter)
int isDone = 0;
enum {
PROLOG, CONTENT
};
typedef struct xpp_context
{
char *buff;
char *utf8buff;
int buff_sz;
int utf8buff_sz;
char *dirty;
char *next;
int m_num_chars;
int m_state;
int m_tok_state;
data_t data;
int m_data_counter;
const XML_Char *m_protocolEncodingName;
INIT_ENCODING m_initEncoding;
const ENCODING *m_encoding;
XML_Bool m_ns;
const char *m_eventPtr;
const char *m_eventEndPtr;
const XML_Memory_Handling_Suite m_mem;
int (*get_block)(char *buff, int buff_sz, int *numchars);
} xpp_context;
static enum XML_Error
processXmlDecl(xpp_context_t* ct, int isGeneralTextEntity,
const char *s, const char *next)
{
//const XML_Char *encodingName = NULL;
//const XML_Char *storedEncName = NULL;
const ENCODING *newEncoding = NULL;
const char *version = NULL;
const char *versionend;
//const XML_Char *storedversion = NULL;
int standalone = -1;
if (!(ns
? XmlParseXmlDeclNS
: XmlParseXmlDecl)(isGeneralTextEntity,
encoding,
s,
next,
&eventPtr,
&version,
&versionend,
&protocolEncodingName,
&newEncoding,
&standalone))
return XML_ERROR_SYNTAX;
else
{
//printf("version:%s\n", version);
//printf("versionend:%s\n", versionend);
*(protocolEncodingName + (ct->next - protocolEncodingName) - 3) = '\0';
printf("encodingName:%s\n", protocolEncodingName);
//if(standalone)
//printf("standalone:%s\n", standalone);
initialize_encoding(ct);
}
}
int ret_status;
int parse(xpp_context_t *ct)
{
ct->data.num_ptrs = 0;
ct->data.num_ptrs_utf8 = 0;
ct->dirty = ct->next;
do {
ret_status = 0;
if(PROLOG == tok_state)
{
initialize_encoding(ct);
//printf("num_chars:%d\n", num_chars);
ret_status = XmlPrologTok(&state, &ct->data, encoding, &num_chars, ct->dirty, &ct->next);
if(XML_ERROR_NONE == ret_status)
{
//printf("ct->dirty:%s\n", ct->dirty);
//printf("ct->next:%s\n", ct->next);
processXmlDecl(ct, 0, ct->dirty, ct->next);
ct->dirty = ct->next;
}
}
if(XML_ERROR_NONE == ret_status)
{
tok_state = CONTENT;
//printf("num_chars:%d\n", num_chars);
ret_status = XmlContentTok(&state, &ct->data, encoding, &num_chars, ct->dirty, &ct->next);
//printf("tempStatus:%d\n", tempStatus);
//printf("ct->dirty:%s\n", ct->dirty);
//printf("ct->next:%s\n", ct->next);
if(XML_ERROR_NONE == ret_status)
{
//process_data(ct);
return XML_ERROR_NONE;
}
}
} while (load_buffer(ct));
return XML_TEST_ERROR;
}
int load_buffer(xpp_context_t *ct)
{
if(isDone)
return XML_ERROR_NONE;
int sz = ct->buff_sz - (int)(ct->next - ct->buff);
if (sz < MIN_BUFF_SZ) {
int ii, n, m;
n = (int)(ct->next - ct->dirty);
if (n < ct->buff_sz)
sz = ct->buff_sz - n;
else//n = ct->buff-sz
{
//return -1;//no, double the buffersize.
ct->buff_sz *= 2;
sz = ct->buff_sz - n;
ct->buff = REALLOC(ct->buff, ct->buff_sz);
}
m = (int)(ct->dirty - ct->buff);
MEMMOVE(ct->buff, ct->dirty, n);
ct->dirty = ct->buff;
ct->next = ct->dirty + n;
ii = 0;
while (ii < ct->data.num_ptrs)
ct->data.ptrs[ii++] -= m;
//num_chars = n;
}
if(!ct->get_block(ct->next, sz, &num_chars)) {
return XML_TEST_ERROR;
}
else
return XML_ERROR_NONE;
}
int get_block(char *buff, int buff_sz, int* numchars)
{
int len;
int done;
*numchars = 0;
len = fread(buff, 1, buff_sz, stdin);
//printf("len:%d\n", len);
*numchars += len;
if (ferror(stdin))
{
fprintf(stderr, "Read error\n");
exit(-1);
}
done = feof(stdin);
if(done)
isDone = 1;
return XML_ERROR_NONE;
}
xpp_context_t* parser_create(const XML_Char *encodingName)
{
return parser_create_mh(encodingName, NULL, NULL);
}
xpp_context_t* parser_create_ns(const XML_Char *encodingName, XML_Char nsSep)
{
XML_Char tmp[2];
*tmp = nsSep;
return parser_create_mh(encodingName, NULL, tmp);
}
xpp_context_t* parser_create_mh(const XML_Char *encodingName, const XML_Memory_Handling_Suite *memsuite, XML_Char nsSep)
{
return parser_create_in(encodingName, memsuite, nsSep);
}
static xpp_context_t* parser_create_in(const XML_Char *encodingName, const XML_Memory_Handling_Suite *memsuite, XML_Char nsSep)
{
xpp_context_t* ct;
if (memsuite) {
XML_Memory_Handling_Suite *mtemp;
ct = (xpp_context_t*) memsuite->malloc_fcn(sizeof(struct xpp_context));
if (ct != NULL) {
mtemp = (XML_Memory_Handling_Suite *)&(ct->m_mem);
mtemp->malloc_fcn = memsuite->malloc_fcn;
mtemp->memmove_fcn = memsuite->memmove_fcn;
mtemp->realloc_fcn = memsuite->realloc_fcn;
mtemp->free_fcn = memsuite->free_fcn;
}
}
else {
XML_Memory_Handling_Suite *mtemp;
ct = (xpp_context_t*) malloc(sizeof(struct xpp_context));
if (ct != NULL) {
mtemp = (XML_Memory_Handling_Suite *)&(ct->m_mem);
mtemp->malloc_fcn = malloc;
mtemp->memmove_fcn = memmove;
mtemp->realloc_fcn = realloc;
mtemp->free_fcn = free;
}
}
ct->buff_sz = INIT_BUFFER_SIZE;
ct->utf8buff_sz = INIT_TAG_SIZE;
char* buff = (char*) malloc(ct->buff_sz * sizeof(char));
char* utf8buff = (char*) malloc(ct->utf8buff_sz * sizeof(char));
if(buff == NULL || utf8buff == NULL)
return NULL;
ct->buff = buff;
ct->utf8buff = utf8buff;
if(XML_ERROR_NONE == parser_init(ct, encodingName))
return ct;
else
return NULL;
}
static int parser_init(xpp_context_t* ct, const XML_Char *encodingName)
{
if(ct)
{
num_chars = 0;
ct->next = ct->buff;
ct->dirty = ct->buff;
state = S_0;
tok_state = PROLOG;
ct->get_block = get_block;
ct->data.ptrs = NULL;
ct->data.utf8ptrs = NULL;
ct->data.ptrs_sz = 8;
ct->utf8buff_sz = INIT_BUFFER_SIZE;
data_counter = 0;
eventPtr = NULL;
eventEndPtr = NULL;
protocolEncodingName = encodingName;
return XML_ERROR_NONE;
}
else
return XML_TEST_ERROR;
}
static int initialize_encoding(xpp_context_t* ct)
{
const char *s;
#ifdef XML_UNICODE
char encodingBuf[128];
if (!protocolEncodingName)
s = NULL;
else
{
int i;
for (i = 0; protocolEncodingName[i]; i++)
{
if (i == sizeof(encodingBuf) - 1
|| (protocolEncodingName[i] & ~0x7f) != 0)
{
encodingBuf[0] = '\0';
break;
}
encodingBuf[i] = (char)protocolEncodingName[i];
}
encodingBuf[i] = '\0';
s = encodingBuf;
}
#else
//printf("protocolEncodingName:%s\n", protocolEncodingName);
s = protocolEncodingName;
#endif
if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))
return XML_ERROR_NONE;
//return handleUnknownEncoding(parser, protocolEncodingName);
}
void* parser_free(xpp_context_t* ct)
{
free(ct);
}
data_t* next(xpp_context_t* ct)
{
data_counter = 0;
if(!parse(ct))
{
process_data(ct, encoding);
return &ct->data;
}
else
return NULL;
}
static int add_utf8_ptr(char *ptr, data_t *data)
{
if (data->num_ptrs_utf8 == data->ptrs_sz
|| !data->utf8ptrs) {
int sz = data->ptrs_sz << 1;
char **ptrs = (char **)malloc(sz << 2);
if (!ptrs)
return XML_TEST_ERROR;
if (data->utf8ptrs) {
memmove(ptrs, data->utf8ptrs, data->num_ptrs_utf8 << 2);
free(data->utf8ptrs);
}
data->utf8ptrs = ptrs;
data->ptrs_sz = sz;
//printf("sz:%d\n", sz);
}
data->utf8ptrs[data->num_ptrs_utf8++] = ptr;
return XML_ERROR_NONE;
}
static void process_data(xpp_context_t* ct)
{
int intCount = 0;
char holder;
int bufSize;
int totLen = 0;
int wordLen = 0;
int tempDiff;
XML_Char *toPtr;
toPtr = (XML_Char *) ct->utf8buff;
XML_Char *startPtr = (XML_Char *) ct->utf8buff;
XML_Char *endPtr = (XML_Char *) ct->utf8buff;
while(intCount < ct->data.num_ptrs)
{
const char *rawNameEnd = &ct->data.ptrs[intCount + 1][1];
const char *fromPtr = ct->data.ptrs[intCount];
tempDiff = ct->data.ptrs[intCount+1] - ct->data.ptrs[intCount];
if(tempDiff <= 1)
return;
startPtr += wordLen;
//printf("fromPtr:\n\n%s\n\n", fromPtr);
//printf("rawNameEnd:\n\n%s\n\n", rawNameEnd);
/*char* mytemp = malloc(1024);
XmlDamConvert(encoding, &fromPtr, rawNameEnd,
(ICHAR **)&toPtr, (ICHAR *)mytemp);
*/
XmlDamConvert(encoding, &fromPtr, rawNameEnd,
(ICHAR **)&toPtr, (ICHAR *)ct->utf8buff + ct->utf8buff_sz);
//printf("startPtr:\n%s\n", startPtr);
//printf("toPtr:\n%s\n", toPtr);
wordLen = toPtr - startPtr;
//printf("wordLen:%d\n", wordLen);
totLen += wordLen;
//printf("totLen:%d\n", totLen);
if(ct->utf8buff_sz <= totLen)
{
ct->utf8buff_sz = 2 * ct->utf8buff_sz;
char *temp = (char *)REALLOC(ct->utf8buff, ct->utf8buff_sz);
if (temp == NULL)
return XML_ERROR_NO_MEMORY;
ct->utf8buff = temp;
}
//toPtr = (XML_Char *)ct->utf8buff + convLen;
endPtr = toPtr - 1;
add_utf8_ptr(startPtr, &ct->data);
add_utf8_ptr(endPtr, &ct->data);
intCount += 2;
}
return;
}
int get_next_element_as_int(xpp_context_t* ct, int* parse_error)
{
int intTemp;
char* temp;
data_counter = 0;
temp = ct->data.utf8ptrs[data_counter + 1][1];
ct->data.utf8ptrs[data_counter + 1][1] = XML_T('\0');
//printf("ct->data.ptrs[0]:%s\n", ct->data.ptrs[0]);
sscanf(ct->data.utf8ptrs[data_counter], "%d", &intTemp);
ct->data.utf8ptrs[data_counter + 1][1] = temp;
*parse_error = XML_ERROR_NONE;
return intTemp;
}
/*
Prier to call this method state should be START_TAG
*/
int get_next_attribute_as_int(xpp_context_t* ct, int* parse_error)
{
int intTemp;
char* temp;
data_t* data;
if (2 >= ct->data.num_ptrs_utf8)
{
*parse_error = XML_TEST_ERROR;
return 0;
}
data_counter += 2;
temp = ct->data.ptrs[data_counter + 1][1];
ct->data.utf8ptrs[data_counter+1][1] = '\0';
//printf("ct->data.ptrs[data_counter]:%s\n", ct->data.ptrs[data_counter]);
sscanf(ct->data.utf8ptrs[data_counter], "%d", &intTemp);
ct->data.utf8ptrs[data_counter+1][1] = temp;
*parse_error = XML_ERROR_NONE;
return intTemp;
}
1.1 ws-axis/c/src/xml/txpp/lib/xpp.h
Index: xpp.h
===================================================================
#include <stdlib.h>
#ifndef XPP_H_INCLUDED
#define XPP_H_INCLUDED
#ifdef XML_UNICODE /* Information is UTF-16 encoded. */
#ifdef XML_UNICODE_WCHAR_T
typedef wchar_t XML_Char;
typedef wchar_t XML_LChar;
#else
typedef unsigned short XML_Char;
typedef char XML_LChar;
#endif /* XML_UNICODE_WCHAR_T */
#else /* Information is UTF-8 encoded. */
typedef char XML_Char;
typedef char XML_LChar;
#endif /* XML_UNICODE */
typedef unsigned char XML_Bool;
#define XML_TRUE ((XML_Bool) 1)
#define XML_FALSE ((XML_Bool) 0)
#ifdef XML_UNICODE
#ifdef XML_UNICODE_WCHAR_T
#define XML_T(x) (const wchar_t)x
#define XML_L(x) L ## x
#else
#define XML_T(x) (const unsigned short)x
#define XML_L(x) x
#endif
#else
#define XML_T(x) x
#define XML_L(x) x
#endif
#ifdef XML_UNICODE
#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
#define XmlConvert XmlUtf16Convert
#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
#define XmlEncode XmlUtf16Encode
#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1))
typedef unsigned short ICHAR;
#else
#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
#define XmlConvert XmlUtf8Convert
#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
#define XmlEncode XmlUtf8Encode
#define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
typedef char ICHAR;
#endif
enum {
S_0, S_1, S_2, S_3, S_4, S_5, S_6, S_7,
S_8, S_9, S_10, S_11, S_12, S_13, S_14
};
enum {
START_TAG, END_TAG, EMPTY_ELEMENT_TAG, PCDATA
};
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_TEST_ERROR
};
typedef struct mm {
void *( *malloc_fcn)(size_t size);
void *( *memmove_fcn)(void *ptrto, void *ptrfrom, size_t size);
void *( *realloc_fcn)(void *ptr, size_t size);
void ( *free_fcn)(void *ptr);
} XML_Memory_Handling_Suite;
typedef struct data
{
int type;
int ptrs_sz;
int num_ptrs;
int num_ptrs_utf8;
char **ptrs;
char **utf8ptrs;
} data_t;
//char *tn[] = {"START_TAG", "END_TAG", "EMPTY_ELEMENT_TAG", "PCDATA"};
struct xpp_context;
typedef struct xpp_context xpp_context_t;
xpp_context_t* parser_create(const XML_Char *encodingName);
xpp_context_t* parser_create_ns(const XML_Char *encodingName, XML_Char nsSep);
xpp_context_t* parser_create_mh(const XML_Char *encodingName, const XML_Memory_Handling_Suite *memsuite, XML_Char nsSep);
void* parser_free(xpp_context_t* ct);
data_t* next(xpp_context_t* ct);
int get_next_element_as_int(xpp_context_t* ct, int* parse_error);
int get_next_attribute_as_int(xpp_context_t* ct, int* parse_error);
#endif