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