186 lines
5.0 KiB
Diff
186 lines
5.0 KiB
Diff
|
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);
|