fc-list.c revision a6844aab
12c393a42Smrg/*
2a6844aabSmrg * fontconfig/fc-list/fc-list.c
32c393a42Smrg *
42c393a42Smrg * Copyright © 2002 Keith Packard
52c393a42Smrg *
62c393a42Smrg * Permission to use, copy, modify, distribute, and sell this software and its
72c393a42Smrg * documentation for any purpose is hereby granted without fee, provided that
82c393a42Smrg * the above copyright notice appear in all copies and that both that
92c393a42Smrg * copyright notice and this permission notice appear in supporting
102c393a42Smrg * documentation, and that the name of Keith Packard not be used in
112c393a42Smrg * advertising or publicity pertaining to distribution of the software without
122c393a42Smrg * specific, written prior permission.  Keith Packard makes no
132c393a42Smrg * representations about the suitability of this software for any purpose.  It
142c393a42Smrg * is provided "as is" without express or implied warranty.
152c393a42Smrg *
16a6844aabSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18a6844aabSmrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
192c393a42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
202c393a42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
212c393a42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
222c393a42Smrg * PERFORMANCE OF THIS SOFTWARE.
232c393a42Smrg */
242c393a42Smrg
252c393a42Smrg#include <fontconfig/fontconfig.h>
262c393a42Smrg#include <stdio.h>
272c393a42Smrg#include <unistd.h>
282c393a42Smrg#include <stdlib.h>
29a6844aabSmrg#include <string.h>
302c393a42Smrg#ifdef HAVE_CONFIG_H
312c393a42Smrg#include <config.h>
322c393a42Smrg#else
332c393a42Smrg#ifdef linux
342c393a42Smrg#define HAVE_GETOPT_LONG 1
352c393a42Smrg#endif
362c393a42Smrg#define HAVE_GETOPT 1
372c393a42Smrg#endif
382c393a42Smrg
392c393a42Smrg#ifndef HAVE_GETOPT
402c393a42Smrg#define HAVE_GETOPT 0
412c393a42Smrg#endif
422c393a42Smrg#ifndef HAVE_GETOPT_LONG
432c393a42Smrg#define HAVE_GETOPT_LONG 0
442c393a42Smrg#endif
452c393a42Smrg
462c393a42Smrg#if HAVE_GETOPT_LONG
472c393a42Smrg#undef  _GNU_SOURCE
482c393a42Smrg#define _GNU_SOURCE
492c393a42Smrg#include <getopt.h>
502c393a42Smrgconst struct option longopts[] = {
512c393a42Smrg    {"verbose", 0, 0, 'v'},
52a6844aabSmrg    {"format", 1, 0, 'f'},
53a6844aabSmrg    {"quiet", 0, 0, 'q'},
54a6844aabSmrg    {"version", 0, 0, 'V'},
55a6844aabSmrg    {"help", 0, 0, 'h'},
562c393a42Smrg    {NULL,0,0,0},
572c393a42Smrg};
582c393a42Smrg#else
592c393a42Smrg#if HAVE_GETOPT
602c393a42Smrgextern char *optarg;
612c393a42Smrgextern int optind, opterr, optopt;
622c393a42Smrg#endif
632c393a42Smrg#endif
642c393a42Smrg
65a6844aabSmrgstatic void
66a6844aabSmrgusage (char *program, int error)
672c393a42Smrg{
68a6844aabSmrg    FILE *file = error ? stderr : stdout;
692c393a42Smrg#if HAVE_GETOPT_LONG
70a6844aabSmrg    fprintf (file, "usage: %s [-vqVh] [-f FORMAT] [--verbose] [--format=FORMAT] [--quiet] [--version] [--help] [pattern] {element ...} \n",
712c393a42Smrg	     program);
722c393a42Smrg#else
73a6844aabSmrg    fprintf (file, "usage: %s [-vqVh] [-f FORMAT] [pattern] {element ...} \n",
742c393a42Smrg	     program);
752c393a42Smrg#endif
76a6844aabSmrg    fprintf (file, "List fonts matching [pattern]\n");
77a6844aabSmrg    fprintf (file, "\n");
782c393a42Smrg#if HAVE_GETOPT_LONG
79a6844aabSmrg    fprintf (file, "  -v, --verbose        display entire font pattern verbosely\n");
80a6844aabSmrg    fprintf (file, "  -f, --format=FORMAT  use the given output format\n");
81a6844aabSmrg    fprintf (file, "  -q, --quiet          suppress all normal output, exit 1 if no fonts matched\n");
82a6844aabSmrg    fprintf (file, "  -V, --version        display font config version and exit\n");
83a6844aabSmrg    fprintf (file, "  -h, --help           display this help and exit\n");
842c393a42Smrg#else
85a6844aabSmrg    fprintf (file, "  -v         (verbose) display entire font pattern verbosely\n");
86a6844aabSmrg    fprintf (file, "  -f FORMAT  (format)  use the given output format\n");
87a6844aabSmrg    fprintf (file, "  -q,        (quiet)   suppress all normal output, exit 1 if no fonts matched\n");
88a6844aabSmrg    fprintf (file, "  -V         (version) display font config version and exit\n");
89a6844aabSmrg    fprintf (file, "  -h         (help)    display this help and exit\n");
902c393a42Smrg#endif
91a6844aabSmrg    exit (error);
922c393a42Smrg}
932c393a42Smrg
942c393a42Smrgint
952c393a42Smrgmain (int argc, char **argv)
962c393a42Smrg{
97a6844aabSmrg    int		verbose = 0;
98a6844aabSmrg    int		quiet = 0;
99a6844aabSmrg    FcChar8     *format = NULL;
100a6844aabSmrg    int		nfont = 0;
1012c393a42Smrg    int		i;
1022c393a42Smrg    FcObjectSet *os = 0;
1032c393a42Smrg    FcFontSet	*fs;
1042c393a42Smrg    FcPattern   *pat;
1052c393a42Smrg#if HAVE_GETOPT_LONG || HAVE_GETOPT
1062c393a42Smrg    int		c;
1072c393a42Smrg
1082c393a42Smrg#if HAVE_GETOPT_LONG
109a6844aabSmrg    while ((c = getopt_long (argc, argv, "vf:qVh", longopts, NULL)) != -1)
1102c393a42Smrg#else
111a6844aabSmrg    while ((c = getopt (argc, argv, "vf:qVh")) != -1)
1122c393a42Smrg#endif
1132c393a42Smrg    {
1142c393a42Smrg	switch (c) {
115a6844aabSmrg	case 'v':
116a6844aabSmrg	    verbose = 1;
117a6844aabSmrg	    break;
118a6844aabSmrg	case 'f':
119a6844aabSmrg	    format = (FcChar8 *) strdup (optarg);
120a6844aabSmrg	    break;
121a6844aabSmrg	case 'q':
122a6844aabSmrg	    quiet = 1;
123a6844aabSmrg	    break;
1242c393a42Smrg	case 'V':
125a6844aabSmrg	    fprintf (stderr, "fontconfig version %d.%d.%d\n",
1262c393a42Smrg		     FC_MAJOR, FC_MINOR, FC_REVISION);
1272c393a42Smrg	    exit (0);
128a6844aabSmrg	case 'h':
129a6844aabSmrg	    usage (argv[0], 0);
1302c393a42Smrg	default:
131a6844aabSmrg	    usage (argv[0], 1);
1322c393a42Smrg	}
1332c393a42Smrg    }
1342c393a42Smrg    i = optind;
1352c393a42Smrg#else
1362c393a42Smrg    i = 1;
1372c393a42Smrg#endif
1382c393a42Smrg
1392c393a42Smrg    if (!FcInit ())
1402c393a42Smrg    {
1412c393a42Smrg	fprintf (stderr, "Can't init font config library\n");
1422c393a42Smrg	return 1;
1432c393a42Smrg    }
1442c393a42Smrg    if (argv[i])
1452c393a42Smrg    {
1462c393a42Smrg	pat = FcNameParse ((FcChar8 *) argv[i]);
1472c393a42Smrg	while (argv[++i])
1482c393a42Smrg	{
1492c393a42Smrg	    if (!os)
1502c393a42Smrg		os = FcObjectSetCreate ();
1512c393a42Smrg	    FcObjectSetAdd (os, argv[i]);
1522c393a42Smrg	}
1532c393a42Smrg    }
1542c393a42Smrg    else
1552c393a42Smrg	pat = FcPatternCreate ();
156a6844aabSmrg    if (quiet && !os)
157a6844aabSmrg	os = FcObjectSetCreate ();
158a6844aabSmrg    if (!verbose && !format && !os)
1592c393a42Smrg	os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, (char *) 0);
1602c393a42Smrg    fs = FcFontList (0, pat, os);
161a6844aabSmrg    if (os)
162a6844aabSmrg	FcObjectSetDestroy (os);
1632c393a42Smrg    if (pat)
1642c393a42Smrg	FcPatternDestroy (pat);
1652c393a42Smrg
166a6844aabSmrg    if (!quiet && fs)
1672c393a42Smrg    {
1682c393a42Smrg	int	j;
1692c393a42Smrg
1702c393a42Smrg	for (j = 0; j < fs->nfont; j++)
1712c393a42Smrg	{
172a6844aabSmrg	    if (verbose)
173a6844aabSmrg	    {
174a6844aabSmrg		FcPatternPrint (fs->fonts[j]);
175a6844aabSmrg	    }
176a6844aabSmrg	    else if (format)
177a6844aabSmrg	    {
178a6844aabSmrg	        FcChar8 *s;
179a6844aabSmrg
180a6844aabSmrg		s = FcPatternFormat (fs->fonts[j], format);
181a6844aabSmrg		if (s)
182a6844aabSmrg		{
183a6844aabSmrg		    printf ("%s", s);
184a6844aabSmrg		    free (s);
185a6844aabSmrg		}
186a6844aabSmrg	    }
187a6844aabSmrg	    else
188a6844aabSmrg	    {
189a6844aabSmrg		FcChar8 *str;
190a6844aabSmrg		FcChar8 *file;
1912c393a42Smrg
192a6844aabSmrg		str = FcNameUnparse (fs->fonts[j]);
193a6844aabSmrg		if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch)
194a6844aabSmrg		    printf ("%s: ", file);
195a6844aabSmrg		printf ("%s\n", str);
196a6844aabSmrg		free (str);
197a6844aabSmrg	    }
1982c393a42Smrg	}
199a6844aabSmrg    }
200a6844aabSmrg
201a6844aabSmrg    if (fs) {
202a6844aabSmrg	nfont = fs->nfont;
2032c393a42Smrg	FcFontSetDestroy (fs);
2042c393a42Smrg    }
2052c393a42Smrg
2062c393a42Smrg    FcFini ();
2072c393a42Smrg
208a6844aabSmrg    return quiet ? (nfont == 0 ? 1 : 0) : 0;
2092c393a42Smrg}
210