source: trunk/poppler/fontconfig-2.3.2-os2/src/fcdir.c @ 2

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

File size: 6.5 KB
Line 
1/*
2 * $RCSId: xc/lib/fontconfig/src/fcdir.c,v 1.9 2002/08/31 22:17:32 keithp Exp $
3 *
4 * Copyright © 2000 Keith Packard
5 *
6 * Permission to use, copy, modify, distribute, and sell this software and its
7 * documentation for any purpose is hereby granted without fee, provided that
8 * the above copyright notice appear in all copies and that both that
9 * copyright notice and this permission notice appear in supporting
10 * documentation, and that the name of Keith Packard not be used in
11 * advertising or publicity pertaining to distribution of the software without
12 * specific, written prior permission.  Keith Packard makes no
13 * representations about the suitability of this software for any purpose.  It
14 * is provided "as is" without express or implied warranty.
15 *
16 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22 * PERFORMANCE OF THIS SOFTWARE.
23 */
24
25#include "fcint.h"
26#if defined(__OS2__) && !defined(__INNOTEK_LIBC__)
27#include <direct.h>
28#else
29#include <dirent.h>
30#endif
31
32FcBool
33FcFileIsDir (const FcChar8 *file)
34{
35    struct stat     statb;
36
37    if (stat ((const char *) file, &statb) != 0)
38        return FcFalse;
39    return S_ISDIR(statb.st_mode);
40}
41
42FcBool
43FcFileScanConfig (FcFontSet     *set,
44                  FcStrSet      *dirs,
45                  FcGlobalCache *cache,
46                  FcBlanks      *blanks,
47                  const FcChar8 *file,
48                  FcBool        force,
49                  FcConfig      *config)
50{
51    int                 id;
52    FcChar8             *name;
53    FcPattern           *font;
54    FcBool              ret = FcTrue;
55    FcBool              isDir;
56    int                 count = 0;
57    FcGlobalCacheFile   *cache_file;
58    FcGlobalCacheDir    *cache_dir;
59    FcBool              need_scan;
60
61    setbuf(stdout, NULL);
62    if (config && !FcConfigAcceptFilename (config, file))
63        return FcTrue;
64
65    if (force)
66        cache = 0;
67    id = 0;
68    do
69    {
70        need_scan = FcTrue;
71        font = 0;
72        /*
73         * Check the cache
74         */
75        if (cache)
76        {
77            if ((cache_file = FcGlobalCacheFileGet (cache, file, id, &count)))
78            {
79                /*
80                 * Found a cache entry for the file
81                 */
82                if (FcGlobalCacheCheckTime (file, &cache_file->info))
83                {
84                    name = cache_file->name;
85                    need_scan = FcFalse;
86                    FcGlobalCacheReferenced (cache, &cache_file->info);
87                    /* "." means the file doesn't contain a font */
88                    if (FcStrCmp (name, FC_FONT_FILE_INVALID) != 0)
89                    {
90                        font = FcNameParse (name);
91                        if (font)
92                            if (!FcPatternAddString (font, FC_FILE, file))
93                                ret = FcFalse;
94                    }
95                }
96            }
97            else if ((cache_dir = FcGlobalCacheDirGet (cache, file,
98                                                       strlen ((const char *) file),
99                                                       FcFalse)))
100            {
101                if (FcGlobalCacheCheckTime (cache_dir->info.file, 
102                                            &cache_dir->info))
103                {
104                    font = 0;
105                    need_scan = FcFalse;
106                    FcGlobalCacheReferenced (cache, &cache_dir->info);
107                    if (!FcStrSetAdd (dirs, file))
108                        ret = FcFalse;
109                }
110            }
111        }
112        /*
113         * Nothing in the cache, scan the file
114         */
115        if (need_scan)
116        {
117            if (FcDebug () & FC_DBG_SCAN)
118            {
119                printf ("\tScanning file %s...", file);
120                fflush (stdout);
121            }
122            font = FcFreeTypeQuery (file, id, blanks, &count);
123            if (FcDebug () & FC_DBG_SCAN)
124                printf ("done\n");
125            isDir = FcFalse;
126            if (!font && FcFileIsDir (file))
127            {
128                isDir = FcTrue;
129                ret = FcStrSetAdd (dirs, file);
130            }
131            /*
132             * Update the cache
133             */
134            if (cache && font)
135            {
136                FcChar8 *unparse;
137
138                unparse = FcNameUnparse (font);
139                if (unparse)
140                {
141                    (void) FcGlobalCacheUpdate (cache, file, id, unparse);
142                    FcStrFree (unparse);
143                }
144            }
145        }
146        /*
147         * Add the font
148         */
149        if (font && (!config || FcConfigAcceptFont (config, font)))
150        {
151            if (!FcFontSetAdd (set, font))
152            {
153                FcPatternDestroy (font);
154                font = 0;
155                ret = FcFalse;
156            }
157        }
158        else if (font)
159            FcPatternDestroy (font);
160        id++;
161    } while (font && ret && id < count);
162    return ret;
163}
164
165FcBool
166FcFileScan (FcFontSet       *set,
167            FcStrSet        *dirs,
168            FcGlobalCache   *cache,
169            FcBlanks        *blanks,
170            const FcChar8   *file,
171            FcBool          force)
172{
173    return FcFileScanConfig (set, dirs, cache, blanks, file, force, 0);
174}
175
176/*
177 * Scan 'dir', adding font files to 'set' and
178 * subdirectories to 'dirs'
179 */
180
181FcBool
182FcDirScanConfig (FcFontSet      *set,
183                 FcStrSet       *dirs,
184                 FcGlobalCache  *cache,
185                 FcBlanks       *blanks,
186                 const FcChar8  *dir,
187                 FcBool         force,
188                 FcConfig       *config)
189{
190    DIR                 *d;
191    struct dirent       *e;
192    FcChar8             *file;
193    FcChar8             *base;
194    FcBool              ret = FcTrue;
195
196    if (config && !FcConfigAcceptFilename (config, dir))
197        return FcTrue;
198
199    if (!force)
200    {
201        /*
202         * Check fonts.cache-<version> file
203         */
204        if (FcDirCacheReadDir (set, dirs, dir, config))
205        {
206            if (cache)
207                FcGlobalCacheReferenceSubdir (cache, dir);
208            return FcTrue;
209        }
210   
211        /*
212         * Check ~/.fonts.cache-<version> file
213         */
214        if (cache && FcGlobalCacheScanDir (set, dirs, cache, dir, config))
215            return FcTrue;
216    }
217   
218    /* freed below */
219    file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1);
220    if (!file)
221        return FcFalse;
222
223    strcpy ((char *) file, (char *) dir);
224    strcat ((char *) file, "/");
225    base = file + strlen ((char *) file);
226   
227    if (FcDebug () & FC_DBG_SCAN)
228        printf ("\tScanning dir %s\n", dir);
229       
230    d = opendir ((char *) dir);
231   
232    if (!d)
233    {
234        free (file);
235        /* Don't complain about missing directories */
236        if (errno == ENOENT)
237            return FcTrue;
238        return FcFalse;
239    }
240    while (ret && (e = readdir (d)))
241    {
242        if (e->d_name[0] != '.' && strlen (e->d_name) < FC_MAX_FILE_LEN)
243        {
244            strcpy ((char *) base, (char *) e->d_name);
245            ret = FcFileScanConfig (set, dirs, cache, blanks, file, force, config);
246        }
247    }
248    free (file);
249    closedir (d);
250    /*
251     * Now that the directory has been scanned,
252     * add the cache entry
253     */
254    if (ret && cache)
255    {
256      FcGlobalCacheUpdate (cache, dir, 0, 0);
257      FcDirCacheWriteDir (set, dirs, dir);
258    }
259       
260    return ret;
261}
262
263FcBool
264FcDirScan (FcFontSet        *set,
265           FcStrSet         *dirs,
266           FcGlobalCache    *cache,
267           FcBlanks         *blanks,
268           const FcChar8    *dir,
269           FcBool           force)
270{
271    return FcDirScanConfig (set, dirs, cache, blanks, dir, force, 0);
272}
273
274FcBool
275FcDirSave (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir)
276{
277  if (FcDebug () & FC_DBG_SCAN)
278  {
279    printf ("\tFcDirCacheWriteDir %s...", dir);
280    fflush (stdout);
281  }
282 
283    return FcDirCacheWriteDir (set, dirs, dir);
284}
Note: See TracBrowser for help on using the repository browser.