1 commit 7670d4a2720c61fbc7b989fed14c676f04ac3ad1
2 Author: Dodji Seketeli <dodji@openedhand.com>
3 Date: Mon Jul 16 12:24:34 2007 +0200
5 Remove side effects from BuiltinReadDirectory()
7 The first time BuiltinReadDirectory() is called,
8 save the content of builtin_dir and builtin_alias,
9 before calling FontFileAddFontFile(), because that fonction
12 Then, in subsequent calls to BuiltinReadDirectory(), restore
13 builtin_dir and builtin_alias so that the side effect incurred
14 by the first call disappears.
16 diff --git a/src/builtins/dir.c b/src/builtins/dir.c
17 index c272449..97f1e1e 100644
18 --- a/src/builtins/dir.c
19 +++ b/src/builtins/dir.c
25 +BuiltinDirsDup (const BuiltinDirPtr a_dirs,
28 + BuiltinDirPtr dirs=NULL ;
34 + dirs = xcalloc (a_dirs_len, sizeof (BuiltinDirRec)) ;
38 + for (i=0; i < a_dirs_len; i++) {
39 + int len = strlen (a_dirs[i].file_name) ;
40 + dirs[i].file_name = xcalloc (1, len) ;
41 + memmove (dirs[i].file_name, a_dirs[i].file_name, len);
42 + len = strlen (a_dirs[i].font_name) ;
43 + dirs[i].font_name = xcalloc (1, len) ;
44 + memmove (dirs[i].font_name, a_dirs[i].font_name, len);
50 + * Copy a_save back into a_cur
51 + * @param a_cur the instance of BuiltinDir to restore
52 + * @param a_saved the saved instance of BuiltinDir to copy into a_cur
53 + * @return 0 if went okay, 1 otherwise.
56 +BuiltinDirRestore (BuiltinDirPtr a_cur,
57 + const BuiltinDirPtr a_saved)
64 + if (a_saved->font_name)
65 + memmove (a_cur->font_name, a_saved->font_name, strlen (a_saved->font_name)) ;
71 +BuiltinDirsRestore (BuiltinDirPtr a_cur_tab,
72 + const BuiltinDirPtr a_saved_tab,
82 + for (i=0 ; i < a_tab_len; i++) {
83 + if (BuiltinDirRestore (&a_cur_tab[i], &a_saved_tab[i]))
90 +BuiltinAliasesDup (const BuiltinAliasPtr a_aliases,
93 + BuiltinAliasPtr aliases=NULL ;
99 + aliases = xcalloc (a_aliases_len, sizeof (BuiltinAliasRec)) ;
103 + for (i=0; i < a_aliases_len; i++) {
104 + int len = strlen (a_aliases[i].font_name) ;
105 + aliases[i].font_name = xcalloc (1, len) ;
106 + memmove (aliases[i].font_name, a_aliases[i].font_name, len);
112 + * Copy a_save back into a_cur
113 + * @param a_cur the instance of BuiltinAlias to restore
114 + * @param a_saved the saved instance of BuiltinAlias to copy into a_cur
115 + * @return 0 if went okay, 1 otherwise.
118 +BuiltinAliasRestore (BuiltinAliasPtr a_cur,
119 + const BuiltinAliasPtr a_save)
125 + if (a_save->alias_name)
126 + memmove (a_cur->alias_name, a_save->alias_name, strlen (a_save->alias_name)) ;
127 + if (a_save->font_name)
128 + memmove (a_cur->font_name, a_save->font_name, strlen (a_save->font_name)) ;
133 +BuiltinAliasesRestore (BuiltinAliasPtr a_cur_tab,
134 + const BuiltinAliasPtr a_saved_tab,
144 + for (i=0 ; i < a_tab_len; i++) {
145 + if (BuiltinAliasRestore (&a_cur_tab[i], &a_saved_tab[i]))
152 BuiltinReadDirectory (char *directory, FontDirectoryPtr *pdir)
154 @@ -36,6 +163,34 @@ BuiltinReadDirectory (char *directory, FontDirectoryPtr *pdir)
157 dir = FontFileMakeDir ("", builtin_dir_count);
158 + static BuiltinDirPtr saved_builtin_dir ;
159 + static BuiltinAliasPtr saved_builtin_alias ;
162 + if (saved_builtin_dir)
164 + BuiltinDirsRestore ((BuiltinDirPtr) builtin_dir,
166 + builtin_dir_count) ;
170 + saved_builtin_dir = BuiltinDirsDup ((const BuiltinDirPtr) builtin_dir,
171 + builtin_dir_count) ;
174 + if (saved_builtin_alias)
176 + BuiltinAliasesRestore ((BuiltinAliasPtr) builtin_alias,
177 + saved_builtin_alias,
178 + builtin_alias_count) ;
182 + saved_builtin_alias = BuiltinAliasesDup ((const BuiltinAliasPtr) builtin_alias,
183 + builtin_alias_count) ;
186 for (i = 0; i < builtin_dir_count; i++)
188 if (!FontFileAddFontFile (dir,