1a96d7823Smrg/* 2a96d7823Smrg * Copyright 1999 SuSE, Inc. 3a96d7823Smrg * 4a96d7823Smrg * Permission to use, copy, modify, distribute, and sell this software and its 5a96d7823Smrg * documentation for any purpose is hereby granted without fee, provided that 6a96d7823Smrg * the above copyright notice appear in all copies and that both that 7a96d7823Smrg * copyright notice and this permission notice appear in supporting 8a96d7823Smrg * documentation, and that the name of SuSE not be used in advertising or 9a96d7823Smrg * publicity pertaining to distribution of the software without specific, 10a96d7823Smrg * written prior permission. SuSE makes no representations about the 11a96d7823Smrg * suitability of this software for any purpose. It is provided "as is" 12a96d7823Smrg * without express or implied warranty. 13a96d7823Smrg * 14a96d7823Smrg * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL 15a96d7823Smrg * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE 16a96d7823Smrg * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17a96d7823Smrg * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 18a96d7823Smrg * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 19a96d7823Smrg * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20a96d7823Smrg * 21a96d7823Smrg * Author: Keith Packard, SuSE, Inc. 22a96d7823Smrg */ 23a96d7823Smrg 24a96d7823Smrg#ifdef HAVE_CONFIG_H 25a96d7823Smrg#include <config.h> 26a96d7823Smrg#endif 27a96d7823Smrg#include "libxfontint.h" 28a96d7823Smrg#include "builtin.h" 29a96d7823Smrg 30a96d7823Smrgstatic BuiltinDirPtr 31a96d7823SmrgBuiltinDirsDup (const BuiltinDirPtr a_dirs, 32a96d7823Smrg int a_dirs_len) 33a96d7823Smrg{ 34a96d7823Smrg BuiltinDirPtr dirs=NULL ; 35a96d7823Smrg int i=0 ; 36a96d7823Smrg 37a96d7823Smrg if (!a_dirs) 38a96d7823Smrg return NULL ; 39a96d7823Smrg 40a96d7823Smrg dirs = calloc (a_dirs_len, sizeof (BuiltinDirRec)) ; 41a96d7823Smrg if (!dirs) 42a96d7823Smrg return NULL ; 43a96d7823Smrg 44a96d7823Smrg for (i=0; i < a_dirs_len; i++) { 45a96d7823Smrg dirs[i].file_name = strdup(a_dirs[i].file_name); 46a96d7823Smrg dirs[i].font_name = strdup(a_dirs[i].font_name); 47a96d7823Smrg } 48a96d7823Smrg return dirs ; 49a96d7823Smrg} 50a96d7823Smrg 51a96d7823Smrg/** 52a96d7823Smrg * Copy a_save back into a_cur 53a96d7823Smrg * @param a_cur the instance of BuiltinDir to restore 54a96d7823Smrg * @param a_saved the saved instance of BuiltinDir to copy into a_cur 55a96d7823Smrg * @return 0 if went okay, 1 otherwise. 56a96d7823Smrg */ 57a96d7823Smrgstatic int 58a96d7823SmrgBuiltinDirRestore (BuiltinDirPtr a_cur, 59a96d7823Smrg const BuiltinDirPtr a_saved) 60a96d7823Smrg{ 61a96d7823Smrg if (!a_cur) 62a96d7823Smrg return 1 ; 63a96d7823Smrg if (!a_saved) 64a96d7823Smrg return 0 ; 65a96d7823Smrg 66a96d7823Smrg if (a_saved->font_name) 67a96d7823Smrg memmove (a_cur->font_name, a_saved->font_name, strlen (a_saved->font_name)) ; 68a96d7823Smrg return 0 ; 69a96d7823Smrg} 70a96d7823Smrg 71a96d7823Smrg 72a96d7823Smrgstatic int 73a96d7823SmrgBuiltinDirsRestore (BuiltinDirPtr a_cur_tab, 74a96d7823Smrg const BuiltinDirPtr a_saved_tab, 75a96d7823Smrg int a_tab_len) 76a96d7823Smrg{ 77a96d7823Smrg int i=0 ; 78a96d7823Smrg 79a96d7823Smrg if (!a_cur_tab) 80a96d7823Smrg return 1 ; 81a96d7823Smrg if (!a_saved_tab) 82a96d7823Smrg return 0 ; 83a96d7823Smrg 84a96d7823Smrg for (i=0 ; i < a_tab_len; i++) { 85a96d7823Smrg if (BuiltinDirRestore (&a_cur_tab[i], &a_saved_tab[i])) 86a96d7823Smrg return 1 ; 87a96d7823Smrg } 88a96d7823Smrg return 0 ; 89a96d7823Smrg} 90a96d7823Smrg 91a96d7823Smrgstatic BuiltinAliasPtr 92a96d7823SmrgBuiltinAliasesDup (const BuiltinAliasPtr a_aliases, 93a96d7823Smrg int a_aliases_len) 94a96d7823Smrg{ 95a96d7823Smrg BuiltinAliasPtr aliases=NULL ; 96a96d7823Smrg int i=0 ; 97a96d7823Smrg 98a96d7823Smrg if (!a_aliases) 99a96d7823Smrg return NULL ; 100a96d7823Smrg 101a96d7823Smrg aliases = calloc (a_aliases_len, sizeof (BuiltinAliasRec)) ; 102a96d7823Smrg if (!aliases) 103a96d7823Smrg return NULL ; 104a96d7823Smrg 105a96d7823Smrg for (i=0; i < a_aliases_len; i++) { 106a96d7823Smrg aliases[i].font_name = strdup(a_aliases[i].font_name); 107a96d7823Smrg } 108a96d7823Smrg return aliases ; 109a96d7823Smrg} 110a96d7823Smrg 111a96d7823Smrg/** 112a96d7823Smrg * Copy a_save back into a_cur 113a96d7823Smrg * @param a_cur the instance of BuiltinAlias to restore 114a96d7823Smrg * @param a_saved the saved instance of BuiltinAlias to copy into a_cur 115a96d7823Smrg * @return 0 if went okay, 1 otherwise. 116a96d7823Smrg */ 117a96d7823Smrgstatic int 118a96d7823SmrgBuiltinAliasRestore (BuiltinAliasPtr a_cur, 119a96d7823Smrg const BuiltinAliasPtr a_save) 120a96d7823Smrg{ 121a96d7823Smrg if (!a_cur) 122a96d7823Smrg return 1 ; 123a96d7823Smrg if (!a_save) 124a96d7823Smrg return 0 ; 125a96d7823Smrg if (a_save->alias_name) 126a96d7823Smrg memmove (a_cur->alias_name, a_save->alias_name, strlen (a_save->alias_name)) ; 127a96d7823Smrg if (a_save->font_name) 128a96d7823Smrg memmove (a_cur->font_name, a_save->font_name, strlen (a_save->font_name)) ; 129a96d7823Smrg return 0 ; 130a96d7823Smrg} 131a96d7823Smrg 132a96d7823Smrgstatic int 133a96d7823SmrgBuiltinAliasesRestore (BuiltinAliasPtr a_cur_tab, 134a96d7823Smrg const BuiltinAliasPtr a_saved_tab, 135a96d7823Smrg int a_tab_len) 136a96d7823Smrg{ 137a96d7823Smrg int i=0 ; 138a96d7823Smrg 139a96d7823Smrg if (!a_cur_tab) 140a96d7823Smrg return 1 ; 141a96d7823Smrg if (!a_saved_tab) 142a96d7823Smrg return 0 ; 143a96d7823Smrg 144a96d7823Smrg for (i=0 ; i < a_tab_len; i++) { 145a96d7823Smrg if (BuiltinAliasRestore (&a_cur_tab[i], &a_saved_tab[i])) 146a96d7823Smrg return 1 ; 147a96d7823Smrg } 148a96d7823Smrg return 0 ; 149a96d7823Smrg} 150a96d7823Smrg 151a96d7823Smrgint 152a96d7823SmrgBuiltinReadDirectory (const char *directory, FontDirectoryPtr *pdir) 153a96d7823Smrg{ 154a96d7823Smrg FontDirectoryPtr dir; 155a96d7823Smrg int i; 156a96d7823Smrg 157a96d7823Smrg static BuiltinDirPtr saved_builtin_dir; 158a96d7823Smrg static BuiltinAliasPtr saved_builtin_alias; 159a96d7823Smrg 160a96d7823Smrg dir = FontFileMakeDir ("", builtin_dir_count); 161a96d7823Smrg 162a96d7823Smrg if (saved_builtin_dir) 163a96d7823Smrg { 164a96d7823Smrg BuiltinDirsRestore ((BuiltinDirPtr) builtin_dir, 165a96d7823Smrg saved_builtin_dir, 166a96d7823Smrg builtin_dir_count) ; 167a96d7823Smrg } 168a96d7823Smrg else 169a96d7823Smrg { 170a96d7823Smrg saved_builtin_dir = BuiltinDirsDup ((const BuiltinDirPtr) builtin_dir, 171a96d7823Smrg builtin_dir_count) ; 172a96d7823Smrg } 173a96d7823Smrg 174a96d7823Smrg if (saved_builtin_alias) 175a96d7823Smrg { 176a96d7823Smrg BuiltinAliasesRestore ((BuiltinAliasPtr) builtin_alias, 177a96d7823Smrg saved_builtin_alias, 178a96d7823Smrg builtin_alias_count) ; 179a96d7823Smrg } 180a96d7823Smrg else 181a96d7823Smrg { 182a96d7823Smrg saved_builtin_alias = BuiltinAliasesDup ((const BuiltinAliasPtr) builtin_alias, 183a96d7823Smrg builtin_alias_count) ; 184a96d7823Smrg } 185a96d7823Smrg 186a96d7823Smrg for (i = 0; i < builtin_dir_count; i++) 187a96d7823Smrg { 188a96d7823Smrg if (!FontFileAddFontFile (dir, 189a96d7823Smrg (char *) builtin_dir[i].font_name, 190a96d7823Smrg (char *) builtin_dir[i].file_name)) 191a96d7823Smrg { 192a96d7823Smrg FontFileFreeDir (dir); 193a96d7823Smrg return BadFontPath; 194a96d7823Smrg } 195a96d7823Smrg } 196a96d7823Smrg for (i = 0; i < builtin_alias_count; i++) 197a96d7823Smrg { 198a96d7823Smrg if (!FontFileAddFontAlias (dir, 199a96d7823Smrg (char *) builtin_alias[i].alias_name, 200a96d7823Smrg (char *) builtin_alias[i].font_name)) 201a96d7823Smrg { 202a96d7823Smrg FontFileFreeDir (dir); 203a96d7823Smrg return BadFontPath; 204a96d7823Smrg } 205a96d7823Smrg } 206a96d7823Smrg FontFileSortDir (dir); 207a96d7823Smrg *pdir = dir; 208a96d7823Smrg return Successful; 209a96d7823Smrg} 210