gfx/skia/trunk/src/ports/SkXMLParser_expat.cpp

changeset 0
6474c204b198
     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 +}

mercurial