Commit 704f4d75cdfae502cc0b70e3413c26ad996b1ac2

suzuki toshiya 2009-09-13T00:50:14

[BDF] Modify hash API to take size_t value instead of void *.

diff --git a/ChangeLog b/ChangeLog
index f9c06c6..5ba1b03 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+2009-09-11  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[BDF] Modify hash API to take size_t value instead of void *.
+
+	The hash API in BDF driver is designed to be generic, it takes
+	void * typed data.  But BDF driver always gives an unsigned long
+	integer (the index to a property).  To reduce non-essential
+	casts from unsigned long to void* and from void* to unsigned
+	long, the hash API is changed to take size_t integer.
+	The issue of incompatible cast between unsigned long and void*
+	on LLP64 platform is reported by NightStrike from MinGW-Win64
+	project.  See
+	http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+
+	* src/bdf/bdf.h: The type of hashnode->data is changed from
+	void* to size_t.
+
+	* src/bdf/bdflib.c (hash_insert): Get size_t data, instead of
+	void* data.
+	(bdf_create_property): Get the name length of new property by
+	size_t variable, with a cut-off at FT_ULONG_MAX.
+	(_bdf_set_default_spacing): Get the name length of the face by
+	size_t variable, with a cut-off at 256.
+	(bdf_get_property): Get the property id by size_t variable to
+	reduce the casts between 32-bit prop ID & hashnode->data during
+	simple copying.
+	(_bdf_add_property): Ditto.
+	(_bdf_parse_start): Calculate the index to the property array
+	by size_t variable.
+	(bdf_get_font_property): Drop a cast to unsigned long.
+
 2009-09-10  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	[Win64] Improve the computation of random seed from stack address.
diff --git a/src/bdf/bdf.h b/src/bdf/bdf.h
index e3088a2..561b415 100644
--- a/src/bdf/bdf.h
+++ b/src/bdf/bdf.h
@@ -160,7 +160,7 @@ FT_BEGIN_HEADER
   typedef struct  _hashnode_
   {
     const char*  key;
-    void*        data;
+    size_t       data;
 
   } _hashnode, *hashnode;
 
diff --git a/src/bdf/bdflib.c b/src/bdf/bdflib.c
index c8afc01..5fa5868 100644
--- a/src/bdf/bdflib.c
+++ b/src/bdf/bdflib.c
@@ -281,7 +281,7 @@
 
   static FT_Error
   hash_insert( char*       key,
-               void*       data,
+               size_t      data,
                hashtable*  ht,
                FT_Memory   memory )
   {
@@ -971,7 +971,7 @@
                        int          format,
                        bdf_font_t*  font )
   {
-    unsigned long    n;
+    size_t           n;
     bdf_property_t*  p;
     FT_Memory        memory = font->memory;
     FT_Error         error = BDF_Err_Ok;
@@ -991,7 +991,9 @@
     p = font->user_props + font->nuser_props;
     FT_ZERO( p );
 
-    n = (unsigned long)( ft_strlen( name ) + 1 );
+    n = ft_strlen( name ) + 1;
+    if ( n > FT_ULONG_MAX )
+      return BDF_Err_Invalid_Argument;
 
     if ( FT_NEW_ARRAY( p->name, n ) )
       goto Exit;
@@ -1003,7 +1005,7 @@
 
     n = _num_bdf_properties + font->nuser_props;
 
-    error = hash_insert( p->name, (void *)n, &(font->proptbl), memory );
+    error = hash_insert( p->name, n, &(font->proptbl), memory );
     if ( error )
       goto Exit;
 
@@ -1018,8 +1020,8 @@
   bdf_get_property( char*        name,
                     bdf_font_t*  font )
   {
-    hashnode       hn;
-    unsigned long  propid;
+    hashnode  hn;
+    size_t    propid;
 
 
     if ( name == 0 || *name == 0 )
@@ -1028,7 +1030,7 @@
     if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 )
       return 0;
 
-    propid = (unsigned long)hn->data;
+    propid = hn->data;
     if ( propid >= _num_bdf_properties )
       return font->user_props + ( propid - _num_bdf_properties );
 
@@ -1131,11 +1133,11 @@
   _bdf_set_default_spacing( bdf_font_t*     font,
                             bdf_options_t*  opts )
   {
-    unsigned long  len;
-    char           name[256];
-    _bdf_list_t    list;
-    FT_Memory      memory;
-    FT_Error       error = BDF_Err_Ok;
+    size_t       len;
+    char         name[256];
+    _bdf_list_t  list;
+    FT_Memory    memory;
+    FT_Error     error = BDF_Err_Ok;
 
 
     if ( font == 0 || font->name == 0 || font->name[0] == 0 )
@@ -1150,7 +1152,7 @@
 
     font->spacing = opts->font_spacing;
 
-    len = (unsigned long)( ft_strlen( font->name ) + 1 );
+    len = ft_strlen( font->name ) + 1;
     /* Limit ourselves to 256 characters in the font name. */
     if ( len >= 256 )
     {
@@ -1261,7 +1263,7 @@
                      char*        name,
                      char*        value )
   {
-    unsigned long   propid;
+    size_t          propid;
     hashnode        hn;
     bdf_property_t  *prop, *fp;
     FT_Memory       memory = font->memory;
@@ -1273,7 +1275,7 @@
     {
       /* The property already exists in the font, so simply replace */
       /* the value of the property with the current value.          */
-      fp = font->props + (unsigned long)hn->data;
+      fp = font->props + hn->data;
 
       switch ( fp->format )
       {
@@ -1335,7 +1337,7 @@
       font->props_size++;
     }
 
-    propid = (unsigned long)hn->data;
+    propid = hn->data;
     if ( propid >= _num_bdf_properties )
       prop = font->user_props + ( propid - _num_bdf_properties );
     else
@@ -1372,7 +1374,7 @@
     if ( ft_memcmp( name, "COMMENT", 7 ) != 0 ) {
       /* Add the property to the font property table. */
       error = hash_insert( fp->name,
-                           (void *)font->props_used,
+                           font->props_used,
                            (hashtable *)font->internal,
                            memory );
       if ( error )
@@ -2044,7 +2046,7 @@
       p->memory    = 0;
 
       { /* setup */
-        unsigned long    i;
+        size_t           i;
         bdf_property_t*  prop;
 
 
@@ -2054,7 +2056,7 @@
         for ( i = 0, prop = (bdf_property_t*)_bdf_properties;
               i < _num_bdf_properties; i++, prop++ )
         {
-          error = hash_insert( prop->name, (void *)i,
+          error = hash_insert( prop->name, i,
                                &(font->proptbl), memory );
           if ( error )
             goto Exit;
@@ -2472,7 +2474,7 @@
 
     hn = hash_lookup( name, (hashtable *)font->internal );
 
-    return hn ? ( font->props + (unsigned long)hn->data ) : 0;
+    return hn ? ( font->props + hn->data ) : 0;
   }