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; }
int FontFileReadDirectory (char *directory, FontDirectoryPtr *pdir) { char file_name[MAXFONTFILENAMELEN]; char font_name[MAXFONTNAMELEN]; char dir_file[MAXFONTFILENAMELEN]; char dir_path[MAXFONTFILENAMELEN]; char *ptr; FILE *file; int count, i, status; struct stat statb; static char format[24] = ""; FontDirectoryPtr dir = NullFontDirectory; if (strlen(directory) + 1 + sizeof(FontDirFile) > sizeof(dir_file)) return BadFontPath; /* Check for font directory attributes */ #if !defined(__UNIXOS2__) && !defined(WIN32) if ((ptr = strchr(directory, ':'))) { #else /* OS/2 and WIN32 path might start with a drive letter, don't clip this */ if ((ptr = strchr(directory+2, ':'))) { #endif strncpy(dir_path, directory, ptr - directory); dir_path[ptr - directory] = '\0'; } else { strcpy(dir_path, directory); } strcpy(dir_file, dir_path); if (dir_file[strlen(dir_file) - 1] != '/') strcat(dir_file, "/"); strcat(dir_file, FontDirFile); file = fopen(dir_file, "rt"); if (file) { Bool found_font = FALSE; #ifndef WIN32 if (fstat (fileno(file), &statb) == -1) #else if (stat (dir_file, &statb) == -1) #endif { fclose(file); return BadFontPath; } count = fscanf(file, "%d\n", &i); if ((count == EOF) || (count != 1)) { fclose(file); return BadFontPath; } dir = FontFileMakeDir(directory, i); if (dir == NULL) { fclose(file); return BadFontPath; } dir->dir_mtime = statb.st_mtime; if (format[0] == '\0') sprintf(format, "%%%ds %%%d[^\n]\n", MAXFONTFILENAMELEN-1, MAXFONTNAMELEN-1); while ((count = fscanf(file, format, file_name, font_name)) != EOF) { #if defined(__UNIXOS2__) || defined(WIN32) /* strip any existing trailing CR */ for (i=0; i<strlen(font_name); i++) { if (font_name[i]=='\r') font_name[i] = '\0'; } #endif if (count != 2) { FontFileFreeDir (dir); fclose(file); return BadFontPath; } if (FontFileAddFontFile (dir, font_name, file_name)) found_font = TRUE; } if (!found_font) { FontFileFreeDir (dir); fclose(file); return BadFontPath; } fclose(file); } else if (errno != ENOENT) { return BadFontPath; } status = ReadFontAlias(dir_path, FALSE, &dir); if (status != Successful) { if (dir) FontFileFreeDir (dir); return status; } if (!dir) return BadFontPath; FontFileSortDir(dir); *pdir = dir; return Successful; } Bool FontFileDirectoryChanged(FontDirectoryPtr dir) { char dir_file[MAXFONTFILENAMELEN]; struct stat statb; if (strlen(dir->directory) + sizeof(FontDirFile) > sizeof(dir_file)) return FALSE; strcpy (dir_file, dir->directory); strcat (dir_file, FontDirFile); if (stat (dir_file, &statb) == -1) { if (errno != ENOENT || dir->dir_mtime != 0) return TRUE; return FALSE; /* doesn't exist and never did: no change */ } if (dir->dir_mtime != statb.st_mtime) return TRUE; strcpy (dir_file, dir->directory); strcat (dir_file, FontAliasFile); if (stat (dir_file, &statb) == -1) { if (errno != ENOENT || dir->alias_mtime != 0) return TRUE; return FALSE; /* doesn't exist and never did: no change */ } if (dir->alias_mtime != statb.st_mtime) return TRUE; return FALSE; }