19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <xml/xml_tinyParser.h> 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t xml_errno; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef XML_DOM_PARSER 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define XML_IS_WHITESPACE(x) ((x) == '\t' || (x) == '\n' || (x) == ' ' || (x) == '\r') 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define XML_IS_NAMECHAR(ch) (isalpha(ch) || isdigit(ch) || ch ==':' || \ 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ch == '_' || ch == '-' || ch =='.') 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic uint8_t *xml_ignore_blank(uint8_t *buffer) 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (XML_IS_WHITESPACE(*buffer)) 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic uint8_t *xml_goto_tagend(uint8_t *buffer) 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t nameLen, valueLen; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *name, *value; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Ignore the start-tag */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '<') { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (buffer != NULL && XML_IS_NAMECHAR(*buffer)) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = xml_ignore_blank(buffer))) 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '>' || (*buffer == '/' && *(buffer + 1) == '>')) 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_DOM_getAttr(buffer, &name, &nameLen, &value, &valueLen)) 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = value + valueLen + 1; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (*buffer != '\0'); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic uint8_t *xml_match_tag(uint8_t *buffer) 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t tagLen, tagType, bal; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bal = 0; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = XML_DOM_getTag(buffer, &tagLen, &tagType))) 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (tagType) { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XML_TAG_SELF: 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XML_TAG_START: 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = xml_goto_tagend(buffer + tagLen + 1))) 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strncmp((char *)buffer, "/>", 2) == 0) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += 2; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bal++; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XML_TAG_END: 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bal <= 0) 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = buffer + tagLen + 2; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bal--; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (bal != 0); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *XML_DOM_getAttr(uint8_t *buffer, uint8_t **pName, int32_t *nameLen, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t **pValue, int32_t *valueLen) 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t charQuoted; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Ignore the tag */ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '<') { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Ignore the STag */ 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (buffer != NULL && XML_IS_NAMECHAR(*buffer)) 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = xml_ignore_blank(buffer))) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Name */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pName = buffer; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (buffer != NULL && XML_IS_NAMECHAR(*buffer)) 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ATTR_NAME); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *nameLen = buffer - *pName; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*nameLen <= 0) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ATTR_NAME); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* '=' */ 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = xml_ignore_blank(buffer); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer || *buffer != '=') { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ATTR_MISSED_EQUAL); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Value */ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = xml_ignore_blank(buffer); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer || (*buffer != '"' && *buffer != '\'')) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ATTR_VALUE); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project charQuoted = *buffer++; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pValue = buffer; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*buffer != '\0' && *buffer != charQuoted) 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer != charQuoted) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ATTR_VALUE); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = buffer - *pValue; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer + 1; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *XML_DOM_getValue(uint8_t *buffer, uint8_t **pValue, int32_t *valueLen) 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pEnd; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Ignore the STag */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '<') { 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* If it's an end_tag, no value should be returned */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '/') { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = 0; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NOVALUE); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (buffer != NULL && XML_IS_NAMECHAR(*buffer)) 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = xml_goto_tagend(buffer))) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_PROPERTY_END); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* <test/> node found */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '/') { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*(buffer + 1) != '>') { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_PROPERTY_END); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = 0; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '>') 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = xml_ignore_blank(buffer))) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* the following is a tag instead of the value */ 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '<') { /* nono value, such as <test></test> */ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer != '/') { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ENDTAG); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = 0; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pValue = buffer; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = NULL; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*buffer != '\0' && *buffer != '<') { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!XML_IS_WHITESPACE(*buffer)) 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = buffer; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer != '<' || pEnd == NULL) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_VALUE); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = pEnd - *pValue + 1; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer != '/') { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ENDTAG); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer - 1; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *XML_DOM_getTag(uint8_t *buffer, int32_t *tagLen, int32_t *tagType) 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pStart; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* WARNING: <!-- --> comment is not supported in this verison */ 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*buffer != '<') { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '\0') { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '\"' || *buffer == '\'') { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t charQuoted = *buffer; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (*buffer != '\0' && *buffer != charQuoted) 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '\0') { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (*buffer == '!' || *buffer == '?'); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pStart = buffer - 1; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == '/') { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *tagType = XML_TAG_END; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* check here if it is self-end-tag */ 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pCheck = xml_goto_tagend(pStart); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pCheck == NULL) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_PROPERTY_END); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*pCheck == '>') 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *tagType = XML_TAG_START; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (strncmp((char *)pCheck, "/>", 2) == 0) 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *tagType = XML_TAG_SELF; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_PROPERTY_END); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (buffer != NULL && XML_IS_NAMECHAR(*buffer)) 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*tagType == XML_TAG_END) 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *tagLen = buffer - pStart - 2; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *tagLen = buffer - pStart - 1; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pStart; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *XML_DOM_getNode(uint8_t *buffer, const uint8_t *const node) 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pStart; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t buf[XML_MAX_PROPERTY_LEN + 2]; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *nodeStr = buf; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *retPtr = NULL; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t tagLen, tagType; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *lastNode = (uint8_t *)""; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)nodeStr, (char *)node, XML_MAX_PROPERTY_LEN); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strcat((char *)nodeStr, "\\"); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pStart = (uint8_t *)strchr((char *)nodeStr, '\\'); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (pStart != NULL) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pStart = '\0'; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* get the first start_tag from buffer */ 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = XML_DOM_getTag(buffer, &tagLen, &tagType))) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_SUCH_NODE); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagType == XML_TAG_END) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (0 == 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncmp((char *)lastNode, (char *)(buffer + 2), strlen((char *)lastNode))) 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_SUCH_NODE); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_START_TAG); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* wrong node, contiue to fetch the next node */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((int32_t) strlen((char *)nodeStr) != tagLen 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || strncmp((char *)nodeStr, (char *)(buffer + 1), tagLen) != 0) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* we should ignore all the middle code */ 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = xml_match_tag(buffer); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project retPtr = buffer; /* retPtr starts with '<xxx>' */ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += (tagLen + 1); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagType == XML_TAG_SELF) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nodeStr = pStart + 1; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastNode = nodeStr; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nodeStr = pStart + 1; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pStart = (uint8_t *)strchr((char *)nodeStr, '\\'); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Check 5: nodeStr should be empty here */ 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*nodeStr != '\0') { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_SUCH_NODE); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return retPtr; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *XML_DOM_getNodeValue(uint8_t *buffer, uint8_t *node, 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t **value, int32_t *valueLen) 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pStart; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *lastTag; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == node || NULL == buffer) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastTag = node + strlen((char *)node) - 1; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (lastTag >= node && *lastTag != '\\') 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastTag--; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastTag++; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (pStart = XML_DOM_getNode(buffer, node))) 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pStart += (strlen((char *)lastTag) + 1); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (pStart = xml_goto_tagend(pStart))) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_PROPERTY_END); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (pStart = XML_DOM_getValue(pStart, value, valueLen))) 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Check the end tag */ 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef XML_DOM_CHECK_ENDTAG 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strncmp((char *)pStart, "/>", 2) == 0) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (strncmp((char *)lastTag, (char *)(pStart + 2), strlen((char *)lastTag)) != 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_ENDTAG); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return *value; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *XML_DOM_getNextNode(uint8_t *buffer, uint8_t **pNodeName, int32_t *nodenameLen) 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t tagType; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (buffer = XML_DOM_getTag(buffer + 1, nodenameLen, &tagType))) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_SUCH_NODE); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (tagType == XML_TAG_END); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *pNodeName = buffer + 1; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* XML_DOM_PARSER */ 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef WBXML_DOM_PARSER 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef WBXML_OLD_VERSION 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *WBXML_DOM_getNode(uint8_t *buffer, int32_t bufferLen, 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *node) 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t i = 0, j = 0; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer || node == NULL) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_BUFFER_NULL); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < bufferLen) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (WBXML_GET_TAG(buffer[i]) == WBXML_GET_TAG(node[j])) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j++; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (node[j] == '\0') 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Check if there is the content(it should have content) */ 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!WBXML_HAS_CONTENT(buffer[i])) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*XML_ERROR(WBXML_ERROR_MISSED_CONTENT); */ 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_SUCH_NODE); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Ignore the attrib filed */ 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (WBXML_HAS_ATTR(buffer[i])) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < bufferLen && buffer[i] != WBXML_ATTR_END) 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= bufferLen) 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* Ignore the content filed */ 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer[i] == WBXML_STR_I) { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < bufferLen && buffer[i] != WBXML_END) 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= bufferLen) 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i >= bufferLen) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_SUCH_NODE); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buffer + i + 1; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t *WBXML_DOM_getNodeValue(uint8_t *buffer, int32_t bufferLen, 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *node, 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t **value, int32_t *valueLen) 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t i; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pEnd; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = NULL; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = 0; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pEnd = buffer + bufferLen; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = WBXML_DOM_getNode(buffer, bufferLen, node); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == buffer) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_NO_SUCH_NODE); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer == WBXML_OPAUE) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = WBXML_GetUintVar(buffer, &i); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*valueLen < 0) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(WBXML_ERROR_MBUINT32); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += i; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = buffer; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return *value; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (*buffer != WBXML_STR_I) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(WBXML_ERROR_MISSED_STARTTAG); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i = 0; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((buffer + i) < pEnd && buffer[i] != WBXML_END) 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (buffer[i] != WBXML_END) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(WBXML_ERROR_MISSED_ENDTAG); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *value = buffer; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *valueLen = i; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_ERROR(XML_ERROR_OK); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return *value; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* WBXML_OLD_VERSION */ 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MAX_UINT_VAR_BYTE 4 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define UINTVAR_INVALID -1 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint32_t WBXML_GetUintVar(const uint8_t *const buffer, int32_t *len) 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t i, byteLen; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sum; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byteLen = 0; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((buffer[byteLen] & 0x80) > 0 && byteLen < MAX_UINT_VAR_BYTE) 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byteLen++; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (byteLen > MAX_UINT_VAR_BYTE) 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return UINTVAR_INVALID; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *len = byteLen + 1; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sum = buffer[byteLen]; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (i = byteLen - 1; i >= 0; i--) 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sum += ((buffer[i] & 0x7F) << 7 * (byteLen - i)); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sum; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectXML_BOOL WBXML_DOM_Init(WBXML * pWbxml, uint8_t *buffer, 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t bufferLen) 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t num, len; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->End = buffer + bufferLen; 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->version = *buffer++; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UINTVAR_INVALID == (num = WBXML_GetUintVar(buffer, &len))) 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XML_FALSE; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += len; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->publicid = num; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UINTVAR_INVALID == (num = WBXML_GetUintVar(buffer, &len))) 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XML_FALSE; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += len; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->charset = num; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (UINTVAR_INVALID == (num = WBXML_GetUintVar(buffer, &len))) 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XML_FALSE; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += len; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->strTable = buffer; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->strTableLen = num; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += num; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->curPtr = pWbxml->Content = buffer; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->depth = 0; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XML_TRUE; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid WBXML_DOM_Rewind(WBXML * pWbxml) 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->curPtr = pWbxml->Content; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectXML_BOOL WBXML_DOM_Eof(WBXML * pWbxml) 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pWbxml->curPtr > pWbxml->End) 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XML_TRUE; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XML_FALSE; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t WBXML_DOM_GetTag(WBXML * pWbxml) 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t tagChar; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pWbxml->curPtr > pWbxml->End) 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return XML_EOF; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project tagChar = *pWbxml->curPtr; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->curPtr++; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (WBXML_GET_TAG(tagChar) == WBXML_CONTENT_END) 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->depth--; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->depth++; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return tagChar; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t WBXML_DOM_GetChar(WBXML * pWbxml) 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return *pWbxml->curPtr++; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid WBXML_DOM_Seek(WBXML * pWbxml, int32_t offset) 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->curPtr += offset; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectuint8_t WBXML_DOM_GetUIntVar(WBXML * pWbxml) 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t num, len; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project num = WBXML_GetUintVar(pWbxml->curPtr, &len); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pWbxml->curPtr += len; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (uint8_t)num; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef XML_TREE_STRUCTURE 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef DEBUG_MODE 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t malloc_times = 0; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int32_t free_times = 0; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid XML_PrintMallocInfo() 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("====XML_PrintMallocInfo====\n"); 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" Total malloc times:%d\n", malloc_times); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf(" Total free times:%d\n", free_times); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project printf("===========================\n"); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid *xml_malloc(int32_t size) 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef DEBUG_MODE 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project malloc_times++; 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return malloc(size); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid xml_free(void *buffer) 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef DEBUG_MODE 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project free_times++; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project free(buffer); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectXML_TREE *xml_tree_fillnode(uint8_t **buf, int32_t tagLen) 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_TREE *Tree; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pAttr, *pName, *pValue; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t nameLen, valueLen; 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *buffer = *buf; 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (Tree = (XML_TREE *) xml_malloc(sizeof(XML_TREE)))) 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(Tree, 0, sizeof(XML_TREE)); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)Tree->tag, (char *)++buffer, tagLen); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer += tagLen; 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pAttr = buffer; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* attribute */ 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NULL != 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (pAttr = 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_DOM_getAttr(pAttr, &pName, &nameLen, &pValue, 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &valueLen))) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_TREE_ATTR *attr; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (attr = (XML_TREE_ATTR *) xml_malloc(sizeof(XML_TREE_ATTR)))) 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(attr, 0, sizeof(XML_TREE_ATTR)); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)attr->name, (char *)pName, nameLen); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)attr->value, (char *)pValue, valueLen); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = pValue + valueLen + 1; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL != Tree->attr) // no attribute now 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Tree->last_attr->next = attr; 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Tree->attr = attr; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Tree->last_attr = attr; 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* value */ 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pAttr = XML_DOM_getValue(buffer, &pValue, &valueLen); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pAttr != NULL && valueLen > 0) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project strncpy((char *)Tree->value, (char *)pValue, valueLen); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer = pValue + valueLen; 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *buf = buffer; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Tree; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectXML_TREE *XML_makeTree(uint8_t **buf) 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *pBuf; 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t valueLen, tagType; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t *buffer = *buf; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_TREE *TreeHead = NULL; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (buffer = XML_DOM_getTag(buffer, &valueLen, &tagType))) 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (XML_TAG_END == tagType) 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (TreeHead = xml_tree_fillnode(&buffer, valueLen))) 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (XML_TAG_SELF == tagType) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *buf = buffer; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TreeHead; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == (pBuf = XML_DOM_getTag(buffer, &valueLen, &tagType))) 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (tagType) { 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XML_TAG_SELF: 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XML_TAG_START: 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == TreeHead->child) 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TreeHead->child = XML_makeTree(&buffer); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else if (NULL == TreeHead->child->last_brother) { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TreeHead->child->brother = XML_makeTree(&buffer); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TreeHead->child->last_brother = TreeHead->child->brother; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TreeHead->child->last_brother->brother = 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_makeTree(&buffer); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TreeHead->child->last_brother = 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TreeHead->child->last_brother->brother; 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case XML_TAG_END: 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *buf = pBuf; 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TreeHead; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project buffer++; 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (1); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid XML_freeTree(XML_TREE * pTree) 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_TREE *p, *pNext; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_TREE_ATTR *pa, *lastpa; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL == pTree) 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pTree->brother; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NULL != p) { 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pNext = p->brother; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p->brother = NULL; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_freeTree(p); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pNext; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NULL != pTree->child) 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XML_freeTree(pTree->child); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = pTree->attr; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (NULL != pa) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lastpa = pa; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = pa->next; 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xml_free(lastpa); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xml_free(pTree); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* XML_TREE_STRUCTURE */ 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif /* WBXML_DOM_PARSER */ 835