Index: src/ports/SkFontConfigParser_android.cpp |
diff --git a/src/ports/SkFontConfigParser_android.cpp b/src/ports/SkFontConfigParser_android.cpp |
index 78d997dccfd9987ff055d5953656f354cdec9e6f..20fee40a78592ffa212a23fe86ad7339776825ba 100644 |
--- a/src/ports/SkFontConfigParser_android.cpp |
+++ b/src/ports/SkFontConfigParser_android.cpp |
@@ -115,7 +115,7 @@ static bool memeq(const char* s1, const char* s2, size_t n1, size_t n2) { |
namespace lmpParser { |
-void familyElementHandler(FontFamily* family, const char** attributes) { |
+static void family_element_handler(FontFamily* family, const char** attributes) { |
// A non-fallback <family> tag must have a canonical name attribute. |
// A fallback <family> tag has no name, and may have lang and variant |
// attributes. |
@@ -142,12 +142,12 @@ void familyElementHandler(FontFamily* family, const char** attributes) { |
} |
} |
-void XMLCALL fontFileNameHandler(void* data, const char* s, int len) { |
+static void XMLCALL font_file_name_handler(void* data, const char* s, int len) { |
FamilyData* self = static_cast<FamilyData*>(data); |
self->fCurrentFontInfo->fFileName.append(s, len); |
} |
-void fontElementHandler(FamilyData* self, FontFileInfo* file, const char** attributes) { |
+static void font_element_handler(FamilyData* self, FontFileInfo* file, const char** attributes) { |
// A <font> should have weight (integer) and style (normal, italic) attributes. |
// NOTE: we ignore the style. |
// The element should contain a filename. |
@@ -161,10 +161,10 @@ void fontElementHandler(FamilyData* self, FontFileInfo* file, const char** attri |
} |
} |
} |
- XML_SetCharacterDataHandler(self->fParser, fontFileNameHandler); |
+ XML_SetCharacterDataHandler(self->fParser, font_file_name_handler); |
} |
-FontFamily* findFamily(FamilyData* self, const SkString& familyName) { |
+static FontFamily* find_family(FamilyData* self, const SkString& familyName) { |
for (int i = 0; i < self->fFamilies.count(); i++) { |
FontFamily* candidate = self->fFamilies[i]; |
for (int j = 0; j < candidate->fNames.count(); j++) { |
@@ -176,7 +176,7 @@ FontFamily* findFamily(FamilyData* self, const SkString& familyName) { |
return NULL; |
} |
-void aliasElementHandler(FamilyData* self, const char** attributes) { |
+static void alias_element_handler(FamilyData* self, const char** attributes) { |
// An <alias> must have name and to attributes. |
// It may have weight (integer). |
// If it *does not* have a weight, it is a variant name for a <family>. |
@@ -203,7 +203,7 @@ void aliasElementHandler(FamilyData* self, const char** attributes) { |
} |
// Assumes that the named family is already declared |
- FontFamily* targetFamily = findFamily(self, to); |
+ FontFamily* targetFamily = find_family(self, to); |
if (!targetFamily) { |
SkDebugf("---- Font alias target %s (NOT FOUND)", to.c_str()); |
return; |
@@ -224,22 +224,22 @@ void aliasElementHandler(FamilyData* self, const char** attributes) { |
} |
} |
-void XMLCALL startElementHandler(void* data, const char* tag, const char** attributes) { |
+static void XMLCALL start_element_handler(void* data, const char* tag, const char** attributes) { |
FamilyData* self = static_cast<FamilyData*>(data); |
size_t len = strlen(tag); |
if (MEMEQ("family", tag, len)) { |
self->fCurrentFamily.reset(new FontFamily(self->fBasePath, self->fIsFallback)); |
- familyElementHandler(self->fCurrentFamily, attributes); |
+ family_element_handler(self->fCurrentFamily, attributes); |
} else if (MEMEQ("font", tag, len)) { |
FontFileInfo* file = &self->fCurrentFamily->fFonts.push_back(); |
self->fCurrentFontInfo = file; |
- fontElementHandler(self, file, attributes); |
+ font_element_handler(self, file, attributes); |
} else if (MEMEQ("alias", tag, len)) { |
- aliasElementHandler(self, attributes); |
+ alias_element_handler(self, attributes); |
} |
} |
-void XMLCALL endElementHandler(void* data, const char* tag) { |
+static void XMLCALL end_element_handler(void* data, const char* tag) { |
FamilyData* self = static_cast<FamilyData*>(data); |
size_t len = strlen(tag); |
if (MEMEQ("family", tag, len)) { |
@@ -337,8 +337,8 @@ static void XMLCALL start_element_handler(void* data, const char* tag, const cha |
int version; |
if (parse_non_negative_integer(valueString, &version) && (version >= 21)) { |
XML_SetElementHandler(self->fParser, |
- lmpParser::startElementHandler, |
- lmpParser::endElementHandler); |
+ lmpParser::start_element_handler, |
+ lmpParser::end_element_handler); |
self->fVersion = version; |
} |
} |
@@ -405,6 +405,12 @@ static void XMLCALL xml_entity_decl_handler(void *data, |
XML_StopParser(self->fParser, XML_FALSE); |
} |
+static const XML_Memory_Handling_Suite sk_XML_alloc = { |
+ sk_malloc_throw, |
+ sk_realloc_throw, |
+ sk_free |
+}; |
+ |
template<typename T> struct remove_ptr {typedef T type;}; |
template<typename T> struct remove_ptr<T*> {typedef T type;}; |
@@ -424,7 +430,8 @@ static int parse_config_file(const char* filename, SkTDArray<FontFamily*>& famil |
return -1; |
} |
- SkAutoTCallVProc<remove_ptr<XML_Parser>::type, XML_ParserFree> parser(XML_ParserCreate(NULL)); |
+ SkAutoTCallVProc<remove_ptr<XML_Parser>::type, XML_ParserFree> parser( |
+ XML_ParserCreate_MM(NULL, &sk_XML_alloc, NULL)); |
if (!parser) { |
SkDebugf("Could not create XML parser.\n"); |
return -1; |
@@ -439,12 +446,20 @@ static int parse_config_file(const char* filename, SkTDArray<FontFamily*>& famil |
// Start parsing oldschool; switch these in flight if we detect a newer version of the file. |
XML_SetElementHandler(parser, jbParser::start_element_handler, jbParser::end_element_handler); |
- char buffer[512]; |
+ // One would assume it would be faster to have a buffer on the stack and call XML_Parse. |
+ // But XML_Parse will call XML_GetBuffer anyway and memmove the passed buffer into it. |
+ // (Unless XML_CONTEXT_BYTES is undefined, but all users define it.) |
+ static const int bufferSize = 512; |
bool done = false; |
while (!done) { |
- size_t len = file.read(buffer, SK_ARRAY_COUNT(buffer)); |
+ void* buffer = XML_GetBuffer(parser, bufferSize); |
+ if (!buffer) { |
+ SkDebugf("Could not buffer enough to continue.\n"); |
+ return -1; |
+ } |
+ size_t len = file.read(buffer, bufferSize); |
done = file.isAtEnd(); |
- XML_Status status = XML_Parse(parser, buffer, len, done); |
+ XML_Status status = XML_ParseBuffer(parser, len, done); |
if (XML_STATUS_ERROR == status) { |
XML_Error error = XML_GetErrorCode(parser); |
int line = XML_GetCurrentLineNumber(parser); |