|
|
|
@ -169,6 +169,18 @@ |
|
|
|
|
sizeof ( _bdf_properties[0] ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* An auxiliary macro to parse properties, to be used in conditionals. */ |
|
|
|
|
/* It behaves like `strncmp' but also tests the following character */ |
|
|
|
|
/* whether it is a whitespace or NULL. */ |
|
|
|
|
/* `property' is a constant string of length `n' to compare with. */ |
|
|
|
|
#define _bdf_strncmp( name, property, n ) \ |
|
|
|
|
( ft_strncmp( name, property, n ) || \
|
|
|
|
|
!( name[n] == ' ' || \
|
|
|
|
|
name[n] == '\0' || \
|
|
|
|
|
name[n] == '\n' || \
|
|
|
|
|
name[n] == '\r' || \
|
|
|
|
|
name[n] == '\t' ) ) |
|
|
|
|
|
|
|
|
|
/* Auto correction messages. */ |
|
|
|
|
#define ACMSG1 "FONT_ASCENT property missing. " \ |
|
|
|
|
"Added `FONT_ASCENT %hd'.\n" |
|
|
|
@ -1408,7 +1420,7 @@ |
|
|
|
|
|
|
|
|
|
/* If the property happens to be a comment, then it doesn't need */ |
|
|
|
|
/* to be added to the internal hash table. */ |
|
|
|
|
if ( ft_strncmp( name, "COMMENT", 7 ) != 0 ) |
|
|
|
|
if ( _bdf_strncmp( name, "COMMENT", 7 ) != 0 ) |
|
|
|
|
{ |
|
|
|
|
/* Add the property to the font property table. */ |
|
|
|
|
error = hash_insert( fp->name, |
|
|
|
@ -1426,13 +1438,13 @@ |
|
|
|
|
/* FONT_ASCENT and FONT_DESCENT need to be assigned if they are */ |
|
|
|
|
/* present, and the SPACING property should override the default */ |
|
|
|
|
/* spacing. */ |
|
|
|
|
if ( ft_strncmp( name, "DEFAULT_CHAR", 12 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( name, "DEFAULT_CHAR", 12 ) == 0 ) |
|
|
|
|
font->default_char = fp->value.l; |
|
|
|
|
else if ( ft_strncmp( name, "FONT_ASCENT", 11 ) == 0 ) |
|
|
|
|
else if ( _bdf_strncmp( name, "FONT_ASCENT", 11 ) == 0 ) |
|
|
|
|
font->font_ascent = fp->value.l; |
|
|
|
|
else if ( ft_strncmp( name, "FONT_DESCENT", 12 ) == 0 ) |
|
|
|
|
else if ( _bdf_strncmp( name, "FONT_DESCENT", 12 ) == 0 ) |
|
|
|
|
font->font_descent = fp->value.l; |
|
|
|
|
else if ( ft_strncmp( name, "SPACING", 7 ) == 0 ) |
|
|
|
|
else if ( _bdf_strncmp( name, "SPACING", 7 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !fp->value.atom ) |
|
|
|
|
{ |
|
|
|
@ -1490,7 +1502,7 @@ |
|
|
|
|
memory = font->memory; |
|
|
|
|
|
|
|
|
|
/* Check for a comment. */ |
|
|
|
|
if ( ft_strncmp( line, "COMMENT", 7 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
linelen -= 7; |
|
|
|
|
|
|
|
|
@ -1507,7 +1519,7 @@ |
|
|
|
|
/* The very first thing expected is the number of glyphs. */ |
|
|
|
|
if ( !( p->flags & _BDF_GLYPHS ) ) |
|
|
|
|
{ |
|
|
|
|
if ( ft_strncmp( line, "CHARS", 5 ) != 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "CHARS", 5 ) != 0 ) |
|
|
|
|
{ |
|
|
|
|
FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "CHARS" )); |
|
|
|
|
error = FT_THROW( Missing_Chars_Field ); |
|
|
|
@ -1541,7 +1553,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Check for the ENDFONT field. */ |
|
|
|
|
if ( ft_strncmp( line, "ENDFONT", 7 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "ENDFONT", 7 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
/* Sort the glyphs by encoding. */ |
|
|
|
|
ft_qsort( (char *)font->glyphs, |
|
|
|
@ -1555,7 +1567,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Check for the ENDCHAR field. */ |
|
|
|
|
if ( ft_strncmp( line, "ENDCHAR", 7 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "ENDCHAR", 7 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
p->glyph_enc = 0; |
|
|
|
|
p->flags &= ~_BDF_GLYPH_BITS; |
|
|
|
@ -1571,7 +1583,7 @@ |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
/* Check for the STARTCHAR field. */ |
|
|
|
|
if ( ft_strncmp( line, "STARTCHAR", 9 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "STARTCHAR", 9 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
/* Set the character name in the parse info first until the */ |
|
|
|
|
/* encoding can be checked for an unencoded character. */ |
|
|
|
@ -1605,7 +1617,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Check for the ENCODING field. */ |
|
|
|
|
if ( ft_strncmp( line, "ENCODING", 8 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "ENCODING", 8 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !( p->flags & _BDF_GLYPH ) ) |
|
|
|
|
{ |
|
|
|
@ -1791,7 +1803,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Expect the SWIDTH (scalable width) field next. */ |
|
|
|
|
if ( ft_strncmp( line, "SWIDTH", 6 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "SWIDTH", 6 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !( p->flags & _BDF_ENCODING ) ) |
|
|
|
|
goto Missing_Encoding; |
|
|
|
@ -1807,7 +1819,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Expect the DWIDTH (scalable width) field next. */ |
|
|
|
|
if ( ft_strncmp( line, "DWIDTH", 6 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "DWIDTH", 6 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !( p->flags & _BDF_ENCODING ) ) |
|
|
|
|
goto Missing_Encoding; |
|
|
|
@ -1835,7 +1847,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Expect the BBX field next. */ |
|
|
|
|
if ( ft_strncmp( line, "BBX", 3 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "BBX", 3 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !( p->flags & _BDF_ENCODING ) ) |
|
|
|
|
goto Missing_Encoding; |
|
|
|
@ -1903,7 +1915,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* And finally, gather up the bitmap. */ |
|
|
|
|
if ( ft_strncmp( line, "BITMAP", 6 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "BITMAP", 6 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
unsigned long bitmap_size; |
|
|
|
|
|
|
|
|
@ -1978,7 +1990,7 @@ |
|
|
|
|
p = (_bdf_parse_t *) client_data; |
|
|
|
|
|
|
|
|
|
/* Check for the end of the properties. */ |
|
|
|
|
if ( ft_strncmp( line, "ENDPROPERTIES", 13 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "ENDPROPERTIES", 13 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
/* If the FONT_ASCENT or FONT_DESCENT properties have not been */ |
|
|
|
|
/* encountered yet, then make sure they are added as properties and */ |
|
|
|
@ -2019,12 +2031,12 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Ignore the _XFREE86_GLYPH_RANGES properties. */ |
|
|
|
|
if ( ft_strncmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 ) |
|
|
|
|
goto Exit; |
|
|
|
|
|
|
|
|
|
/* Handle COMMENT fields and properties in a special way to preserve */ |
|
|
|
|
/* the spacing. */ |
|
|
|
|
if ( ft_strncmp( line, "COMMENT", 7 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
name = value = line; |
|
|
|
|
value += 7; |
|
|
|
@ -2088,7 +2100,7 @@ |
|
|
|
|
|
|
|
|
|
/* Check for a comment. This is done to handle those fonts that have */ |
|
|
|
|
/* comments before the STARTFONT line for some reason. */ |
|
|
|
|
if ( ft_strncmp( line, "COMMENT", 7 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "COMMENT", 7 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( p->opts->keep_comments != 0 && p->font != 0 ) |
|
|
|
|
{ |
|
|
|
@ -2114,7 +2126,7 @@ |
|
|
|
|
{ |
|
|
|
|
memory = p->memory; |
|
|
|
|
|
|
|
|
|
if ( ft_strncmp( line, "STARTFONT", 9 ) != 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "STARTFONT", 9 ) != 0 ) |
|
|
|
|
{ |
|
|
|
|
/* we don't emit an error message since this code gets */ |
|
|
|
|
/* explicitly caught one level higher */ |
|
|
|
@ -2162,7 +2174,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Check for the start of the properties. */ |
|
|
|
|
if ( ft_strncmp( line, "STARTPROPERTIES", 15 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "STARTPROPERTIES", 15 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !( p->flags & _BDF_FONT_BBX ) ) |
|
|
|
|
{ |
|
|
|
@ -2191,7 +2203,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Check for the FONTBOUNDINGBOX field. */ |
|
|
|
|
if ( ft_strncmp( line, "FONTBOUNDINGBOX", 15 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "FONTBOUNDINGBOX", 15 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !( p->flags & _BDF_SIZE ) ) |
|
|
|
|
{ |
|
|
|
@ -2222,7 +2234,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* The next thing to check for is the FONT field. */ |
|
|
|
|
if ( ft_strncmp( line, "FONT", 4 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "FONT", 4 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
error = _bdf_list_split( &p->list, (char *)" +", line, linelen ); |
|
|
|
|
if ( error ) |
|
|
|
@ -2257,7 +2269,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Check for the SIZE field. */ |
|
|
|
|
if ( ft_strncmp( line, "SIZE", 4 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "SIZE", 4 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
if ( !( p->flags & _BDF_FONT_NAME ) ) |
|
|
|
|
{ |
|
|
|
@ -2311,7 +2323,7 @@ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Check for the CHARS field -- font properties are optional */ |
|
|
|
|
if ( ft_strncmp( line, "CHARS", 5 ) == 0 ) |
|
|
|
|
if ( _bdf_strncmp( line, "CHARS", 5 ) == 0 ) |
|
|
|
|
{ |
|
|
|
|
char nbuf[128]; |
|
|
|
|
|
|
|
|
|