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