1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/ports/SkXMLParser_expat.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,140 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2006 The Android Open Source Project 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 +#include "SkXMLParser.h" 1.14 +#include "SkString.h" 1.15 +#include "SkStream.h" 1.16 + 1.17 +#include "expat.h" 1.18 + 1.19 +#ifdef SK_BUILD_FOR_PPI 1.20 +#define CHAR_16_TO_9 1.21 +#endif 1.22 + 1.23 +#if defined CHAR_16_TO_9 1.24 +inline size_t sk_wcslen(const short* char16) { 1.25 + const short* start = char16; 1.26 + while (*char16) 1.27 + char16++; 1.28 + return char16 - start; 1.29 +} 1.30 + 1.31 +inline const char* ConvertUnicodeToChar(const short* ch16, size_t len, SkAutoMalloc& ch8Malloc) { 1.32 + char* ch8 = (char*) ch8Malloc.get(); 1.33 + int index; 1.34 + for (index = 0; index < len; index++) 1.35 + ch8[index] = (char) ch16[index]; 1.36 + ch8[index] = '\0'; 1.37 + return ch8; 1.38 +} 1.39 +#endif 1.40 + 1.41 +static void XMLCALL start_proc(void *data, const char *el, const char **attr) 1.42 +{ 1.43 +#if defined CHAR_16_TO_9 1.44 + size_t len = sk_wcslen((const short*) el); 1.45 + SkAutoMalloc el8(len + 1); 1.46 + el = ConvertUnicodeToChar((const short*) el, len, el8); 1.47 +#endif 1.48 + if (((SkXMLParser*)data)->startElement(el)) { 1.49 + XML_StopParser((XML_Parser) ((SkXMLParser*)data)->fParser, false); 1.50 + return; 1.51 + } 1.52 + while (*attr) 1.53 + { 1.54 + const char* attr0 = attr[0]; 1.55 + const char* attr1 = attr[1]; 1.56 +#if defined CHAR_16_TO_9 1.57 + size_t len0 = sk_wcslen((const short*) attr0); 1.58 + SkAutoMalloc attr0_8(len0 + 1); 1.59 + attr0 = ConvertUnicodeToChar((const short*) attr0, len0, attr0_8); 1.60 + size_t len1 = sk_wcslen((const short*) attr1); 1.61 + SkAutoMalloc attr1_8(len1 + 1); 1.62 + attr1 = ConvertUnicodeToChar((const short*) attr1, len1, attr1_8); 1.63 +#endif 1.64 + if (((SkXMLParser*)data)->addAttribute(attr0, attr1)) { 1.65 + XML_StopParser((XML_Parser) ((SkXMLParser*)data)->fParser, false); 1.66 + return; 1.67 + } 1.68 + attr += 2; 1.69 + } 1.70 +} 1.71 + 1.72 +static void XMLCALL end_proc(void *data, const char *el) 1.73 +{ 1.74 +#if defined CHAR_16_TO_9 1.75 + size_t len = sk_wcslen((const short*) el); 1.76 + SkAutoMalloc el8(len + 1); 1.77 + el = ConvertUnicodeToChar((const short*) el, len, el8); 1.78 +#endif 1.79 + if (((SkXMLParser*)data)->endElement(el)) 1.80 + XML_StopParser((XML_Parser) ((SkXMLParser*)data)->fParser, false); 1.81 +} 1.82 + 1.83 +static void XMLCALL text_proc(void* data, const char* text, int len) 1.84 +{ 1.85 +#if defined CHAR_16_TO_9 1.86 + SkAutoMalloc text8(len + 1); 1.87 + text = ConvertUnicodeToChar((const short*) text, len, text8); 1.88 +#endif 1.89 + if (((SkXMLParser*)data)->text(text, len)) 1.90 + XML_StopParser((XML_Parser) ((SkXMLParser*)data)->fParser, false); 1.91 +} 1.92 + 1.93 +bool SkXMLParser::parse(const char doc[], size_t len) 1.94 +{ 1.95 + if (len == 0) { 1.96 + fError->fCode = SkXMLParserError::kEmptyFile; 1.97 + reportError(NULL); 1.98 + return false; 1.99 + } 1.100 + XML_Parser p = XML_ParserCreate(NULL); 1.101 + SkASSERT(p); 1.102 + fParser = p; 1.103 + XML_SetElementHandler(p, start_proc, end_proc); 1.104 + XML_SetCharacterDataHandler(p, text_proc); 1.105 + XML_SetUserData(p, this); 1.106 + 1.107 + bool success = true; 1.108 + int error = XML_Parse(p, doc, len, true); 1.109 + if (error == XML_STATUS_ERROR) { 1.110 + reportError(p); 1.111 + success = false; 1.112 + } 1.113 + XML_ParserFree(p); 1.114 + return success; 1.115 +} 1.116 + 1.117 +bool SkXMLParser::parse(SkStream& input) 1.118 +{ 1.119 + size_t len = input.getLength(); 1.120 + SkAutoMalloc am(len); 1.121 + char* doc = (char*)am.get(); 1.122 + 1.123 + input.rewind(); 1.124 + size_t len2 = input.read(doc, len); 1.125 + SkASSERT(len2 == len); 1.126 + 1.127 + return this->parse(doc, len2); 1.128 +} 1.129 + 1.130 +void SkXMLParser::reportError(void* p) 1.131 +{ 1.132 + XML_Parser parser = (XML_Parser) p; 1.133 + if (fError && parser) { 1.134 + fError->fNativeCode = XML_GetErrorCode(parser); 1.135 + fError->fLineNumber = XML_GetCurrentLineNumber(parser); 1.136 + } 1.137 +} 1.138 + 1.139 +void SkXMLParser::GetNativeErrorString(int error, SkString* str) 1.140 +{ 1.141 + if (str) 1.142 + str->set(XML_ErrorString((XML_Error) error)); 1.143 +}