shithub: freetype+ttf2subf

Download patch

ref: c0f9c4aaddcf0a4078e8ce87808ff94b7dba377d
parent: fe33408f9a8c4c0fd3fa57cb4bd4078b10abafad
author: David Turner <[email protected]>
date: Mon Feb 12 09:55:03 EST 2007

introduce ft_mem_dup, ft_mem_strdup and ft_mem_strcpyn, and the corresponding
macros to use them (e.g. FT_STRDUP, FT_DUP and FT_STRCPYN)

modify the code to use them instead of raw mallocs/strcpy

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-02-12  David Turner  <[email protected]>
+
+	* include/freetype/internal/ftmemory.h, src/base/ftutils.c,
+	src/bfd/bfddrivr.c, src/bdf/bdflib.c, src/pcf/pcfread.c,
+	src/cff/cffdrivr.c, src/cff/cffload.c, src/cff/cffobjs.c,
+	src/sfnt/sfdriver.c, src/type1/t1driver.c, src/type42/t42drivr.c:
+	introduce ft_mem_strdup, ft_mem_dup, ft_mem_strcpyn and the
+	corresponding macros, and modify code to use them. This is to
+	get rid of various uses of strcpy and other "evil" functions,
+	as well as simplify a few things
+
+	
 2007-02-11  Werner Lemberg  <[email protected]>
 
 	* src/autofit/afloader.c (af_loader_load_g): Don't change width for
@@ -66,6 +78,7 @@
 	(gxv_mort_subtable_type1_substTable_validate): Fix debugging
 	message.
 
+>>>>>>> 1.1514
 2007-01-31  Werner Lemberg  <[email protected]>
 
 
--- a/builds/mac/ftmac.c
+++ b/builds/mac/ftmac.c
@@ -441,7 +441,12 @@
 
     while ( 1 )
     {
-      q = p + FT_MIN( 255, ft_strlen( p ) );
+      int  len = ft_strlen( p );
+
+      if (len > 255)
+        len = 255;
+
+      q = p + len;
 
       if ( q == p )
         return 0;
--- a/include/freetype/internal/ftmemory.h
+++ b/include/freetype/internal/ftmemory.h
@@ -322,6 +322,38 @@
 #endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
 
 
+  FT_BASE( FT_Pointer )
+  ft_mem_strdup( FT_Memory    memory,
+                 const char*  str,
+                 FT_Error    *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_dup( FT_Memory    memory,
+              const void*  address,
+              FT_ULong     size,
+              FT_Error    *p_error );
+
+#define  FT_MEM_STRDUP(dst,str)    \
+    (dst) = ft_mem_strdup( memory, (const char*)(str), &error )
+
+#define  FT_STRDUP(dst,str)   \
+    FT_MEM_SET_ERROR( FT_MEM_STRDUP(dst,str) )
+
+#define  FT_MEM_DUP(dst, address,size)   \
+    (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
+
+#define  FT_DUP(dst,address,size)  \
+    FT_MEM_SET_ERROR( FT_MEM_DUP(dst,address,size) )
+
+  /* returns 1 or more if a trunction occured, 0 if the source string fitted the buffer */
+  /* this is *not* the same than the normal strlcpy() call                              */
+  FT_BASE( FT_Int )
+  ft_mem_strcpyn( char*        dst,
+                  const char*  src,
+                  FT_ULong     size );
+
+#define  FT_STRCPYN(dst,src,size)   ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
+
  /* */
 
 
--- a/src/base/ftutil.c
+++ b/src/base/ftutil.c
@@ -172,6 +172,48 @@
   }
 
 
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_dup( FT_Memory    memory,
+              const void*  address,
+              FT_ULong     size,
+              FT_Error    *p_error )
+  {
+    FT_Error    error;
+    FT_Pointer  p = ft_mem_qalloc( memory, size, &error );
+
+    if (!error && address)
+      ft_memcpy( p, address, size );
+
+    *p_error = error;
+    return p;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_strdup( FT_Memory    memory,
+                 const char*  str,
+                 FT_Error    *p_error )
+  {
+    FT_ULong  len = str ? (FT_ULong)ft_strlen(str)+1 : 0;
+
+    return ft_mem_dup( memory, str, len, p_error );
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  ft_mem_strcpyn( char*        dst,
+                  const char*  src,
+                  FT_ULong     size )
+  {
+    while ( size > 1 && *src != 0 )
+      *dst++ = *src++;
+
+    *dst = 0;  /* always zero-terminate */
+
+    return (*src != 0);
+  }
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
--- a/src/bdf/bdfdrivr.c
+++ b/src/bdf/bdfdrivr.c
@@ -194,12 +194,10 @@
     bdf_font_t*      font   = bdf->bdffont;
     bdf_property_t*  prop;
 
-    char  *istr = NULL, *bstr = NULL;
-    char  *sstr = NULL, *astr = NULL;
+    int    nn, len;
+    char*  strings[4] = { NULL, NULL, NULL, NULL };
+    int    lengths[4];
 
-    int  parts = 0, len = 0;
-
-
     face->style_flags = 0;
 
     prop = bdf_get_font_property( font, (char *)"SLANT" );
@@ -209,11 +207,9 @@
            *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) )
     {
       face->style_flags |= FT_STYLE_FLAG_ITALIC;
-      istr = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' )
-               ? (char *)"Oblique"
-               : (char *)"Italic";
-      len += ft_strlen( istr );
-      parts++;
+      strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' )
+                   ? (char *)"Oblique"
+                   : (char *)"Italic";
     }
 
     prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" );
@@ -222,9 +218,7 @@
          ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) )
     {
       face->style_flags |= FT_STYLE_FLAG_BOLD;
-      bstr = (char *)"Bold";
-      len += ft_strlen( bstr );
-      parts++;
+      strings[1] = (char *)"Bold";
     }
 
     prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" );
@@ -232,9 +226,7 @@
          prop->value.atom && *(prop->value.atom)                       &&
          !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
     {
-      sstr = (char *)(prop->value.atom);
-      len += ft_strlen( sstr );
-      parts++;
+      strings[3] = (char *)(prop->value.atom);
     }
 
     prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" );
@@ -242,60 +234,64 @@
          prop->value.atom && *(prop->value.atom)                       &&
          !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
     {
-      astr = (char *)(prop->value.atom);
-      len += ft_strlen( astr );
-      parts++;
+      strings[0] = (char *)(prop->value.atom);
     }
 
-    if ( !parts || !len )
+    len   = 0;
+
+    for (len = 0, nn = 0; nn < 4; nn++)
     {
-      if ( FT_ALLOC( face->style_name, ft_strlen( "Regular" ) + 1 ) )
-        return error;
+      lengths[nn] = 0;
+      if (strings[nn]) 
+      {
+        lengths[nn] = ft_strlen(strings[nn]);
+        len        += lengths[nn]+1;
+      }
+    }
 
-      ft_strcpy( face->style_name, "Regular" );
+    if ( len == 0 )
+    {
+      strings[0] = "Regular";
+      lengths[0] = ft_strlen(strings[0]);
+      len        = lengths[0]+1;
     }
-    else
+
     {
-      char          *style, *s;
-      unsigned int  i;
+      char*  s;
 
 
-      if ( FT_ALLOC( style, len + parts ) )
+      if ( FT_ALLOC( face->style_name, len ) )
         return error;
 
-      s = style;
+      s = face->style_name;
 
-      if ( astr )
+      for (nn = 0; nn < 4; nn++)
       {
-        ft_strcpy( s, astr );
-        for ( i = 0; i < ft_strlen( astr ); i++, s++ )
-          if ( *s == ' ' )
-            *s = '-';                     /* replace spaces with dashes */
-        *(s++) = ' ';
-      }
-      if ( bstr )
-      {
-        ft_strcpy( s, bstr );
-        s += ft_strlen( bstr );
-        *(s++) = ' ';
-      }
-      if ( istr )
-      {
-        ft_strcpy( s, istr );
-        s += ft_strlen( istr );
-        *(s++) = ' ';
-      }
-      if ( sstr )
-      {
-        ft_strcpy( s, sstr );
-        for ( i = 0; i < ft_strlen( sstr ); i++, s++ )
-          if ( *s == ' ' )
-            *s = '-';                     /* replace spaces with dashes */
-        *(s++) = ' ';
-      }
-      *(--s) = '\0';        /* overwrite last ' ', terminate the string */
+        char*  src = strings[nn];
+        int    len = lengths[nn];
 
-      face->style_name = style;                     /* allocated string */
+        if ( src == NULL )
+          continue;
+
+        /* separate elements with a space */
+        if (s != face->style_name)
+          *s++ = ' ';
+
+        memcpy( s, src, len );
+
+        /* need to convert spaces to dashes for add_style_name and setwidth_name */
+        if (nn == 0 || nn == 3) 
+        {
+          int  mm;
+
+          for (mm = 0; mm < len; mm++)
+            if (s[mm] == ' ')
+              s[mm] = '-';
+        }
+
+        s += len;
+      }
+      *s = 0;
     }
 
     return error;
@@ -394,12 +390,8 @@
       prop = bdf_get_font_property( font, "FAMILY_NAME" );
       if ( prop && prop->value.atom )
       {
-        int  l = ft_strlen( prop->value.atom ) + 1;
-
-
-        if ( FT_NEW_ARRAY( bdfface->family_name, l ) )
+        if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) )
           goto Exit;
-        ft_strcpy( bdfface->family_name, prop->value.atom );
       }
       else
         bdfface->family_name = 0;
@@ -503,15 +495,9 @@
             const char*  s;
 
 
-            if ( FT_NEW_ARRAY( face->charset_encoding,
-                               ft_strlen( charset_encoding->value.atom ) + 1 ) )
+            if ( FT_STRDUP( face->charset_encoding, charset_encoding->value.atom ) ||
+                 FT_STRDUP( face->charset_registry, charset_registry->value.atom ) )
               goto Exit;
-            if ( FT_NEW_ARRAY( face->charset_registry,
-                               ft_strlen( charset_registry->value.atom ) + 1 ) )
-              goto Exit;
-
-            ft_strcpy( face->charset_registry, charset_registry->value.atom );
-            ft_strcpy( face->charset_encoding, charset_encoding->value.atom );
 
             /* Uh, oh, compare first letters manually to avoid dependency
                on locales. */
--- a/src/bdf/bdflib.c
+++ b/src/bdf/bdflib.c
@@ -1253,7 +1253,6 @@
   {
     unsigned long   propid;
     hashnode        hn;
-    int             len;
     bdf_property_t  *prop, *fp;
     FT_Memory       memory = font->memory;
     FT_Error        error = BDF_Err_Ok;
@@ -1272,19 +1271,11 @@
         /* Delete the current atom if it exists. */
         FT_FREE( fp->value.atom );
 
-        if ( value == 0 )
-          len = 1;
-        else
-          len = ft_strlen( value ) + 1;
-
-        if ( len > 1 )
+        if ( value && value[0] != 0 )
         {
-          if ( FT_NEW_ARRAY( fp->value.atom, len ) )
+          if ( FT_STRDUP( fp->value.atom, value ) )
             goto Exit;
-          FT_MEM_COPY( fp->value.atom, value, len );
         }
-        else
-          fp->value.atom = 0;
         break;
 
       case BDF_INTEGER:
@@ -1349,19 +1340,12 @@
     switch ( prop->format )
     {
     case BDF_ATOM:
-      if ( value == 0 )
-        len = 1;
-      else
-        len = ft_strlen( value ) + 1;
-
-      if ( len > 1 )
+      fp->value.atom = 0;
+      if ( value != 0 && value[0] )
       {
-        if ( FT_NEW_ARRAY( fp->value.atom, len ) )
+        if ( FT_STRDUP( fp->value.atom, value ) )
           goto Exit;
-        FT_MEM_COPY( fp->value.atom, value, len );
       }
-      else
-        fp->value.atom = 0;
       break;
 
     case BDF_INTEGER:
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -220,17 +220,8 @@
     /* now, lookup the name itself */
     gname = cff_index_get_sid_string( &font->string_index, sid, psnames );
 
-    if ( gname && buffer_max > 0 )
-    {
-      FT_UInt  len = (FT_UInt)ft_strlen( gname );
-
-
-      if ( len >= buffer_max )
-        len = buffer_max - 1;
-
-      FT_MEM_COPY( buffer, gname, len );
-      ((FT_Byte*)buffer)[len] = 0;
-    }
+    if ( gname )
+      FT_STRCPYN( buffer, gname, buffer_max );
 
     FT_FREE( gname );
     error = CFF_Err_Ok;
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -570,7 +570,6 @@
     {
       FT_String*   name       = 0;
       const char*  adobe_name = psnames->adobe_std_strings( sid );
-      FT_UInt      len;
 
 
       if ( adobe_name )
@@ -579,12 +578,7 @@
         FT_Error   error;
 
 
-        len = (FT_UInt)ft_strlen( adobe_name );
-        if ( !FT_ALLOC( name, len + 1 ) )
-        {
-          FT_MEM_COPY( name, adobe_name, len );
-          name[len] = 0;
-        }
+        (void)FT_STRDUP( name, adobe_name );
 
         FT_UNUSED( error );
       }
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -285,17 +285,9 @@
               const FT_String*  source )
   {
     FT_Error    error;
-    FT_String*  result = 0;
-    FT_Int      len = (FT_Int)ft_strlen( source );
+    FT_String*  result;
 
-
-    if ( !FT_ALLOC( result, len + 1 ) )
-    {
-      FT_MEM_COPY( result, source, len );
-      result[len] = 0;
-    }
-
-    FT_UNUSED( error );
+    result = ft_mem_strdup(memory, source, &error);
 
     return result;
   }
--- a/src/pcf/pcfread.c
+++ b/src/pcf/pcfread.c
@@ -513,10 +513,8 @@
         goto Bail;
       }
 
-      if ( FT_NEW_ARRAY( properties[i].name,
-                         ft_strlen( strings + name_offset ) + 1 ) )
+      if ( FT_STRDUP( properties[i].name, strings + name_offset ) )
         goto Bail;
-      ft_strcpy( properties[i].name, strings + name_offset );
 
       FT_TRACE4(( "  %s:", properties[i].name ));
 
@@ -534,10 +532,8 @@
           goto Bail;
         }
 
-        if ( FT_NEW_ARRAY( properties[i].value.atom,
-                           ft_strlen( strings + value_offset ) + 1 ) )
+        if ( FT_STRDUP( properties[i].value.atom, strings + value_offset ) )
           goto Bail;
-        ft_strcpy( properties[i].value.atom, strings + props[i].value );
 
         FT_TRACE4(( " `%s'\n", properties[i].value.atom ));
       }
@@ -993,12 +989,11 @@
 
     PCF_Property  prop;
 
-    char  *istr = NULL, *bstr = NULL;
-    char  *sstr = NULL, *astr = NULL;
+    int    nn, len;
+    char*  strings[4] = { NULL, NULL, NULL, NULL };
+    int    lengths[4];
 
-    int  parts = 0, len = 0;
 
-
     face->style_flags = 0;
 
     prop = pcf_find_property( pcf, "SLANT" );
@@ -1007,11 +1002,9 @@
            *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) )
     {
       face->style_flags |= FT_STYLE_FLAG_ITALIC;
-      istr = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' )
-               ? (char *)"Oblique"
-               : (char *)"Italic";
-      len += ft_strlen( istr );
-      parts++;
+      strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' )
+          ? (char *)"Oblique"
+        : (char *)"Italic";
     }
 
     prop = pcf_find_property( pcf, "WEIGHT_NAME" );
@@ -1019,9 +1012,7 @@
          ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) )
     {
       face->style_flags |= FT_STYLE_FLAG_BOLD;
-      bstr = (char *)"Bold";
-      len += ft_strlen( bstr );
-      parts++;
+      strings[1] = (char *)"Bold";
     }
 
     prop = pcf_find_property( pcf, "SETWIDTH_NAME" );
@@ -1029,9 +1020,7 @@
          *(prop->value.atom)                                           &&
          !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
     {
-      sstr = (char *)(prop->value.atom);
-      len += ft_strlen( sstr );
-      parts++;
+      strings[3] = (char *)(prop->value.atom);
     }
 
     prop = pcf_find_property( pcf, "ADD_STYLE_NAME" );
@@ -1039,60 +1028,62 @@
          *(prop->value.atom)                                           &&
          !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
     {
-      astr = (char *)(prop->value.atom);
-      len += ft_strlen( astr );
-      parts++;
+      strings[0] = (char *)(prop->value.atom);
     }
 
-    if ( !parts || !len )
+    for (len = 0, nn = 0; nn < 4; nn++)
     {
-      if ( FT_ALLOC( face->style_name, 8 ) )
-        return error;
-      ft_strcpy( face->style_name, "Regular" );
-      face->style_name[7] = '\0';
+      lengths[nn] = 0;
+      if (strings[nn]) 
+      {
+        lengths[nn] = ft_strlen(strings[nn]);
+        len        += lengths[nn]+1;
+      }
     }
-    else
+
+    if ( len == 0 )
     {
-      char          *style, *s;
-      unsigned int  i;
+      strings[0] = "Regular";
+      lengths[0] = ft_strlen(strings[0]);
+      len        = lengths[0]+1;
+    }
 
+    {
+      char*  s;
 
-      if ( FT_ALLOC( style, len + parts ) )
+
+      if ( FT_ALLOC( face->style_name, len ) )
         return error;
 
-      s = style;
+      s = face->style_name;
 
-      if ( astr )
+      for (nn = 0; nn < 4; nn++)
       {
-        ft_strcpy( s, astr );
-        for ( i = 0; i < ft_strlen( astr ); i++, s++ )
-          if ( *s == ' ' )
-            *s = '-';                     /* replace spaces with dashes */
-        *(s++) = ' ';
-      }
-      if ( bstr )
-      {
-        ft_strcpy( s, bstr );
-        s += ft_strlen( bstr );
-        *(s++) = ' ';
-      }
-      if ( istr )
-      {
-        ft_strcpy( s, istr );
-        s += ft_strlen( istr );
-        *(s++) = ' ';
-      }
-      if ( sstr )
-      {
-        ft_strcpy( s, sstr );
-        for ( i = 0; i < ft_strlen( sstr ); i++, s++ )
-          if ( *s == ' ' )
-            *s = '-';                     /* replace spaces with dashes */
-        *(s++) = ' ';
-      }
-      *(--s) = '\0';        /* overwrite last ' ', terminate the string */
+        char*  src = strings[nn];
+        int    len = lengths[nn];
 
-      face->style_name = style;                     /* allocated string */
+        if ( src == NULL )
+          continue;
+
+        /* separate elements with a space */
+        if (s != face->style_name)
+          *s++ = ' ';
+
+        memcpy( s, src, len );
+
+        /* need to convert spaces to dashes for add_style_name and setwidth_name */
+        if (nn == 0 || nn == 3) 
+        {
+          int  mm;
+
+          for (mm = 0; mm < len; mm++)
+            if (s[mm] == ' ')
+              s[mm] = '-';
+        }
+
+        s += len;
+      }
+      *s = 0;
     }
 
     return error;
@@ -1173,12 +1164,8 @@
       prop = pcf_find_property( face, "FAMILY_NAME" );
       if ( prop && prop->isString )
       {
-        int  l = ft_strlen( prop->value.atom ) + 1;
-
-
-        if ( FT_NEW_ARRAY( root->family_name, l ) )
+        if ( FT_STRDUP( root->family_name, prop->value.atom ) )
           goto Exit;
-        ft_strcpy( root->family_name, prop->value.atom );
       }
       else
         root->family_name = NULL;
@@ -1256,16 +1243,9 @@
         if ( charset_registry && charset_registry->isString &&
              charset_encoding && charset_encoding->isString )
         {
-          if ( FT_NEW_ARRAY( face->charset_encoding,
-                             ft_strlen( charset_encoding->value.atom ) + 1 ) )
+          if ( FT_STRDUP( face->charset_encoding, charset_encoding->value.atom ) ||
+               FT_STRDUP( face->charset_registry, charset_registry->value.atom ) )
             goto Exit;
-
-          if ( FT_NEW_ARRAY( face->charset_registry,
-                             ft_strlen( charset_registry->value.atom ) + 1 ) )
-            goto Exit;
-
-          ft_strcpy( face->charset_registry, charset_registry->value.atom );
-          ft_strcpy( face->charset_encoding, charset_encoding->value.atom );
         }
       }
     }
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -144,17 +144,8 @@
 
 
     error = tt_face_get_ps_name( face, glyph_index, &gname );
-    if ( !error && buffer_max > 0 )
-    {
-      FT_UInt  len = (FT_UInt)( ft_strlen( gname ) );
-
-
-      if ( len >= buffer_max )
-        len = buffer_max - 1;
-
-      FT_MEM_COPY( buffer, gname, len );
-      ((FT_Byte*)buffer)[len] = 0;
-    }
+    if ( !error )
+      FT_STRCPYN( buffer, gname, buffer_max );
 
     return error;
   }
--- a/src/type1/t1driver.c
+++ b/src/type1/t1driver.c
@@ -59,23 +59,7 @@
                      FT_Pointer  buffer,
                      FT_UInt     buffer_max )
   {
-    FT_String*  gname;
-
-
-    gname = face->type1.glyph_names[glyph_index];
-
-    if ( buffer_max > 0 )
-    {
-      FT_UInt  len = (FT_UInt)( ft_strlen( gname ) );
-
-
-      if (len >= buffer_max)
-        len = buffer_max - 1;
-
-      FT_MEM_COPY( buffer, gname, len );
-      ((FT_Byte*)buffer)[len] = 0;
-    }
-
+    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
     return T1_Err_Ok;
   }
 
--- a/src/type42/t42drivr.c
+++ b/src/type42/t42drivr.c
@@ -61,23 +61,7 @@
                       FT_Pointer  buffer,
                       FT_UInt     buffer_max )
   {
-    FT_String*  gname;
-
-
-    gname = face->type1.glyph_names[glyph_index];
-
-    if ( buffer_max > 0 )
-    {
-      FT_UInt  len = (FT_UInt)( ft_strlen( gname ) );
-
-
-      if ( len >= buffer_max )
-        len = buffer_max - 1;
-
-      FT_MEM_COPY( buffer, gname, len );
-      ((FT_Byte*)buffer)[len] = 0;
-    }
-
+    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
     return T42_Err_Ok;
   }
 
@@ -94,7 +78,7 @@
     {
       gname = face->type1.glyph_names[i];
 
-      if ( !ft_strcmp( glyph_name, gname ) )
+      if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) )
         return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] );
     }