--- /dev/null
+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);