]> git.donarmstrong.com Git - lilypond.git/commitdiff
(Module): strip AFM handling completely.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 27 Dec 2005 23:47:36 +0000 (23:47 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 27 Dec 2005 23:47:36 +0000 (23:47 +0000)
ChangeLog
flower/include/parse-afm.hh [deleted file]
flower/parse-afm.cc [deleted file]
lily/afm.cc [deleted file]
lily/all-font-metrics.cc
lily/font-metric.cc
lily/include/afm.hh [deleted file]
lily/include/all-font-metrics.hh
lily/include/kpath.hh
lily/include/lily-proto.hh
lily/score-engraver.cc

index 24f760965bade9ba37dcc91c271d6349506c3123..7fba238e137f209d274e16962b553e0e1853b79c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2005-12-28  Han-Wen Nienhuys  <hanwen@xs4all.nl>
 
+       * flower/parse-afm.cc (Module): strip AFM handling completely.
+
        * lily/stencil-expression.cc: idem.
 
        * lily/grob-interface-scheme.cc (LY_DEFINE): idem.
diff --git a/flower/include/parse-afm.hh b/flower/include/parse-afm.hh
deleted file mode 100644 (file)
index 074e98e..0000000
+++ /dev/null
@@ -1,293 +0,0 @@
-/* Modified 1999 Morten Welinder:
- * 1. ANSI prototype.
- * 2. parseFileFree function.
- */
-// 2000 HWN: AFM_ prefixes.
-/*
- * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
- *
- * This file may be freely copied and redistributed as long as:
- *   1) This entire notice continues to be included in the file,
- *   2) If the file has been modified in any way, a notice of such
- *      modification is conspicuously indicated.
- *
- * PostScript, Display PostScript, and Adobe are registered trademarks of
- * Adobe Systems Incorporated.
- *
- * ************************************************************************
- * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
- * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
- * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
- * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
- * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
- * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
- * ************************************************************************
- */
-
-/* ParseAFM.h
- *
- * This header file is used in conjuction with the parseAFM.c file.
- * Together these files provide the functionality to parse Adobe Font
- * Metrics files and store the information in predefined data structures.
- * It is intended to work with an application program that needs font metric
- * information. The program can be used as is by making a procedure call to
- * parse an AFM file and have the data stored, or an application developer
- * may wish to customize the code.
- *
- * This header file defines the data structures used as well as the key
- * strings that are currently recognized by this version of the AFM parser.
- * This program is based on the document "Adobe Font Metrics Files,
- * Specification Version 2.0".
- *
- * AFM files are separated into distinct sections of different data. Because
- * of this, the parseAFM program can parse a specified file to only save
- * certain sections of information based on the application's needs. A record
- * containing the requested information will be returned to the application.
- *
- * AFM files are divided into five sections of data:
- *     1) The Global Font Information
- *     2) The Character Metrics Information
- *     3) The Track Kerning Data
- *     4) The Pair-Wise Kerning Data
- *     5) The Composite Character Data
- *
- * Basically, the application can request any of these sections independent
- * of what other sections are requested. In addition, in recognizing that
- * many applications will want ONLY the x-width of characters and not all
- * of the other character metrics information, there is a way to receive
- * only the width information so as not to pay the storage cost for the
- * unwanted data. An application should never request both the
- * "quick and dirty" char metrics (widths only) and the Character Metrics
- * Information since the Character Metrics Information will contain all
- * of the character widths as well.
- *
- * There is a procedure in parseAFM.c, called parseFile, that can be
- * called from any application wishing to get information from the AFM File.
- * This procedure expects 3 parameters: a vaild file descriptor, a pointer
- * to a (FontInfo *) variable (for which space will be allocated and then
- * will be filled in with the data requested), and a mask specifying
- * which data from the AFM File should be saved in the FontInfo structure.
- *
- * The flags that can be used to set the appropriate mask are defined below.
- * In addition, several commonly used masks have already been defined.
- *
- * History:
- *     original: DSM  Thu Oct 20 17:39:59 PDT 1988
- *  modified: DSM  Mon Jul  3 14:17:50 PDT 1989
- *    - added 'storageProblem' return code
- *       - fixed typos
- */
-
-#include <cstdio>
-using namespace std;
-
-#define BOOL int
-#define FLAGS int
-
-/* Possible return codes from the parseFile procedure.
- *
- * ok means there were no problems parsing the file.
- *
- * parseError means that there was some kind of parsing error, but the
- * parser went on. This could include problems like the count for any given
- * section does not add up to how many entries there actually were, or
- * there was a key that was not recognized. The return record may contain
- * vaild data or it may not.
- *
- * earlyEOF means that an End of File was encountered before expected. This
- * may mean that the AFM file had been truncated, or improperly formed.
- *
- * storageProblem means that there were problems allocating storage for
- * the data structures that would have contained the AFM data.
- */
-#define AFM_ok 0
-#define AFM_parseError -1
-#define AFM_earlyEOF -2
-#define AFM_storageProblem -3
-
-/************************* TYPES *********************************/
-/* Below are all of the data structure definitions. These structures
- * try to map as closely as possible to grouping and naming of data
- * in the AFM Files.
- */
-
-/* Bounding box definition. Used for the Font AFM_BBox as well as the
- * Character AFM_BBox.
- */
-typedef struct
-{
-  int llx;     /* lower left x-position  */
-  int lly;     /* lower left y-position  */
-  int urx;     /* upper right x-position */
-  int ury;     /* upper right y-position */
-}
-  AFM_BBox;
-
-/* Global Font information.
- * The key that each field is associated with is in comments. For an
- * explanation about each key and its value please refer to the AFM
- * documentation (full title & version given above).
- */
-typedef struct
-{
-  char *afmVersion;            /* key: StartFontMetrics */
-  char *fontName;              /* key: FontName */
-  char *fullName;              /* key: FullName */
-  char *familyName;            /* key: FamilyName */
-  char *weight;                /* key: Weight */
-  float italicAngle;           /* key: ItalicAngle */
-  BOOL isFixedPitch;           /* key: IsFixedPitch */
-  AFM_BBox fontBBox;           /* key: FontBBox */
-  int underlinePosition;       /* key: UnderlinePosition */
-  int underlineThickness;      /* key: UnderlineThickness */
-  char *version;               /* key: Version */
-  char *notice;                /* key: Notice */
-  char *encodingScheme;        /* key: EncodingScheme */
-  int capHeight;               /* key: CapHeight */
-  int xHeight;                 /* key: XHeight */
-  int ascender;                /* key: Ascender */
-  int descender;               /* key: Descender */
-}
-  AFM_GlobalFontInfo;
-
-/* Ligature definition is a linked list since any character can have
- * any number of ligatures.
- */
-typedef struct _t_ligature
-{
-  char *succ, *lig;
-  struct _t_ligature *next;
-} AFM_Ligature;
-
-/* Character Metric Information. This structure is used only if ALL
- * character metric information is requested. If only the character
- * widths is requested, then only an array of the character x-widths
- * is returned.
- *
- * The key that each field is associated with is in comments. For an
- * explanation about each key and its value please refer to the
- * Character Metrics section of the AFM documentation (full title
- * & version given above).
- */
-typedef struct
-{
-  int code,                                            /* key: C */
-    wx,                                                /* key: WX */
-    wy;                /* together wx and wy are associated with key: W */
-  char *name;  /* key: N */
-  AFM_BBox charBBox;   /* key: B */
-  AFM_Ligature *ligs;  /* key: L (linked list; not a fixed number of Ls */
-}
-  AFM_CharMetricInfo;
-
-/* Track kerning data structure.
- * The fields of this record are the five values associated with every
- * TrackKern entry.
- *
- * For an explanation about each value please refer to the
- * Track Kerning section of the AFM documentation (full title
- * & version given above).
- */
-typedef struct
-{
-  int degree;
-  float minPtSize,
-    minKernAmt,
-    maxPtSize,
-    maxKernAmt;
-}
-  AFM_TrackKernData;
-
-/* Pair Kerning data structure.
- * The fields of this record are the four values associated with every
- * KP entry. For KPX entries, the yamt will be zero.
- *
- * For an explanation about each value please refer to the
- * Pair Kerning section of the AFM documentation (full title
- * & version given above).
- */
-typedef struct
-{
-  char *name1;
-  char *name2;
-  int xamt,
-    yamt;
-}
-  AFM_PairKernData;
-
-/* AFM_Pcc is a piece of a composite character. This is a sub structure of a
- * AFM_CompCharData described below.
- * These fields will be filled in with the values from the key AFM_Pcc.
- *
- * For an explanation about each key and its value please refer to the
- * Composite Character section of the AFM documentation (full title
- * & version given above).
- */
-typedef struct
-{
-  char *AFM_PccName;
-  int deltax,
-    deltay;
-}
-  AFM_Pcc;
-
-/* Composite Character Information data structure.
- * The fields ccName and numOfPieces are filled with the values associated
- * with the key CC. The field pieces points to an array (size = numOfPieces)
- * of information about each of the parts of the composite character. That
- * array is filled in with the values from the key AFM_Pcc.
- *
- * For an explanation about each key and its value please refer to the
- * Composite Character section of the AFM documentation (full title
- * & version given above).
- */
-typedef struct
-{
-  char *ccName;
-  int numOfPieces;
-  AFM_Pcc *pieces;
-}
-  AFM_CompCharData;
-
-/*  FontInfo
- *  Record type containing pointers to all of the other data
- *  structures containing information about a font.
- *  A a record of this type is filled with data by the
- *  parseFile function.
- */
-typedef struct
-{
-  AFM_GlobalFontInfo *gfi;     /* ptr to a AFM_GlobalFontInfo record */
-  int *cwi;                    /* ptr to 256 element array of just char widths */
-  int numOfChars;              /* number of entries in char metrics array */
-  AFM_CharMetricInfo *cmi;     /* ptr to char metrics array */
-  int numOfTracks;             /* number to entries in track kerning array */
-  AFM_TrackKernData *tkd;              /* ptr to track kerning array */
-  int numOfPairs;              /* number to entries in pair kerning array */
-  AFM_PairKernData *pkd;               /* ptr to pair kerning array */
-  int numOfComps;              /* number to entries in comp char array */
-  AFM_CompCharData *ccd;               /* ptr to comp char array */
-}
-  AFM_Font_info;
-
-/************************* PROCEDURES ****************************/
-
-/*  Call this procedure to do the grunt work of parsing an AFM file.
- *
- *  "fp" should be a valid file pointer to an AFM file.
- *
- *  "fi" is a pointer to a pointer to a FontInfo record sturcture
- * (defined above). Storage for the FontInfo structure will be
- *  allocated in parseFile and the structure will be filled in
- *  with the requested data from the AFM File.
- *
- *  "flags" is a mask with bits set representing what data should
- *  be saved. Defined above are valid flags that can be used to set
- *  the mask, as well as a few commonly used masks.
- *
- *  The possible return codes from parseFile are defined above.
- */
-
-int AFM_parseFile (FILE *fp, AFM_Font_info **fi, FLAGS flags);
-void AFM_free (AFM_Font_info *fi);
diff --git a/flower/parse-afm.cc b/flower/parse-afm.cc
deleted file mode 100644 (file)
index b656657..0000000
+++ /dev/null
@@ -1,1376 +0,0 @@
-/* Our mods:
-
-1. FontInfo has become AFM_AFM_Font_info to avoid namespace collisions.
-2. Version is a linetoken because Bitstream Charter has a space in the version.
-3. Added some necessary #include headers.
-4. Added AFM_ prefixes to error codes.
-5. Made it recognize both '\n' and '\r' as line terminators. Sheesh!
-6. Stopped buffer overflows in token and linetoken.
-
-Raph Levien <raph@acm.org> writing on 4 Oct 1998, updating 21 Oct 1998
-
-
-1. parseFileFree function.
-2. Leak fix in parseFile.
-
-Morten Welinder <terra@diku.dk> September 1999.
-*/
-
-/*
- * (C) 1988, 1989, 1990 by Adobe Systems Incorporated. All rights reserved.
- *
- * This file may be freely copied and redistributed as long as:
- *   1) This entire notice continues to be included in the file,
- *   2) If the file has been modified in any way, a notice of such
- *      modification is conspicuously indicated.
- *
- * PostScript, Display PostScript, and Adobe are registered trademarks of
- * Adobe Systems Incorporated.
- *
- * ************************************************************************
- * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
- * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
- * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
- * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
- * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
- * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
- * ************************************************************************
- */
-
-/* parseAFM.c
- *
- * This file is used in conjuction with the parseAFM.h header file.
- * This file contains several procedures that are used to parse AFM
- * files. It is intended to work with an application program that needs
- * font metric information. The program can be used as is by making a
- * procedure call to "parseFile" (passing in the expected parameters)
- * and having it fill in a data structure with the data from the
- * AFM file, or an application developer may wish to customize this
- * code.
- *
- * There is also a file, parseAFMclient.c, that is a sample application
- * showing how to call the "parseFile" procedure and how to use the data
- * after "parseFile" has returned.
- *
- * Please read the comments in parseAFM.h and parseAFMclient.c.
- *
- * History:
- *     original: DSM  Thu Oct 20 17:39:59 PDT 1988
- *  modified: DSM  Mon Jul  3 14:17:50 PDT 1989
- *    - added 'storageProblem' return code
- *       - fixed bug of not allocating extra byte for string duplication
- *    - fixed typos
- *  modified: DSM  Tue Apr  3 11:18:34 PDT 1990
- *    - added free (ident) at end of parseFile routine
- *  modified: DSM  Tue Jun 19 10:16:29 PDT 1990
- *    - changed (width == 250) to (width = 250) in initializeArray
- */
-
-#include "parse-afm.hh"
-
-#include <cstdlib>
-#include <cerrno>
-#include <cmath>
-#include <cstring>
-using namespace std;
-
-#include <sys/file.h>
-
-#include "warn.hh"
-
-/* your basic constants */
-#define TRUE 1
-#define FALSE 0
-#define EOL '\n'                /* end-of-line indicator */
-#define MAX_NAME 4096           /* max length for identifiers */
-
-/* Flags that can be AND'ed together to specify exactly what
- * information from the AFM file should be saved.
- */
-#define P_G 0x01       /* 0000 0001 */   /* Global Font Info      */
-#define P_W 0x02       /* 0000 0010 */   /* Character Widths ONLY */
-#define P_M 0x06       /* 0000 0110 */   /* All Char Metric Info  */
-#define P_P 0x08       /* 0000 1000 */   /* Pair Kerning Info     */
-#define P_T 0x10       /* 0001 0000 */   /* Track Kerning Info    */
-#define P_C 0x20       /* 0010 0000 */   /* Composite Char Info   */
-
-/* Commonly used flags
- */
-#define P_GW                                   \
-  (P_G | P_W)
-#define P_GM                                   \
-  (P_G | P_M)
-#define P_GMP                                  \
-  (P_G | P_M | P_P)
-#define P_GMK                                  \
-  (P_G | P_M | P_P | P_T)
-#define P_GALL                                 \
-  (P_G | P_M | P_P | P_T | P_C)
-
-#define METATYPE1_BUG   /* Parse Metatype1's (version unknown)
-                          'Generated' global tag as comment. */
-
-#define lineterm EOL   /* line terminating character */
-#define lineterm_alt '\r' /* alternative line terminating character */
-#define normalEOF 1    /* return code from parsing routines used only */
-                       /* in this module */
-#define Space "space"   /* used in string comparison to look for the width */
-                       /* of the space character to init the widths array */
-#define False "false"   /* used in string comparison to check the value of */
-                       /* boolean keys (e.g. IsFixedPitch)  */
-
-#define MATCH(A, B) (strncmp ((A), (B), MAX_NAME) == 0)
-
-/*************************** GLOBALS ***********************/
-
-static char *ident = NULL; /* storage buffer for keywords */
-
-/* "shorts" for fast case statement
- * The values of each of these enumerated items correspond to an entry in the
- * table of strings defined below. Therefore, if you add a new string as
- * new keyword into the keyStrings table, you must also add a corresponding
- * parseKey AND it MUST be in the same position!
- *
- * IMPORTANT: since the sorting algorithm is a binary search, the strings of
- * keywords must be placed in lexicographical order, below. [Therefore, the
- * enumerated items are not necessarily in lexicographical order, depending
- * on the name chosen. BUT, they must be placed in the same position as the
- * corresponding key string.] The NOPE shall remain in the last position,
- * since it does not correspond to any key string, and it is used in the
- * "recognize" procedure to calculate how many possible keys there are.
- */
-
-enum parseKey
-  {
-    ASCENDER, CHARBBOX, CODE, COMPCHAR, CAPHEIGHT, COMMENT,
-    DESCENDER, ENCODINGSCHEME, ENDCHARMETRICS, ENDCOMPOSITES,
-    ENDFONTMETRICS, ENDKERNDATA, ENDKERNPAIRS, ENDTRACKKERN,
-    FAMILYNAME, FONTBBOX, FONTNAME, FULLNAME,
-#ifdef METATYPE1_BUG
-    GENERATED,
-#endif
-    ISFIXEDPITCH,
-    ITALICANGLE, KERNPAIR, KERNPAIRXAMT, LIGATURE, CHARNAME,
-    NOTICE, COMPCHARPIECE, STARTCHARMETRICS, STARTCOMPOSITES,
-    STARTFONTMETRICS, STARTKERNDATA, STARTKERNPAIRS,
-    STARTTRACKKERN, TRACKKERN, UNDERLINEPOSITION,
-    UNDERLINETHICKNESS, VERSION, XYWIDTH, XWIDTH, WEIGHT, XHEIGHT,
-    NOPE };
-
-/* keywords for the system:
- * This a table of all of the current strings that are vaild AFM keys.
- * Each entry can be referenced by the appropriate parseKey value (an
- * enumerated data type defined above). If you add a new keyword here,
- * a corresponding parseKey MUST be added to the enumerated data type
- * defined above, AND it MUST be added in the same position as the
- * string is in this table.
- *
- * IMPORTANT: since the sorting algorithm is a binary search, the keywords
- * must be placed in lexicographical order. And, NULL should remain at the
- * end.
- */
-
-static char *keyStrings[]
-= {
-  "Ascender", "B", "C", "CC", "CapHeight", "Comment",
-  "Descender", "EncodingScheme", "EndCharMetrics", "EndComposites",
-  "EndFontMetrics", "EndKernData", "EndKernPairs", "EndTrackKern",
-  "FamilyName", "FontBBox", "FontName", "FullName",
-#ifdef METATYPE1_BUG
-  "Generated",
-#endif
-  "IsFixedPitch",
-  "ItalicAngle", "KP", "KPX", "L", "N",
-  "Notice", "PCC", "StartCharMetrics", "StartComposites",
-  "StartFontMetrics", "StartKernData", "StartKernPairs",
-  "StartTrackKern", "TrackKern", "UnderlinePosition",
-  "UnderlineThickness", "Version", "W", "WX", "Weight", "XHeight",
-  NULL };
-
-/*************************** PARSING ROUTINES **************/
-
-/*************************** token *************************/
-
-/*  A "AFM File Conventions" tokenizer. That means that it will
- *  return the next token delimited by white space.  See also
- *  the `linetoken' routine, which does a similar thing but
- *  reads all tokens until the next end-of-line.
- */
-
-static char *
-token (FILE *stream)
-{
-  int ch, idx;
-
-  /* skip over white space */
-  while ((ch = fgetc (stream)) == ' ' || ch == lineterm
-        || ch == lineterm_alt
-        || ch == ',' || ch == '\t' || ch == ';');
-
-  idx = 0;
-  while (idx < MAX_NAME - 1
-        && ch != EOF && ch != ' ' && ch != lineterm && ch != lineterm_alt
-        && ch != '\t' && ch != ':' && ch != ';')
-    {
-      ident[idx++] = ch;
-      ch = fgetc (stream);
-    } /* while */
-
-  if (ch == EOF && idx < 1) return ((char *)NULL);
-  if (idx >= 1 && ch != ':') ungetc (ch, stream);
-  if (idx < 1) ident[idx++] = ch;      /* single-character token */
-  ident[idx] = 0;
-
-  return (ident);      /* returns pointer to the token */
-} /* token */
-
-/*************************** linetoken *************************/
-
-/*  "linetoken" will get read all tokens until the EOL character from
- *  the given stream.  This is used to get any arguments that can be
- *  more than one word (like Comment lines and FullName).
- */
-
-static char *
-linetoken (FILE *stream)
-{
-  int ch, idx;
-
-  while ((ch = fgetc (stream)) == ' ' || ch == '\t');
-
-  idx = 0;
-  while (idx < MAX_NAME - 1
-        && ch != EOF && ch != lineterm && ch != lineterm_alt)
-    {
-      ident[idx++] = ch;
-      ch = fgetc (stream);
-    } /* while */
-
-  ungetc (ch, stream);
-  ident[idx] = 0;
-
-  return (ident);      /* returns pointer to the token */
-} /* linetoken */
-
-/*************************** recognize *************************/
-
-/*  This function tries to match a string to a known list of
- *  valid AFM entries (check the keyStrings array above).
- *  "ident" contains everything from white space through the
- *  next space, tab, or ":" character.
- *
- *  The algorithm is a standard Knuth binary search.
- */
-
-static enum parseKey
-recognize (register char *ident)
-{
-  int lower = 0,
-    upper = (int) NOPE,
-    midpoint = 0,
-    cmpvalue = 0;
-  BOOL found = FALSE;
-
-  while ((upper >= lower) && !found)
-    {
-      midpoint = (lower + upper) / 2;
-      if (keyStrings[midpoint] == NULL)
-       break;
-      cmpvalue = strncmp (ident, keyStrings[midpoint], MAX_NAME);
-      if (cmpvalue == 0)
-       found = TRUE;
-      else
-       if (cmpvalue < 0)
-         upper = midpoint - 1;
-       else
-         lower = midpoint + 1;
-    }
-
-  if (found)
-    return (enum parseKey) midpoint;
-  else
-    return NOPE;
-}
-
-/************************* parseGlobals *****************************/
-
-/*  This function is called by "parseFile". It will parse the AFM File
- *  up to the "StartCharMetrics" keyword, which essentially marks the
- *  end of the Global Font Information and the beginning of the character
- *  metrics information.
- *
- *  If the caller of "parseFile" specified that it wanted the Global
- *  Font Information (as defined by the "AFM File Specification"
- *  document), then that information will be stored in the returned
- *  data structure.
- *
- *  Any Global Font Information entries that are not found in a
- *  given file, will have the usual default initialization value
- *  for its type (i.e. entries of type int will be 0, etc).
- *
- *  This function returns an error code specifying whether there was
- *  a premature EOF or a parsing error. This return value is used by
- *  parseFile to determine if there is more file to parse.
- */
-
-static BOOL
-parseGlobals (FILE *fp, register AFM_GlobalFontInfo *gfi)
-{
-  BOOL cont = TRUE, save = (gfi != NULL);
-  int error = AFM_ok;
-  register char *keyword;
-
-  while (cont)
-    {
-      keyword = token (fp);
-
-      if (keyword == NULL)
-       /* Have reached an early and unexpected EOF. */
-       /* Set flag and stop parsing */
-       {
-         error = AFM_earlyEOF;
-         break;   /* get out of loop */
-       }
-      if (!save)
-       /* get tokens until the end of the Global Font info section */
-       /* without saving any of the data */
-       switch (recognize (keyword))
-         {
-         case STARTCHARMETRICS:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         default:
-           break;
-         } /* switch */
-      else
-       /* otherwise parse entire global font info section, */
-       /* saving the data */
-       switch (recognize (keyword))
-         {
-         case STARTFONTMETRICS:
-           keyword = token (fp);
-           gfi->afmVersion = (char *) malloc (strlen (keyword) + 1);
-           strcpy (gfi->afmVersion, keyword);
-           break;
-         case COMMENT:
-#ifdef METATYPE1_BUG
-         case GENERATED:
-#endif
-           keyword = linetoken (fp);
-           break;
-         case FONTNAME:
-           keyword = token (fp);
-           gfi->fontName = (char *) malloc (strlen (keyword) + 1);
-           strcpy (gfi->fontName, keyword);
-           break;
-         case ENCODINGSCHEME:
-           keyword = token (fp);
-           gfi->encodingScheme = (char *)
-             malloc (strlen (keyword) + 1);
-           strcpy (gfi->encodingScheme, keyword);
-           break;
-         case FULLNAME:
-           keyword = linetoken (fp);
-           gfi->fullName = (char *) malloc (strlen (keyword) + 1);
-           strcpy (gfi->fullName, keyword);
-           break;
-         case FAMILYNAME:
-           keyword = linetoken (fp);
-           gfi->familyName = (char *) malloc (strlen (keyword) + 1);
-           strcpy (gfi->familyName, keyword);
-           break;
-         case WEIGHT:
-           keyword = token (fp);
-           gfi->weight = (char *) malloc (strlen (keyword) + 1);
-           strcpy (gfi->weight, keyword);
-           break;
-         case ITALICANGLE:
-           keyword = token (fp);
-           gfi->italicAngle = atof (keyword);
-           if (errno == ERANGE) error = AFM_parseError;
-           break;
-         case ISFIXEDPITCH:
-           keyword = token (fp);
-           if (MATCH (keyword, False))
-             gfi->isFixedPitch = 0;
-           else
-             gfi->isFixedPitch = 1;
-           break;
-         case UNDERLINEPOSITION:
-           keyword = token (fp);
-           gfi->underlinePosition = atoi (keyword);
-           break;
-         case UNDERLINETHICKNESS:
-           keyword = token (fp);
-           gfi->underlineThickness = atoi (keyword);
-           break;
-         case VERSION:
-           keyword = linetoken (fp);
-           gfi->version = (char *) malloc (strlen (keyword) + 1);
-           strcpy (gfi->version, keyword);
-           break;
-         case NOTICE:
-           keyword = linetoken (fp);
-           gfi->notice = (char *) malloc (strlen (keyword) + 1);
-           strcpy (gfi->notice, keyword);
-           break;
-         case FONTBBOX:
-           keyword = token (fp);
-           gfi->fontBBox.llx = atoi (keyword);
-           keyword = token (fp);
-           gfi->fontBBox.lly = atoi (keyword);
-           keyword = token (fp);
-           gfi->fontBBox.urx = atoi (keyword);
-           keyword = token (fp);
-           gfi->fontBBox.ury = atoi (keyword);
-           break;
-         case CAPHEIGHT:
-           keyword = token (fp);
-           gfi->capHeight = atoi (keyword);
-           break;
-         case XHEIGHT:
-           keyword = token (fp);
-           gfi->xHeight = atoi (keyword);
-           break;
-         case DESCENDER:
-           keyword = token (fp);
-           gfi->descender = atoi (keyword);
-           break;
-         case ASCENDER:
-           keyword = token (fp);
-           gfi->ascender = atoi (keyword);
-           break;
-         case STARTCHARMETRICS:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         case NOPE:
-         default:
-           error = AFM_parseError;
-           break;
-         } /* switch */
-    } /* while */
-
-  return (error);
-} /* parseGlobals */
-
-#if 0
-/************************* initializeArray ************************/
-
-/*  Unmapped character codes are (at Adobe Systems) assigned the
- *  width of the space character (if one exists) else they get the
- *  value of 250 ems. This function initializes all entries in the
- *  char widths array to have this value. Then any mapped character
- *  codes will be replaced with the width of the appropriate character
- *  when parsing the character metric section.
-
- *  This function parses the Character Metrics Section looking
- *  for a space character (by comparing character names). If found,
- *  the width of the space character will be used to initialize the
- *  values in the array of character widths.
- *
- *  Before returning, the position of the read/write pointer of the
- *  file is reset to be where it was upon entering this function.
- */
-
-static int
-initializeArray (FILE *fp, register int *cwi)
-{
-  BOOL cont = TRUE, found = FALSE;
-  long opos = ftell (fp);
-  int code = 0, width = 0, i = 0, error = 0;
-  register char *keyword;
-
-  while (cont)
-    {
-      keyword = token (fp);
-      if (keyword == NULL)
-       {
-         error = AFM_earlyEOF;
-         break; /* get out of loop */
-       }
-      switch (recognize (keyword))
-       {
-       case COMMENT:
-         keyword = linetoken (fp);
-         break;
-       case CODE:
-         code = atoi (token (fp));
-         break;
-       case XWIDTH:
-         width = atoi (token (fp));
-         break;
-       case CHARNAME:
-         keyword = token (fp);
-         if (MATCH (keyword, Space))
-           {
-             cont = FALSE;
-             found = TRUE;
-           }
-         break;
-       case ENDCHARMETRICS:
-         cont = FALSE;
-         break;
-       case ENDFONTMETRICS:
-         cont = FALSE;
-         error = normalEOF;
-         break;
-       case NOPE:
-       default:
-         error = AFM_parseError;
-         break;
-       } /* switch */
-    } /* while */
-
-  if (!found)
-    width = 250;
-
-  for (i = 0; i < 256; ++i)
-    cwi[i] = width;
-
-  fseek (fp, opos, 0);
-
-  return (error);
-} /* initializeArray */
-#endif
-
-/************************* parseCharWidths **************************/
-
-/*  This function is called by "parseFile". It will parse the AFM File
- *  up to the "EndCharMetrics" keyword. It will save the character
- *  width info (as opposed to all of the character metric information)
- *  if requested by the caller of parseFile. Otherwise, it will just
- *  parse through the section without saving any information.
- *
- *  If data is to be saved, parseCharWidths is passed in a pointer
- *  to an array of widths that has already been initialized by the
- *  standard value for unmapped character codes. This function parses
- *  the Character Metrics section only storing the width information
- *  for the encoded characters into the array using the character code
- *  as the index into that array.
- *
- *  This function returns an error code specifying whether there was
- *  a premature EOF or a parsing error. This return value is used by
- *  parseFile to determine if there is more file to parse.
- */
-
-static int
-parseCharWidths (FILE *fp, register int *cwi)
-{
-  BOOL cont = TRUE, save = (cwi != NULL);
-  int pos = 0, error = AFM_ok;
-  register char *keyword;
-
-  while (cont)
-    {
-      keyword = token (fp);
-      /* Have reached an early and unexpected EOF. */
-      /* Set flag and stop parsing */
-      if (keyword == NULL)
-       {
-         error = AFM_earlyEOF;
-         break; /* get out of loop */
-       }
-      if (!save)
-       /* get tokens until the end of the Char Metrics section without */
-       /* saving any of the data*/
-       switch (recognize (keyword))
-         {
-         case ENDCHARMETRICS:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         default:
-           break;
-         } /* switch */
-      else
-       /* otherwise parse entire char metrics section, saving */
-       /* only the char x-width info */
-       switch (recognize (keyword))
-         {
-         case COMMENT:
-           keyword = linetoken (fp);
-           break;
-         case CODE:
-           keyword = token (fp);
-           pos = atoi (keyword);
-           break;
-         case XYWIDTH:
-           /* PROBLEM: Should be no Y-WIDTH when doing "quick & dirty" */
-           keyword = token (fp); keyword = token (fp); /* eat values */
-           error = AFM_parseError;
-           break;
-         case XWIDTH:
-           keyword = token (fp);
-           if (pos >= 0) /* ignore unmapped chars */
-             cwi[pos] = atoi (keyword);
-           break;
-         case ENDCHARMETRICS:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         case CHARNAME:        /* eat values (so doesn't cause AFM_parseError) */
-           keyword = token (fp);
-           break;
-         case CHARBBOX:
-           keyword = token (fp); keyword = token (fp);
-           keyword = token (fp); keyword = token (fp);
-           break;
-         case LIGATURE:
-           keyword = token (fp); keyword = token (fp);
-           break;
-         case NOPE:
-         default:
-           error = AFM_parseError;
-           break;
-         } /* switch */
-    } /* while */
-
-  return (error);
-} /* parseCharWidths */
-
-/************************* parseCharMetrics ************************/
-
-/*  This function is called by parseFile if the caller of parseFile
- *  requested that all character metric information be saved
- * (as opposed to only the character width information).
- *
- *  parseCharMetrics is passed in a pointer to an array of records
- *  to hold information on a per character basis. This function
- *  parses the Character Metrics section storing all character
- *  metric information for the ALL characters (mapped and unmapped)
- *  into the array.
- *
- *  This function returns an error code specifying whether there was
- *  a premature EOF or a parsing error. This return value is used by
- *  parseFile to determine if there is more file to parse.
- */
-
-static int
-parseCharMetrics (FILE *fp, register AFM_Font_info *fi)
-{
-  BOOL cont = TRUE, firstTime = TRUE;
-  int error = AFM_ok, count = 0;
-  register AFM_CharMetricInfo *temp = fi->cmi;
-  register char *keyword;
-
-  while (cont)
-    {
-      keyword = token (fp);
-      if (keyword == NULL)
-       {
-         error = AFM_earlyEOF;
-         break; /* get out of loop */
-       }
-      switch (recognize (keyword))
-       {
-       case COMMENT:
-         keyword = linetoken (fp);
-         break;
-       case CODE:
-         if (count < fi->numOfChars)
-           {
-             if (firstTime)
-               firstTime = FALSE;
-             else
-               temp++;
-             temp->code = atoi (token (fp));
-             count++;
-           }
-         else
-           {
-             warning ("Too many metrics.");
-             error = AFM_parseError;
-             cont = FALSE;
-           }
-         break;
-       case XYWIDTH:
-         temp->wx = atoi (token (fp));
-         temp->wy = atoi (token (fp));
-         break;
-       case XWIDTH:
-         temp->wx = atoi (token (fp));
-         break;
-
-       case CHARNAME:
-         keyword = token (fp);
-         temp->name = (char *) malloc (strlen (keyword) + 1);
-         strcpy (temp->name, keyword);
-         break;
-
-       case CHARBBOX:
-         temp->charBBox.llx = atoi (token (fp));
-         temp->charBBox.lly = atoi (token (fp));
-         temp->charBBox.urx = atoi (token (fp));
-         temp->charBBox.ury = atoi (token (fp));
-         break;
-
-       case LIGATURE:
-         {
-           AFM_Ligature **tail = &(temp->ligs);
-           AFM_Ligature *node = *tail;
-
-           if (*tail != NULL)
-             {
-               while (node->next != NULL)
-                 node = node->next;
-               tail = &(node->next);
-             }
-
-           *tail = (AFM_Ligature *) calloc (1, sizeof (AFM_Ligature));
-           keyword = token (fp);
-           (*tail)->succ = (char *) malloc (strlen (keyword) + 1);
-           strcpy ((*tail)->succ, keyword);
-           keyword = token (fp);
-           (*tail)->lig = (char *) malloc (strlen (keyword) + 1);
-           strcpy ((*tail)->lig, keyword);
-           break; }
-       case ENDCHARMETRICS:
-         cont = FALSE;;
-         break;
-       case ENDFONTMETRICS:
-         cont = FALSE;
-         error = normalEOF;
-         break;
-       case NOPE:
-       default:
-         warning ("Unknown token");
-
-         error = AFM_parseError;
-         break;
-       } /* switch */
-    } /* while */
-
-  if ((error == AFM_ok) && (count != fi->numOfChars))
-    {
-      warning ("Incorrect char count");
-      error = AFM_parseError;
-    }
-  return (error);
-} /* parseCharMetrics */
-
-/************************* parseAFM_TrackKernData ***********************/
-
-/*  This function is called by "parseFile". It will parse the AFM File
- *  up to the "EndTrackKern" or "EndKernData" keywords. It will save the
- *  track kerning data if requested by the caller of parseFile.
- *
- *  parseAFM_TrackKernData is passed in a pointer to the FontInfo record.
- *  If data is to be saved, the FontInfo record will already contain
- *  a valid pointer to storage for the track kerning data.
- *
- *  This function returns an error code specifying whether there was
- *  a premature EOF or a parsing error. This return value is used by
- *  parseFile to determine if there is more file to parse.
- */
-
-static int
-parseAFM_TrackKernData (FILE *fp, register AFM_Font_info *fi)
-{
-  BOOL cont = TRUE, save = (fi->tkd != NULL);
-  int pos = 0, error = AFM_ok, tcount = 0;
-  register char *keyword;
-
-  while (cont)
-    {
-      keyword = token (fp);
-
-      if (keyword == NULL)
-       {
-         error = AFM_earlyEOF;
-         break; /* get out of loop */
-       }
-      if (!save)
-       /* get tokens until the end of the Track Kerning Data */
-       /* section without saving any of the data */
-       switch (recognize (keyword))
-         {
-         case ENDTRACKKERN:
-         case ENDKERNDATA:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         default:
-           break;
-         } /* switch */
-      else
-       /* otherwise parse entire Track Kerning Data section, */
-       /* saving the data */
-       switch (recognize (keyword))
-         {
-         case COMMENT:
-#ifdef METATYPE1_BUG
-         case GENERATED:
-#endif
-           keyword = linetoken (fp);
-           break;
-         case TRACKKERN:
-           if (tcount < fi->numOfTracks)
-             {
-               keyword = token (fp);
-               fi->tkd[pos].degree = atoi (keyword);
-               keyword = token (fp);
-               fi->tkd[pos].minPtSize = atof (keyword);
-               if (errno == ERANGE) error = AFM_parseError;
-               keyword = token (fp);
-               fi->tkd[pos].minKernAmt = atof (keyword);
-               if (errno == ERANGE) error = AFM_parseError;
-               keyword = token (fp);
-               fi->tkd[pos].maxPtSize = atof (keyword);
-               if (errno == ERANGE) error = AFM_parseError;
-               keyword = token (fp);
-               fi->tkd[pos++].maxKernAmt = atof (keyword);
-               if (errno == ERANGE) error = AFM_parseError;
-               tcount++;
-             }
-           else
-             {
-               error = AFM_parseError;
-               cont = FALSE;
-             }
-           break;
-         case ENDTRACKKERN:
-         case ENDKERNDATA:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         case NOPE:
-         default:
-           error = AFM_parseError;
-           break;
-         } /* switch */
-    } /* while */
-
-  if (error == AFM_ok && tcount != fi->numOfTracks)
-    error = AFM_parseError;
-
-  return (error);
-} /* parseAFM_TrackKernData */
-
-/************************* parseAFM_PairKernData ************************/
-
-/*  This function is called by "parseFile". It will parse the AFM File
- *  up to the "EndKernPairs" or "EndKernData" keywords. It will save
- *  the pair kerning data if requested by the caller of parseFile.
- *
- *  parseAFM_PairKernData is passed in a pointer to the FontInfo record.
- *  If data is to be saved, the FontInfo record will already contain
- *  a valid pointer to storage for the pair kerning data.
- *
- *  This function returns an error code specifying whether there was
- *  a premature EOF or a parsing error. This return value is used by
- *  parseFile to determine if there is more file to parse.
- */
-
-static int
-parseAFM_PairKernData (FILE *fp, register AFM_Font_info *fi)
-{
-  BOOL cont = TRUE, save = (fi->pkd != NULL);
-  int pos = 0, error = AFM_ok, pcount = 0;
-  register char *keyword;
-
-  while (cont)
-    {
-      keyword = token (fp);
-
-      if (keyword == NULL)
-       {
-         error = AFM_earlyEOF;
-         break; /* get out of loop */
-       }
-      if (!save)
-       /* get tokens until the end of the Pair Kerning Data */
-       /* section without saving any of the data */
-       switch (recognize (keyword))
-         {
-         case ENDKERNPAIRS:
-         case ENDKERNDATA:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         default:
-           break;
-         } /* switch */
-      else
-       /* otherwise parse entire Pair Kerning Data section, */
-       /* saving the data */
-       switch (recognize (keyword))
-         {
-         case COMMENT:
-           keyword = linetoken (fp);
-           break;
-         case KERNPAIR:
-           if (pcount < fi->numOfPairs)
-             {
-               keyword = token (fp);
-               fi->pkd[pos].name1 = (char *)
-                 malloc (strlen (keyword) + 1);
-               strcpy (fi->pkd[pos].name1, keyword);
-               keyword = token (fp);
-               fi->pkd[pos].name2 = (char *)
-                 malloc (strlen (keyword) + 1);
-               strcpy (fi->pkd[pos].name2, keyword);
-               keyword = token (fp);
-               fi->pkd[pos].xamt = atoi (keyword);
-               keyword = token (fp);
-               fi->pkd[pos++].yamt = atoi (keyword);
-               pcount++;
-             }
-           else
-             {
-               error = AFM_parseError;
-               cont = FALSE;
-             }
-           break;
-         case KERNPAIRXAMT:
-           if (pcount < fi->numOfPairs)
-             {
-               keyword = token (fp);
-               fi->pkd[pos].name1 = (char *)
-                 malloc (strlen (keyword) + 1);
-               strcpy (fi->pkd[pos].name1, keyword);
-               keyword = token (fp);
-               fi->pkd[pos].name2 = (char *)
-                 malloc (strlen (keyword) + 1);
-               strcpy (fi->pkd[pos].name2, keyword);
-               keyword = token (fp);
-               fi->pkd[pos++].xamt = atoi (keyword);
-               pcount++;
-             }
-           else
-             {
-               error = AFM_parseError;
-               cont = FALSE;
-             }
-           break;
-         case ENDKERNPAIRS:
-         case ENDKERNDATA:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         case NOPE:
-         default:
-           error = AFM_parseError;
-           break;
-         } /* switch */
-    } /* while */
-
-  if (error == AFM_ok && pcount != fi->numOfPairs)
-    error = AFM_parseError;
-
-  return (error);
-} /* parseAFM_PairKernData */
-
-/************************* parseAFM_CompCharData **************************/
-
-/*  This function is called by "parseFile". It will parse the AFM File
- *  up to the "EndComposites" keyword. It will save the composite
- *  character data if requested by the caller of parseFile.
- *
- *  parseAFM_CompCharData is passed in a pointer to the FontInfo record, and
- *  a boolean representing if the data should be saved.
- *
- *  This function will create the appropriate amount of storage for
- *  the composite character data and store a pointer to the storage
- *  in the FontInfo record.
- *
- *  This function returns an error code specifying whether there was
- *  a premature EOF or a parsing error. This return value is used by
- *  parseFile to determine if there is more file to parse.
- */
-
-static int
-parseAFM_CompCharData (FILE *fp, register AFM_Font_info *fi)
-{
-  BOOL cont = TRUE, firstTime = TRUE, save = (fi->ccd != NULL);
-  int pos = 0, j = 0, error = AFM_ok, ccount = 0, pcount = 0;
-  register char *keyword;
-
-  while (cont)
-    {
-      keyword = token (fp);
-      if (keyword == NULL)
-       /* Have reached an early and unexpected EOF. */
-       /* Set flag and stop parsing */
-       {
-         error = AFM_earlyEOF;
-         break; /* get out of loop */
-       }
-      if (ccount > fi->numOfComps)
-       {
-         error = AFM_parseError;
-         break; /* get out of loop */
-       }
-      if (!save)
-       /* get tokens until the end of the Composite Character info */
-       /* section without saving any of the data */
-       switch (recognize (keyword))
-         {
-         case ENDCOMPOSITES:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         default:
-           break;
-         } /* switch */
-      else
-       /* otherwise parse entire Composite Character info section, */
-       /* saving the data */
-       switch (recognize (keyword))
-         {
-         case COMMENT:
-           keyword = linetoken (fp);
-           break;
-         case COMPCHAR:
-           if (ccount < fi->numOfComps)
-             {
-               keyword = token (fp);
-               if (pcount != fi->ccd[pos].numOfPieces)
-                 error = AFM_parseError;
-               pcount = 0;
-               if (firstTime) firstTime = FALSE;
-               else pos++;
-               fi->ccd[pos].ccName = (char *)
-                 malloc (strlen (keyword) + 1);
-               strcpy (fi->ccd[pos].ccName, keyword);
-               keyword = token (fp);
-               fi->ccd[pos].numOfPieces = atoi (keyword);
-               fi->ccd[pos].pieces = (AFM_Pcc *)
-                 calloc (fi->ccd[pos].numOfPieces, sizeof (AFM_Pcc));
-               j = 0;
-               ccount++;
-             }
-           else
-             {
-               error = AFM_parseError;
-               cont = FALSE;
-             }
-           break;
-         case COMPCHARPIECE:
-           if (pcount < fi->ccd[pos].numOfPieces)
-             {
-               keyword = token (fp);
-               fi->ccd[pos].pieces[j].AFM_PccName = (char *)
-                 malloc (strlen (keyword) + 1);
-               strcpy (fi->ccd[pos].pieces[j].AFM_PccName, keyword);
-               keyword = token (fp);
-               fi->ccd[pos].pieces[j].deltax = atoi (keyword);
-               keyword = token (fp);
-               fi->ccd[pos].pieces[j++].deltay = atoi (keyword);
-               pcount++;
-             }
-           else
-             error = AFM_parseError;
-           break;
-         case ENDCOMPOSITES:
-           cont = FALSE;
-           break;
-         case ENDFONTMETRICS:
-           cont = FALSE;
-           error = normalEOF;
-           break;
-         case NOPE:
-         default:
-           error = AFM_parseError;
-           break;
-         } /* switch */
-    } /* while */
-
-  if (error == AFM_ok && ccount != fi->numOfComps)
-    error = AFM_parseError;
-
-  return (error);
-} /* parseAFM_CompCharData */
-
-/*************************** 'PUBLIC' FUNCTION ********************/
-
-void
-AFM_free (AFM_Font_info *fi)
-{
-  if (fi->gfi)
-    {
-      free (fi->gfi->afmVersion);
-      free (fi->gfi->fontName);
-      free (fi->gfi->fullName);
-      free (fi->gfi->familyName);
-      free (fi->gfi->weight);
-      free (fi->gfi->version);
-      free (fi->gfi->notice);
-      free (fi->gfi->encodingScheme);
-      free (fi->gfi);
-    }
-
-  /* This contains just scalars.  */
-  free (fi->cwi);
-
-  if (fi->cmi)
-    {
-      int i;
-      for (i = 0; i < fi->numOfChars; i++)
-       {
-         free (fi->cmi[i].name);
-         while (fi->cmi[i].ligs)
-           {
-             AFM_Ligature *tmp;
-             tmp = fi->cmi[i].ligs;
-             free (tmp->succ);
-             free (tmp->lig);
-             free (tmp);
-             fi->cmi[i].ligs = fi->cmi[i].ligs->next;
-           }
-       }
-      free (fi->cmi);
-    }
-
-  /* This contains just scalars.  */
-  free (fi->tkd);
-
-  if (fi->pkd)
-    {
-      int i;
-      for (i = 0; i < fi->numOfPairs; i++)
-       {
-         free (fi->pkd[i].name1);
-         free (fi->pkd[i].name2);
-       }
-      free (fi->pkd);
-    }
-
-  if (fi->ccd)
-    {
-      int i, j;
-      for (i = 0; i < fi->numOfComps; i++)
-       {
-         free (fi->ccd[i].ccName);
-         for (j = 0; j < fi->ccd[i].numOfPieces; j++)
-           free (fi->ccd[i].pieces[j].AFM_PccName);
-         free (fi->ccd[i].pieces);
-       }
-      free (fi->ccd);
-    }
-
-  free (fi);
-}
-
-/*************************** parseFile *****************************/
-
-/*  parseFile is the only 'public' procedure available. It is called
- *  from an application wishing to get information from an AFM file.
- *  The caller of this function is responsible for locating and opening
- *  an AFM file and handling all errors associated with that task.
- *
- *  parseFile expects 3 parameters: a vaild file pointer, a pointer
- *  to a (FontInfo *) variable (for which storage will be allocated and
- *  the data requested filled in), and a mask specifying which
- *  data from the AFM File should be saved in the FontInfo structure.
- *
- *  The file will be parsed and the requested data will be stored in
- *  a record of type FontInfo (refer to ParseAFM.h).
- *
- *  parseFile returns an error code as defined in parseAFM.h.
- *
- *  The position of the read/write pointer associated with the file
- *  pointer upon return of this function is undefined.
- */
-
-int
-AFM_parseFile (FILE *fp, AFM_Font_info **fi, int flags)
-{
-
-  int code = AFM_ok;   /* return code from each of the parsing routines */
-  int error = AFM_ok;  /* used as the return code from this function */
-
-  register char *keyword; /* used to store a token */
-
-  /* storage data for the global variable ident */
-  if (!ident)
-    ident = (char *) calloc (MAX_NAME, sizeof (char));
-  if (ident == NULL)
-    {
-      error = AFM_storageProblem;
-      return error;
-    }
-
-  (*fi) = (AFM_Font_info *) calloc (1, sizeof (AFM_Font_info));
-  if ((*fi) == NULL)
-    {
-      error = AFM_storageProblem;
-      return error;
-    }
-
-  if (flags & P_G)
-    {
-      (*fi)->gfi = (AFM_GlobalFontInfo *) calloc (1,
-                                                 sizeof (AFM_GlobalFontInfo));
-      if ((*fi)->gfi == NULL)
-       {
-         error = AFM_storageProblem;
-         return error;
-       }
-    }
-
-  /* The AFM File begins with Global Font Information. This section */
-  /* will be parsed whether or not information should be saved. */
-  code = parseGlobals (fp, (*fi)->gfi);
-
-  if (code < 0)
-    error = code;
-
-  /* The Global Font Information is followed by the Character Metrics */
-  /* section. Which procedure is used to parse this section depends on */
-  /* how much information should be saved. If all of the metrics info */
-  /* is wanted, parseCharMetrics is called. If only the character widths */
-  /* is wanted, parseCharWidths is called. parseCharWidths will also */
-  /* be called in the case that no character data is to be saved, just */
-  /* to parse through the section. */
-
-  if ((code != normalEOF) && (code != AFM_earlyEOF))
-    {
-      (*fi)->numOfChars = atoi (token (fp));
-      if (flags & (P_M ^ P_W))
-       {
-         (*fi)->cmi = (AFM_CharMetricInfo *)
-           calloc ((*fi)->numOfChars, sizeof (AFM_CharMetricInfo));
-         if ((*fi)->cmi == NULL)
-           {
-             error = AFM_storageProblem;
-             return error;
-           }
-         code = parseCharMetrics (fp, *fi);
-       }
-      else
-       {
-         if (flags & P_W)
-           {
-             (*fi)->cwi = (int *) calloc (256, sizeof (int));
-             if ((*fi)->cwi == NULL)
-               {
-                 error = AFM_storageProblem;
-                 return (error);
-               }
-           }
-         /* parse section regardless */
-         code = parseCharWidths (fp, (*fi)->cwi);
-       } /* else */
-    } /* if */
-
-  if ((error != AFM_earlyEOF) && (code < 0))
-    error = code;
-
-  /* The remaining sections of the AFM are optional. This code will */
-  /* look at the next keyword in the file to determine what section */
-  /* is next, and then allocate the appropriate amount of storage */
-  /* for the data (if the data is to be saved) and call the */
-  /* appropriate parsing routine to parse the section. */
-
-  while ((code != normalEOF) && (code != AFM_earlyEOF))
-    {
-      keyword = token (fp);
-      if (keyword == NULL)
-       /* Have reached an early and unexpected EOF. */
-       /* Set flag and stop parsing */
-       {
-         code = AFM_earlyEOF;
-         break; /* get out of loop */
-       }
-      switch (recognize (keyword))
-       {
-       case STARTKERNDATA:
-         break;
-       case ENDKERNDATA:
-         break;
-       case STARTTRACKKERN:
-         keyword = token (fp);
-         if (flags & P_T)
-           {
-             (*fi)->numOfTracks = atoi (keyword);
-             (*fi)->tkd = (AFM_TrackKernData *)
-               calloc ((*fi)->numOfTracks, sizeof (AFM_TrackKernData));
-             if ((*fi)->tkd == NULL)
-               {
-                 error = AFM_storageProblem;
-                 return (error);
-               }
-           } /* if */
-         code = parseAFM_TrackKernData (fp, *fi);
-         break;
-       case STARTKERNPAIRS:
-         keyword = token (fp);
-         if (flags & P_P)
-           {
-             (*fi)->numOfPairs = atoi (keyword);
-             (*fi)->pkd = (AFM_PairKernData *)
-               calloc ((*fi)->numOfPairs, sizeof (AFM_PairKernData));
-             if ((*fi)->pkd == NULL)
-               {
-                 error = AFM_storageProblem;
-                 return (error);
-               }
-           } /* if */
-         code = parseAFM_PairKernData (fp, *fi);
-         break;
-       case STARTCOMPOSITES:
-         keyword = token (fp);
-         if (flags & P_C)
-           {
-             (*fi)->numOfComps = atoi (keyword);
-             (*fi)->ccd = (AFM_CompCharData *)
-               calloc ((*fi)->numOfComps, sizeof (AFM_CompCharData));
-             if ((*fi)->ccd == NULL)
-               {
-                 error = AFM_storageProblem;
-                 return (error);
-               }
-           } /* if */
-         code = parseAFM_CompCharData (fp, *fi);
-         break;
-       case ENDFONTMETRICS:
-         code = normalEOF;
-         break;
-       case NOPE:
-       default:
-         code = AFM_parseError;
-         break;
-       } /* switch */
-
-      if ((error != AFM_earlyEOF) && (code < 0))
-       error = code;
-    } /* while */
-
-  if ((error != AFM_earlyEOF) && (code < 0))
-    error = code;
-
-  if (ident != NULL) { free (ident); ident = NULL; }
-
-  return (error);
-} /* parseFile */
-
diff --git a/lily/afm.cc b/lily/afm.cc
deleted file mode 100644 (file)
index 282f8dc..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
-  afm.cc -- implement Adobe_font_metric
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 2000--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
-*/
-
-#include "afm.hh"
-
-#include <cstring>
-using namespace std;
-
-#include "warn.hh"
-#include "libc-extension.hh"
-#include "dimensions.hh"
-
-Adobe_font_metric::Adobe_font_metric (AFM_Font_info *fi)
-{
-  checksum_ = 0;
-  font_info_ = fi;
-  design_size_ = 1.0;
-
-  for (int i = max (256, fi->numOfChars); i--;)
-    ascii_to_metric_idx_.push (-1);
-
-  for (int i = 0; i < fi->numOfChars; i++)
-    {
-      AFM_CharMetricInfo *c = fi->cmi + i;
-
-      /* Some TeX afm files contain code = -1.  We don't know why,
-        let's ignore it.  */
-      if (c->code >= 0)
-       ascii_to_metric_idx_[c->code] = i;
-      name_to_metric_dict_[c->name] = i;
-    }
-}
-
-Adobe_font_metric::~Adobe_font_metric ()
-{
-  AFM_free (font_info_);
-}
-
-SCM
-Adobe_font_metric::make_afm (AFM_Font_info *fi,
-                            unsigned int checksum,
-                            Real design_size)
-{
-  Adobe_font_metric *fm = new Adobe_font_metric (fi);
-  fm->checksum_ = checksum;
-  fm->design_size_ = design_size;
-  return fm->self_scm ();
-}
-
-AFM_CharMetricInfo const *
-Adobe_font_metric::find_ascii_metric (int a) const
-{
-  if (ascii_to_metric_idx_[a] >= 0)
-    {
-      int code = ascii_to_metric_idx_[a];
-      if (code >= 0)
-       return font_info_->cmi + code;
-    }
-  return 0;
-}
-
-AFM_CharMetricInfo const *
-Adobe_font_metric::find_char_metric (String nm) const
-{
-  int idx = name_to_index (nm);
-  if (idx >= 0)
-    return font_info_->cmi + idx;
-  return 0;
-}
-
-int
-Adobe_font_metric::name_to_index (String name) const
-{
-  map<String, int>::const_iterator ai = name_to_metric_dict_.find (name);
-  if (ai == name_to_metric_dict_.end ())
-    return -1;
-  return (*ai).second;
-}
-
-int
-Adobe_font_metric::count () const
-{
-  return font_info_->numOfChars;
-}
-
-Box
-Adobe_font_metric::get_ascii_char (int code) const
-{
-  AFM_CharMetricInfo const *c = find_ascii_metric (code);
-  Box b (Interval (0, 0), Interval (0, 0));
-  if (c)
-    b = afm_bbox_to_box (c->charBBox);
-  return b;
-}
-
-int
-Adobe_font_metric::index_to_ascii (int code) const
-{
-  return font_info_->cmi[code].code;
-}
-
-Box
-Adobe_font_metric::get_indexed_char (int code) const
-{
-  if (code >= 0)
-    return afm_bbox_to_box (font_info_->cmi[code].charBBox);
-  else
-    return Box (Interval (0, 0), Interval (0, 0));
-}
-
-SCM
-read_afm_file (String nm)
-{
-  FILE *f = fopen (nm.to_str0 (), "r");
-  char s[2048] = "";
-  char *check_key = "Comment TfmCheckSum";
-  char *size_key = "Comment DesignSize";
-
-  unsigned int cs = 0;
-  Real ds = 1.0;
-
-  /* Assume check_key in first 10 lines */
-  for (int i = 0; i < 10; i++)
-    {
-      fgets (s, sizeof (s), f);
-      if (strncmp (s, check_key, strlen (check_key)) == 0)
-       sscanf (s + strlen (check_key), "%ud", &cs);
-      else if (strncmp (s, size_key, strlen (size_key)) == 0)
-       sscanf (s + strlen (size_key), "%lf", &ds);
-    }
-
-  rewind (f);
-
-  AFM_Font_info *fi;
-  int e = AFM_parseFile (f, &fi, ~0);
-
-  if (e)
-    error (_f ("parsing AFM file: `%s'", nm.to_str0 ()));
-  fclose (f);
-
-  return Adobe_font_metric::make_afm (fi, cs, ds);
-}
-
-Box
-afm_bbox_to_box (AFM_BBox bb)
-{
-#if 1 /* Fine for feta; ec-fonts-mftraced do not have AFM.  */
-  return Box (Interval (bb.llx, bb.urx) * 0.001 PT,
-             Interval (bb.lly, bb.ury) * 0.001 PT);
-#else /* FIXME: about right for lmodern.  */
-  return Box (Interval (bb.llx, bb.urx) * 1.14 * 0.001 PT,
-             Interval (bb.lly, bb.ury) * 1.14 * 0.001 PT);
-#endif
-}
-
-Offset
-Adobe_font_metric::get_indexed_wxwy (int k) const
-{
-  AFM_CharMetricInfo const *mi = font_info_->cmi + k;
-#if 1 /* Fine for feta; ec-fonts-mftraced do not have AFM.  */
-  return Offset (mi->wx, mi->wy) * 0.001 PT;
-#else /* FIXME: about right for lmodern.  */
-  return Offset (mi->wx, mi->wy) * 1.14 * 0.001 PT;
-#endif
-}
-
-Real
-Adobe_font_metric::design_size () const
-{
-  return design_size_;
-}
-
-String
-Adobe_font_metric::font_name () const
-{
-  return font_info_->gfi->fontName;
-}
index 440e16ca66fc55002a11d3dfa2e2967ce89cd13a..e1be0f1de16c238cdee1c65c25a7997317f03604 100644 (file)
@@ -11,7 +11,6 @@
 #include "open-type-font.hh"
 #include "main.hh"
 #include "warn.hh"
-#include "afm.hh"
 #include "tfm.hh"
 #include "scm-hash.hh"
 #include "pango-font.hh"
@@ -20,7 +19,6 @@ static char const *default_font_str0_ = "cmr10";
 
 All_font_metrics::All_font_metrics (String path)
 {
-  afm_dict_ = new Scheme_hash_table;
   tfm_dict_ = new Scheme_hash_table;
   otf_dict_ = new Scheme_hash_table;
 
@@ -43,7 +41,6 @@ All_font_metrics::All_font_metrics (String path)
 
 All_font_metrics::~All_font_metrics ()
 {
-  afm_dict_->unprotect ();
   tfm_dict_->unprotect ();
   otf_dict_->unprotect ();
 
@@ -125,87 +122,6 @@ kpathsea_find_file (String name, String ext)
   return "";
 }
 
-/*
-  TODO: our AFM handling is broken: the units in an AFM file are
-  relative to the design size (1000 units = 1 designsize). Hence we
-  should include design size when generating an AFM metric.
-
-  ugr: copied from find_tfm.
-*/
-Adobe_font_metric *
-All_font_metrics::find_afm (String name)
-{
-  SCM sname = ly_symbol2scm (name.to_str0 ());
-  SCM name_string = scm_makfrom0str (name.to_str0 ());
-  SCM val;
-  if (!afm_dict_->try_retrieve (sname, &val))
-    {
-      String file_name;
-
-      if (file_name.is_empty ())
-       file_name = search_path_.find (name + ".afm");
-
-      if (file_name.is_empty ())
-       {
-         String p = kpathsea_find_file (name, "afm");
-         if (p.length ())
-           file_name = p;
-       }
-
-      if (file_name.is_empty ())
-       return 0;
-
-      if (be_verbose_global)
-       progress_indication ("[" + file_name);
-      val = read_afm_file (file_name);
-      unsmob_metrics (val)->file_name_ = file_name;
-
-      unsmob_metrics (val)->description_ = scm_cons (name_string,
-                                                    scm_from_double (1.0));
-
-      if (be_verbose_global)
-       progress_indication ("]");
-
-      afm_dict_->set (sname, val);
-      unsmob_metrics (val)->unprotect ();
-
-      Adobe_font_metric *afm
-       = dynamic_cast<Adobe_font_metric *> (unsmob_metrics (val));
-
-      /* Only check checksums if there is one.  We take the risk that
-        some file has valid checksum 0 */
-      if (afm->checksum_)
-       {
-         Tex_font_metric *tfm = find_tfm (name);
-
-         /* FIXME: better warning message
-            (maybe check upon startup for feta16.afm, feta16.tfm?) */
-         if (tfm && tfm->info ().checksum != afm->checksum_)
-           {
-             // FIXME: broken sentence
-             String s = _f ("checksum mismatch for font file: `%s'",
-                            file_name.to_str0 ());
-             s += " " + _f ("does not match: `%s'",
-                            tfm->file_name_.to_str0 ());
-             s += "\n";
-             s += " TFM: " + to_string ((int) tfm->info ().checksum);
-             s += " AFM: " + to_string ((int) afm->checksum_);
-             s += "\n";
-             s += _ ("Rebuild all .afm files, and remove all .pk and .tfm files.");
-             s += "\n";
-             s += _ ("Rerun with -V to show font paths.");
-             s += "\n";
-             s += _ ("A script for removing font-files is delivered with the source-code:");
-             s += "\n";
-             s += "buildscripts/clean-fonts.sh";
-             error (s);
-           }
-       }
-    }
-
-  return dynamic_cast<Adobe_font_metric *> (unsmob_metrics (val));
-}
-
 Open_type_font *
 All_font_metrics::find_otf (String name)
 {
@@ -286,20 +202,9 @@ All_font_metrics::find_font (String name)
 {
   Font_metric *f = find_otf (name);
 
-  if (!f
-      && (name.left_string (4) == "feta"
-         || name.left_string (8) == "parmesan"
-         || name.left_string (2) == "lm"))
-    {
-      f = find_afm (name);
-      if (!f)
-       f = find_tfm (name);
-    }
-  else if (!f)
+  if (!f)
     {
       f = find_tfm (name);
-      if (!f)
-       f = find_afm (name);
     }
 
   if (!f)
@@ -310,11 +215,6 @@ All_font_metrics::find_font (String name)
 
   String def_name = default_font_str0_;
 
-  /* We're in emergency recovery mode here anyway, so don't try to do
-     anything smart that runs the risk of failing.  */
-  if (!f)
-    f = find_afm (def_name);
-
   if (!f)
     f = find_tfm (def_name);
 
index 7dcbf7b4886d6735386af7f5cbdcd324c7767d3b..0706bf8d6d6f136fca019d8cf0578c4aecdb34c2 100644 (file)
@@ -136,8 +136,6 @@ Font_metric::font_name () const
   return s;
 }
 
-#include "afm.hh"
-
 int
 Font_metric::index_to_ascii (int i) const
 {
diff --git a/lily/include/afm.hh b/lily/include/afm.hh
deleted file mode 100644 (file)
index f5908f4..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-  afm.hh -- declare Adobe_font_metric
-
-  source file of the GNU LilyPond music typesetter
-
-  (c) 1998--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
-*/
-
-#ifndef AFM_HH
-#define AFM_HH
-
-#include <map>
-using namespace std;
-
-#include "array.hh"
-#include "font-metric.hh"
-#include "parse-afm.hh"
-
-class Adobe_font_metric : public Simple_font_metric
-{
-  DECLARE_CLASSNAME(Adobe_font_metric);
-public:
-  AFM_Font_info *font_info_;
-  unsigned int checksum_;
-  Real design_size_;
-
-  ~Adobe_font_metric ();
-
-  virtual int name_to_index (String) const;
-  virtual int count () const;
-  virtual int index_to_ascii (int) const;
-  virtual Box get_ascii_char (int) const;
-  virtual Box get_indexed_char (int) const;
-  virtual Offset get_indexed_wxwy (int) const;
-  static SCM make_afm (AFM_Font_info *, unsigned, Real);
-  virtual Real design_size () const;
-  virtual String font_name () const;
-
-protected:
-  AFM_CharMetricInfo const *find_char_metric (String name) const;
-  AFM_CharMetricInfo const *find_ascii_metric (int) const;
-
-  Array<int> ascii_to_metric_idx_;
-  map<String, int> name_to_metric_dict_;
-
-  Adobe_font_metric (AFM_Font_info *);
-};
-
-SCM read_afm_file (String);
-Box afm_bbox_to_box (AFM_BBox);
-
-#endif /* AFM_HH */
-
index a8e135c0206c7923f67b27f2cf9e89c22d63ba27..4e5be8a23acb36c5e537efa49363d3a312d9048c 100644 (file)
@@ -23,7 +23,6 @@
 */
 class All_font_metrics
 {
-  Scheme_hash_table *afm_dict_;
   Scheme_hash_table *tfm_dict_;
   Scheme_hash_table *otf_dict_;
   File_path search_path_;
@@ -45,7 +44,6 @@ public:
                               Real scale);
 #endif
 
-  Adobe_font_metric *find_afm (String name);
   Tex_font_metric *find_tfm (String);
   Font_metric *find_font (String name);
   Open_type_font *find_otf (String name);
index 132e0034e10b3a5679aa41c9cba6bcbe48edefbe..9b48ce50ff1cd6a324430e0f896a9fc1c6af2942 100644 (file)
@@ -11,7 +11,6 @@
 
 class String;
 
-String kpathsea_find_afm (char const *name);
 String kpathsea_find_tfm (char const *name);
 void initialize_kpathsea (char *av0);
 
index d7ea27aa7c39c2140eda6ee2d101fa6a01d2d15f..7aa1fc7813b613cdbe72a4d4b776db1f0c4a3fa9 100644 (file)
@@ -10,7 +10,6 @@
 #define LILY_PROTO_HH
 #include "flower-proto.hh"
 
-class Adobe_font_metric;
 class All_font_metrics;
 class Audio_column;
 class Audio_dynamic;
index 258b55bd22d2dc43de820ebf016feecf8741243a..2ab76bab37f704a8bc6413ce1531be9bf8660113 100644 (file)
@@ -7,7 +7,6 @@
 */
 
 #include "all-font-metrics.hh"
-#include "afm.hh"
 #include "warn.hh"
 #include "main.hh"
 #include "system.hh"
@@ -21,9 +20,6 @@
 #include "open-type-font.hh"
 #include "paper-column-engraver.hh"
 
-/*
-  TODO: the column creation logic is rather hairy. Revise it.
-*/
 Score_engraver::Score_engraver ()
 {
   system_ = 0;