fc-scan.c revision a4e54154
1/* 2 * fontconfig/fc-scan/fc-scan.c 3 * 4 * Copyright © 2003 Keith Packard 5 * Copyright © 2008 Red Hat, Inc. 6 * Red Hat Author(s): Behdad Esfahbod 7 * 8 * Permission to use, copy, modify, distribute, and sell this software and its 9 * documentation for any purpose is hereby granted without fee, provided that 10 * the above copyright notice appear in all copies and that both that 11 * copyright notice and this permission notice appear in supporting 12 * documentation, and that the name of the author(s) not be used in 13 * advertising or publicity pertaining to distribution of the software without 14 * specific, written prior permission. The authors make no 15 * representations about the suitability of this software for any purpose. It 16 * is provided "as is" without express or implied warranty. 17 * 18 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 19 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 20 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR 21 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 22 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 23 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 24 * PERFORMANCE OF THIS SOFTWARE. 25 */ 26 27#ifdef HAVE_CONFIG_H 28#include <config.h> 29#else 30#ifdef linux 31#define HAVE_GETOPT_LONG 1 32#endif 33#define HAVE_GETOPT 1 34#endif 35 36#include <fontconfig/fontconfig.h> 37#include <fontconfig/fcfreetype.h> 38#include <stdio.h> 39#include <stdlib.h> 40#include <string.h> 41#include <locale.h> 42 43#ifdef HAVE_UNISTD_H 44#include <unistd.h> 45#endif 46 47#ifdef ENABLE_NLS 48#include <libintl.h> 49#define _(x) (dgettext(GETTEXT_PACKAGE, x)) 50#else 51#define dgettext(d, s) (s) 52#define _(x) (x) 53#endif 54 55#ifndef HAVE_GETOPT 56#define HAVE_GETOPT 0 57#endif 58#ifndef HAVE_GETOPT_LONG 59#define HAVE_GETOPT_LONG 0 60#endif 61 62#if HAVE_GETOPT_LONG 63#undef _GNU_SOURCE 64#define _GNU_SOURCE 65#include <getopt.h> 66static const struct option longopts[] = { 67 {"brief", 0, 0, 'b'}, 68 {"format", 1, 0, 'f'}, 69 {"sysroot", required_argument, 0, 'y'}, 70 {"version", 0, 0, 'V'}, 71 {"help", 0, 0, 'h'}, 72 {NULL,0,0,0}, 73}; 74#else 75#if HAVE_GETOPT 76extern char *optarg; 77extern int optind, opterr, optopt; 78#endif 79#endif 80 81static void 82usage (char *program, int error) 83{ 84 FILE *file = error ? stderr : stdout; 85#if HAVE_GETOPT_LONG 86 fprintf (file, _("usage: %s [-bcVh] [-f FORMAT] [-y SYSROOT] [--brief] [--format FORMAT] [--version] [--help] font-file...\n"), 87 program); 88#else 89 fprintf (file, _("usage: %s [-bcVh] [-f FORMAT] [-y SYSROOT] font-file...\n"), 90 program); 91#endif 92 fprintf (file, _("Scan font files and directories, and print resulting pattern(s)\n")); 93 fprintf (file, "\n"); 94#if HAVE_GETOPT_LONG 95 fprintf (file, _(" -b, --brief display font pattern briefly\n")); 96 fprintf (file, _(" -f, --format=FORMAT use the given output format\n")); 97 fprintf (file, _(" -y, --sysroot=SYSROOT prepend SYSROOT to all paths for scanning\n")); 98 fprintf (file, _(" -V, --version display font config version and exit\n")); 99 fprintf (file, _(" -h, --help display this help and exit\n")); 100#else 101 fprintf (file, _(" -b (brief) display font pattern briefly\n")); 102 fprintf (file, _(" -f FORMAT (format) use the given output format\n")); 103 fprintf (file, _(" -y SYSROOT (sysroot) prepend SYSROOT to all paths for scanning\n")); 104 fprintf (file, _(" -V (version) display font config version and exit\n")); 105 fprintf (file, _(" -h (help) display this help and exit\n")); 106#endif 107 exit (error); 108} 109 110int 111main (int argc, char **argv) 112{ 113 int brief = 0; 114 FcChar8 *format = NULL, *sysroot = NULL; 115 int i; 116 FcFontSet *fs; 117#if HAVE_GETOPT_LONG || HAVE_GETOPT 118 int c; 119 120 setlocale (LC_ALL, ""); 121#if HAVE_GETOPT_LONG 122 while ((c = getopt_long (argc, argv, "bf:y:Vh", longopts, NULL)) != -1) 123#else 124 while ((c = getopt (argc, argv, "bf:y:Vh")) != -1) 125#endif 126 { 127 switch (c) { 128 case 'b': 129 brief = 1; 130 break; 131 case 'f': 132 format = (FcChar8 *) strdup (optarg); 133 break; 134 case 'y': 135 sysroot = FcStrCopy ((const FcChar8 *) optarg); 136 break; 137 case 'V': 138 fprintf (stderr, "fontconfig version %d.%d.%d\n", 139 FC_MAJOR, FC_MINOR, FC_REVISION); 140 exit (0); 141 case 'h': 142 usage (argv[0], 0); 143 default: 144 usage (argv[0], 1); 145 } 146 } 147 i = optind; 148#else 149 i = 1; 150#endif 151 152 if (i == argc) 153 usage (argv[0], 1); 154 155 if (sysroot) 156 { 157 FcConfigSetSysRoot (NULL, sysroot); 158 FcStrFree (sysroot); 159 } 160 fs = FcFontSetCreate (); 161 162 for (; i < argc; i++) 163 { 164 const FcChar8 *file = (FcChar8*) argv[i]; 165 166 if (!FcFileIsDir (file)) 167 FcFileScan (fs, NULL, NULL, NULL, file, FcTrue); 168 else 169 { 170 FcStrSet *dirs = FcStrSetCreate (); 171 FcStrList *strlist = FcStrListCreate (dirs); 172 do 173 { 174 FcDirScan (fs, dirs, NULL, NULL, file, FcTrue); 175 } 176 while ((file = FcStrListNext (strlist))); 177 FcStrListDone (strlist); 178 FcStrSetDestroy (dirs); 179 } 180 } 181 182 for (i = 0; i < fs->nfont; i++) 183 { 184 FcPattern *pat = fs->fonts[i]; 185 186 if (brief) 187 { 188 FcPatternDel (pat, FC_CHARSET); 189 FcPatternDel (pat, FC_LANG); 190 } 191 192 if (format) 193 { 194 FcChar8 *s; 195 196 s = FcPatternFormat (pat, format); 197 if (s) 198 { 199 printf ("%s", s); 200 FcStrFree (s); 201 } 202 } 203 else 204 { 205 FcPatternPrint (pat); 206 } 207 } 208 209 FcFontSetDestroy (fs); 210 211 FcFini (); 212 return i > 0 ? 0 : 1; 213} 214