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