(root)/
fontconfig-2.14.2/
fc-scan/
fc-scan.c
       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>
      66  static 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
      76  extern char *optarg;
      77  extern int optind, opterr, optopt;
      78  #endif
      79  #endif
      80  
      81  static void
      82  usage (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  
     110  int
     111  main (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  }