~ubuntu-branches/ubuntu/intrepid/fontconfig/intrepid

« back to all changes in this revision

Viewing changes to fc-match/fc-match.c

  • Committer: Bazaar Package Importer
  • Author(s): Keith Packard
  • Date: 2008-05-31 20:01:57 UTC
  • mto: (0.1.4 lenny) (1.1.6 upstream)
  • mto: This revision was merged to the branch mainline in revision 28.
  • Revision ID: james.westby@ubuntu.com-20080531200157-7u3xgmgeh1594flx
Import upstream version 2.6.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * $RCSId: xc/lib/fontconfig/fc-list/fc-list.c,v 1.5 2002/06/30 23:45:40 keithp Exp $
 
3
 *
 
4
 * Copyright © 2003 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
#ifdef HAVE_CONFIG_H
 
26
#include <config.h>
 
27
#else
 
28
#ifdef linux
 
29
#define HAVE_GETOPT_LONG 1
 
30
#endif
 
31
#define HAVE_GETOPT 1
 
32
#endif
 
33
 
 
34
#include <fontconfig/fontconfig.h>
 
35
#include <stdio.h>
 
36
#include <unistd.h>
 
37
#include <stdlib.h>
 
38
#include <string.h>
 
39
 
 
40
#ifndef HAVE_GETOPT
 
41
#define HAVE_GETOPT 0
 
42
#endif
 
43
#ifndef HAVE_GETOPT_LONG
 
44
#define HAVE_GETOPT_LONG 0
 
45
#endif
 
46
 
 
47
#if HAVE_GETOPT_LONG
 
48
#undef  _GNU_SOURCE
 
49
#define _GNU_SOURCE
 
50
#include <getopt.h>
 
51
static const struct option longopts[] = {
 
52
    {"sort", 0, 0, 's'},
 
53
    {"all", 0, 0, 'a'},
 
54
    {"version", 0, 0, 'V'},
 
55
    {"verbose", 0, 0, 'v'},
 
56
    {"help", 0, 0, '?'},
 
57
    {NULL,0,0,0},
 
58
};
 
59
#else
 
60
#if HAVE_GETOPT
 
61
extern char *optarg;
 
62
extern int optind, opterr, optopt;
 
63
#endif
 
64
#endif
 
65
 
 
66
static void usage (char *program)
 
67
{
 
68
#if HAVE_GETOPT_LONG
 
69
    fprintf (stderr, "usage: %s [-svV?] [--sort] [--all] [--verbose] [--version] [--help] [pattern]\n",
 
70
             program);
 
71
#else
 
72
    fprintf (stderr, "usage: %s [-svV?] [pattern]\n",
 
73
             program);
 
74
#endif
 
75
    fprintf (stderr, "List fonts matching [pattern]\n");
 
76
    fprintf (stderr, "\n");
 
77
#if HAVE_GETOPT_LONG
 
78
    fprintf (stderr, "  -s, --sort           display sorted list of matches\n");
 
79
    fprintf (stderr, "  -a, --all            display unpruned sorted list of matches\n");
 
80
    fprintf (stderr, "  -v, --verbose        display entire font pattern\n");
 
81
    fprintf (stderr, "  -V, --version        display font config version and exit\n");
 
82
    fprintf (stderr, "  -?, --help           display this help and exit\n");
 
83
#else
 
84
    fprintf (stderr, "  -s,        (sort)    display sorted list of matches\n");
 
85
    fprintf (stderr, "  -a         (all)     display unpruned sorted list of matches\n");
 
86
    fprintf (stderr, "  -v         (verbose) display entire font pattern\n");
 
87
    fprintf (stderr, "  -V         (version) display font config version and exit\n");
 
88
    fprintf (stderr, "  -?         (help)    display this help and exit\n");
 
89
#endif
 
90
    exit (1);
 
91
}
 
92
 
 
93
int
 
94
main (int argc, char **argv)
 
95
{
 
96
    int         verbose = 0;
 
97
    int         sort = 0, all = 0;
 
98
    int         i;
 
99
    FcFontSet   *fs;
 
100
    FcPattern   *pat;
 
101
    FcResult    result;
 
102
#if HAVE_GETOPT_LONG || HAVE_GETOPT
 
103
    int         c;
 
104
 
 
105
#if HAVE_GETOPT_LONG
 
106
    while ((c = getopt_long (argc, argv, "asVv?", longopts, NULL)) != -1)
 
107
#else
 
108
    while ((c = getopt (argc, argv, "asVv?")) != -1)
 
109
#endif
 
110
    {
 
111
        switch (c) {
 
112
        case 'a':
 
113
            all = 1;
 
114
            break;
 
115
        case 's':
 
116
            sort = 1;
 
117
            break;
 
118
        case 'V':
 
119
            fprintf (stderr, "fontconfig version %d.%d.%d\n", 
 
120
                     FC_MAJOR, FC_MINOR, FC_REVISION);
 
121
            exit (0);
 
122
        case 'v':
 
123
            verbose = 1;
 
124
            break;
 
125
        default:
 
126
            usage (argv[0]);
 
127
        }
 
128
    }
 
129
    i = optind;
 
130
#else
 
131
    i = 1;
 
132
#endif
 
133
 
 
134
    if (!FcInit ())
 
135
    {
 
136
        fprintf (stderr, "Can't init font config library\n");
 
137
        return 1;
 
138
    }
 
139
    if (argv[i])
 
140
        pat = FcNameParse ((FcChar8 *) argv[i]);
 
141
    else
 
142
        pat = FcPatternCreate ();
 
143
 
 
144
    if (!pat)
 
145
        return 1;
 
146
 
 
147
    FcConfigSubstitute (0, pat, FcMatchPattern);
 
148
    FcDefaultSubstitute (pat);
 
149
    
 
150
    fs = FcFontSetCreate ();
 
151
 
 
152
    if (sort || all)
 
153
    {
 
154
        FcFontSet       *font_patterns;
 
155
        int     j;
 
156
        font_patterns = FcFontSort (0, pat, all ? FcFalse : FcTrue, 0, &result);
 
157
 
 
158
        for (j = 0; j < font_patterns->nfont; j++)
 
159
        {
 
160
            FcPattern  *font_pattern;
 
161
 
 
162
            font_pattern = FcFontRenderPrepare (NULL, pat, font_patterns->fonts[j]);
 
163
            if (font_pattern)
 
164
                FcFontSetAdd (fs, font_pattern);
 
165
        }
 
166
 
 
167
        FcFontSetSortDestroy (font_patterns);
 
168
    }
 
169
    else
 
170
    {
 
171
        FcPattern   *match;
 
172
        match = FcFontMatch (0, pat, &result);
 
173
        if (match)
 
174
            FcFontSetAdd (fs, match);
 
175
    }
 
176
    FcPatternDestroy (pat);
 
177
 
 
178
    if (fs)
 
179
    {
 
180
        int     j;
 
181
 
 
182
        for (j = 0; j < fs->nfont; j++)
 
183
        {
 
184
            if (verbose)
 
185
            {
 
186
                FcPatternPrint (fs->fonts[j]);
 
187
            }
 
188
            else
 
189
            {
 
190
                FcChar8 *family;
 
191
                FcChar8 *style;
 
192
                FcChar8 *file;
 
193
 
 
194
                if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &file) != FcResultMatch)
 
195
                    file = (FcChar8 *) "<unknown filename>";
 
196
                else
 
197
                {
 
198
                    FcChar8 *slash = (FcChar8 *) strrchr ((char *) file, '/');
 
199
                    if (slash)
 
200
                        file = slash+1;
 
201
                }
 
202
                if (FcPatternGetString (fs->fonts[j], FC_FAMILY, 0, &family) != FcResultMatch)
 
203
                    family = (FcChar8 *) "<unknown family>";
 
204
                if (FcPatternGetString (fs->fonts[j], FC_STYLE, 0, &style) != FcResultMatch)
 
205
                    style = (FcChar8 *) "<unknown style>";
 
206
 
 
207
                printf ("%s: \"%s\" \"%s\"\n", file, family, style);
 
208
            }
 
209
        }
 
210
        FcFontSetDestroy (fs);
 
211
    }
 
212
    FcFini ();
 
213
    return 0;
 
214
}