fc-match.c revision 2c393a42
12c393a42Smrg/*
22c393a42Smrg * $RCSId: xc/lib/fontconfig/fc-list/fc-list.c,v 1.5 2002/06/30 23:45:40 keithp Exp $
32c393a42Smrg *
42c393a42Smrg * Copyright © 2003 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 *
162c393a42Smrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
182c393a42Smrg * EVENT SHALL KEITH PACKARD 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#ifdef HAVE_CONFIG_H
262c393a42Smrg#include <config.h>
272c393a42Smrg#else
282c393a42Smrg#ifdef linux
292c393a42Smrg#define HAVE_GETOPT_LONG 1
302c393a42Smrg#endif
312c393a42Smrg#define HAVE_GETOPT 1
322c393a42Smrg#endif
332c393a42Smrg
342c393a42Smrg#include <fontconfig/fontconfig.h>
352c393a42Smrg#include <stdio.h>
362c393a42Smrg#include <unistd.h>
372c393a42Smrg#include <stdlib.h>
382c393a42Smrg#include <string.h>
392c393a42Smrg
402c393a42Smrg#ifndef HAVE_GETOPT
412c393a42Smrg#define HAVE_GETOPT 0
422c393a42Smrg#endif
432c393a42Smrg#ifndef HAVE_GETOPT_LONG
442c393a42Smrg#define HAVE_GETOPT_LONG 0
452c393a42Smrg#endif
462c393a42Smrg
472c393a42Smrg#if HAVE_GETOPT_LONG
482c393a42Smrg#undef  _GNU_SOURCE
492c393a42Smrg#define _GNU_SOURCE
502c393a42Smrg#include <getopt.h>
512c393a42Smrgstatic const struct option longopts[] = {
522c393a42Smrg    {"sort", 0, 0, 's'},
532c393a42Smrg    {"all", 0, 0, 'a'},
542c393a42Smrg    {"version", 0, 0, 'V'},
552c393a42Smrg    {"verbose", 0, 0, 'v'},
562c393a42Smrg    {"help", 0, 0, '?'},
572c393a42Smrg    {NULL,0,0,0},
582c393a42Smrg};
592c393a42Smrg#else
602c393a42Smrg#if HAVE_GETOPT
612c393a42Smrgextern char *optarg;
622c393a42Smrgextern int optind, opterr, optopt;
632c393a42Smrg#endif
642c393a42Smrg#endif
652c393a42Smrg
662c393a42Smrgstatic void usage (char *program)
672c393a42Smrg{
682c393a42Smrg#if HAVE_GETOPT_LONG
692c393a42Smrg    fprintf (stderr, "usage: %s [-svV?] [--sort] [--all] [--verbose] [--version] [--help] [pattern]\n",
702c393a42Smrg	     program);
712c393a42Smrg#else
722c393a42Smrg    fprintf (stderr, "usage: %s [-svV?] [pattern]\n",
732c393a42Smrg	     program);
742c393a42Smrg#endif
752c393a42Smrg    fprintf (stderr, "List fonts matching [pattern]\n");
762c393a42Smrg    fprintf (stderr, "\n");
772c393a42Smrg#if HAVE_GETOPT_LONG
782c393a42Smrg    fprintf (stderr, "  -s, --sort           display sorted list of matches\n");
792c393a42Smrg    fprintf (stderr, "  -a, --all            display unpruned sorted list of matches\n");
802c393a42Smrg    fprintf (stderr, "  -v, --verbose        display entire font pattern\n");
812c393a42Smrg    fprintf (stderr, "  -V, --version        display font config version and exit\n");
822c393a42Smrg    fprintf (stderr, "  -?, --help           display this help and exit\n");
832c393a42Smrg#else
842c393a42Smrg    fprintf (stderr, "  -s,        (sort)    display sorted list of matches\n");
852c393a42Smrg    fprintf (stderr, "  -a         (all)     display unpruned sorted list of matches\n");
862c393a42Smrg    fprintf (stderr, "  -v         (verbose) display entire font pattern\n");
872c393a42Smrg    fprintf (stderr, "  -V         (version) display font config version and exit\n");
882c393a42Smrg    fprintf (stderr, "  -?         (help)    display this help and exit\n");
892c393a42Smrg#endif
902c393a42Smrg    exit (1);
912c393a42Smrg}
922c393a42Smrg
932c393a42Smrgint
942c393a42Smrgmain (int argc, char **argv)
952c393a42Smrg{
962c393a42Smrg    int		verbose = 0;
972c393a42Smrg    int		sort = 0, all = 0;
982c393a42Smrg    int		i;
992c393a42Smrg    FcFontSet	*fs;
1002c393a42Smrg    FcPattern   *pat;
1012c393a42Smrg    FcResult	result;
1022c393a42Smrg#if HAVE_GETOPT_LONG || HAVE_GETOPT
1032c393a42Smrg    int		c;
1042c393a42Smrg
1052c393a42Smrg#if HAVE_GETOPT_LONG
1062c393a42Smrg    while ((c = getopt_long (argc, argv, "asVv?", longopts, NULL)) != -1)
1072c393a42Smrg#else
1082c393a42Smrg    while ((c = getopt (argc, argv, "asVv?")) != -1)
1092c393a42Smrg#endif
1102c393a42Smrg    {
1112c393a42Smrg	switch (c) {
1122c393a42Smrg	case 'a':
1132c393a42Smrg	    all = 1;
1142c393a42Smrg	    break;
1152c393a42Smrg	case 's':
1162c393a42Smrg	    sort = 1;
1172c393a42Smrg	    break;
1182c393a42Smrg	case 'V':
1192c393a42Smrg	    fprintf (stderr, "fontconfig version %d.%d.%d\n",
1202c393a42Smrg		     FC_MAJOR, FC_MINOR, FC_REVISION);
1212c393a42Smrg	    exit (0);
1222c393a42Smrg	case 'v':
1232c393a42Smrg	    verbose = 1;
1242c393a42Smrg	    break;
1252c393a42Smrg	default:
1262c393a42Smrg	    usage (argv[0]);
1272c393a42Smrg	}
1282c393a42Smrg    }
1292c393a42Smrg    i = optind;
1302c393a42Smrg#else
1312c393a42Smrg    i = 1;
1322c393a42Smrg#endif
1332c393a42Smrg
1342c393a42Smrg    if (!FcInit ())
1352c393a42Smrg    {
1362c393a42Smrg	fprintf (stderr, "Can't init font config library\n");
1372c393a42Smrg	return 1;
1382c393a42Smrg    }
1392c393a42Smrg    if (argv[i])
1402c393a42Smrg	pat = FcNameParse ((FcChar8 *) argv[i]);
1412c393a42Smrg    else
1422c393a42Smrg	pat = FcPatternCreate ();
1432c393a42Smrg
1442c393a42Smrg    if (!pat)
1452c393a42Smrg	return 1;
1462c393a42Smrg
1472c393a42Smrg    FcConfigSubstitute (0, pat, FcMatchPattern);
1482c393a42Smrg    FcDefaultSubstitute (pat);
1492c393a42Smrg
1502c393a42Smrg    fs = FcFontSetCreate ();
1512c393a42Smrg
1522c393a42Smrg    if (sort || all)
1532c393a42Smrg    {
1542c393a42Smrg	FcFontSet	*font_patterns;
1552c393a42Smrg	int	j;
1562c393a42Smrg	font_patterns = FcFontSort (0, pat, all ? FcFalse : FcTrue, 0, &result);
1572c393a42Smrg
1582c393a42Smrg	for (j = 0; j < font_patterns->nfont; j++)
1592c393a42Smrg	{
1602c393a42Smrg	    FcPattern  *font_pattern;
1612c393a42Smrg
1622c393a42Smrg	    font_pattern = FcFontRenderPrepare (NULL, pat, font_patterns->fonts[j]);
1632c393a42Smrg	    if (font_pattern)
1642c393a42Smrg		FcFontSetAdd (fs, font_pattern);
1652c393a42Smrg	}
1662c393a42Smrg
1672c393a42Smrg	FcFontSetSortDestroy (font_patterns);
1682c393a42Smrg    }
1692c393a42Smrg    else
1702c393a42Smrg    {
1712c393a42Smrg	FcPattern   *match;
1722c393a42Smrg	match = FcFontMatch (0, pat, &result);
1732c393a42Smrg	if (match)
1742c393a42Smrg	    FcFontSetAdd (fs, match);
1752c393a42Smrg    }
1762c393a42Smrg    FcPatternDestroy (pat);
1772c393a42Smrg
1782c393a42Smrg    if (fs)
1792c393a42Smrg    {
1802c393a42Smrg	int	j;
1812c393a42Smrg
1822c393a42Smrg	for (j = 0; j < fs->nfont; j++)
1832c393a42Smrg	{
1842c393a42Smrg	    if (verbose)
1852c393a42Smrg	    {
1862c393a42Smrg		FcPatternPrint (fs->fonts[j]);
1872c393a42Smrg	    }
1882c393a42Smrg	    else
1892c393a42Smrg	    {
1902c393a42Smrg		FcChar8	*family;
1912c393a42Smrg		FcChar8	*style;
1922c393a42Smrg		FcChar8	*file;
1932c393a42Smrg
1942c393a42Smrg		if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &file) != FcResultMatch)
1952c393a42Smrg		    file = (FcChar8 *) "<unknown filename>";
1962c393a42Smrg		else
1972c393a42Smrg		{
1982c393a42Smrg		    FcChar8 *slash = (FcChar8 *) strrchr ((char *) file, '/');
1992c393a42Smrg		    if (slash)
2002c393a42Smrg			file = slash+1;
2012c393a42Smrg		}
2022c393a42Smrg		if (FcPatternGetString (fs->fonts[j], FC_FAMILY, 0, &family) != FcResultMatch)
2032c393a42Smrg		    family = (FcChar8 *) "<unknown family>";
2042c393a42Smrg		if (FcPatternGetString (fs->fonts[j], FC_STYLE, 0, &style) != FcResultMatch)
2052c393a42Smrg		    style = (FcChar8 *) "<unknown style>";
2062c393a42Smrg
2072c393a42Smrg		printf ("%s: \"%s\" \"%s\"\n", file, family, style);
2082c393a42Smrg	    }
2092c393a42Smrg	}
2102c393a42Smrg	FcFontSetDestroy (fs);
2112c393a42Smrg    }
2122c393a42Smrg    FcFini ();
2132c393a42Smrg    return 0;
2142c393a42Smrg}
215