diff --git a/src/builtins/dir.c b/src/builtins/dir.c index 1f7f547..3a8d944 100644 --- a/src/builtins/dir.c +++ b/src/builtins/dir.c @@ -29,172 +29,32 @@ #endif #include "builtin.h" -static BuiltinDirPtr -BuiltinDirsDup (const BuiltinDirPtr a_dirs, - int a_dirs_len) -{ - BuiltinDirPtr dirs=NULL ; - int i=0 ; - - if (!a_dirs) - return NULL ; - - dirs = xcalloc (a_dirs_len, sizeof (BuiltinDirRec)) ; - if (!dirs) - return NULL ; - - for (i=0; i < a_dirs_len; i++) { - int len = strlen (a_dirs[i].file_name) ; - dirs[i].file_name = xcalloc (1, len) ; - memmove (dirs[i].file_name, a_dirs[i].file_name, len); - len = strlen (a_dirs[i].font_name) ; - dirs[i].font_name = xcalloc (1, len) ; - memmove (dirs[i].font_name, a_dirs[i].font_name, len); - } - return dirs ; -} - -/** - * Copy a_save back into a_cur - * @param a_cur the instance of BuiltinDir to restore - * @param a_saved the saved instance of BuiltinDir to copy into a_cur - * @return 0 if went okay, 1 otherwise. - */ -static int -BuiltinDirRestore (BuiltinDirPtr a_cur, - const BuiltinDirPtr a_saved) -{ - if (!a_cur) - return 1 ; - if (!a_saved) - return 0 ; - - if (a_saved->font_name) - memmove (a_cur->font_name, a_saved->font_name, strlen (a_saved->font_name)) ; - return 0 ; -} - - -static int -BuiltinDirsRestore (BuiltinDirPtr a_cur_tab, - const BuiltinDirPtr a_saved_tab, - int a_tab_len) -{ - int i=0 ; - - if (!a_cur_tab) - return 1 ; - if (!a_saved_tab) - return 0 ; - - for (i=0 ; i < a_tab_len; i++) { - if (BuiltinDirRestore (&a_cur_tab[i], &a_saved_tab[i])) - return 1 ; - } - return 0 ; -} - -static BuiltinAliasPtr -BuiltinAliasesDup (const BuiltinAliasPtr a_aliases, - int a_aliases_len) -{ - BuiltinAliasPtr aliases=NULL ; - int i=0 ; - - if (!a_aliases) - return NULL ; - - aliases = xcalloc (a_aliases_len, sizeof (BuiltinAliasRec)) ; - if (!aliases) - return NULL ; - - for (i=0; i < a_aliases_len; i++) { - int len = strlen (a_aliases[i].font_name) ; - aliases[i].font_name = xcalloc (1, len) ; - memmove (aliases[i].font_name, a_aliases[i].font_name, len); - } - return aliases ; -} - -/** - * Copy a_save back into a_cur - * @param a_cur the instance of BuiltinAlias to restore - * @param a_saved the saved instance of BuiltinAlias to copy into a_cur - * @return 0 if went okay, 1 otherwise. - */ -static int -BuiltinAliasRestore (BuiltinAliasPtr a_cur, - const BuiltinAliasPtr a_save) -{ - if (!a_cur) - return 1 ; - if (!a_save) - return 0 ; - if (a_save->alias_name) - memmove (a_cur->alias_name, a_save->alias_name, strlen (a_save->alias_name)) ; - if (a_save->font_name) - memmove (a_cur->font_name, a_save->font_name, strlen (a_save->font_name)) ; - return 0 ; -} - -static int -BuiltinAliasesRestore (BuiltinAliasPtr a_cur_tab, - const BuiltinAliasPtr a_saved_tab, - int a_tab_len) -{ - int i=0 ; - - if (!a_cur_tab) - return 1 ; - if (!a_saved_tab) - return 0 ; - - for (i=0 ; i < a_tab_len; i++) { - if (BuiltinAliasRestore (&a_cur_tab[i], &a_saved_tab[i])) - return 1 ; - } - return 0 ; -} - int BuiltinReadDirectory (char *directory, FontDirectoryPtr *pdir) { FontDirectoryPtr dir; int i; - static BuiltinDirPtr saved_builtin_dir; - static BuiltinAliasPtr saved_builtin_alias; + static char **builtin_dir_font_name_copy = NULL; 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) + if (!builtin_dir_font_name_copy) { - BuiltinAliasesRestore ((BuiltinAliasPtr) builtin_alias, - saved_builtin_alias, - builtin_alias_count) ; + builtin_dir_font_name_copy = malloc (sizeof(char*) * builtin_dir_count); + for (i = 0; i < builtin_dir_count; ++i) + builtin_dir_font_name_copy[i] = strdup(builtin_dir[i].font_name); } else { - saved_builtin_alias = BuiltinAliasesDup ((const BuiltinAliasPtr) builtin_alias, - builtin_alias_count) ; + for (i = 0; i < builtin_dir_count; ++i) + strcpy(builtin_dir_font_name_copy[i], builtin_dir[i].font_name); } for (i = 0; i < builtin_dir_count; i++) { if (!FontFileAddFontFile (dir, - (char *) builtin_dir[i].font_name, + (char *) builtin_dir_font_name_copy[i], (char *) builtin_dir[i].file_name)) { FontFileFreeDir (dir);