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