xml/cxmllibrary/src/wbxmlp/src/parse_logic.cpp
branchRCL_3
changeset 21 604ca70b6235
parent 20 889504eac4fb
--- a/xml/cxmllibrary/src/wbxmlp/src/parse_logic.cpp	Tue Aug 31 17:02:56 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1651 +0,0 @@
-/*
-* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
-
-
-/*****************************************************************
-**  File: wbxml_parse_logic.c
-**
-**  Description:
-*
-* Here is the main parser logic. None of these functions has
-* any knowlege of how wbxml is stored or read, so they should
-* work as well with a buffer, stream or file based parser. These
-* functions require some implementation of the "parser reader
-* interface" as defined in wbxml_reader.h.
-*
-*****************************************************************/
-
-#include "cxml_internal.h"
-#include <xml/cxml/nw_wbxml_token.h>
-#include <xml/cxml/nw_wbxml_dictionary.h>
-#include <xml/cxml/nw_wbxml_document.h>
-#include <xml/cxml/nw_wbxml_event.h>
-#include <xml/cxml/nw_wbxml_reader.h>
-#include "nw_wbxml_parsei.h"
-#include <xml/cxml/nw_string_char.h>
-
-#ifndef HTTP_utf_8
-#define HTTP_utf_8 0x6A
-#endif
-
-#define TOKEN_STATE_TAG         0
-#define TOKEN_STATE_ATTR        1
-
-#define WBXML_MAX_RECURSIVE_CALL_DEPTH 120  /* For parse element only */
-
-/* The parser tries to be very strict about errors caused by bad NW_Byte
- * code, lack of memory, etc. For example, the parser will not read
- * past the end of the buffer. Callbacks can also set error status to
- * stop parsing. These will be detected as soon as possible after the
- * callback returns.  The following method is called with the return
- * value (NW_Status_t) from the callback functions.  The status is
- * saved and if it is not NW_STAT_SUCCESS, then the parser's flags
- * field is updated so that the parser will know that a callback has
- * raised an exception/error condition. The parser will quit as soon
- * as it checks the flags.
- */
-
-static void
-NW_WBXML_Parser_setStatus (NW_WBXML_Parser_t * parser,
-                           NW_Status_t status)
-{
-  parser->status = status;
-
-  switch (status)
-  {
-  case NW_STAT_SUCCESS:
-    break;
-  case NW_STAT_OUT_OF_MEMORY:
-    parser->flags |= NW_WBXML_PARSER_NOMEMORY;
-    break;
-  case NW_STAT_WBXML_ERROR_BYTECODE:
-    parser->flags |= NW_WBXML_PARSER_BYTECODEERROR;
-    break;
-  case NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED:
-    parser->flags |= NW_WBXML_PARSER_CHARSET_UNSUPPORTED;
-    break;
-  default:
-    parser->flags |= NW_WBXML_PARSER_UNKNOWN_ERROR;
-    break;
-  }
-  return;
-}
-
-/*
- * Convert the parser's flag status code to a NW_Status_t constant
- */
-
-static NW_Status_t
-NW_WBXML_Parser_flagToStatus (NW_WBXML_Parser_t * parser)
-{
-  if (parser->flags & NW_WBXML_PARSER_NOMEMORY)
-    return NW_STAT_OUT_OF_MEMORY;
-
-  if (parser->flags & NW_WBXML_PARSER_BYTECODEERROR)
-    return NW_STAT_WBXML_ERROR_BYTECODE;
-
-  if (parser->flags & NW_WBXML_PARSER_CHARSET_UNSUPPORTED)
-    return NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED;
-
-  return parser->status;
-}
-
-
-#define GET_STATE(parser) ((parser)->state & NW_WBXML_PARSER_S_MASK)
-#define SET_STATE(parser, st) \
-  ((parser)->state = (~NW_WBXML_PARSER_S_MASK & parser->state) | (st))
-
-#define CHECK_PARSER_STATUS \
-  if((parser->flags & NW_WBXML_PARSER_S_MASK) != NW_WBXML_PARSER_OK) \
-    return NW_WBXML_Parser_flagToStatus(parser)
-
-
-/*
-* Create an uninitialized code page registry. As long as the registry is not
-* created, it will be ignored. Once it has been created, the parser will check
-* the REGISTRY_INIT flag. If this is not set, the registry will be initialized
-* as the parser runs. If this is set, then the registry will be consulted when
-* updating the offset.
-*/
-
-NW_Status_t
-NW_WBXML_Parser_addCPRegistry(NW_WBXML_Parser_t* parser,
-                              NW_WBXML_CP_Registry_Entry_t* storage,
-                              NW_Int32 count)
-{
-  NW_ASSERT(parser != NULL);
-  NW_ASSERT(storage != NULL);
-
-  parser->cp_registry.storage = storage;
-  parser->cp_registry.current = storage;
-  parser->cp_registry.count = count;
-  // WLIU_DEBUG: parser->cp_registry.realcount = 0;
-  parser->state &= ~NW_WBXML_REGISTRY_INIT; /* Make sure flag is not set */
-  return NW_STAT_SUCCESS;
-}
-
-static void
-NW_WBXML_CPRegistry_addEntry(NW_WBXML_CP_Registry_t *registry ,
-                             NW_Uint8 code_page,
-                             NW_Uint32 offset, /* must point to switch_page token */
-                             NW_Uint8 token_state)
-{
-  NW_ASSERT(registry != NULL);
-  NW_ASSERT(registry->current < (registry->storage + registry->count));
-
-  /* ignoring page type (tag or attribute) check that registry is in
-  increasing order of offset so that the algorith in
-  NW_WBXML_CPRegistry_getCodePages() works */
-  NW_ASSERT((registry->current > registry->storage) ?
-            (offset > (registry->current - 1)->start_offset)
-            : 1);
-  /* Each entry must record if it is for tokens or attributes.  A
-  trick to encode this without extra memory relies on the use of two
-  bytes in WBXML to encode a page switch.  With two bytes one has an
-  even offset and one an odd offset.  We pick the even if it is a tag
-  page and the odd offset if it is an attribute page. */
-  if (token_state == TOKEN_STATE_TAG) {
-    if (offset & 1) { /* if it is odd, advance one to make it even */
-      offset++;
-    }
-  } else {
-    NW_ASSERT(token_state == TOKEN_STATE_ATTR);
-    if ((offset & 1) == 0) { /* if it is even, advance one to make it odd */
-      offset++;
-    }
-  }
-  registry->current->start_offset = offset;
-  registry->current->code_page = code_page;
-
-  //if(registry->current < (registry->storage + registry->count - 1)){
-    registry->current++;
-    // WLIU_DEBUG: registry->realcount++;
-  //
-}
-
-void
-NW_WBXML_CPRegistry_getCodePages(NW_WBXML_CP_Registry_t* registry,
-                                 NW_Uint32 offset,
-                                 NW_Uint8 *tag_code_page,
-                                 NW_Uint8 *attribute_code_page)
-{
-  NW_WBXML_CP_Registry_Entry_t* entry;
-
-  NW_ASSERT(registry != NULL);
-
-  *tag_code_page = 0;
-  *attribute_code_page = 0;
-  for (entry = registry->storage;
-       entry < (registry->storage + registry->count);
-       entry++){
-    /* assume that the entries are in increasing offset order */
-    NW_ASSERT((entry > registry->storage) ?
-              (entry->start_offset > (entry - 1)->start_offset)
-              : 1);
-
-    if(offset > entry->start_offset) {
-      if(entry->start_offset & 1) {
-        /* odd offset indicates attributes */
-        *attribute_code_page = entry->code_page;
-      } else {
-        /* even offset indicates tokens */
-        *tag_code_page = entry->code_page;
-      }
-    } else {
-      break; /* early out */
-    }
-  }
-}
-
-
-/*
-  This function parses "version publicid charset strtbl" which is a
-  sequence that comprises the "header" of a WBXML document.
-
-  From specification WAP-192-WBXML-20010725-a, Version 1.3, 25 July 2001,
-  section 5.3 BNF for Document Structure:
-
-  start = version publicid charset strtbl body
-  version = u_int8 // WBXML version number
-  publicid = mb_u_int32 | ( zero index )
-  charset = mb_u_int32
-  strtbl = length *byte
-  length = mb_u_int32
-
-  The "version" specifies the WBXML specification version. The
-  version byte contains the major version minus one in the upper
-  four bits and the minor version in the lower four bits. For
-  example, the version number 1.3 would be encoded as 0x03.
-
-  The first form of publicid is a multi-byte positive integer value,
-  greater than zero, representing a well-known XML document type given
-  an assigned value.  See table at section 7.2.1 or try
-  http://www.wapforum.org/wina/wbxml-public-docid.htm
-  Note that 0x01 is used for "unknown or missing public identifier."
-
-  The second form of publicid begins with a 0 byte followed by a
-  string table index (note that these "index" values are all 0-based
-  byte offsets from the start of the string table).  The entry in the
-  string table encodes the XML document type string.
-
-  The charset is the multi-byte encoding of the IANA charset MIBenum
-  http://www.iana.org/assignments/character-sets
-
-  The string table either has length 0, if empty, or the length is the
-  byte count of the string table block not counting the length byte
-  itself.
-
-  This is what the specification says about "index" as an index into
-  the string table:
-
-  "Various tokens encode references to the contents of the string
-  table. These references are encoded as scalar byte offsets from the
-  first byte of the first string in the string table. For example, the
-  offset of the first string is zero (0)."
-
-  So, "index" is a 0-based byte offset from the first byte of the
-  string table.  The first byte of the string table is the one after
-  the multi-byte encoding of the string table length.
-
-  This function returns one of:
-
-  NW_STAT_SUCCESS
-  NW_STAT_OUT_OF_MEMORY
-  NW_STAT_WBXML_ERROR_BYTECODE
-*/
-NW_Status_t
-NW_WBXML_Parser_docHeaderParse(NW_WBXML_Parser_t* pParser,
-                               NW_WBXML_Document_t* pDoc)
-{
-  NW_Int32 bytesRead;
-  NW_Uint32 docTypeByteOffset = 0;
-  NW_Status_t substatus;
-  NW_Status_t status = NW_STAT_WBXML_ERROR_BYTECODE;
-
-  /* this is an internal function where caller should guarantee these */
-  NW_ASSERT(pParser != NULL);
-  NW_ASSERT(pDoc != NULL);
-  NW_ASSERT(GET_STATE(pParser) == NW_WBXML_PARSER_S_START);
-
-  /* version */
-  pDoc->version = NW_WBXML_Parser_readUint8(pParser);
-  if (NW_WBXML_Parser_advance(pParser, 1) < 0) {
-    goto errorExitHeaderParse;
-  }
-  /* publicid */
-  bytesRead = NW_WBXML_Parser_readMbUint32(pParser, &(pDoc->publicid));
-  if ((bytesRead < 0)
-      || (NW_WBXML_Parser_advance(pParser, bytesRead) < 0)) {
-    goto errorExitHeaderParse;
-  }
-  /* check for publicid second form referencing string table */
-  if (pDoc->publicid == 0) {
-    /* save doctype string table index for after string table is read */
-    bytesRead = NW_WBXML_Parser_readMbUint32(pParser, &docTypeByteOffset);
-    if ((bytesRead < 0)
-        || (NW_WBXML_Parser_advance(pParser, bytesRead) < 0)) {
-      goto errorExitHeaderParse;
-    }
-  }
-
- if(pDoc->publicid == 1) //As per WBXML spec, invalid public identifier
-  {
-    return NW_STAT_WMLBROWSER_BAD_CONTENT;
-  }
-
-  /* charset */
-  if (pDoc->version != 0) {
-    bytesRead = NW_WBXML_Parser_readMbUint32(pParser, &(pDoc->charset));
-    if ((bytesRead < 0)
-        || (NW_WBXML_Parser_advance(pParser, bytesRead) < 0)) {
-      goto errorExitHeaderParse;
-    }
-  } else {
-    /* For WBXML version 1.0, which did not have a charset field in
-       the document header, we hardwire the charset to UTF-8.  This is
-       against the spec which says that the charset should come as
-       side info with the doc (e.g., get charset from the load
-       response), but the API needs to change to support this so
-       rather than reject all version 1.0 docs we accept the UTF-8
-       (includes ASCII but not Latin-1) encoded ones. */
-    pDoc->charset = HTTP_utf_8;
-  }
-  substatus = NW_String_charsetValid(pDoc->charset);
-  if (substatus != NW_STAT_SUCCESS) {
-    status = substatus;
-    goto errorExitHeaderParse;
-  }
-  /* strtbl */
-  substatus = NW_WBXML_Parser_readStringTable(pParser, pDoc,
-                                              &(pDoc->strtbl.data));
-  if (substatus != NW_STAT_SUCCESS) {
-    status = substatus;
-    goto errorExitHeaderParse;
-  }
-
-  /* record remainder of doc as the body length */
-  pDoc->body_len = pParser->left;
-
-  /* deal with doctype string, maybe from string table */
-
-  if(pDoc->doc_type)
-  {
-   NW_String_delete(pDoc->doc_type);
-  }
-
-  pDoc->doc_type = NULL;
-  if (pDoc->publicid == 0) {
-    /* now that we have the string table, get the doctype string */
-    if ((docTypeByteOffset >= pDoc->strtbl.length)
-        || (!NW_String_valid(pDoc->strtbl.data + docTypeByteOffset,
-                             pDoc->strtbl.length - docTypeByteOffset,
-                             pDoc->charset))) {
-      goto errorExitHeaderParse;
-    }
-    pDoc->doc_type = NW_String_new();
-    if (pDoc->doc_type != NULL) {
-      if (NW_String_initialize(pDoc->doc_type,
-                               pDoc->strtbl.data + docTypeByteOffset,
-                               pDoc->charset) != NW_STAT_SUCCESS) {
-        NW_String_delete(pDoc->doc_type);
-        pDoc->doc_type = NULL;
-        goto errorExitHeaderParse;
-      }
-      /* TBD should now go back and try to fill in the internal "publicId"
-         from the WBXML dictionary to match the docType. */
-    } else {
-      status = NW_STAT_OUT_OF_MEMORY;
-      goto errorExitHeaderParse;
-    }
-  } else {
-    /* doc came with publicid so now fill in the type string. */
-    substatus
-      = NW_WBXML_Dictionary_publicId_to_doctypeString(pDoc->publicid,
-                                                      &(pDoc->doc_type));
-    /* ignore any error other than OOM */
-    if (substatus == NW_STAT_OUT_OF_MEMORY) {
-      status = NW_STAT_OUT_OF_MEMORY;
-      goto errorExitHeaderParse;
-    }
-  }
-  SET_STATE(pParser, NW_WBXML_PARSER_S_HEADER);
-  pParser->doc = pDoc;
-  status = NW_STAT_SUCCESS;
- errorExitHeaderParse:
-  return status;
-}
-
-/*
- * Save/restore context can be used if the parser is to be invoked
- * reentrantly (in a callback).  Normally this should be avoided since
- * the only really safe way to do this is to save the whole parser
- * object on the stack. This uses a lot of space!
- */
-
-NW_Status_t
-NW_WBXML_Parser_saveContext(NW_WBXML_Parser_t *parser,
-                            NW_WBXML_Parser_t *context)
-{
-  NW_ASSERT(parser != NULL);
-  NW_ASSERT(context != NULL);
-
-  NW_Mem_memcpy(context, parser, sizeof(*parser));
-  return NW_STAT_SUCCESS;
-}
-
-NW_Status_t
-NW_WBXML_Parser_restoreContext(NW_WBXML_Parser_t *parser,
-                               NW_WBXML_Parser_t *context)
-{
-  NW_ASSERT(parser != NULL);
-  NW_ASSERT(context != NULL);
-
-  NW_Mem_memcpy(parser, context, sizeof(*parser));
-  return NW_STAT_SUCCESS;
-}
-
-NW_Status_t
-NW_WBXML_Parser_setTagCodepage(NW_WBXML_Parser_t *parser,
-                               NW_Uint8 page)
-{
-  NW_ASSERT(parser != NULL);
-
-  parser->tag_code_page = page;
-  return NW_STAT_SUCCESS;
-}
-
-NW_Uint8
-NW_WBXML_Parser_getTagCodepage(NW_WBXML_Parser_t *parser)
-{
-  NW_ASSERT(parser != NULL);
-
-  return parser->tag_code_page;
-}
-
-NW_Status_t
-NW_WBXML_Parser_setAttrCodepage(NW_WBXML_Parser_t *parser,
-                                NW_Uint8 page)
-{
-  NW_ASSERT(parser != NULL);
-
-  parser->attribute_code_page = page;
-  return NW_STAT_SUCCESS;
-}
-
-NW_Uint8
-NW_WBXML_Parser_getAttrCodepage(NW_WBXML_Parser_t *parser)
-{
-  NW_ASSERT(parser != NULL);
-
-  return parser->attribute_code_page;
-}
-
-/*
-* Turn an eight bit token into a fully qualified 32 bit token depending
-* on the parser state.
-*/
-
-static
-NW_Uint32
-FqToken (NW_WBXML_Parser_t * parser,
-         NW_Uint8 token,
-         NW_Int32 token_state)
-{
-  NW_Uint32 fq_token = token;
-
-  NW_ASSERT(parser != NULL);
-
-  fq_token |= (parser->dictionary << 16);
-  if (token_state == TOKEN_STATE_ATTR) {
-    fq_token |=
-      ((parser->attribute_code_page << 8) | NW_WBXML_CP_STATE_ATTR);
-  } else {
-    fq_token |= ((parser->tag_code_page << 8) | NW_WBXML_CP_STATE_TAG);
-  }
-  return fq_token;
-}
-
-
-/* Invoke callbacks */
-
-/* The callback wrappers use the parser flags to implement an
- * "exception" mechanism. If a callback returns a non-OK status, the
- * parser will detect this as soon as possible and stop what
- * it is doing.
- */
-
-/* Handle state callbacks */
-
-static
-void
-Handle_Pi(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Pi_CB)){
-    status = (*(parser->handler->Pi_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Pi_End(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Pi_End_CB)){
-    status = (*(parser->handler->Pi_End_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Tag_Start(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Tag_Start_CB)){
-    status = (*(parser->handler->Tag_Start_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Tag_End(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Tag_End_CB)){
-    status = (*(parser->handler->Tag_End_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Attr_Start(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Attr_Start_CB)){
-    status = (*(parser->handler->Attr_Start_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Attr_Val(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Attr_Val_CB)){
-    status = (*(parser->handler->Attr_Val_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Content(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Content_CB)){
-    status = (*(parser->handler->Content_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Codepage(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->CodePage_CB)){
-    status = (*(parser->handler->CodePage_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Extension(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Extension_CB)){
-    status = (*(parser->handler->Extension_CB)) (parser, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-/* Handle data type callbacks */
-
-static
-void
-Handle_Fq_Token(NW_WBXML_Parser_t *parser,
-                NW_Uint32 token)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->FQToken_CB)){
-    status = (*(parser->handler->FQToken_CB)) (parser, token, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Inline_String(NW_WBXML_Parser_t *parser,
-                     NW_Uint32 len)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->InlineString_CB)){
-    status = (*(parser->handler->InlineString_CB)) (parser, len,
-                                                    parser->context);
-    
-        NW_WBXML_Parser_setStatus (parser, status);
- } 
-}
-
-static
-void
-Handle_Table_String(NW_WBXML_Parser_t *parser,
-                    NW_Uint32 index)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->TableString_CB)){
-    status = (*(parser->handler->TableString_CB)) (parser, index,
-                                                   parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Binary(NW_WBXML_Parser_t *parser,
-              NW_Uint32 value)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Binary_CB)){
-    status = (*(parser->handler->Binary_CB)) (parser, value, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Opaque(NW_WBXML_Parser_t *parser,
-              NW_Uint32 len)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Opaque_CB)){
-    status = (*(parser->handler->Opaque_CB)) (parser, len, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-static
-void
-Handle_Entity(NW_WBXML_Parser_t *parser,
-              NW_Uint32 e)
-{
-  NW_Status_t status;
-  if ((parser->handler) && (parser->handler->Entity_CB)){
-    status = (*(parser->handler->Entity_CB)) (parser, e, parser->context);
-    NW_WBXML_Parser_setStatus (parser, status);
-  }
-}
-
-/*
-* Safely get the next token, checking for switch pages along the way.
-* While this does advance past any switch pages, it DOES NOT advance
-* past the returned token.
-*/
-
-static
-NW_Status_t
-NW_WBXML_Parser_getNextToken (NW_WBXML_Parser_t * parser,
-                              NW_Uint8 * token,
-                              NW_Int32 token_state)
-{
-
-  NW_ASSERT(parser != NULL);
-
-  if (!NW_WBXML_Parser_hasMoreBytecode (parser)) {
-    return NW_STAT_WBXML_ERROR_BYTECODE;
-  }
-
-  while ((*token = NW_WBXML_Parser_readUint8 (parser)) ==
-         NW_WBXML_SWITCH_PAGE)
-  {
-    if (NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    if (!NW_WBXML_Parser_hasMoreBytecode (parser)) {
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-
-    if (token_state == TOKEN_STATE_TAG){
-      parser->tag_code_page = NW_WBXML_Parser_readUint8 (parser);
-    } else {
-      parser->attribute_code_page = NW_WBXML_Parser_readUint8 (parser);
-    }
-
-    if((parser->cp_registry.count > 0)
-      && ((parser->flags & NW_WBXML_REGISTRY_INIT) != NW_WBXML_REGISTRY_INIT)){
-      NW_ASSERT(parser->offset > 0);
-      /* We have a registry but we haven't finished initing it yet */
-      // WLIU_DEBUG: RFileLogger::WriteFormat(_L("Browser"), _L("cp_count.txt"), EFileLoggingModeAppend, _L("=== cp_count: %x, pW->index: %x \n"), parser->cp_registry.realcount +1, parser->offset - parser->lastValid);
-      NW_WBXML_CPRegistry_addEntry(&(parser->cp_registry),
-                                   NW_WBXML_Parser_readUint8(parser),
-                                   /* must use switch page token position */
-                                   parser->offset - 1,
-                                   (NW_Uint8)token_state);
-    }
-
-    Handle_Codepage(parser);
-
-    if (NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    if (!NW_WBXML_Parser_hasMoreBytecode (parser)) {
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-  return NW_STAT_SUCCESS;
-}
-
-/*
- * Element parsing methods: The parser is made up of a set of methods
- * that know how to parse individual elements of the wbxml source. For
- * elements that repeat, these are implemented in iterators. Building
- * the parser from a set of element parsers and iterators makes it
- * simple to use the parser as a deserializer for wbxml elements.
- */
-
-#define HAS_CONTENT(t)    ((t)&NW_WBXML_FLAGS_CONTENT)
-#define HAS_ATTRIBUTES(t) ((t)&NW_WBXML_FLAGS_ATTRIBUTES)
-
-/*
-* Parse the token and name part of a tag. This generates a fully
-* qualified token.
-*/
-
-NW_Status_t
-NW_WBXML_Parser_tagNameParse(NW_WBXML_Parser_t *parser)
-{
-  NW_Uint8 token;
-  NW_Int32 ilen;
-  NW_Uint32 index;
-  NW_Uint32 fq_token;
-  NW_Status_t status;
-
-  NW_ASSERT(parser != NULL);
-
-  Handle_Tag_Start(parser);
-
-  CHECK_PARSER_STATUS;
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  fq_token = FqToken (parser, token, TOKEN_STATE_TAG);
-  Handle_Fq_Token(parser, fq_token);
-
-  if (HAS_CONTENT(fq_token) || HAS_ATTRIBUTES(fq_token) ||
-      (NW_WBXML_Parser_hasMoreBytecode (parser)))
-  {
-    if (NW_WBXML_Parser_advance (parser, 1) < 0){
-        return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-
-  /*
-   * Note that while the spec defines tokens for literal tags with
-   * and without attributes and content, they are just
-   * NW_WBXML_LITERAL with the content and/or attributes flags
-   * set. So ...
-   */
-
-  if ((token & NW_WBXML_MASK_TAG_ID) == NW_WBXML_LITERAL){
-
-  /*
-   * TODO:  Should check for another global token
-   * and return an error?
-   */
-
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-
-    Handle_Table_String(parser, index);
-
-    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-
-  if (HAS_ATTRIBUTES (fq_token)){   /* Has attributes, possibly content */
-    status = NW_STAT_WBXML_HAS_ATTRIBUTES;
-    if (HAS_CONTENT (fq_token)){
-      status = NW_STAT_WBXML_HAS_ATTR_CONTENT;
-    }
-  }
-
-  else if (HAS_CONTENT (fq_token)){ /* Has content, no attributes */
-    status = NW_STAT_WBXML_HAS_CONTENT;
-  }
-
-  else{                             /* No attributes, no content */
-    status = NW_STAT_SUCCESS;
-    Handle_Tag_End(parser);
-  }
-
-  return status;
-}
-
-/* Parse an attribute list */
-
-NW_Status_t
-NW_WBXML_Parser_attributeListIterate(NW_WBXML_Parser_t *parser)
-{
-  NW_Uint8 token;
-  NW_Status_t status;
-
-  NW_ASSERT(parser != NULL);
-
-  status = NW_WBXML_Parser_attributeParse (parser);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  if (token == NW_WBXML_END){
-    return NW_STAT_WBXML_ITERATE_DONE;
-  }
-  return NW_STAT_WBXML_ITERATE_MORE;
-}
-
-static
-NW_Status_t
-NW_WBXML_Parser_attributeListParse(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-
-  /* Run the attribute list iterator till it completes */
-
-  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
-    status = NW_WBXML_Parser_attributeListIterate(parser);
-    if(status == NW_STAT_WBXML_ITERATE_DONE){
-      return NW_STAT_SUCCESS;
-    }
-    if(status != NW_STAT_WBXML_ITERATE_MORE){
-      return status;
-    }
-  }
-  return NW_WBXML_Parser_flagToStatus(parser);
-}
-
-/*
-* Parse a processing instruction
-*/
-static
-NW_Status_t
-NW_WBXML_Parser_piParse (NW_WBXML_Parser_t * parser,
-                         NW_Int32 token_state)
-{
-
-  NW_Uint8 token;
-  NW_Status_t status;
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, token_state);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  switch (token){
-  case NW_WBXML_PI:
-    Handle_Pi(parser);
-    /*
-    * Advance past the PI token and then get the PI's
-    * target and value
-    */
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    status = NW_WBXML_Parser_attributeParse (parser);
-    if(status != NW_STAT_SUCCESS){
-      return status;
-    }
-    /* Advance past the PI's end token */
-    status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
-    if(status != NW_STAT_SUCCESS){
-      return status;
-    }
-    if (token == NW_WBXML_END){
-      Handle_Pi_End(parser);
-      /*
-       * Must advance the reader past the end token but since this
-       * PI may be the last NW_Byte in the bytecode, first check to see
-       * if there is any bytecode left.
-       */
-      if (NW_WBXML_Parser_hasMoreBytecode (parser)){
-        NW_WBXML_Parser_advance (parser, 1);
-      }
-    }
-    else
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    break;
-  default:
-    return NW_STAT_WBXML_ERROR_BYTECODE;
-  }
-  return NW_STAT_SUCCESS;
-}
-
-/* Parse an element, recursively parsing content */
-
-static
-NW_Status_t
-NW_WBXML_Parser_elementParse (NW_WBXML_Parser_t * parser)
-{
-  NW_Status_t tag_status = NW_STAT_SUCCESS;
-  NW_Status_t status     = NW_STAT_WBXML_ERROR_BYTECODE;
-
-  if (++(parser->recursiveCallCnt) >= WBXML_MAX_RECURSIVE_CALL_DEPTH) {
-    goto FuncExit;
-  }
-
-  /* The while loop checks parser status after each case. */
-  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
-    if (tag_status == NW_STAT_SUCCESS){
-      tag_status = NW_WBXML_Parser_tagNameParse(parser);
-      if(tag_status == NW_STAT_SUCCESS){
-        status = NW_STAT_SUCCESS; /* Normal return */
-        goto FuncExit;
-      }
-    }
-
-    else if((tag_status == NW_STAT_WBXML_HAS_ATTRIBUTES) ||
-            (tag_status == NW_STAT_WBXML_HAS_ATTR_CONTENT)) {
-
-      status = NW_WBXML_Parser_attributeListParse (parser);
-      if(status != NW_STAT_SUCCESS){
-        goto FuncExit;
-      }
-
-      if (NW_WBXML_Parser_hasMoreBytecode (parser)){
-        if(NW_WBXML_Parser_advance (parser, 1) < 0){
-          status = NW_STAT_WBXML_ERROR_BYTECODE;
-          goto FuncExit;
-        }
-      }
-
-      if(tag_status == NW_STAT_WBXML_HAS_ATTR_CONTENT) {
-        tag_status = NW_STAT_WBXML_HAS_CONTENT;
-      }
-      else {
-        Handle_Tag_End(parser);
-        status = NW_STAT_SUCCESS;       /* Normal return */
-        goto FuncExit;
-      }
-
-      /*  TODO:  else check for error (token >= 128) */
-    }
-
-    else if((tag_status == NW_STAT_WBXML_HAS_CONTENT) ||
-            (tag_status == NW_STAT_WBXML_HAS_ATTR_CONTENT)) {
-
-      status = NW_WBXML_Parser_contentParse(parser);
-      if(status != NW_STAT_SUCCESS){
-        goto FuncExit;
-      }
-
-      Handle_Tag_End(parser);
-      status = NW_STAT_SUCCESS; /* Normal return */
-      goto FuncExit;
-    }
-    else{
-      /* Unexpected NW_Byte code */
-      status = NW_STAT_WBXML_ERROR_BYTECODE;
-      goto FuncExit;
-    }
-  }
-  status = NW_STAT_WBXML_ERROR_BYTECODE; /* Bad parser status */
-
-  FuncExit:
-  --(parser->recursiveCallCnt);
-  return status;
-}
-
-
-/* Parse a sequence of text components until a non-text component is reached */
-
-
-static
-NW_Uint32
-isTextToken(NW_Uint8 token){
-  if((token == NW_WBXML_STR_I)
-    ||(token == NW_WBXML_STR_T)
-    ||(token == NW_WBXML_OPAQUE)
-    ||(token == NW_WBXML_ENTITY)
-    ||(token == NW_WBXML_EXT_I_0)
-    || (token == NW_WBXML_EXT_I_1)
-    || (token == NW_WBXML_EXT_I_2)
-    || (token == NW_WBXML_EXT_T_0)
-    || (token == NW_WBXML_EXT_T_1)
-    || (token == NW_WBXML_EXT_T_2)
-    || (token == NW_WBXML_EXT_0)
-    || (token == NW_WBXML_EXT_1)
-    || (token == NW_WBXML_EXT_2)){
-    return 1;
-  }
-  return 0;
-}
-
-
-NW_Status_t
-NW_WBXML_Parser_textIterate(NW_WBXML_Parser_t * parser){
-
-  NW_Uint8 token;
-  NW_Int32 ilen = 0;
-  NW_Uint32 index;
-  NW_Uint32 e;
-  NW_Status_t status;
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  switch (token){
-  case NW_WBXML_STR_I:
-    Handle_Content(parser);
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_getInlineStrLen(parser, parser->doc);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Inline_String(parser, (NW_Uint32)ilen);
-    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    break;
-  case NW_WBXML_STR_T:
-    Handle_Content(parser);
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
-    if ((ilen < 0) || (index >= parser->doc->strtbl.length)) {
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    if (!NW_String_valid(parser->doc->strtbl.data + index,
-                         parser->doc->strtbl.length - index,
-                         parser->doc->charset)) {
-      return  NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Table_String(parser, index);
-    if(NW_WBXML_Parser_advance(parser, ilen)< 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    break;
-  case NW_WBXML_ENTITY:
-    Handle_Content(parser);
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &e);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Entity(parser, e);
-    break;
-  case NW_WBXML_EXT_I_0:
-  case NW_WBXML_EXT_I_1:
-  case NW_WBXML_EXT_I_2:
-  case NW_WBXML_EXT_T_0:
-  case NW_WBXML_EXT_T_1:
-  case NW_WBXML_EXT_T_2:
-  case NW_WBXML_EXT_0:
-  case NW_WBXML_EXT_1:
-  case NW_WBXML_EXT_2:
-    Handle_Content(parser);
-    status = NW_WBXML_Parser_extensionParse (parser, TOKEN_STATE_TAG);
-    if(status != NW_STAT_SUCCESS){
-      return status;
-    }
-    break;
-  case NW_WBXML_OPAQUE:
-    Handle_Content(parser);
-    status = NW_WBXML_Parser_opaqueParse (parser, TOKEN_STATE_TAG);
-    if(status != NW_STAT_SUCCESS){
-      return status;
-    }
-    break;
-  case NW_WBXML_PI:
-    status = NW_WBXML_Parser_piParse (parser, TOKEN_STATE_TAG);
-    if (status != NW_STAT_SUCCESS){
-      return status;
-    }
-    break;
-  default:
-    return NW_STAT_FAILURE;
-  }
-  if (NW_WBXML_Parser_hasMoreBytecode (parser)) {
-    status = NW_WBXML_Parser_getNextToken(parser, &token, TOKEN_STATE_TAG);
-    if(status != NW_STAT_SUCCESS){
-      return status;
-    }
-    if(isTextToken(token))
-      return NW_STAT_WBXML_ITERATE_MORE;
-  }
-  return NW_STAT_WBXML_ITERATE_DONE;
-}
-
-static
-NW_Status_t
-NW_WBXML_Parser_textParse(NW_WBXML_Parser_t * parser){
-
-  NW_Status_t status;
-
-  /* Run the text iterator till it completes */
-
-  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
-    status = NW_WBXML_Parser_textIterate(parser);
-    if(status == NW_STAT_WBXML_ITERATE_DONE){
-      return NW_STAT_SUCCESS;
-    }
-    if(status != NW_STAT_WBXML_ITERATE_MORE){
-      return status;
-    }
-  }
-  return NW_WBXML_Parser_flagToStatus(parser);
-}
-
-
-/* Parse tag content */
-
-NW_Status_t
-NW_WBXML_Parser_contentParse (NW_WBXML_Parser_t * parser){
-
-  NW_Uint8 token;
-  NW_Status_t status;
-
-  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
-
-    status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
-    if(status != NW_STAT_SUCCESS){
-      return status;
-    }
-
-    switch (token){
-    case NW_WBXML_END:
-      if (NW_WBXML_Parser_hasMoreBytecode (parser)){
-        NW_WBXML_Parser_advance (parser, 1);
-      }
-      return NW_STAT_SUCCESS;             /* Normal return */
-
-    case NW_WBXML_STR_I:
-    case NW_WBXML_STR_T:
-    case NW_WBXML_ENTITY:
-    case NW_WBXML_PI:
-    case NW_WBXML_EXT_I_0:
-    case NW_WBXML_EXT_I_1:
-    case NW_WBXML_EXT_I_2:
-    case NW_WBXML_EXT_T_0:
-    case NW_WBXML_EXT_T_1:
-    case NW_WBXML_EXT_T_2:
-    case NW_WBXML_EXT_0:
-    case NW_WBXML_EXT_1:
-    case NW_WBXML_EXT_2:
-    case NW_WBXML_OPAQUE:
-      status = NW_WBXML_Parser_textParse(parser);
-      if(status != NW_STAT_SUCCESS){
-        return status;
-      }
-      break;
-    case NW_WBXML_LITERAL:
-    case NW_WBXML_LITERAL_A:
-    case NW_WBXML_LITERAL_C:
-    case NW_WBXML_LITERAL_AC:
-    default:
-      Handle_Content(parser);
-      status = NW_WBXML_Parser_elementParse (parser);
-      if(status != NW_STAT_SUCCESS){
-        return status;
-      }
-      break;
-    }
-  }
-  return NW_WBXML_Parser_flagToStatus(parser);
-}
-
-/* Parse an extension */
-
-NW_Status_t
-NW_WBXML_Parser_extensionParse (NW_WBXML_Parser_t * parser,
-                                NW_Int32 token_state)
-{
-  NW_Uint8 token = 0;
-  NW_Uint32 fq_token;
-  int ilen;
-  NW_Uint32 value;
-  NW_Status_t status;
-
-  /*  if (token_state == TOKEN_STATE_TAG)
-  * handler = parser->handler; TODO: deal with this
-  */
-
-  Handle_Extension(parser);
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, token_state);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  fq_token = FqToken (parser, token, token_state);
-  Handle_Fq_Token(parser, fq_token);
-
-  switch (token){
-  case NW_WBXML_EXT_I_0:
-  case NW_WBXML_EXT_I_1:
-  case NW_WBXML_EXT_I_2:
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-
-    ilen = NW_WBXML_Parser_getInlineStrLen(parser, parser->doc);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-
-    Handle_Inline_String(parser, (NW_Uint32)ilen);
-
-    if(NW_WBXML_Parser_advance(parser, ilen)<0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    break;
-  case NW_WBXML_EXT_T_0:
-  case NW_WBXML_EXT_T_1:
-  case NW_WBXML_EXT_T_2:
-
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &value);
-
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-
-    if (parser->ext_t_not_table_index == 0) {
-      Handle_Table_String(parser, value);
-    } else {
-      Handle_Binary(parser, value); /* handle ext_t anonymous int */
-    }
-    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    break;
-  case NW_WBXML_EXT_0:
-  case NW_WBXML_EXT_1:
-  case NW_WBXML_EXT_2:
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    /* Note - For an extension token without other parameters the
-     second parameter to Handle_Binary is bogus.  The callback is here
-     so that the parser client can manage its internal state. */
-    Handle_Binary(parser, 0);
-    break;
-  default:
-    NW_ASSERT(NW_FALSE);
-    return NW_STAT_WBXML_ERROR_BYTECODE;
-  }
-  return NW_STAT_SUCCESS;
-}
-
-
-/*
-* Parse an attribute
-*/
-
-
-
-NW_Status_t
-NW_WBXML_Parser_attributeNameParse (NW_WBXML_Parser_t * parser){
-
-  NW_Uint8 token;
-  NW_Uint32 fq_token;
-  NW_Uint32 index;
-  NW_Int32 ilen;
-  NW_Status_t status;
-
-  if (!NW_WBXML_Parser_hasMoreBytecode(parser)) {
-    return NW_STAT_WBXML_ERROR_BYTECODE;
-  }
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  if (token < 128){
-    Handle_Attr_Start(parser);
-    if (parser->status == NW_STAT_OUT_OF_MEMORY) {
-      return parser->status;
-    }
-    if(NW_WBXML_Parser_advance (parser, 1)<0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-
-    fq_token = FqToken (parser, token, TOKEN_STATE_ATTR);
-
-    Handle_Fq_Token(parser, fq_token);
-  }
-
-  else{
-    return NW_STAT_WBXML_ERROR_BYTECODE;
-  }
-
-  if (token == NW_WBXML_LITERAL){
-    /*  TODO:  Should check for another global token and return an error? */
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Table_String(parser, index);
-    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-  return NW_STAT_SUCCESS;
-}
-
-
-NW_Status_t
-NW_WBXML_Parser_attributeValsIterate (NW_WBXML_Parser_t * parser)
-{
-  NW_Uint8 token;
-  NW_Uint32 fq_token;
-  NW_Uint32 index;
-  NW_Uint32 e;
-  NW_Int32 ilen;
-  NW_Status_t status;
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  if (token == NW_WBXML_STR_I){
-    /* NW_WBXML_ATTR_COMPONENT_STRING; */
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_getInlineStrLen(parser, parser->doc);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Attr_Val(parser);
-    Handle_Inline_String(parser, (NW_Uint32) ilen);
-    if(NW_WBXML_Parser_advance(parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-  else if (token == NW_WBXML_STR_T){
-    /* NW_WBXML_ATTR_COMPONENT_STRING; */
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Attr_Val(parser);
-    Handle_Table_String(parser, index);
-    if(NW_WBXML_Parser_advance(parser, ilen)<0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-  else if (token == NW_WBXML_OPAQUE){
-    /* NW_WBXML_ATTR_COMPONENT_OPAQUE; */
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    /* Move past the length NW_Byte(s) */
-    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Attr_Val(parser);
-    Handle_Opaque(parser, index);
-    if(NW_WBXML_Parser_advance (parser, (NW_Int32)index) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-  else if (token == NW_WBXML_ENTITY){
-    /*NW_WBXML_ATTR_COMPONENT_ENTITY; */
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_readMbUint32 (parser,&e);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Entity(parser, e);
-    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-  else if ((token == NW_WBXML_EXT_I_0)
-           || (token == NW_WBXML_EXT_I_1)
-           || (token == NW_WBXML_EXT_I_2)
-           || (token == NW_WBXML_EXT_T_0)
-           || (token == NW_WBXML_EXT_T_1)
-           || (token == NW_WBXML_EXT_T_2)
-           || (token == NW_WBXML_EXT_0)
-           || (token == NW_WBXML_EXT_1)
-           || (token == NW_WBXML_EXT_2)){
-
-    /* NW_WBXML_ATTR_COMPONENT_EXT; */
-    Handle_Attr_Val(parser);
-    status = NW_WBXML_Parser_extensionParse (parser, TOKEN_STATE_ATTR);
-    if(status != NW_STAT_SUCCESS){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-  else if (token >= 128){
-    /*NW_WBXML_ATTR_COMPONENT_TOKEN; */
-    fq_token = FqToken(parser, token, TOKEN_STATE_ATTR);
-    Handle_Attr_Val(parser);
-    Handle_Fq_Token(parser, fq_token);
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-  }
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_ATTR);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  /*
-  * Attribute tokens are either text tokens or
-  * dictionary-defined tokens > 128
-  */
-  if(isTextToken(token) || (token >=128)){
-
-    return NW_STAT_WBXML_ITERATE_MORE;          /* Normal exit */
-  }
-  else /*if ((token < 128) || (token == NW_WBXML_END)
-    || (token == NW_WBXML_LITERAL))*/{
-    /*parser->state &= ~NW_WBXML_PARSER_S_ATTR_VAL; */
-    /* Don't advance parser */
-    return NW_STAT_WBXML_ITERATE_DONE;      /* Normal exit */
-  }
-}
-
-NW_Status_t
-NW_WBXML_Parser_attributeParse(NW_WBXML_Parser_t *parser)
-{
-  NW_Status_t status;
-
-  status = NW_WBXML_Parser_attributeNameParse(parser);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-  while ((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK){
-    status = NW_WBXML_Parser_attributeValsIterate(parser);
-    if(status == NW_STAT_WBXML_ITERATE_DONE){
-      return NW_STAT_SUCCESS;
-    }
-    if(status != NW_STAT_WBXML_ITERATE_MORE){
-      return status;
-    }
-  }
-  return NW_WBXML_Parser_flagToStatus(parser);
-}
-
-
-/*
-* Parse opaque data
-*/
-
-NW_Status_t
-NW_WBXML_Parser_opaqueParse (NW_WBXML_Parser_t * parser,
-                             NW_Int32 token_state)
-{
-
-  NW_Uint32 index;
-  NW_Int32 ilen = 0;
-  NW_Uint8 token;
-  NW_Status_t status;
-
-  status = NW_WBXML_Parser_getNextToken (parser, &token, token_state);
-  if(status != NW_STAT_SUCCESS){
-    return status;
-  }
-
-  switch (token){
-  case NW_WBXML_OPAQUE:
-    if(NW_WBXML_Parser_advance (parser, 1) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    ilen = NW_WBXML_Parser_readMbUint32 (parser, &index);
-    if(ilen < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    if(NW_WBXML_Parser_advance (parser, ilen) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    Handle_Opaque(parser,index);
-    if(NW_WBXML_Parser_advance (parser, (NW_Int32)index) < 0){
-      return NW_STAT_WBXML_ERROR_BYTECODE;
-    }
-    break;
-  default:
-    /* return NW_STAT_WBXML_ERROR_BYTECODE;*/
-    NW_ASSERT(NW_FALSE); /* Never reached */
-  }
-  return NW_STAT_SUCCESS;
-}
-
-
-/*
-* Parse the body of a document
-*
-* RETURN NW_STAT_SUCCESS
-*        NW_STAT_OUT_OF_MEMORY
-*        NW_STAT_BAD_INPUT_PARAM
-*        NW_STAT_WBXML_ERROR_BYTECODE
-*        NW_STAT_WBXML_ERROR_CHARSET_UNSUPPORTED
-*/
-
-NW_Status_t
-NW_WBXML_Parser_bodyParse (NW_WBXML_Parser_t * parser)
-{
-  NW_Status_t status;
-  NW_Uint8 token;
-
-  NW_ASSERT(parser != NULL);
-  // WLIU_DEBUG: RFileLogger::WriteFormat(_L("Browser"), _L("cp_count.txt"), EFileLoggingModeAppend, _L("====== body parse starts =====\n"));
-
-  /* This is not quite the WBXML grammar because we want to permit
-     loose HTML docs where there is no one document node. */
-  while (((parser->flags & NW_WBXML_PARSER_S_MASK) == NW_WBXML_PARSER_OK)
-         && NW_WBXML_Parser_hasMoreBytecode (parser)) {
-
-    status = NW_WBXML_Parser_getNextToken (parser, &token, TOKEN_STATE_TAG);
-    if(status != NW_STAT_SUCCESS){
-      return status;
-    }
-
-    switch (token){
-    case NW_WBXML_END:
-      if (NW_WBXML_Parser_hasMoreBytecode (parser)) {
-        if(NW_WBXML_Parser_advance (parser, 1) < 0){
-          return NW_STAT_WBXML_ERROR_BYTECODE;
-        }
-        Handle_Tag_End(parser);
-      }
-      break;
-
-    case NW_WBXML_STR_I:
-    case NW_WBXML_STR_T:
-    case NW_WBXML_ENTITY:
-    case NW_WBXML_PI:
-    case NW_WBXML_EXT_I_0:
-    case NW_WBXML_EXT_I_1:
-    case NW_WBXML_EXT_I_2:
-    case NW_WBXML_EXT_T_0:
-    case NW_WBXML_EXT_T_1:
-    case NW_WBXML_EXT_T_2:
-    case NW_WBXML_EXT_0:
-    case NW_WBXML_EXT_1:
-    case NW_WBXML_EXT_2:
-    case NW_WBXML_OPAQUE:
-      status = NW_WBXML_Parser_textParse(parser);
-      if(status != NW_STAT_SUCCESS){
-        return status;
-      }
-      break;
-
-    case NW_WBXML_LITERAL:
-    case NW_WBXML_LITERAL_A:
-    case NW_WBXML_LITERAL_C:
-    case NW_WBXML_LITERAL_AC:
-    default:
-      status = NW_WBXML_Parser_elementParse (parser);
-      if(status != NW_STAT_SUCCESS){
-        return status;
-      }
-      break;
-    }
-  }
-  CHECK_PARSER_STATUS;
-
-  /*
-  * If we have a registry then it must be inited at this point, so
-  * set the init flag.
-  */
-
-  if((parser->cp_registry.count > 0)
-    && ((parser->flags & NW_WBXML_REGISTRY_INIT) != NW_WBXML_REGISTRY_INIT)){
-    parser->flags |= NW_WBXML_REGISTRY_INIT;
-  }
-
-  // WLIU_DEBUG: RFileLogger::WriteFormat(_L("Browser"), _L("cp_count.txt"), EFileLoggingModeAppend, _L("====== body parse ends =====\n"));
-
-  if (parser->handler && parser->handler->EndDocument_CB){
-    return (*(parser->handler->EndDocument_CB)) (parser, parser->context);
-  }
-  return NW_STAT_SUCCESS;
-}
-
-
-/*
-* Cache the parser's event handler and context
-*
-* RETURN: NW_STAT_SUCCESS
-*/
-
-EXPORT_C NW_Status_t
-NW_WBXML_Parser_registerHandler (NW_WBXML_Parser_t * parser,
-                                 const struct NW_WBXML_EventHandler_s * handler,
-                                 void *context)
-{
-
-  NW_ASSERT(parser != NULL);
-
-  parser->handler = handler;
-  parser->context = context;
-
-  return NW_STAT_SUCCESS;
-}