Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(678)

Unified Diff: src/ports/SkFontConfigParser_android.cpp

Issue 915443002: Additional cleanups to Android config parsing. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Prevent future bit rot in test debug dump. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « platform_tools/android/gyp/dependencies.gypi ('k') | tests/FontConfigParser.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « platform_tools/android/gyp/dependencies.gypi ('k') | tests/FontConfigParser.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698