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