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