int BuiltinReadDirectory (char *directory, FontDirectoryPtr *pdir) { FontDirectoryPtr dir; int i; static BuiltinDirPtr saved_builtin_dir; static BuiltinAliasPtr saved_builtin_alias; dir = FontFileMakeDir ("", builtin_dir_count); if (saved_builtin_dir) { BuiltinDirsRestore ((BuiltinDirPtr) builtin_dir, saved_builtin_dir, builtin_dir_count) ; } else { saved_builtin_dir = BuiltinDirsDup ((const BuiltinDirPtr) builtin_dir, builtin_dir_count) ; } if (saved_builtin_alias) { BuiltinAliasesRestore ((BuiltinAliasPtr) builtin_alias, saved_builtin_alias, builtin_alias_count) ; } else { saved_builtin_alias = BuiltinAliasesDup ((const BuiltinAliasPtr) builtin_alias, builtin_alias_count) ; } for (i = 0; i < builtin_dir_count; i++) { if (!FontFileAddFontFile (dir, (char *) builtin_dir[i].font_name, (char *) builtin_dir[i].file_name)) { FontFileFreeDir (dir); return BadFontPath; } } for (i = 0; i < builtin_alias_count; i++) { if (!FontFileAddFontAlias (dir, (char *) builtin_alias[i].alias_name, (char *) builtin_alias[i].font_name)) { FontFileFreeDir (dir); return BadFontPath; } } FontFileSortDir (dir); *pdir = dir; return Successful; }
static Bool AddFileNameAliases(FontDirectoryPtr dir) { int i; char copy[MAXFONTFILENAMELEN]; char *fileName; FontTablePtr table; FontRendererPtr renderer; int len; FontNameRec name; table = &dir->nonScalable; for (i = 0; i < table->used; i++) { if (table->entries[i].type != FONT_ENTRY_BITMAP) continue; fileName = table->entries[i].u.bitmap.fileName; renderer = FontFileMatchRenderer (fileName); if (!renderer) continue; len = strlen (fileName) - renderer->fileSuffixLen; if (len >= sizeof(copy)) continue; CopyISOLatin1Lowered (copy, fileName, len); copy[len] = '\0'; name.name = copy; name.length = len; name.ndashes = FontFileCountDashes (copy, len); if (!FontFileFindNameInDir(table, &name)) { if (!FontFileAddFontAlias (dir, copy, table->entries[i].name.name)) return FALSE; } } return TRUE; }
static int ReadFontAlias(char *directory, Bool isFile, FontDirectoryPtr *pdir) { char alias[MAXFONTNAMELEN]; char font_name[MAXFONTNAMELEN]; char alias_file[MAXFONTFILENAMELEN]; FILE *file; FontDirectoryPtr dir; int token; char *lexToken; int status = Successful; struct stat statb; if (strlen(directory) >= sizeof(alias_file)) return BadFontPath; dir = *pdir; strcpy(alias_file, directory); if (!isFile) { if (strlen(directory) + 1 + sizeof(FontAliasFile) > sizeof(alias_file)) return BadFontPath; if (directory[strlen(directory) - 1] != '/') strcat(alias_file, "/"); strcat(alias_file, FontAliasFile); } file = fopen(alias_file, "rt"); if (!file) return ((errno == ENOENT) ? Successful : BadFontPath); if (!dir) *pdir = dir = FontFileMakeDir(directory, 10); if (!dir) { fclose (file); return AllocError; } #ifndef WIN32 if (fstat (fileno (file), &statb) == -1) #else if (stat (alias_file, &statb) == -1) #endif { fclose (file); return BadFontPath; } dir->alias_mtime = statb.st_mtime; while (status == Successful) { token = lexAlias(file, &lexToken); switch (token) { case NEWLINE: break; case DONE: fclose(file); return Successful; case EALLOC: status = AllocError; break; case NAME: if (strlen(lexToken) >= sizeof(alias)) { status = BadFontPath; break; } strcpy(alias, lexToken); token = lexAlias(file, &lexToken); switch (token) { case NEWLINE: if (strcmp(alias, "FILE_NAMES_ALIASES")) status = BadFontPath; else if (!AddFileNameAliases(dir)) status = AllocError; break; case DONE: status = BadFontPath; break; case EALLOC: status = AllocError; break; case NAME: if (strlen(lexToken) >= sizeof(font_name)) { status = BadFontPath; break; } CopyISOLatin1Lowered(alias, alias, strlen(alias)); CopyISOLatin1Lowered(font_name, lexToken, strlen(lexToken)); if (!FontFileAddFontAlias (dir, alias, font_name)) status = AllocError; break; } } } fclose(file); return status; }