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

Side by Side Diff: src/ports/SkFontMgr_android_parser.cpp

Issue 1316233002: Style Change: NULL->nullptr (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2015-08-27 (Thursday) 10:25:06 EDT Created 5 years, 3 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 unified diff | Download patch
« no previous file with comments | « src/ports/SkFontMgr_android_parser.h ('k') | src/ports/SkFontMgr_custom.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The Android Open Source Project 2 * Copyright 2011 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkFontMgr_android_parser.h" 8 #include "SkFontMgr_android_parser.h"
9 #include "SkStream.h" 9 #include "SkStream.h"
10 #include "SkTDArray.h" 10 #include "SkTDArray.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 * 44 *
45 * If the 'familyset' 'version' attribute is 21 or higher the LMP parser is used , otherwise the JB. 45 * If the 'familyset' 'version' attribute is 21 or higher the LMP parser is used , otherwise the JB.
46 */ 46 */
47 47
48 struct FamilyData; 48 struct FamilyData;
49 49
50 struct TagHandler { 50 struct TagHandler {
51 /** Called at the start tag. 51 /** Called at the start tag.
52 * Called immediately after the parent tag retuns this handler from a call to 'tag'. 52 * Called immediately after the parent tag retuns this handler from a call to 'tag'.
53 * Allows setting up for handling the tag content and processing attributes . 53 * Allows setting up for handling the tag content and processing attributes .
54 * If NULL, will not be called. 54 * If nullptr, will not be called.
55 */ 55 */
56 void (*start)(FamilyData* data, const char* tag, const char** attributes); 56 void (*start)(FamilyData* data, const char* tag, const char** attributes);
57 57
58 /** Called at the end tag. 58 /** Called at the end tag.
59 * Allows post-processing of any accumulated information. 59 * Allows post-processing of any accumulated information.
60 * This will be the last call made in relation to the current tag. 60 * This will be the last call made in relation to the current tag.
61 * If NULL, will not be called. 61 * If nullptr, will not be called.
62 */ 62 */
63 void (*end)(FamilyData* data, const char* tag); 63 void (*end)(FamilyData* data, const char* tag);
64 64
65 /** Called when a nested tag is encountered. 65 /** Called when a nested tag is encountered.
66 * This is responsible for determining how to handle the tag. 66 * This is responsible for determining how to handle the tag.
67 * If the tag is not recognized, return NULL to skip the tag. 67 * If the tag is not recognized, return nullptr to skip the tag.
68 * If NULL, all nested tags will be skipped. 68 * If nullptr, all nested tags will be skipped.
69 */ 69 */
70 const TagHandler* (*tag)(FamilyData* data, const char* tag, const char** att ributes); 70 const TagHandler* (*tag)(FamilyData* data, const char* tag, const char** att ributes);
71 71
72 /** The character handler for this tag. 72 /** The character handler for this tag.
73 * This is only active for character data contained directly in this tag (n ot sub-tags). 73 * This is only active for character data contained directly in this tag (n ot sub-tags).
74 * The first parameter will be castable to a FamilyData*. 74 * The first parameter will be castable to a FamilyData*.
75 * If NULL, any character data in this tag will be ignored. 75 * If nullptr, any character data in this tag will be ignored.
76 */ 76 */
77 XML_CharacterDataHandler chars; 77 XML_CharacterDataHandler chars;
78 }; 78 };
79 79
80 /** Represents the current parsing state. */ 80 /** Represents the current parsing state. */
81 struct FamilyData { 81 struct FamilyData {
82 FamilyData(XML_Parser parser, SkTDArray<FontFamily*>& families, 82 FamilyData(XML_Parser parser, SkTDArray<FontFamily*>& families,
83 const SkString& basePath, bool isFallback, const char* filename, 83 const SkString& basePath, bool isFallback, const char* filename,
84 const TagHandler* topLevelHandler) 84 const TagHandler* topLevelHandler)
85 : fParser(parser) 85 : fParser(parser)
86 , fFamilies(families) 86 , fFamilies(families)
87 , fCurrentFamily(NULL) 87 , fCurrentFamily(nullptr)
88 , fCurrentFontInfo(NULL) 88 , fCurrentFontInfo(nullptr)
89 , fVersion(0) 89 , fVersion(0)
90 , fBasePath(basePath) 90 , fBasePath(basePath)
91 , fIsFallback(isFallback) 91 , fIsFallback(isFallback)
92 , fFilename(filename) 92 , fFilename(filename)
93 , fDepth(1) 93 , fDepth(1)
94 , fSkip(0) 94 , fSkip(0)
95 , fHandler(&topLevelHandler, 1) 95 , fHandler(&topLevelHandler, 1)
96 { }; 96 { };
97 97
98 XML_Parser fParser; // The expat parser doing the work , owned by caller 98 XML_Parser fParser; // The expat parser doing the work , owned by caller
99 SkTDArray<FontFamily*>& fFamilies; // The array to append families, o wned by caller 99 SkTDArray<FontFamily*>& fFamilies; // The array to append families, o wned by caller
100 SkAutoTDelete<FontFamily> fCurrentFamily; // The family being created, owned by this 100 SkAutoTDelete<FontFamily> fCurrentFamily; // The family being created, owned by this
101 FontFileInfo* fCurrentFontInfo; // The fontInfo being created, own ed by fCurrentFamily 101 FontFileInfo* fCurrentFontInfo; // The fontInfo being created, own ed by fCurrentFamily
102 int fVersion; // The version of the file parsed. 102 int fVersion; // The version of the file parsed.
103 const SkString& fBasePath; // The current base path. 103 const SkString& fBasePath; // The current base path.
104 const bool fIsFallback; // Indicates the file being parsed is a fallback file 104 const bool fIsFallback; // Indicates the file being parsed is a fallback file
105 const char* fFilename; // The name of the file currently being parsed. 105 const char* fFilename; // The name of the file currently being parsed.
106 106
107 int fDepth; // The current element depth of th e parse. 107 int fDepth; // The current element depth of th e parse.
108 int fSkip; // The depth to stop skipping, 0 i f not skipping. 108 int fSkip; // The depth to stop skipping, 0 i f not skipping.
109 SkTDArray<const TagHandler*> fHandler; // The stack of current tag handle rs. 109 SkTDArray<const TagHandler*> fHandler; // The stack of current tag handle rs.
110 }; 110 };
111 111
112 static bool memeq(const char* s1, const char* s2, size_t n1, size_t n2) { 112 static bool memeq(const char* s1, const char* s2, size_t n1, size_t n2) {
113 return n1 == n2 && 0 == memcmp(s1, s2, n1); 113 return n1 == n2 && 0 == memcmp(s1, s2, n1);
114 } 114 }
115 #define MEMEQ(c, s, n) memeq(c, s, sizeof(c) - 1, n) 115 #define MEMEQ(c, s, n) memeq(c, s, sizeof(c) - 1, n)
116 116
117 #define ATTS_NON_NULL(a, i) (a[i] != NULL && a[i+1] != NULL) 117 #define ATTS_NON_NULL(a, i) (a[i] != nullptr && a[i+1] != nullptr)
118 118
119 #define SK_FONTMGR_ANDROID_PARSER_PREFIX "[SkFontMgr Android Parser] " 119 #define SK_FONTMGR_ANDROID_PARSER_PREFIX "[SkFontMgr Android Parser] "
120 120
121 #define SK_FONTCONFIGPARSER_WARNING(message, ...) SkDebugf( \ 121 #define SK_FONTCONFIGPARSER_WARNING(message, ...) SkDebugf( \
122 SK_FONTMGR_ANDROID_PARSER_PREFIX "%s:%d:%d: warning: " message "\n", \ 122 SK_FONTMGR_ANDROID_PARSER_PREFIX "%s:%d:%d: warning: " message "\n", \
123 self->fFilename, \ 123 self->fFilename, \
124 XML_GetCurrentLineNumber(self->fParser), \ 124 XML_GetCurrentLineNumber(self->fParser), \
125 XML_GetCurrentColumnNumber(self->fParser), \ 125 XML_GetCurrentColumnNumber(self->fParser), \
126 ##__VA_ARGS__); 126 ##__VA_ARGS__);
127 127
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 } else { 171 } else {
172 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid axis tag", v alue); 172 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid axis tag", v alue);
173 } 173 }
174 } else if (MEMEQ("stylevalue", name, nameLen)) { 174 } else if (MEMEQ("stylevalue", name, nameLen)) {
175 if (!parse_fixed<16>(value, &axis.fValue)) { 175 if (!parse_fixed<16>(value, &axis.fValue)) {
176 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid axis styleva lue", value); 176 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid axis styleva lue", value);
177 } 177 }
178 } 178 }
179 } 179 }
180 }, 180 },
181 /*end*/NULL, 181 /*end*/nullptr,
182 /*tag*/NULL, 182 /*tag*/nullptr,
183 /*chars*/NULL, 183 /*chars*/nullptr,
184 }; 184 };
185 185
186 static const TagHandler fontHandler = { 186 static const TagHandler fontHandler = {
187 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { 187 /*start*/[](FamilyData* self, const char* tag, const char** attributes) {
188 // 'weight' (non-negative integer) [default 0] 188 // 'weight' (non-negative integer) [default 0]
189 // 'style' ("normal", "italic") [default "auto"] 189 // 'style' ("normal", "italic") [default "auto"]
190 // 'index' (non-negative integer) [default 0] 190 // 'index' (non-negative integer) [default 0]
191 // The character data should be a filename. 191 // The character data should be a filename.
192 FontFileInfo& file = self->fCurrentFamily->fFonts.push_back(); 192 FontFileInfo& file = self->fCurrentFamily->fFonts.push_back();
193 self->fCurrentFontInfo = &file; 193 self->fCurrentFontInfo = &file;
(...skipping 20 matching lines...) Expand all
214 } 214 }
215 }, 215 },
216 /*end*/[](FamilyData* self, const char* tag) { 216 /*end*/[](FamilyData* self, const char* tag) {
217 trim_string(&self->fCurrentFontInfo->fFileName); 217 trim_string(&self->fCurrentFontInfo->fFileName);
218 }, 218 },
219 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 219 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
220 size_t len = strlen(tag); 220 size_t len = strlen(tag);
221 if (MEMEQ("axis", tag, len)) { 221 if (MEMEQ("axis", tag, len)) {
222 return &axisHandler; 222 return &axisHandler;
223 } 223 }
224 return NULL; 224 return nullptr;
225 }, 225 },
226 /*chars*/[](void* data, const char* s, int len) { 226 /*chars*/[](void* data, const char* s, int len) {
227 FamilyData* self = static_cast<FamilyData*>(data); 227 FamilyData* self = static_cast<FamilyData*>(data);
228 self->fCurrentFontInfo->fFileName.append(s, len); 228 self->fCurrentFontInfo->fFileName.append(s, len);
229 } 229 }
230 }; 230 };
231 231
232 static const TagHandler familyHandler = { 232 static const TagHandler familyHandler = {
233 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { 233 /*start*/[](FamilyData* self, const char* tag, const char** attributes) {
234 // 'name' (string) [optional] 234 // 'name' (string) [optional]
(...skipping 23 matching lines...) Expand all
258 } 258 }
259 }, 259 },
260 /*end*/[](FamilyData* self, const char* tag) { 260 /*end*/[](FamilyData* self, const char* tag) {
261 *self->fFamilies.append() = self->fCurrentFamily.detach(); 261 *self->fFamilies.append() = self->fCurrentFamily.detach();
262 }, 262 },
263 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 263 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
264 size_t len = strlen(tag); 264 size_t len = strlen(tag);
265 if (MEMEQ("font", tag, len)) { 265 if (MEMEQ("font", tag, len)) {
266 return &fontHandler; 266 return &fontHandler;
267 } 267 }
268 return NULL; 268 return nullptr;
269 }, 269 },
270 /*chars*/NULL, 270 /*chars*/nullptr,
271 }; 271 };
272 272
273 static FontFamily* find_family(FamilyData* self, const SkString& familyName) { 273 static FontFamily* find_family(FamilyData* self, const SkString& familyName) {
274 for (int i = 0; i < self->fFamilies.count(); i++) { 274 for (int i = 0; i < self->fFamilies.count(); i++) {
275 FontFamily* candidate = self->fFamilies[i]; 275 FontFamily* candidate = self->fFamilies[i];
276 for (int j = 0; j < candidate->fNames.count(); j++) { 276 for (int j = 0; j < candidate->fNames.count(); j++) {
277 if (candidate->fNames[j] == familyName) { 277 if (candidate->fNames[j] == familyName) {
278 return candidate; 278 return candidate;
279 } 279 }
280 } 280 }
281 } 281 }
282 return NULL; 282 return nullptr;
283 } 283 }
284 284
285 static const TagHandler aliasHandler = { 285 static const TagHandler aliasHandler = {
286 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { 286 /*start*/[](FamilyData* self, const char* tag, const char** attributes) {
287 // 'name' (string) introduces a new family name. 287 // 'name' (string) introduces a new family name.
288 // 'to' (string) specifies which (previous) family to alias 288 // 'to' (string) specifies which (previous) family to alias
289 // 'weight' (non-negative integer) [optional] 289 // 'weight' (non-negative integer) [optional]
290 // If it *does not* have a weight, 'name' is an alias for the entire 'to ' family. 290 // If it *does not* have a weight, 'name' is an alias for the entire 'to ' family.
291 // If it *does* have a weight, 'name' is a new family consisting of 291 // If it *does* have a weight, 'name' is a new family consisting of
292 // the font(s) with 'weight' from the 'to' family. 292 // the font(s) with 'weight' from the 'to' family.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 for (int i = 0; i < targetFamily->fFonts.count(); i++) { 324 for (int i = 0; i < targetFamily->fFonts.count(); i++) {
325 if (targetFamily->fFonts[i].fWeight == weight) { 325 if (targetFamily->fFonts[i].fWeight == weight) {
326 family->fFonts.push_back(targetFamily->fFonts[i]); 326 family->fFonts.push_back(targetFamily->fFonts[i]);
327 } 327 }
328 } 328 }
329 *self->fFamilies.append() = family; 329 *self->fFamilies.append() = family;
330 } else { 330 } else {
331 targetFamily->fNames.push_back().set(aliasName); 331 targetFamily->fNames.push_back().set(aliasName);
332 } 332 }
333 }, 333 },
334 /*end*/NULL, 334 /*end*/nullptr,
335 /*tag*/NULL, 335 /*tag*/nullptr,
336 /*chars*/NULL, 336 /*chars*/nullptr,
337 }; 337 };
338 338
339 static const TagHandler familySetHandler = { 339 static const TagHandler familySetHandler = {
340 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { }, 340 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { },
341 /*end*/NULL, 341 /*end*/nullptr,
342 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 342 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
343 size_t len = strlen(tag); 343 size_t len = strlen(tag);
344 if (MEMEQ("family", tag, len)) { 344 if (MEMEQ("family", tag, len)) {
345 return &familyHandler; 345 return &familyHandler;
346 } else if (MEMEQ("alias", tag, len)) { 346 } else if (MEMEQ("alias", tag, len)) {
347 return &aliasHandler; 347 return &aliasHandler;
348 } 348 }
349 return NULL; 349 return nullptr;
350 }, 350 },
351 /*chars*/NULL, 351 /*chars*/nullptr,
352 }; 352 };
353 353
354 } // lmpParser 354 } // lmpParser
355 355
356 namespace jbParser { 356 namespace jbParser {
357 357
358 static const TagHandler fileHandler = { 358 static const TagHandler fileHandler = {
359 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { 359 /*start*/[](FamilyData* self, const char* tag, const char** attributes) {
360 // 'variant' ("elegant", "compact") [default "default"] 360 // 'variant' ("elegant", "compact") [default "default"]
361 // 'lang' (string) [default ""] 361 // 'lang' (string) [default ""]
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 393
394 } else if (MEMEQ("index", name, nameLen)) { 394 } else if (MEMEQ("index", name, nameLen)) {
395 if (!parse_non_negative_integer(value, &newFileInfo.fIndex)) { 395 if (!parse_non_negative_integer(value, &newFileInfo.fIndex)) {
396 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid index", value); 396 SK_FONTCONFIGPARSER_WARNING("'%s' is an invalid index", value);
397 } 397 }
398 } 398 }
399 } 399 }
400 } 400 }
401 self->fCurrentFontInfo = &newFileInfo; 401 self->fCurrentFontInfo = &newFileInfo;
402 }, 402 },
403 /*end*/NULL, 403 /*end*/nullptr,
404 /*tag*/NULL, 404 /*tag*/nullptr,
405 /*chars*/[](void* data, const char* s, int len) { 405 /*chars*/[](void* data, const char* s, int len) {
406 FamilyData* self = static_cast<FamilyData*>(data); 406 FamilyData* self = static_cast<FamilyData*>(data);
407 self->fCurrentFontInfo->fFileName.append(s, len); 407 self->fCurrentFontInfo->fFileName.append(s, len);
408 } 408 }
409 }; 409 };
410 410
411 static const TagHandler fileSetHandler = { 411 static const TagHandler fileSetHandler = {
412 /*start*/NULL, 412 /*start*/nullptr,
413 /*end*/NULL, 413 /*end*/nullptr,
414 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 414 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
415 size_t len = strlen(tag); 415 size_t len = strlen(tag);
416 if (MEMEQ("file", tag, len)) { 416 if (MEMEQ("file", tag, len)) {
417 return &fileHandler; 417 return &fileHandler;
418 } 418 }
419 return NULL; 419 return nullptr;
420 }, 420 },
421 /*chars*/NULL, 421 /*chars*/nullptr,
422 }; 422 };
423 423
424 static const TagHandler nameHandler = { 424 static const TagHandler nameHandler = {
425 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { 425 /*start*/[](FamilyData* self, const char* tag, const char** attributes) {
426 // The character data should be a name for the font. 426 // The character data should be a name for the font.
427 self->fCurrentFamily->fNames.push_back(); 427 self->fCurrentFamily->fNames.push_back();
428 }, 428 },
429 /*end*/NULL, 429 /*end*/nullptr,
430 /*tag*/NULL, 430 /*tag*/nullptr,
431 /*chars*/[](void* data, const char* s, int len) { 431 /*chars*/[](void* data, const char* s, int len) {
432 FamilyData* self = static_cast<FamilyData*>(data); 432 FamilyData* self = static_cast<FamilyData*>(data);
433 SkAutoAsciiToLC tolc(s, len); 433 SkAutoAsciiToLC tolc(s, len);
434 self->fCurrentFamily->fNames.back().append(tolc.lc(), len); 434 self->fCurrentFamily->fNames.back().append(tolc.lc(), len);
435 } 435 }
436 }; 436 };
437 437
438 static const TagHandler nameSetHandler = { 438 static const TagHandler nameSetHandler = {
439 /*start*/NULL, 439 /*start*/nullptr,
440 /*end*/NULL, 440 /*end*/nullptr,
441 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 441 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
442 size_t len = strlen(tag); 442 size_t len = strlen(tag);
443 if (MEMEQ("name", tag, len)) { 443 if (MEMEQ("name", tag, len)) {
444 return &nameHandler; 444 return &nameHandler;
445 } 445 }
446 return NULL; 446 return nullptr;
447 }, 447 },
448 /*chars*/NULL, 448 /*chars*/nullptr,
449 }; 449 };
450 450
451 static const TagHandler familyHandler = { 451 static const TagHandler familyHandler = {
452 /*start*/[](FamilyData* self, const char* tag, const char** attributes) { 452 /*start*/[](FamilyData* self, const char* tag, const char** attributes) {
453 self->fCurrentFamily.reset(new FontFamily(self->fBasePath, self->fIsFall back)); 453 self->fCurrentFamily.reset(new FontFamily(self->fBasePath, self->fIsFall back));
454 // 'order' (non-negative integer) [default -1] 454 // 'order' (non-negative integer) [default -1]
455 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) { 455 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) {
456 const char* value = attributes[i+1]; 456 const char* value = attributes[i+1];
457 parse_non_negative_integer(value, &self->fCurrentFamily->fOrder); 457 parse_non_negative_integer(value, &self->fCurrentFamily->fOrder);
458 } 458 }
459 }, 459 },
460 /*end*/[](FamilyData* self, const char* tag) { 460 /*end*/[](FamilyData* self, const char* tag) {
461 *self->fFamilies.append() = self->fCurrentFamily.detach(); 461 *self->fFamilies.append() = self->fCurrentFamily.detach();
462 }, 462 },
463 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 463 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
464 size_t len = strlen(tag); 464 size_t len = strlen(tag);
465 if (MEMEQ("nameset", tag, len)) { 465 if (MEMEQ("nameset", tag, len)) {
466 return &nameSetHandler; 466 return &nameSetHandler;
467 } else if (MEMEQ("fileset", tag, len)) { 467 } else if (MEMEQ("fileset", tag, len)) {
468 return &fileSetHandler; 468 return &fileSetHandler;
469 } 469 }
470 return NULL; 470 return nullptr;
471 }, 471 },
472 /*chars*/NULL, 472 /*chars*/nullptr,
473 }; 473 };
474 474
475 static const TagHandler familySetHandler = { 475 static const TagHandler familySetHandler = {
476 /*start*/NULL, 476 /*start*/nullptr,
477 /*end*/NULL, 477 /*end*/nullptr,
478 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 478 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
479 size_t len = strlen(tag); 479 size_t len = strlen(tag);
480 if (MEMEQ("family", tag, len)) { 480 if (MEMEQ("family", tag, len)) {
481 return &familyHandler; 481 return &familyHandler;
482 } 482 }
483 return NULL; 483 return nullptr;
484 }, 484 },
485 /*chars*/NULL, 485 /*chars*/nullptr,
486 }; 486 };
487 487
488 } // namespace jbParser 488 } // namespace jbParser
489 489
490 static const TagHandler topLevelHandler = { 490 static const TagHandler topLevelHandler = {
491 /*start*/NULL, 491 /*start*/nullptr,
492 /*end*/NULL, 492 /*end*/nullptr,
493 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* { 493 /*tag*/[](FamilyData* self, const char* tag, const char** attributes) -> con st TagHandler* {
494 size_t len = strlen(tag); 494 size_t len = strlen(tag);
495 if (MEMEQ("familyset", tag, len)) { 495 if (MEMEQ("familyset", tag, len)) {
496 // 'version' (non-negative integer) [default 0] 496 // 'version' (non-negative integer) [default 0]
497 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) { 497 for (size_t i = 0; ATTS_NON_NULL(attributes, i); i += 2) {
498 const char* name = attributes[i]; 498 const char* name = attributes[i];
499 size_t nameLen = strlen(name); 499 size_t nameLen = strlen(name);
500 if (MEMEQ("version", name, nameLen)) { 500 if (MEMEQ("version", name, nameLen)) {
501 const char* value = attributes[i+1]; 501 const char* value = attributes[i+1];
502 if (parse_non_negative_integer(value, &self->fVersion)) { 502 if (parse_non_negative_integer(value, &self->fVersion)) {
503 if (self->fVersion >= 21) { 503 if (self->fVersion >= 21) {
504 return &lmpParser::familySetHandler; 504 return &lmpParser::familySetHandler;
505 } 505 }
506 } 506 }
507 } 507 }
508 } 508 }
509 return &jbParser::familySetHandler; 509 return &jbParser::familySetHandler;
510 } 510 }
511 return NULL; 511 return nullptr;
512 }, 512 },
513 /*chars*/NULL, 513 /*chars*/nullptr,
514 }; 514 };
515 515
516 static void XMLCALL start_element_handler(void *data, const char *tag, const cha r **attributes) { 516 static void XMLCALL start_element_handler(void *data, const char *tag, const cha r **attributes) {
517 FamilyData* self = static_cast<FamilyData*>(data); 517 FamilyData* self = static_cast<FamilyData*>(data);
518 518
519 if (!self->fSkip) { 519 if (!self->fSkip) {
520 const TagHandler* parent = self->fHandler.top(); 520 const TagHandler* parent = self->fHandler.top();
521 const TagHandler* child = parent->tag ? parent->tag(self, tag, attribute s) : NULL; 521 const TagHandler* child = parent->tag ? parent->tag(self, tag, attribute s) : nullptr;
522 if (child) { 522 if (child) {
523 if (child->start) { 523 if (child->start) {
524 child->start(self, tag, attributes); 524 child->start(self, tag, attributes);
525 } 525 }
526 self->fHandler.push(child); 526 self->fHandler.push(child);
527 XML_SetCharacterDataHandler(self->fParser, child->chars); 527 XML_SetCharacterDataHandler(self->fParser, child->chars);
528 } else { 528 } else {
529 SK_FONTCONFIGPARSER_WARNING("'%s' tag not recognized, skipping", tag ); 529 SK_FONTCONFIGPARSER_WARNING("'%s' tag not recognized, skipping", tag );
530 XML_SetCharacterDataHandler(self->fParser, NULL); 530 XML_SetCharacterDataHandler(self->fParser, nullptr);
531 self->fSkip = self->fDepth; 531 self->fSkip = self->fDepth;
532 } 532 }
533 } 533 }
534 534
535 ++self->fDepth; 535 ++self->fDepth;
536 } 536 }
537 537
538 static void XMLCALL end_element_handler(void* data, const char* tag) { 538 static void XMLCALL end_element_handler(void* data, const char* tag) {
539 FamilyData* self = static_cast<FamilyData*>(data); 539 FamilyData* self = static_cast<FamilyData*>(data);
540 --self->fDepth; 540 --self->fDepth;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 SkFILEStream file(filename); 590 SkFILEStream file(filename);
591 591
592 // Some of the files we attempt to parse (in particular, /vendor/etc/fallbac k_fonts.xml) 592 // Some of the files we attempt to parse (in particular, /vendor/etc/fallbac k_fonts.xml)
593 // are optional - failure here is okay because one of these optional files m ay not exist. 593 // are optional - failure here is okay because one of these optional files m ay not exist.
594 if (!file.isValid()) { 594 if (!file.isValid()) {
595 SkDebugf(SK_FONTMGR_ANDROID_PARSER_PREFIX "'%s' could not be opened\n", filename); 595 SkDebugf(SK_FONTMGR_ANDROID_PARSER_PREFIX "'%s' could not be opened\n", filename);
596 return -1; 596 return -1;
597 } 597 }
598 598
599 SkAutoTCallVProc<remove_ptr<XML_Parser>::type, XML_ParserFree> parser( 599 SkAutoTCallVProc<remove_ptr<XML_Parser>::type, XML_ParserFree> parser(
600 XML_ParserCreate_MM(NULL, &sk_XML_alloc, NULL)); 600 XML_ParserCreate_MM(nullptr, &sk_XML_alloc, nullptr));
601 if (!parser) { 601 if (!parser) {
602 SkDebugf(SK_FONTMGR_ANDROID_PARSER_PREFIX "could not create XML parser\n "); 602 SkDebugf(SK_FONTMGR_ANDROID_PARSER_PREFIX "could not create XML parser\n ");
603 return -1; 603 return -1;
604 } 604 }
605 605
606 FamilyData self(parser, families, basePath, isFallback, filename, &topLevelH andler); 606 FamilyData self(parser, families, basePath, isFallback, filename, &topLevelH andler);
607 XML_SetUserData(parser, &self); 607 XML_SetUserData(parser, &self);
608 608
609 // Disable entity processing, to inhibit internal entity expansion. See expa t CVE-2013-0340 609 // Disable entity processing, to inhibit internal entity expansion. See expa t CVE-2013-0340
610 XML_SetEntityDeclHandler(parser, xml_entity_decl_handler); 610 XML_SetEntityDeclHandler(parser, xml_entity_decl_handler);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 static void append_fallback_font_families_for_locale(SkTDArray<FontFamily*>& fal lbackFonts, 662 static void append_fallback_font_families_for_locale(SkTDArray<FontFamily*>& fal lbackFonts,
663 const char* dir, 663 const char* dir,
664 const SkString& basePath) 664 const SkString& basePath)
665 { 665 {
666 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) 666 #if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
667 // The framework is beyond Android 4.2 and can therefore skip this function 667 // The framework is beyond Android 4.2 and can therefore skip this function
668 return; 668 return;
669 #endif 669 #endif
670 670
671 SkAutoTCallIProc<DIR, closedir> fontDirectory(opendir(dir)); 671 SkAutoTCallIProc<DIR, closedir> fontDirectory(opendir(dir));
672 if (NULL == fontDirectory) { 672 if (nullptr == fontDirectory) {
673 return; 673 return;
674 } 674 }
675 675
676 for (struct dirent* dirEntry; (dirEntry = readdir(fontDirectory));) { 676 for (struct dirent* dirEntry; (dirEntry = readdir(fontDirectory));) {
677 // The size of the prefix and suffix. 677 // The size of the prefix and suffix.
678 static const size_t fixedLen = sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1 678 static const size_t fixedLen = sizeof(LOCALE_FALLBACK_FONTS_PREFIX) - 1
679 + sizeof(LOCALE_FALLBACK_FONTS_SUFFIX) - 1; 679 + sizeof(LOCALE_FALLBACK_FONTS_SUFFIX) - 1;
680 680
681 // The size of the prefix, suffix, and a minimum valid language code 681 // The size of the prefix, suffix, and a minimum valid language code
682 static const size_t minSize = fixedLen + 2; 682 static const size_t minSize = fixedLen + 2;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
782 basePath); 782 basePath);
783 } 783 }
784 } 784 }
785 785
786 SkLanguage SkLanguage::getParent() const { 786 SkLanguage SkLanguage::getParent() const {
787 SkASSERT(!fTag.isEmpty()); 787 SkASSERT(!fTag.isEmpty());
788 const char* tag = fTag.c_str(); 788 const char* tag = fTag.c_str();
789 789
790 // strip off the rightmost "-.*" 790 // strip off the rightmost "-.*"
791 const char* parentTagEnd = strrchr(tag, '-'); 791 const char* parentTagEnd = strrchr(tag, '-');
792 if (parentTagEnd == NULL) { 792 if (parentTagEnd == nullptr) {
793 return SkLanguage(); 793 return SkLanguage();
794 } 794 }
795 size_t parentTagLen = parentTagEnd - tag; 795 size_t parentTagLen = parentTagEnd - tag;
796 return SkLanguage(tag, parentTagLen); 796 return SkLanguage(tag, parentTagLen);
797 } 797 }
OLDNEW
« no previous file with comments | « src/ports/SkFontMgr_android_parser.h ('k') | src/ports/SkFontMgr_custom.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698