* src/type1/t1driver.c (t1_ps_get_font_value): Clean up.

This handles negative values better, avoiding many casts.
This commit is contained in:
Werner Lemberg 2015-02-18 08:51:22 +01:00
parent d3240c56e5
commit 6a0ded7641
2 changed files with 21 additions and 14 deletions

View File

@ -1,3 +1,8 @@
2015-02-18 Werner Lemberg <wl@gnu.org>
* src/type1/t1driver.c (t1_ps_get_font_value): Clean up.
This handles negative values better, avoiding many casts.
2015-02-17 Werner Lemberg <wl@gnu.org> 2015-02-17 Werner Lemberg <wl@gnu.org>
[base] Fix Savannah bug #44284. [base] Fix Savannah bug #44284.

View File

@ -176,9 +176,11 @@
PS_Dict_Keys key, PS_Dict_Keys key,
FT_UInt idx, FT_UInt idx,
void *value, void *value,
FT_Long value_len ) FT_Long value_len_ )
{ {
FT_Long retval = -1; FT_ULong retval = 0; /* always >= 1 if valid */
FT_ULong value_len = value_len_ < 0 ? 0 : (FT_ULong)value_len_;
T1_Face t1face = (T1_Face)face; T1_Face t1face = (T1_Face)face;
T1_Font type1 = &t1face->type1; T1_Font type1 = &t1face->type1;
@ -225,7 +227,7 @@
if ( idx < sizeof ( type1->font_bbox ) / if ( idx < sizeof ( type1->font_bbox ) /
sizeof ( type1->font_bbox.xMin ) ) sizeof ( type1->font_bbox.xMin ) )
{ {
FT_Fixed val = 0; FT_Fixed val = 0;
retval = sizeof ( val ); retval = sizeof ( val );
@ -258,7 +260,7 @@
break; break;
case PS_DICT_FONT_NAME: case PS_DICT_FONT_NAME:
retval = (FT_Long)( ft_strlen( type1->font_name ) + 1 ); retval = ft_strlen( type1->font_name ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
ft_memcpy( value, (void *)( type1->font_name ), retval ); ft_memcpy( value, (void *)( type1->font_name ), retval );
break; break;
@ -278,7 +280,7 @@
case PS_DICT_CHAR_STRING_KEY: case PS_DICT_CHAR_STRING_KEY:
if ( idx < (FT_UInt)type1->num_glyphs ) if ( idx < (FT_UInt)type1->num_glyphs )
{ {
retval = (FT_Long)( ft_strlen( type1->glyph_names[idx] ) + 1 ); retval = ft_strlen( type1->glyph_names[idx] ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
{ {
ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval ); ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );
@ -290,7 +292,7 @@
case PS_DICT_CHAR_STRING: case PS_DICT_CHAR_STRING:
if ( idx < (FT_UInt)type1->num_glyphs ) if ( idx < (FT_UInt)type1->num_glyphs )
{ {
retval = (FT_Long)( type1->charstrings_len[idx] + 1 ); retval = type1->charstrings_len[idx] + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
{ {
ft_memcpy( value, (void *)( type1->charstrings[idx] ), ft_memcpy( value, (void *)( type1->charstrings[idx] ),
@ -310,7 +312,7 @@
if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY && if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&
idx < (FT_UInt)type1->encoding.num_chars ) idx < (FT_UInt)type1->encoding.num_chars )
{ {
retval = (FT_Long)( ft_strlen( type1->encoding.char_name[idx] ) + 1 ); retval = ft_strlen( type1->encoding.char_name[idx] ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
{ {
ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ), ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),
@ -329,7 +331,7 @@
case PS_DICT_SUBR: case PS_DICT_SUBR:
if ( idx < (FT_UInt)type1->num_subrs ) if ( idx < (FT_UInt)type1->num_subrs )
{ {
retval = (FT_Long)( type1->subrs_len[idx] + 1 ); retval = type1->subrs_len[idx] + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
{ {
ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 ); ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
@ -523,31 +525,31 @@
break; break;
case PS_DICT_VERSION: case PS_DICT_VERSION:
retval = (FT_Long)( ft_strlen( type1->font_info.version ) + 1 ); retval = ft_strlen( type1->font_info.version ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
ft_memcpy( value, (void *)( type1->font_info.version ), retval ); ft_memcpy( value, (void *)( type1->font_info.version ), retval );
break; break;
case PS_DICT_NOTICE: case PS_DICT_NOTICE:
retval = (FT_Long)( ft_strlen( type1->font_info.notice ) + 1 ); retval = ft_strlen( type1->font_info.notice ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
ft_memcpy( value, (void *)( type1->font_info.notice ), retval ); ft_memcpy( value, (void *)( type1->font_info.notice ), retval );
break; break;
case PS_DICT_FULL_NAME: case PS_DICT_FULL_NAME:
retval = (FT_Long)( ft_strlen( type1->font_info.full_name ) + 1 ); retval = ft_strlen( type1->font_info.full_name ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
ft_memcpy( value, (void *)( type1->font_info.full_name ), retval ); ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );
break; break;
case PS_DICT_FAMILY_NAME: case PS_DICT_FAMILY_NAME:
retval = (FT_Long)( ft_strlen( type1->font_info.family_name ) + 1 ); retval = ft_strlen( type1->font_info.family_name ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
ft_memcpy( value, (void *)( type1->font_info.family_name ), retval ); ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );
break; break;
case PS_DICT_WEIGHT: case PS_DICT_WEIGHT:
retval = (FT_Long)( ft_strlen( type1->font_info.weight ) + 1 ); retval = ft_strlen( type1->font_info.weight ) + 1;
if ( value && value_len >= retval ) if ( value && value_len >= retval )
ft_memcpy( value, (void *)( type1->font_info.weight ), retval ); ft_memcpy( value, (void *)( type1->font_info.weight ), retval );
break; break;
@ -559,7 +561,7 @@
break; break;
} }
return retval; return retval == 0 ? -1 : (FT_Long)retval;
} }