|
Packit |
daac2c |
/* otflist.c -- List OpenType fonts.
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
|
Packit |
daac2c |
National Institute of Advanced Industrial Science and Technology (AIST)
|
|
Packit |
daac2c |
Registration Number H15PRO167
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
This file is part of libotf.
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
Libotf is free software; you can redistribute it and/or modify it
|
|
Packit |
daac2c |
under the terms of the GNU Lesser General Public License as published
|
|
Packit |
daac2c |
by the Free Software Foundation; either version 2.1 of the License, or
|
|
Packit |
daac2c |
(at your option) any later version.
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
Libotf is distributed in the hope that it will be useful, but WITHOUT
|
|
Packit |
daac2c |
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
Packit |
daac2c |
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
Packit |
daac2c |
License for more details.
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
You should have received a copy of the GNU Lesser General Public
|
|
Packit |
daac2c |
License along with this library, in a file named COPYING; if not,
|
|
Packit |
daac2c |
write to the Free Software Foundation, Inc., 59 Temple Place, Suite
|
|
Packit |
daac2c |
330, Boston, MA 02111-1307, USA. */
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#include <stdio.h>
|
|
Packit |
daac2c |
#include <unistd.h>
|
|
Packit |
daac2c |
#include <string.h>
|
|
Packit |
daac2c |
#include <sys/types.h>
|
|
Packit |
daac2c |
#include <dirent.h>
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#include <ft2build.h>
|
|
Packit |
daac2c |
#include FT_FREETYPE_H
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#include "config.h"
|
|
Packit |
daac2c |
#ifdef HAVE_ALLOCA_H
|
|
Packit |
daac2c |
#include <alloca.h>
|
|
Packit |
daac2c |
#endif
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#include <otf.h>
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
/* Format MSG by FMT and print the result to the stderr, and exit. */
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#define FATAL_ERROR(fmt, arg) \
|
|
Packit |
daac2c |
do { \
|
|
Packit |
daac2c |
fprintf (stderr, fmt, arg); \
|
|
Packit |
daac2c |
exit (1); \
|
|
Packit |
daac2c |
} while (0)
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
void
|
|
Packit |
daac2c |
print_tag (OTF_Tag tag)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
char name[5];
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
OTF_tag_name (tag, name);
|
|
Packit |
daac2c |
printf ("%s", name);
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
void
|
|
Packit |
daac2c |
print_gsub_gpos_info (OTF *otf, char *table)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
int i, j;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (OTF_get_table (otf, table) == 0)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
OTF_ScriptList *scripts;
|
|
Packit |
daac2c |
OTF_FeatureList *features;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (! strcmp (table, "GSUB"))
|
|
Packit |
daac2c |
scripts = &otf->gsub->ScriptList, features = &otf->gsub->FeatureList;
|
|
Packit |
daac2c |
else
|
|
Packit |
daac2c |
scripts = &otf->gpos->ScriptList, features = &otf->gpos->FeatureList;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
printf (" %s scripts: ", table);
|
|
Packit |
daac2c |
for (i = 0; i < scripts->ScriptCount; i++)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
OTF_Script *script = scripts->Script + i;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (i > 0)
|
|
Packit |
daac2c |
printf (", ");
|
|
Packit |
daac2c |
print_tag (script->ScriptTag);
|
|
Packit |
daac2c |
if (script->LangSysCount > 0)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
printf (" (");
|
|
Packit |
daac2c |
for (j = 0; j < script->LangSysCount; j++)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
if (j > 0)
|
|
Packit |
daac2c |
printf (", ");
|
|
Packit |
daac2c |
print_tag (script->LangSysRecord[j].LangSysTag);
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
printf (")");
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
printf ("\n");
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
printf (" %s features: ", table);
|
|
Packit |
daac2c |
for (i = 0; i < features->FeatureCount; i++)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
if (i > 0)
|
|
Packit |
daac2c |
printf (",");
|
|
Packit |
daac2c |
print_tag (features->Feature[i].FeatureTag);
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
printf ("\n");
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
void
|
|
Packit |
daac2c |
help_and_exit (char *prog)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
printf ("otflist %s\n", LIBOTF_VERSION);
|
|
Packit |
daac2c |
printf ("Usage: %s [-l] [-h] [DIR]\n", prog);
|
|
Packit |
daac2c |
printf ("List information about OpenType font files in the directory DIR.\n");
|
|
Packit |
daac2c |
printf ("It actually lists all fonts that can be handled by Freetype.\n");
|
|
Packit |
daac2c |
printf (" -h print this help, then exit\n");
|
|
Packit |
daac2c |
printf (" -l use a long listing mode\n");
|
|
Packit |
daac2c |
exit (0);
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
int
|
|
Packit |
daac2c |
filter (const struct dirent *direntry)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
int len = strlen (direntry->d_name);
|
|
Packit |
daac2c |
const char *ext = direntry->d_name + (len - 4);
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
return (len >= 5
|
|
Packit |
daac2c |
&& (! strncmp (ext, ".ttf", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".TTF", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".ttc", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".TTC", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".otf", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".OTF", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".PFA", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".pfa", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".PFB", 4)
|
|
Packit |
daac2c |
|| ! strncmp (ext, ".pfb", 4)));
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
int dir_index = 0;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#ifdef HAVE_SCANDIR
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
struct dirent **namelist = NULL;
|
|
Packit |
daac2c |
int num_files = 0;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
char *
|
|
Packit |
daac2c |
next_file (char *dirname)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
if (dir_index == 0)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
#ifdef HAVE_ALPHASORT
|
|
Packit |
daac2c |
num_files = scandir (".", &namelist, filter, alphasort);
|
|
Packit |
daac2c |
#else
|
|
Packit |
daac2c |
num_files = scandir (".", &namelist, filter, NULL);
|
|
Packit |
daac2c |
#endif
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
if (dir_index == num_files)
|
|
Packit |
daac2c |
return NULL;
|
|
Packit |
daac2c |
return namelist[dir_index++]->d_name;
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#else /* not HAVE_SCANDIR */
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
DIR *dirp;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
char *
|
|
Packit |
daac2c |
next_file (char *dirname)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
struct dirent *dirent;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (dir_index == 0)
|
|
Packit |
daac2c |
dirp = opendir (dirname);
|
|
Packit |
daac2c |
while ((dirent = readdir (dirp))
|
|
Packit |
daac2c |
&& (strcmp (dirent->d_name, ".") == 0
|
|
Packit |
daac2c |
|| strcmp (dirent->d_name, "..") == 0));
|
|
Packit |
daac2c |
if (! dirent)
|
|
Packit |
daac2c |
return NULL;
|
|
Packit |
daac2c |
dir_index++;
|
|
Packit |
daac2c |
return dirent->d_name;
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
#endif /* not HAVE_SCANDIR */
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
int
|
|
Packit |
daac2c |
main (int argc, char **argv)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
FT_Library ft_library;
|
|
Packit |
daac2c |
FT_Face face;
|
|
Packit |
daac2c |
char *filename;
|
|
Packit |
daac2c |
int long_format = 0;
|
|
Packit |
daac2c |
int i;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (FT_Init_FreeType (&ft_library))
|
|
Packit |
daac2c |
FATAL_ERROR ("%s\n", "!! Freetype initialization failed.");
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (argc > 1)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
if (! strcmp (argv[1], "-h") || ! strcmp (argv[1], "--help"))
|
|
Packit |
daac2c |
help_and_exit (argv[0]);
|
|
Packit |
daac2c |
if (! strcmp (argv[1], "-l"))
|
|
Packit |
daac2c |
long_format = 1, argc--, argv++;
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
if (argc == 2)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
if (chdir (argv[1]) < 0)
|
|
Packit |
daac2c |
FATAL_ERROR ("Can't change directory to %s\n", argv[1]);
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
while ((filename = next_file (".")) != NULL)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
if (! FT_New_Face (ft_library, filename, 0, &face))
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
OTF *otf = OTF_open (filename);
|
|
Packit |
daac2c |
char *name, *family = NULL, *style = NULL;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (otf)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
OTF_get_table (otf, "name");
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
if (! (family = otf->name->name[16]))
|
|
Packit |
daac2c |
family = otf->name->name[1];
|
|
Packit |
daac2c |
if (! (style = otf->name->name[17]))
|
|
Packit |
daac2c |
style = otf->name->name[2];
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
if (! family)
|
|
Packit |
daac2c |
family = face->family_name;
|
|
Packit |
daac2c |
if (! style)
|
|
Packit |
daac2c |
style = face->style_name;
|
|
Packit |
daac2c |
|
|
Packit |
daac2c |
name = alloca (strlen (filename)
|
|
Packit |
daac2c |
+ strlen (family)
|
|
Packit |
daac2c |
+ 4);
|
|
Packit |
daac2c |
sprintf (name, "%s (%s)", filename, family);
|
|
Packit |
daac2c |
printf ("%-40s %s", name, style);
|
|
Packit |
daac2c |
for (i = 0; i < face->num_charmaps; i++)
|
|
Packit |
daac2c |
printf (" %d-%d", face->charmaps[i]->platform_id,
|
|
Packit |
daac2c |
face->charmaps[i]->encoding_id);
|
|
Packit |
daac2c |
printf ("\n");
|
|
Packit |
daac2c |
if (otf && long_format)
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
print_gsub_gpos_info (otf, "GSUB");
|
|
Packit |
daac2c |
print_gsub_gpos_info (otf, "GPOS");
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
if (otf)
|
|
Packit |
daac2c |
OTF_close (otf);
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
else
|
|
Packit |
daac2c |
{
|
|
Packit |
daac2c |
printf ("%s fail to open\n", filename);
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
}
|
|
Packit |
daac2c |
exit (0);
|
|
Packit |
daac2c |
}
|