145{
146 ParsingContext ctx(this);
147 if (!ctx.fXMLParser) {
148 SkDEBUGF(
"could not create XML parser\n");
149 return false;
150 }
151
152
153
154
155 unsigned long seed = static_cast<unsigned long>(
156 reinterpret_cast<size_t>(kHashSeed) & 0xFFFFFFFF);
157 XML_SetHashSalt(ctx.fXMLParser, seed ? seed : 1);
158
159 XML_SetUserData(ctx.fXMLParser, &ctx);
161 XML_SetCharacterDataHandler(ctx.fXMLParser, text_handler);
162
163
164 XML_SetEntityDeclHandler(ctx.fXMLParser, entity_decl_handler);
165
166 XML_Status status = XML_STATUS_OK;
169 status = XML_Parse(ctx.fXMLParser,
172 true);
173 } else {
176 do {
179 SkDEBUGF(
"could not buffer enough to continue\n");
180 return false;
181 }
182
185 status = XML_ParseBuffer(ctx.fXMLParser,
SkToS32(len),
done);
186 if (XML_STATUS_ERROR == status) {
187 break;
188 }
190 }
191 if (XML_STATUS_ERROR == status) {
192#if defined(SK_DEBUG)
193 XML_Error
error = XML_GetErrorCode(ctx.fXMLParser);
194 int line = XML_GetCurrentLineNumber(ctx.fXMLParser);
195 int column = XML_GetCurrentColumnNumber(ctx.fXMLParser);
196 const XML_LChar* errorString = XML_ErrorString(
error);
197 SkDEBUGF(
"parse error @%d:%d: %d (%s).\n", line, column,
error, errorString);
198#endif
199 return false;
200 }
201
202 return true;
203}
static void done(const char *config, const char *src, const char *srcOptions, const char *name)
static void XMLCALL start_element_handler(void *data, const char *tag, const char **attributes)
static void XMLCALL end_element_handler(void *data, const char *tag)
static const size_t kBufferSize
constexpr int32_t SkToS32(S x)
virtual size_t getPosition() const
virtual bool isAtEnd() const =0
virtual size_t getLength() const
virtual const void * getMemoryBase()
virtual bool hasLength() const
virtual size_t read(void *buffer, size_t size)=0
static const uint8_t buffer[]
const uint8_t uint32_t uint32_t GError ** error