fc-pattern.c revision ca08ab68
1ca08ab68Smrg/* 2ca08ab68Smrg * fontconfig/fc-pattern/fc-pattern.c 3ca08ab68Smrg * 4ca08ab68Smrg * Copyright © 2003 Keith Packard 5ca08ab68Smrg * 6ca08ab68Smrg * Permission to use, copy, modify, distribute, and sell this software and its 7ca08ab68Smrg * documentation for any purpose is hereby granted without fee, provided that 8ca08ab68Smrg * the above copyright notice appear in all copies and that both that 9ca08ab68Smrg * copyright notice and this permission notice appear in supporting 10ca08ab68Smrg * documentation, and that the name of the author(s) not be used in 11ca08ab68Smrg * advertising or publicity pertaining to distribution of the software without 12ca08ab68Smrg * specific, written prior permission. The authors make no 13ca08ab68Smrg * representations about the suitability of this software for any purpose. It 14ca08ab68Smrg * is provided "as is" without express or implied warranty. 15ca08ab68Smrg * 16ca08ab68Smrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 17ca08ab68Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18ca08ab68Smrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR 19ca08ab68Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 20ca08ab68Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 21ca08ab68Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 22ca08ab68Smrg * PERFORMANCE OF THIS SOFTWARE. 23ca08ab68Smrg */ 24ca08ab68Smrg 25ca08ab68Smrg#ifdef HAVE_CONFIG_H 26ca08ab68Smrg#include <config.h> 27ca08ab68Smrg#else 28ca08ab68Smrg#ifdef linux 29ca08ab68Smrg#define HAVE_GETOPT_LONG 1 30ca08ab68Smrg#endif 31ca08ab68Smrg#define HAVE_GETOPT 1 32ca08ab68Smrg#endif 33ca08ab68Smrg 34ca08ab68Smrg#include <fontconfig/fontconfig.h> 35ca08ab68Smrg#include <stdio.h> 36ca08ab68Smrg#include <unistd.h> 37ca08ab68Smrg#include <stdlib.h> 38ca08ab68Smrg#include <string.h> 39ca08ab68Smrg 40ca08ab68Smrg#ifndef HAVE_GETOPT 41ca08ab68Smrg#define HAVE_GETOPT 0 42ca08ab68Smrg#endif 43ca08ab68Smrg#ifndef HAVE_GETOPT_LONG 44ca08ab68Smrg#define HAVE_GETOPT_LONG 0 45ca08ab68Smrg#endif 46ca08ab68Smrg 47ca08ab68Smrg#if HAVE_GETOPT_LONG 48ca08ab68Smrg#undef _GNU_SOURCE 49ca08ab68Smrg#define _GNU_SOURCE 50ca08ab68Smrg#include <getopt.h> 51ca08ab68Smrgstatic const struct option longopts[] = { 52ca08ab68Smrg {"config", 0, 0, 'c'}, 53ca08ab68Smrg {"default", 0, 0, 'd'}, 54ca08ab68Smrg {"format", 1, 0, 'f'}, 55ca08ab68Smrg {"version", 0, 0, 'V'}, 56ca08ab68Smrg {"help", 0, 0, 'h'}, 57ca08ab68Smrg {NULL,0,0,0}, 58ca08ab68Smrg}; 59ca08ab68Smrg#else 60ca08ab68Smrg#if HAVE_GETOPT 61ca08ab68Smrgextern char *optarg; 62ca08ab68Smrgextern int optind, opterr, optopt; 63ca08ab68Smrg#endif 64ca08ab68Smrg#endif 65ca08ab68Smrg 66ca08ab68Smrgstatic void 67ca08ab68Smrgusage (char *program, int error) 68ca08ab68Smrg{ 69ca08ab68Smrg FILE *file = error ? stderr : stdout; 70ca08ab68Smrg#if HAVE_GETOPT_LONG 71ca08ab68Smrg fprintf (file, "usage: %s [-cdVh] [-f FORMAT] [--config] [--default] [--verbose] [--format=FORMAT] [--version] [--help] [pattern] {element...}\n", 72ca08ab68Smrg program); 73ca08ab68Smrg#else 74ca08ab68Smrg fprintf (file, "usage: %s [-cdVh] [-f FORMAT] [pattern] {element...}\n", 75ca08ab68Smrg program); 76ca08ab68Smrg#endif 77ca08ab68Smrg fprintf (file, "List best font matching [pattern]\n"); 78ca08ab68Smrg fprintf (file, "\n"); 79ca08ab68Smrg#if HAVE_GETOPT_LONG 80ca08ab68Smrg fprintf (file, " -c, --config perform config substitution on pattern\n"); 81ca08ab68Smrg fprintf (file, " -d, -default perform default substitution on pattern\n"); 82ca08ab68Smrg fprintf (file, " -f, --format=FORMAT use the given output format\n"); 83ca08ab68Smrg fprintf (file, " -V, --version display font config version and exit\n"); 84ca08ab68Smrg fprintf (file, " -h, --help display this help and exit\n"); 85ca08ab68Smrg#else 86ca08ab68Smrg fprintf (file, " -c, (config) perform config substitution on pattern\n"); 87ca08ab68Smrg fprintf (file, " -d, (default) perform default substitution on pattern\n"); 88ca08ab68Smrg fprintf (file, " -f FORMAT (format) use the given output format\n"); 89ca08ab68Smrg fprintf (file, " -V (version) display font config version and exit\n"); 90ca08ab68Smrg fprintf (file, " -h (help) display this help and exit\n"); 91ca08ab68Smrg#endif 92ca08ab68Smrg exit (error); 93ca08ab68Smrg} 94ca08ab68Smrg 95ca08ab68Smrgint 96ca08ab68Smrgmain (int argc, char **argv) 97ca08ab68Smrg{ 98ca08ab68Smrg int do_config = 0, do_default = 0; 99ca08ab68Smrg FcChar8 *format = NULL; 100ca08ab68Smrg int i; 101ca08ab68Smrg FcObjectSet *os = 0; 102ca08ab68Smrg FcPattern *pat; 103ca08ab68Smrg#if HAVE_GETOPT_LONG || HAVE_GETOPT 104ca08ab68Smrg int c; 105ca08ab68Smrg 106ca08ab68Smrg#if HAVE_GETOPT_LONG 107ca08ab68Smrg while ((c = getopt_long (argc, argv, "cdf:Vh", longopts, NULL)) != -1) 108ca08ab68Smrg#else 109ca08ab68Smrg while ((c = getopt (argc, argv, "cdf:Vh")) != -1) 110ca08ab68Smrg#endif 111ca08ab68Smrg { 112ca08ab68Smrg switch (c) { 113ca08ab68Smrg case 'c': 114ca08ab68Smrg do_config = 1; 115ca08ab68Smrg break; 116ca08ab68Smrg case 'd': 117ca08ab68Smrg do_default = 1; 118ca08ab68Smrg break; 119ca08ab68Smrg case 'f': 120ca08ab68Smrg format = (FcChar8 *) strdup (optarg); 121ca08ab68Smrg break; 122ca08ab68Smrg case 'V': 123ca08ab68Smrg fprintf (stderr, "fontconfig version %d.%d.%d\n", 124ca08ab68Smrg FC_MAJOR, FC_MINOR, FC_REVISION); 125ca08ab68Smrg exit (0); 126ca08ab68Smrg case 'h': 127ca08ab68Smrg usage (argv[0], 0); 128ca08ab68Smrg default: 129ca08ab68Smrg usage (argv[0], 1); 130ca08ab68Smrg } 131ca08ab68Smrg } 132ca08ab68Smrg i = optind; 133ca08ab68Smrg#else 134ca08ab68Smrg i = 1; 135ca08ab68Smrg#endif 136ca08ab68Smrg 137ca08ab68Smrg if (!FcInit ()) 138ca08ab68Smrg { 139ca08ab68Smrg fprintf (stderr, "Can't init font config library\n"); 140ca08ab68Smrg return 1; 141ca08ab68Smrg } 142ca08ab68Smrg if (argv[i]) 143ca08ab68Smrg { 144ca08ab68Smrg pat = FcNameParse ((FcChar8 *) argv[i]); 145ca08ab68Smrg while (argv[++i]) 146ca08ab68Smrg { 147ca08ab68Smrg if (!os) 148ca08ab68Smrg os = FcObjectSetCreate (); 149ca08ab68Smrg FcObjectSetAdd (os, argv[i]); 150ca08ab68Smrg } 151ca08ab68Smrg } 152ca08ab68Smrg else 153ca08ab68Smrg pat = FcPatternCreate (); 154ca08ab68Smrg 155ca08ab68Smrg if (!pat) 156ca08ab68Smrg return 1; 157ca08ab68Smrg 158ca08ab68Smrg if (do_config) 159ca08ab68Smrg FcConfigSubstitute (0, pat, FcMatchPattern); 160ca08ab68Smrg if (do_default) 161ca08ab68Smrg FcDefaultSubstitute (pat); 162ca08ab68Smrg 163ca08ab68Smrg if (os) 164ca08ab68Smrg { 165ca08ab68Smrg FcPattern *new; 166ca08ab68Smrg new = FcPatternFilter (pat, os); 167ca08ab68Smrg FcPatternDestroy (pat); 168ca08ab68Smrg pat = new; 169ca08ab68Smrg } 170ca08ab68Smrg 171ca08ab68Smrg if (format) 172ca08ab68Smrg { 173ca08ab68Smrg FcChar8 *s; 174ca08ab68Smrg 175ca08ab68Smrg s = FcPatternFormat (pat, format); 176ca08ab68Smrg if (s) 177ca08ab68Smrg { 178ca08ab68Smrg printf ("%s", s); 179ca08ab68Smrg FcStrFree (s); 180ca08ab68Smrg } 181ca08ab68Smrg } 182ca08ab68Smrg else 183ca08ab68Smrg { 184ca08ab68Smrg FcPatternPrint (pat); 185ca08ab68Smrg } 186ca08ab68Smrg 187ca08ab68Smrg FcPatternDestroy (pat); 188ca08ab68Smrg 189ca08ab68Smrg if (os) 190ca08ab68Smrg FcObjectSetDestroy (os); 191ca08ab68Smrg 192ca08ab68Smrg FcFini (); 193ca08ab68Smrg 194ca08ab68Smrg return 0; 195ca08ab68Smrg} 196