fcdir.c 4.13 KB
Newer Older
Keith Packard's avatar
Keith Packard committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * $XFree86: $
 *
 * Copyright  2000 Keith Packard, member of The XFree86 Project, Inc.
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of Keith Packard not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  Keith Packard makes no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include "fcint.h"

#define FC_INVALID_FONT_FILE "."

FcBool
34
35
36
37
38
FcFileScan (FcFontSet	    *set,
	    FcFileCache	    *cache,
	    FcBlanks	    *blanks,
	    const FcChar8   *file,
	    FcBool	    force)
Keith Packard's avatar
Keith Packard committed
39
40
{
    int		    id;
41
    FcChar8	    *name;
Keith Packard's avatar
Keith Packard committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    FcPattern	    *font;
    FcBool	    ret = FcTrue;
    int		    count;
    
    id = 0;
    do
    {
	if (!force && cache)
	    name = FcFileCacheFind (cache, file, id, &count);
	else
	    name = 0;
	if (name)
	{
	    /* "." means the file doesn't contain a font */
	    if (strcmp (name, FC_INVALID_FONT_FILE) != 0)
	    {
		font = FcNameParse (name);
		if (font)
		    FcPatternAddString (font, FC_FILE, file);
	    }
	    else
		font = 0;
	}
	else
	{
	    if (FcDebug () & FC_DBG_SCAN)
	    {
		printf ("\tScanning file %s...", file);
		fflush (stdout);
	    }
	    font = FcFreeTypeQuery (file, id, blanks, &count);
	    if (FcDebug () & FC_DBG_SCAN)
		printf ("done\n");
	    if (!force && cache)
	    {
		if (font)
		{
		    FcChar8	*unparse;

		    unparse = FcNameUnparse (font);
		    if (unparse)
		    {
			(void) FcFileCacheUpdate (cache, file, id, unparse);
			free (unparse);
		    }
		}
		else
		{
		    /* negative cache files not containing fonts */
91
		    FcFileCacheUpdate (cache, file, id, (FcChar8 *) FC_INVALID_FONT_FILE);
Keith Packard's avatar
Keith Packard committed
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
		}
	    }
	}
	if (font)
	{
	    if (!FcFontSetAdd (set, font))
	    {
		FcPatternDestroy (font);
		font = 0;
		ret = FcFalse;
	    }
	}
	id++;
    } while (font && ret && id < count);
    return ret;
}

FcBool
110
111
112
113
114
FcDirScan (FcFontSet	    *set,
	   FcFileCache	    *cache,
	   FcBlanks	    *blanks,
	   const FcChar8    *dir,
	   FcBool	    force)
Keith Packard's avatar
Keith Packard committed
115
116
117
{
    DIR		    *d;
    struct dirent   *e;
118
119
    FcChar8	    *file;
    FcChar8	    *base;
Keith Packard's avatar
Keith Packard committed
120
121
    FcBool	    ret = FcTrue;

122
    file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + 256 + 1);
Keith Packard's avatar
Keith Packard committed
123
124
125
    if (!file)
	return FcFalse;

126
127
128
    strcpy ((char *) file, (char *) dir);
    strcat ((char *) file, "/");
    base = file + strlen ((char *) file);
Keith Packard's avatar
Keith Packard committed
129
130
    if (!force)
    {
131
	strcpy ((char *) base, FC_DIR_CACHE_FILE);
Keith Packard's avatar
Keith Packard committed
132
133
134
135
136
137
138
139
	
	if (FcFileCacheReadDir (set, file))
	{
	    free (file);
	    return FcTrue;
	}
    }
    
140
    d = opendir ((char *) dir);
Keith Packard's avatar
Keith Packard committed
141
142
143
144
145
146
147
148
149
    if (!d)
    {
	free (file);
	return FcFalse;
    }
    while (ret && (e = readdir (d)))
    {
	if (e->d_name[0] != '.')
	{
150
	    strcpy ((char *) base, (char *) e->d_name);
Keith Packard's avatar
Keith Packard committed
151
152
153
154
155
156
157
158
159
	    FcFileScan (set, cache, blanks, file, force);
	}
    }
    free (file);
    closedir (d);
    return ret;
}

FcBool
160
FcDirSave (FcFontSet *set, const FcChar8 *dir)
Keith Packard's avatar
Keith Packard committed
161
{
162
163
    FcChar8	    *file;
    FcChar8	    *base;
Keith Packard's avatar
Keith Packard committed
164
165
    FcBool	    ret;
    
166
    file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + 256 + 1);
Keith Packard's avatar
Keith Packard committed
167
168
169
    if (!file)
	return FcFalse;

170
171
172
173
    strcpy ((char *) file, (char *) dir);
    strcat ((char *) file, "/");
    base = file + strlen ((char *) file);
    strcpy ((char *) base, FC_DIR_CACHE_FILE);
Keith Packard's avatar
Keith Packard committed
174
175
176
177
178
    ret = FcFileCacheWriteDir (set, file);
    free (file);
    return ret;
}