diff --git a/ChangeLog b/ChangeLog index f9c06c67c..5ba1b03d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +2009-09-11 suzuki toshiya + + [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 [Win64] Improve the computation of random seed from stack address. diff --git a/src/bdf/bdf.h b/src/bdf/bdf.h index e3088a29a..561b4158a 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 c8afc019f..5fa5868c7 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; }