Home | History | Annotate | Download | only in cff
      1 /***************************************************************************/
      2 /*                                                                         */
      3 /*  cffparse.c                                                             */
      4 /*                                                                         */
      5 /*    CFF token stream parser (body)                                       */
      6 /*                                                                         */
      7 /*  Copyright 1996-2004, 2007-2011 by                                      */
      8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
      9 /*                                                                         */
     10 /*  This file is part of the FreeType project, and may only be used,       */
     11 /*  modified, and distributed under the terms of the FreeType project      */
     12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
     13 /*  this file you indicate that you have read the license and              */
     14 /*  understand and accept it fully.                                        */
     15 /*                                                                         */
     16 /***************************************************************************/
     17 
     18 
     19 #include <ft2build.h>
     20 #include "cffparse.h"
     21 #include FT_INTERNAL_STREAM_H
     22 #include FT_INTERNAL_DEBUG_H
     23 
     24 #include "cfferrs.h"
     25 #include "cffpic.h"
     26 
     27 
     28   /*************************************************************************/
     29   /*                                                                       */
     30   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
     31   /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
     32   /* messages during execution.                                            */
     33   /*                                                                       */
     34 #undef  FT_COMPONENT
     35 #define FT_COMPONENT  trace_cffparse
     36 
     37 
     38   FT_LOCAL_DEF( void )
     39   cff_parser_init( CFF_Parser  parser,
     40                    FT_UInt     code,
     41                    void*       object,
     42                    FT_Library  library)
     43   {
     44     FT_MEM_ZERO( parser, sizeof ( *parser ) );
     45 
     46     parser->top         = parser->stack;
     47     parser->object_code = code;
     48     parser->object      = object;
     49     parser->library     = library;
     50   }
     51 
     52 
     53   /* read an integer */
     54   static FT_Long
     55   cff_parse_integer( FT_Byte*  start,
     56                      FT_Byte*  limit )
     57   {
     58     FT_Byte*  p   = start;
     59     FT_Int    v   = *p++;
     60     FT_Long   val = 0;
     61 
     62 
     63     if ( v == 28 )
     64     {
     65       if ( p + 2 > limit )
     66         goto Bad;
     67 
     68       val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] );
     69       p  += 2;
     70     }
     71     else if ( v == 29 )
     72     {
     73       if ( p + 4 > limit )
     74         goto Bad;
     75 
     76       val = ( (FT_Long)p[0] << 24 ) |
     77             ( (FT_Long)p[1] << 16 ) |
     78             ( (FT_Long)p[2] <<  8 ) |
     79                        p[3];
     80       p += 4;
     81     }
     82     else if ( v < 247 )
     83     {
     84       val = v - 139;
     85     }
     86     else if ( v < 251 )
     87     {
     88       if ( p + 1 > limit )
     89         goto Bad;
     90 
     91       val = ( v - 247 ) * 256 + p[0] + 108;
     92       p++;
     93     }
     94     else
     95     {
     96       if ( p + 1 > limit )
     97         goto Bad;
     98 
     99       val = -( v - 251 ) * 256 - p[0] - 108;
    100       p++;
    101     }
    102 
    103   Exit:
    104     return val;
    105 
    106   Bad:
    107     val = 0;
    108     goto Exit;
    109   }
    110 
    111 
    112   static const FT_Long power_tens[] =
    113   {
    114     1L,
    115     10L,
    116     100L,
    117     1000L,
    118     10000L,
    119     100000L,
    120     1000000L,
    121     10000000L,
    122     100000000L,
    123     1000000000L
    124   };
    125 
    126 
    127   /* read a real */
    128   static FT_Fixed
    129   cff_parse_real( FT_Byte*  start,
    130                   FT_Byte*  limit,
    131                   FT_Long   power_ten,
    132                   FT_Long*  scaling )
    133   {
    134     FT_Byte*  p = start;
    135     FT_UInt   nib;
    136     FT_UInt   phase;
    137 
    138     FT_Long   result, number, exponent;
    139     FT_Int    sign = 0, exponent_sign = 0;
    140     FT_Long   exponent_add, integer_length, fraction_length;
    141 
    142 
    143     if ( scaling )
    144       *scaling = 0;
    145 
    146     result = 0;
    147 
    148     number   = 0;
    149     exponent = 0;
    150 
    151     exponent_add    = 0;
    152     integer_length  = 0;
    153     fraction_length = 0;
    154 
    155     /* First of all, read the integer part. */
    156     phase = 4;
    157 
    158     for (;;)
    159     {
    160       /* If we entered this iteration with phase == 4, we need to */
    161       /* read a new byte.  This also skips past the initial 0x1E. */
    162       if ( phase )
    163       {
    164         p++;
    165 
    166         /* Make sure we don't read past the end. */
    167         if ( p >= limit )
    168           goto Exit;
    169       }
    170 
    171       /* Get the nibble. */
    172       nib   = ( p[0] >> phase ) & 0xF;
    173       phase = 4 - phase;
    174 
    175       if ( nib == 0xE )
    176         sign = 1;
    177       else if ( nib > 9 )
    178         break;
    179       else
    180       {
    181         /* Increase exponent if we can't add the digit. */
    182         if ( number >= 0xCCCCCCCL )
    183           exponent_add++;
    184         /* Skip leading zeros. */
    185         else if ( nib || number )
    186         {
    187           integer_length++;
    188           number = number * 10 + nib;
    189         }
    190       }
    191     }
    192 
    193     /* Read fraction part, if any. */
    194     if ( nib == 0xa )
    195       for (;;)
    196       {
    197         /* If we entered this iteration with phase == 4, we need */
    198         /* to read a new byte.                                   */
    199         if ( phase )
    200         {
    201           p++;
    202 
    203           /* Make sure we don't read past the end. */
    204           if ( p >= limit )
    205             goto Exit;
    206         }
    207 
    208         /* Get the nibble. */
    209         nib   = ( p[0] >> phase ) & 0xF;
    210         phase = 4 - phase;
    211         if ( nib >= 10 )
    212           break;
    213 
    214         /* Skip leading zeros if possible. */
    215         if ( !nib && !number )
    216           exponent_add--;
    217         /* Only add digit if we don't overflow. */
    218         else if ( number < 0xCCCCCCCL && fraction_length < 9 )
    219         {
    220           fraction_length++;
    221           number = number * 10 + nib;
    222         }
    223       }
    224 
    225     /* Read exponent, if any. */
    226     if ( nib == 12 )
    227     {
    228       exponent_sign = 1;
    229       nib           = 11;
    230     }
    231 
    232     if ( nib == 11 )
    233     {
    234       for (;;)
    235       {
    236         /* If we entered this iteration with phase == 4, */
    237         /* we need to read a new byte.                   */
    238         if ( phase )
    239         {
    240           p++;
    241 
    242           /* Make sure we don't read past the end. */
    243           if ( p >= limit )
    244             goto Exit;
    245         }
    246 
    247         /* Get the nibble. */
    248         nib   = ( p[0] >> phase ) & 0xF;
    249         phase = 4 - phase;
    250         if ( nib >= 10 )
    251           break;
    252 
    253         exponent = exponent * 10 + nib;
    254 
    255         /* Arbitrarily limit exponent. */
    256         if ( exponent > 1000 )
    257           goto Exit;
    258       }
    259 
    260       if ( exponent_sign )
    261         exponent = -exponent;
    262     }
    263 
    264     /* We don't check `power_ten' and `exponent_add'. */
    265     exponent += power_ten + exponent_add;
    266 
    267     if ( scaling )
    268     {
    269       /* Only use `fraction_length'. */
    270       fraction_length += integer_length;
    271       exponent        += integer_length;
    272 
    273       if ( fraction_length <= 5 )
    274       {
    275         if ( number > 0x7FFFL )
    276         {
    277           result   = FT_DivFix( number, 10 );
    278           *scaling = exponent - fraction_length + 1;
    279         }
    280         else
    281         {
    282           if ( exponent > 0 )
    283           {
    284             FT_Long  new_fraction_length, shift;
    285 
    286 
    287             /* Make `scaling' as small as possible. */
    288             new_fraction_length = FT_MIN( exponent, 5 );
    289             exponent           -= new_fraction_length;
    290             shift               = new_fraction_length - fraction_length;
    291 
    292             number *= power_tens[shift];
    293             if ( number > 0x7FFFL )
    294             {
    295               number   /= 10;
    296               exponent += 1;
    297             }
    298           }
    299           else
    300             exponent -= fraction_length;
    301 
    302           result   = number << 16;
    303           *scaling = exponent;
    304         }
    305       }
    306       else
    307       {
    308         if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
    309         {
    310           result   = FT_DivFix( number, power_tens[fraction_length - 4] );
    311           *scaling = exponent - 4;
    312         }
    313         else
    314         {
    315           result   = FT_DivFix( number, power_tens[fraction_length - 5] );
    316           *scaling = exponent - 5;
    317         }
    318       }
    319     }
    320     else
    321     {
    322       integer_length  += exponent;
    323       fraction_length -= exponent;
    324 
    325       /* Check for overflow and underflow. */
    326       if ( FT_ABS( integer_length ) > 5 )
    327         goto Exit;
    328 
    329       /* Remove non-significant digits. */
    330       if ( integer_length < 0 )
    331       {
    332         number          /= power_tens[-integer_length];
    333         fraction_length += integer_length;
    334       }
    335 
    336       /* this can only happen if exponent was non-zero */
    337       if ( fraction_length == 10 )
    338       {
    339         number          /= 10;
    340         fraction_length -= 1;
    341       }
    342 
    343       /* Convert into 16.16 format. */
    344       if ( fraction_length > 0 )
    345       {
    346         if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
    347           goto Exit;
    348 
    349         result = FT_DivFix( number, power_tens[fraction_length] );
    350       }
    351       else
    352       {
    353         number *= power_tens[-fraction_length];
    354 
    355         if ( number > 0x7FFFL )
    356           goto Exit;
    357 
    358         result = number << 16;
    359       }
    360     }
    361 
    362     if ( sign )
    363       result = -result;
    364 
    365   Exit:
    366     return result;
    367   }
    368 
    369 
    370   /* read a number, either integer or real */
    371   static FT_Long
    372   cff_parse_num( FT_Byte**  d )
    373   {
    374     return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
    375                      :   cff_parse_integer( d[0], d[1] );
    376   }
    377 
    378 
    379   /* read a floating point number, either integer or real */
    380   static FT_Fixed
    381   cff_parse_fixed( FT_Byte**  d )
    382   {
    383     return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL )
    384                      : cff_parse_integer( d[0], d[1] ) << 16;
    385   }
    386 
    387 
    388   /* read a floating point number, either integer or real, */
    389   /* but return `10^scaling' times the number read in      */
    390   static FT_Fixed
    391   cff_parse_fixed_scaled( FT_Byte**  d,
    392                           FT_Long    scaling )
    393   {
    394     return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL )
    395                      : ( cff_parse_integer( d[0], d[1] ) *
    396                            power_tens[scaling] ) << 16;
    397   }
    398 
    399 
    400   /* read a floating point number, either integer or real,     */
    401   /* and return it as precise as possible -- `scaling' returns */
    402   /* the scaling factor (as a power of 10)                     */
    403   static FT_Fixed
    404   cff_parse_fixed_dynamic( FT_Byte**  d,
    405                            FT_Long*   scaling )
    406   {
    407     FT_ASSERT( scaling );
    408 
    409     if ( **d == 30 )
    410       return cff_parse_real( d[0], d[1], 0, scaling );
    411     else
    412     {
    413       FT_Long  number;
    414       FT_Int   integer_length;
    415 
    416 
    417       number = cff_parse_integer( d[0], d[1] );
    418 
    419       if ( number > 0x7FFFL )
    420       {
    421         for ( integer_length = 5; integer_length < 10; integer_length++ )
    422           if ( number < power_tens[integer_length] )
    423             break;
    424 
    425         if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
    426         {
    427           *scaling = integer_length - 4;
    428           return FT_DivFix( number, power_tens[integer_length - 4] );
    429         }
    430         else
    431         {
    432           *scaling = integer_length - 5;
    433           return FT_DivFix( number, power_tens[integer_length - 5] );
    434         }
    435       }
    436       else
    437       {
    438         *scaling = 0;
    439         return number << 16;
    440       }
    441     }
    442   }
    443 
    444 
    445   static FT_Error
    446   cff_parse_font_matrix( CFF_Parser  parser )
    447   {
    448     CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;
    449     FT_Matrix*       matrix = &dict->font_matrix;
    450     FT_Vector*       offset = &dict->font_offset;
    451     FT_ULong*        upm    = &dict->units_per_em;
    452     FT_Byte**        data   = parser->stack;
    453     FT_Error         error  = CFF_Err_Stack_Underflow;
    454 
    455 
    456     if ( parser->top >= parser->stack + 6 )
    457     {
    458       FT_Long  scaling;
    459 
    460 
    461       error = CFF_Err_Ok;
    462 
    463       dict->has_font_matrix = TRUE;
    464 
    465       /* We expect a well-formed font matrix, this is, the matrix elements */
    466       /* `xx' and `yy' are of approximately the same magnitude.  To avoid  */
    467       /* loss of precision, we use the magnitude of element `xx' to scale  */
    468       /* all other elements.  The scaling factor is then contained in the  */
    469       /* `units_per_em' value.                                             */
    470 
    471       matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
    472 
    473       scaling = -scaling;
    474 
    475       if ( scaling < 0 || scaling > 9 )
    476       {
    477         /* Return default matrix in case of unlikely values. */
    478 
    479         FT_TRACE1(( "cff_parse_font_matrix:"
    480                     " strange scaling value for xx element (%d),\n"
    481                     "                      "
    482                     " using default matrix\n", scaling ));
    483 
    484         matrix->xx = 0x10000L;
    485         matrix->yx = 0;
    486         matrix->xy = 0;
    487         matrix->yy = 0x10000L;
    488         offset->x  = 0;
    489         offset->y  = 0;
    490         *upm       = 1;
    491 
    492         goto Exit;
    493       }
    494 
    495       matrix->yx = cff_parse_fixed_scaled( data++, scaling );
    496       matrix->xy = cff_parse_fixed_scaled( data++, scaling );
    497       matrix->yy = cff_parse_fixed_scaled( data++, scaling );
    498       offset->x  = cff_parse_fixed_scaled( data++, scaling );
    499       offset->y  = cff_parse_fixed_scaled( data,   scaling );
    500 
    501       *upm = power_tens[scaling];
    502 
    503       FT_TRACE4(( " [%f %f %f %f %f %f]\n",
    504                   (double)matrix->xx / *upm / 65536,
    505                   (double)matrix->xy / *upm / 65536,
    506                   (double)matrix->yx / *upm / 65536,
    507                   (double)matrix->yy / *upm / 65536,
    508                   (double)offset->x  / *upm / 65536,
    509                   (double)offset->y  / *upm / 65536 ));
    510     }
    511 
    512   Exit:
    513     return error;
    514   }
    515 
    516 
    517   static FT_Error
    518   cff_parse_font_bbox( CFF_Parser  parser )
    519   {
    520     CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
    521     FT_BBox*         bbox = &dict->font_bbox;
    522     FT_Byte**        data = parser->stack;
    523     FT_Error         error;
    524 
    525 
    526     error = CFF_Err_Stack_Underflow;
    527 
    528     if ( parser->top >= parser->stack + 4 )
    529     {
    530       bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
    531       bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
    532       bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
    533       bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );
    534       error = CFF_Err_Ok;
    535 
    536       FT_TRACE4(( " [%d %d %d %d]\n",
    537                   bbox->xMin / 65536,
    538                   bbox->yMin / 65536,
    539                   bbox->xMax / 65536,
    540                   bbox->yMax / 65536 ));
    541     }
    542 
    543     return error;
    544   }
    545 
    546 
    547   static FT_Error
    548   cff_parse_private_dict( CFF_Parser  parser )
    549   {
    550     CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
    551     FT_Byte**        data = parser->stack;
    552     FT_Error         error;
    553 
    554 
    555     error = CFF_Err_Stack_Underflow;
    556 
    557     if ( parser->top >= parser->stack + 2 )
    558     {
    559       dict->private_size   = cff_parse_num( data++ );
    560       dict->private_offset = cff_parse_num( data   );
    561       FT_TRACE4(( " %lu %lu\n",
    562                   dict->private_size, dict->private_offset ));
    563 
    564       error = CFF_Err_Ok;
    565     }
    566 
    567     return error;
    568   }
    569 
    570 
    571   static FT_Error
    572   cff_parse_cid_ros( CFF_Parser  parser )
    573   {
    574     CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
    575     FT_Byte**        data = parser->stack;
    576     FT_Error         error;
    577 
    578 
    579     error = CFF_Err_Stack_Underflow;
    580 
    581     if ( parser->top >= parser->stack + 3 )
    582     {
    583       dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
    584       dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
    585       if ( **data == 30 )
    586         FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
    587       dict->cid_supplement = cff_parse_num( data );
    588       if ( dict->cid_supplement < 0 )
    589         FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
    590                    dict->cid_supplement ));
    591       error = CFF_Err_Ok;
    592 
    593       FT_TRACE4(( " %d %d %d\n",
    594                   dict->cid_registry,
    595                   dict->cid_ordering,
    596                   dict->cid_supplement ));
    597     }
    598 
    599     return error;
    600   }
    601 
    602 
    603 #define CFF_FIELD_NUM( code, name, id )             \
    604           CFF_FIELD( code, name, id, cff_kind_num )
    605 #define CFF_FIELD_FIXED( code, name, id )             \
    606           CFF_FIELD( code, name, id, cff_kind_fixed )
    607 #define CFF_FIELD_FIXED_1000( code, name, id )                 \
    608           CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
    609 #define CFF_FIELD_STRING( code, name, id )             \
    610           CFF_FIELD( code, name, id, cff_kind_string )
    611 #define CFF_FIELD_BOOL( code, name, id )             \
    612           CFF_FIELD( code, name, id, cff_kind_bool )
    613 
    614 #define CFFCODE_TOPDICT  0x1000
    615 #define CFFCODE_PRIVATE  0x2000
    616 
    617 
    618 #ifndef FT_CONFIG_OPTION_PIC
    619 
    620 
    621 #undef  CFF_FIELD
    622 #undef  CFF_FIELD_DELTA
    623 
    624 
    625 #ifndef FT_DEBUG_LEVEL_TRACE
    626 
    627 
    628 #define CFF_FIELD_CALLBACK( code, name, id ) \
    629           {                                  \
    630             cff_kind_callback,               \
    631             code | CFFCODE,                  \
    632             0, 0,                            \
    633             cff_parse_ ## name,              \
    634             0, 0                             \
    635           },
    636 
    637 #define CFF_FIELD( code, name, id, kind ) \
    638           {                               \
    639             kind,                         \
    640             code | CFFCODE,               \
    641             FT_FIELD_OFFSET( name ),      \
    642             FT_FIELD_SIZE( name ),        \
    643             0, 0, 0                       \
    644           },
    645 
    646 #define CFF_FIELD_DELTA( code, name, max, id ) \
    647           {                                    \
    648             cff_kind_delta,                    \
    649             code | CFFCODE,                    \
    650             FT_FIELD_OFFSET( name ),           \
    651             FT_FIELD_SIZE_DELTA( name ),       \
    652             0,                                 \
    653             max,                               \
    654             FT_FIELD_OFFSET( num_ ## name )    \
    655           },
    656 
    657   static const CFF_Field_Handler  cff_field_handlers[] =
    658   {
    659 
    660 #include "cfftoken.h"
    661 
    662     { 0, 0, 0, 0, 0, 0, 0 }
    663   };
    664 
    665 
    666 #else /* FT_DEBUG_LEVEL_TRACE */
    667 
    668 
    669 
    670 #define CFF_FIELD_CALLBACK( code, name, id ) \
    671           {                                  \
    672             cff_kind_callback,               \
    673             code | CFFCODE,                  \
    674             0, 0,                            \
    675             cff_parse_ ## name,              \
    676             0, 0,                            \
    677             id                               \
    678           },
    679 
    680 #define CFF_FIELD( code, name, id, kind ) \
    681           {                               \
    682             kind,                         \
    683             code | CFFCODE,               \
    684             FT_FIELD_OFFSET( name ),      \
    685             FT_FIELD_SIZE( name ),        \
    686             0, 0, 0,                      \
    687             id                            \
    688           },
    689 
    690 #define CFF_FIELD_DELTA( code, name, max, id ) \
    691           {                                    \
    692             cff_kind_delta,                    \
    693             code | CFFCODE,                    \
    694             FT_FIELD_OFFSET( name ),           \
    695             FT_FIELD_SIZE_DELTA( name ),       \
    696             0,                                 \
    697             max,                               \
    698             FT_FIELD_OFFSET( num_ ## name ),   \
    699             id                                 \
    700           },
    701 
    702   static const CFF_Field_Handler  cff_field_handlers[] =
    703   {
    704 
    705 #include "cfftoken.h"
    706 
    707     { 0, 0, 0, 0, 0, 0, 0, 0 }
    708   };
    709 
    710 
    711 #endif /* FT_DEBUG_LEVEL_TRACE */
    712 
    713 
    714 #else /* FT_CONFIG_OPTION_PIC */
    715 
    716 
    717   void
    718   FT_Destroy_Class_cff_field_handlers( FT_Library          library,
    719                                        CFF_Field_Handler*  clazz )
    720   {
    721     FT_Memory  memory = library->memory;
    722 
    723 
    724     if ( clazz )
    725       FT_FREE( clazz );
    726   }
    727 
    728 
    729   FT_Error
    730   FT_Create_Class_cff_field_handlers( FT_Library           library,
    731                                       CFF_Field_Handler**  output_class )
    732   {
    733     CFF_Field_Handler*  clazz;
    734     FT_Error            error;
    735     FT_Memory           memory = library->memory;
    736 
    737     int  i = 0;
    738 
    739 
    740 #undef CFF_FIELD
    741 #define CFF_FIELD( code, name, id, kind ) i++;
    742 #undef CFF_FIELD_DELTA
    743 #define CFF_FIELD_DELTA( code, name, max, id ) i++;
    744 #undef CFF_FIELD_CALLBACK
    745 #define CFF_FIELD_CALLBACK( code, name, id ) i++;
    746 
    747 #include "cfftoken.h"
    748 
    749     i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
    750 
    751     if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
    752       return error;
    753 
    754     i = 0;
    755 
    756 
    757 #ifndef FT_DEBUG_LEVEL_TRACE
    758 
    759 
    760 #undef CFF_FIELD_CALLBACK
    761 #define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
    762           clazz[i].kind         = cff_kind_callback;   \
    763           clazz[i].code         = code_ | CFFCODE;     \
    764           clazz[i].offset       = 0;                   \
    765           clazz[i].size         = 0;                   \
    766           clazz[i].reader       = cff_parse_ ## name_; \
    767           clazz[i].array_max    = 0;                   \
    768           clazz[i].count_offset = 0;                   \
    769           i++;
    770 
    771 #undef  CFF_FIELD
    772 #define CFF_FIELD( code_, name_, id_, kind_ )               \
    773           clazz[i].kind         = kind_;                    \
    774           clazz[i].code         = code_ | CFFCODE;          \
    775           clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
    776           clazz[i].size         = FT_FIELD_SIZE( name_ );   \
    777           clazz[i].reader       = 0;                        \
    778           clazz[i].array_max    = 0;                        \
    779           clazz[i].count_offset = 0;                        \
    780           i++;                                              \
    781 
    782 #undef  CFF_FIELD_DELTA
    783 #define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
    784           clazz[i].kind         = cff_kind_delta;                   \
    785           clazz[i].code         = code_ | CFFCODE;                  \
    786           clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
    787           clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
    788           clazz[i].reader       = 0;                                \
    789           clazz[i].array_max    = max_;                             \
    790           clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
    791           i++;
    792 
    793 #include "cfftoken.h"
    794 
    795     clazz[i].kind         = 0;
    796     clazz[i].code         = 0;
    797     clazz[i].offset       = 0;
    798     clazz[i].size         = 0;
    799     clazz[i].reader       = 0;
    800     clazz[i].array_max    = 0;
    801     clazz[i].count_offset = 0;
    802 
    803 
    804 #else /* FT_DEBUG_LEVEL_TRACE */
    805 
    806 
    807 #undef CFF_FIELD_CALLBACK
    808 #define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
    809           clazz[i].kind         = cff_kind_callback;   \
    810           clazz[i].code         = code_ | CFFCODE;     \
    811           clazz[i].offset       = 0;                   \
    812           clazz[i].size         = 0;                   \
    813           clazz[i].reader       = cff_parse_ ## name_; \
    814           clazz[i].array_max    = 0;                   \
    815           clazz[i].count_offset = 0;                   \
    816           clazz[i].id           = id_;                 \
    817           i++;
    818 
    819 #undef  CFF_FIELD
    820 #define CFF_FIELD( code_, name_, id_, kind_ )               \
    821           clazz[i].kind         = kind_;                    \
    822           clazz[i].code         = code_ | CFFCODE;          \
    823           clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
    824           clazz[i].size         = FT_FIELD_SIZE( name_ );   \
    825           clazz[i].reader       = 0;                        \
    826           clazz[i].array_max    = 0;                        \
    827           clazz[i].count_offset = 0;                        \
    828           clazz[i].id           = id_;                      \
    829           i++;                                              \
    830 
    831 #undef  CFF_FIELD_DELTA
    832 #define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
    833           clazz[i].kind         = cff_kind_delta;                   \
    834           clazz[i].code         = code_ | CFFCODE;                  \
    835           clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
    836           clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
    837           clazz[i].reader       = 0;                                \
    838           clazz[i].array_max    = max_;                             \
    839           clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
    840           clazz[i].id           = id_;                              \
    841           i++;
    842 
    843 #include "cfftoken.h"
    844 
    845     clazz[i].kind         = 0;
    846     clazz[i].code         = 0;
    847     clazz[i].offset       = 0;
    848     clazz[i].size         = 0;
    849     clazz[i].reader       = 0;
    850     clazz[i].array_max    = 0;
    851     clazz[i].count_offset = 0;
    852     clazz[i].id           = 0;
    853 
    854 
    855 #endif /* FT_DEBUG_LEVEL_TRACE */
    856 
    857 
    858     *output_class = clazz;
    859 
    860     return CFF_Err_Ok;
    861   }
    862 
    863 
    864 #endif /* FT_CONFIG_OPTION_PIC */
    865 
    866 
    867   FT_LOCAL_DEF( FT_Error )
    868   cff_parser_run( CFF_Parser  parser,
    869                   FT_Byte*    start,
    870                   FT_Byte*    limit )
    871   {
    872     FT_Byte*    p       = start;
    873     FT_Error    error   = CFF_Err_Ok;
    874     FT_Library  library = parser->library;
    875     FT_UNUSED( library );
    876 
    877 
    878     parser->top    = parser->stack;
    879     parser->start  = start;
    880     parser->limit  = limit;
    881     parser->cursor = start;
    882 
    883     while ( p < limit )
    884     {
    885       FT_UInt  v = *p;
    886 
    887 
    888       if ( v >= 27 && v != 31 )
    889       {
    890         /* it's a number; we will push its position on the stack */
    891         if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
    892           goto Stack_Overflow;
    893 
    894         *parser->top ++ = p;
    895 
    896         /* now, skip it */
    897         if ( v == 30 )
    898         {
    899           /* skip real number */
    900           p++;
    901           for (;;)
    902           {
    903             /* An unterminated floating point number at the */
    904             /* end of a dictionary is invalid but harmless. */
    905             if ( p >= limit )
    906               goto Exit;
    907             v = p[0] >> 4;
    908             if ( v == 15 )
    909               break;
    910             v = p[0] & 0xF;
    911             if ( v == 15 )
    912               break;
    913             p++;
    914           }
    915         }
    916         else if ( v == 28 )
    917           p += 2;
    918         else if ( v == 29 )
    919           p += 4;
    920         else if ( v > 246 )
    921           p += 1;
    922       }
    923       else
    924       {
    925         /* This is not a number, hence it's an operator.  Compute its code */
    926         /* and look for it in our current list.                            */
    927 
    928         FT_UInt                   code;
    929         FT_UInt                   num_args = (FT_UInt)
    930                                              ( parser->top - parser->stack );
    931         const CFF_Field_Handler*  field;
    932 
    933 
    934         *parser->top = p;
    935         code = v;
    936         if ( v == 12 )
    937         {
    938           /* two byte operator */
    939           p++;
    940           if ( p >= limit )
    941             goto Syntax_Error;
    942 
    943           code = 0x100 | p[0];
    944         }
    945         code = code | parser->object_code;
    946 
    947         for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ )
    948         {
    949           if ( field->code == (FT_Int)code )
    950           {
    951             /* we found our field's handler; read it */
    952             FT_Long   val;
    953             FT_Byte*  q = (FT_Byte*)parser->object + field->offset;
    954 
    955 
    956 #ifdef FT_DEBUG_LEVEL_TRACE
    957             FT_TRACE4(( "  %s", field->id ));
    958 #endif
    959 
    960             /* check that we have enough arguments -- except for */
    961             /* delta encoded arrays, which can be empty          */
    962             if ( field->kind != cff_kind_delta && num_args < 1 )
    963               goto Stack_Underflow;
    964 
    965             switch ( field->kind )
    966             {
    967             case cff_kind_bool:
    968             case cff_kind_string:
    969             case cff_kind_num:
    970               val = cff_parse_num( parser->stack );
    971               goto Store_Number;
    972 
    973             case cff_kind_fixed:
    974               val = cff_parse_fixed( parser->stack );
    975               goto Store_Number;
    976 
    977             case cff_kind_fixed_thousand:
    978               val = cff_parse_fixed_scaled( parser->stack, 3 );
    979 
    980             Store_Number:
    981               switch ( field->size )
    982               {
    983               case (8 / FT_CHAR_BIT):
    984                 *(FT_Byte*)q = (FT_Byte)val;
    985                 break;
    986 
    987               case (16 / FT_CHAR_BIT):
    988                 *(FT_Short*)q = (FT_Short)val;
    989                 break;
    990 
    991               case (32 / FT_CHAR_BIT):
    992                 *(FT_Int32*)q = (FT_Int)val;
    993                 break;
    994 
    995               default:  /* for 64-bit systems */
    996                 *(FT_Long*)q = val;
    997               }
    998 
    999 #ifdef FT_DEBUG_LEVEL_TRACE
   1000               switch ( field->kind )
   1001               {
   1002               case cff_kind_bool:
   1003                 FT_TRACE4(( " %s\n", val ? "true" : "false" ));
   1004                 break;
   1005 
   1006               case cff_kind_string:
   1007                 FT_TRACE4(( " %ld (SID)\n", val ));
   1008                 break;
   1009 
   1010               case cff_kind_num:
   1011                 FT_TRACE4(( " %ld\n", val ));
   1012                 break;
   1013 
   1014               case cff_kind_fixed:
   1015                 FT_TRACE4(( " %f\n", (double)val / 65536 ));
   1016                 break;
   1017 
   1018               case cff_kind_fixed_thousand:
   1019                 FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
   1020 
   1021               default:
   1022                 ; /* never reached */
   1023               }
   1024 #endif
   1025 
   1026               break;
   1027 
   1028             case cff_kind_delta:
   1029               {
   1030                 FT_Byte*   qcount = (FT_Byte*)parser->object +
   1031                                       field->count_offset;
   1032 
   1033                 FT_Byte**  data = parser->stack;
   1034 
   1035 
   1036                 if ( num_args > field->array_max )
   1037                   num_args = field->array_max;
   1038 
   1039                 FT_TRACE4(( " [" ));
   1040 
   1041                 /* store count */
   1042                 *qcount = (FT_Byte)num_args;
   1043 
   1044                 val = 0;
   1045                 while ( num_args > 0 )
   1046                 {
   1047                   val += cff_parse_num( data++ );
   1048                   switch ( field->size )
   1049                   {
   1050                   case (8 / FT_CHAR_BIT):
   1051                     *(FT_Byte*)q = (FT_Byte)val;
   1052                     break;
   1053 
   1054                   case (16 / FT_CHAR_BIT):
   1055                     *(FT_Short*)q = (FT_Short)val;
   1056                     break;
   1057 
   1058                   case (32 / FT_CHAR_BIT):
   1059                     *(FT_Int32*)q = (FT_Int)val;
   1060                     break;
   1061 
   1062                   default:  /* for 64-bit systems */
   1063                     *(FT_Long*)q = val;
   1064                   }
   1065 
   1066                   FT_TRACE4(( " %ld", val ));
   1067 
   1068                   q += field->size;
   1069                   num_args--;
   1070                 }
   1071 
   1072                 FT_TRACE4(( "]\n" ));
   1073               }
   1074               break;
   1075 
   1076             default:  /* callback */
   1077               error = field->reader( parser );
   1078               if ( error )
   1079                 goto Exit;
   1080             }
   1081             goto Found;
   1082           }
   1083         }
   1084 
   1085         /* this is an unknown operator, or it is unsupported; */
   1086         /* we will ignore it for now.                         */
   1087 
   1088       Found:
   1089         /* clear stack */
   1090         parser->top = parser->stack;
   1091       }
   1092       p++;
   1093     }
   1094 
   1095   Exit:
   1096     return error;
   1097 
   1098   Stack_Overflow:
   1099     error = CFF_Err_Invalid_Argument;
   1100     goto Exit;
   1101 
   1102   Stack_Underflow:
   1103     error = CFF_Err_Invalid_Argument;
   1104     goto Exit;
   1105 
   1106   Syntax_Error:
   1107     error = CFF_Err_Invalid_Argument;
   1108     goto Exit;
   1109   }
   1110 
   1111 
   1112 /* END */
   1113