[bdf] Use new hash functions.
* src/bdf/bdf.h: Include FT_INTERNAL_HASH_H. (hashnode, hashtable): Removed. (bdf_font_t): Use `FT_HashRec' type for `proptbl'. * src/bdf/bdflib.c: Remove all hash functions. Update code for new hash structure and function names.
This commit is contained in:
parent
c98a40f99d
commit
313435657d
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2015-12-19 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
[bdf] Use new hash functions.
|
||||
|
||||
* src/bdf/bdf.h: Include FT_INTERNAL_HASH_H.
|
||||
(hashnode, hashtable): Removed.
|
||||
(bdf_font_t): Use `FT_HashRec' type for `proptbl'.
|
||||
|
||||
* src/bdf/bdflib.c: Remove all hash functions.
|
||||
Update code for new hash structure and function names.
|
||||
|
||||
2015-12-19 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
[bdf, base] Lift hash functions from bdf driver to base module.
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <ft2build.h>
|
||||
#include FT_INTERNAL_OBJECTS_H
|
||||
#include FT_INTERNAL_STREAM_H
|
||||
#include FT_INTERNAL_HASH_H
|
||||
|
||||
|
||||
FT_BEGIN_HEADER
|
||||
|
@ -157,24 +158,6 @@ FT_BEGIN_HEADER
|
|||
} bdf_glyph_t;
|
||||
|
||||
|
||||
typedef struct _hashnode_
|
||||
{
|
||||
const char* key;
|
||||
size_t data;
|
||||
|
||||
} _hashnode, *hashnode;
|
||||
|
||||
|
||||
typedef struct hashtable_
|
||||
{
|
||||
unsigned int limit;
|
||||
unsigned int size;
|
||||
unsigned int used;
|
||||
hashnode* table;
|
||||
|
||||
} hashtable;
|
||||
|
||||
|
||||
typedef struct bdf_glyphlist_t_
|
||||
{
|
||||
unsigned short pad; /* Pad to 4-byte boundary. */
|
||||
|
@ -238,7 +221,7 @@ FT_BEGIN_HEADER
|
|||
|
||||
bdf_property_t* user_props;
|
||||
unsigned long nuser_props;
|
||||
hashtable proptbl;
|
||||
FT_HashRec proptbl;
|
||||
|
||||
} bdf_font_t;
|
||||
|
||||
|
|
202
src/bdf/bdflib.c
202
src/bdf/bdflib.c
|
@ -219,164 +219,6 @@
|
|||
#define DBGMSG2 " (0x%lX)\n"
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* Hash table utilities for the properties. */
|
||||
/* */
|
||||
/*************************************************************************/
|
||||
|
||||
/* XXX: Replace this with FreeType's hash functions */
|
||||
|
||||
|
||||
#define INITIAL_HT_SIZE 241
|
||||
|
||||
typedef void
|
||||
(*hash_free_func)( hashnode node );
|
||||
|
||||
static hashnode*
|
||||
hash_bucket( const char* key,
|
||||
hashtable* ht )
|
||||
{
|
||||
const char* kp = key;
|
||||
unsigned long res = 0;
|
||||
hashnode* bp = ht->table, *ndp;
|
||||
|
||||
|
||||
/* Mocklisp hash function. */
|
||||
while ( *kp )
|
||||
res = ( res << 5 ) - res + (unsigned long)*kp++;
|
||||
|
||||
ndp = bp + ( res % ht->size );
|
||||
while ( *ndp )
|
||||
{
|
||||
kp = (*ndp)->key;
|
||||
if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 )
|
||||
break;
|
||||
ndp--;
|
||||
if ( ndp < bp )
|
||||
ndp = bp + ( ht->size - 1 );
|
||||
}
|
||||
|
||||
return ndp;
|
||||
}
|
||||
|
||||
|
||||
static FT_Error
|
||||
hash_rehash( hashtable* ht,
|
||||
FT_Memory memory )
|
||||
{
|
||||
hashnode* obp = ht->table, *bp, *nbp;
|
||||
unsigned int i, sz = ht->size;
|
||||
FT_Error error = FT_Err_Ok;
|
||||
|
||||
|
||||
ht->size <<= 1;
|
||||
ht->limit = ht->size / 3;
|
||||
|
||||
if ( FT_NEW_ARRAY( ht->table, ht->size ) )
|
||||
goto Exit;
|
||||
|
||||
for ( i = 0, bp = obp; i < sz; i++, bp++ )
|
||||
{
|
||||
if ( *bp )
|
||||
{
|
||||
nbp = hash_bucket( (*bp)->key, ht );
|
||||
*nbp = *bp;
|
||||
}
|
||||
}
|
||||
FT_FREE( obp );
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
static FT_Error
|
||||
hash_init( hashtable* ht,
|
||||
FT_Memory memory )
|
||||
{
|
||||
unsigned int sz = INITIAL_HT_SIZE;
|
||||
FT_Error error = FT_Err_Ok;
|
||||
|
||||
|
||||
ht->size = sz;
|
||||
ht->limit = sz / 3;
|
||||
ht->used = 0;
|
||||
|
||||
if ( FT_NEW_ARRAY( ht->table, sz ) )
|
||||
goto Exit;
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
hash_free( hashtable* ht,
|
||||
FT_Memory memory )
|
||||
{
|
||||
if ( ht != 0 )
|
||||
{
|
||||
unsigned int i, sz = ht->size;
|
||||
hashnode* bp = ht->table;
|
||||
|
||||
|
||||
for ( i = 0; i < sz; i++, bp++ )
|
||||
FT_FREE( *bp );
|
||||
|
||||
FT_FREE( ht->table );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static FT_Error
|
||||
hash_insert( char* key,
|
||||
size_t data,
|
||||
hashtable* ht,
|
||||
FT_Memory memory )
|
||||
{
|
||||
hashnode nn;
|
||||
hashnode* bp = hash_bucket( key, ht );
|
||||
FT_Error error = FT_Err_Ok;
|
||||
|
||||
|
||||
nn = *bp;
|
||||
if ( !nn )
|
||||
{
|
||||
if ( FT_NEW( nn ) )
|
||||
goto Exit;
|
||||
*bp = nn;
|
||||
|
||||
nn->key = key;
|
||||
nn->data = data;
|
||||
|
||||
if ( ht->used >= ht->limit )
|
||||
{
|
||||
error = hash_rehash( ht, memory );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
}
|
||||
ht->used++;
|
||||
}
|
||||
else
|
||||
nn->data = data;
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
static hashnode
|
||||
hash_lookup( const char* key,
|
||||
hashtable* ht )
|
||||
{
|
||||
hashnode *np = hash_bucket( key, ht );
|
||||
|
||||
|
||||
return *np;
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* Utility types and functions. */
|
||||
|
@ -970,7 +812,7 @@
|
|||
/* First check whether the property has */
|
||||
/* already been added or not. If it has, then */
|
||||
/* simply ignore it. */
|
||||
if ( hash_lookup( name, &(font->proptbl) ) )
|
||||
if ( ft_hash_lookup( name, &(font->proptbl) ) )
|
||||
goto Exit;
|
||||
|
||||
if ( FT_RENEW_ARRAY( font->user_props,
|
||||
|
@ -995,7 +837,7 @@
|
|||
|
||||
n = _num_bdf_properties + font->nuser_props;
|
||||
|
||||
error = hash_insert( p->name, n, &(font->proptbl), memory );
|
||||
error = ft_hash_insert( p->name, n, &(font->proptbl), memory );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
|
||||
|
@ -1010,14 +852,14 @@
|
|||
bdf_get_property( char* name,
|
||||
bdf_font_t* font )
|
||||
{
|
||||
hashnode hn;
|
||||
size_t propid;
|
||||
FT_Hashnode hn;
|
||||
size_t propid;
|
||||
|
||||
|
||||
if ( name == 0 || *name == 0 )
|
||||
return 0;
|
||||
|
||||
if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 )
|
||||
if ( ( hn = ft_hash_lookup( name, &(font->proptbl) ) ) == 0 )
|
||||
return 0;
|
||||
|
||||
propid = hn->data;
|
||||
|
@ -1233,7 +1075,7 @@
|
|||
unsigned long lineno )
|
||||
{
|
||||
size_t propid;
|
||||
hashnode hn;
|
||||
FT_Hashnode hn;
|
||||
bdf_property_t *prop, *fp;
|
||||
FT_Memory memory = font->memory;
|
||||
FT_Error error = FT_Err_Ok;
|
||||
|
@ -1242,7 +1084,7 @@
|
|||
|
||||
|
||||
/* First, check whether the property already exists in the font. */
|
||||
if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 )
|
||||
if ( ( hn = ft_hash_lookup( name, (FT_Hash)font->internal ) ) != 0 )
|
||||
{
|
||||
/* The property already exists in the font, so simply replace */
|
||||
/* the value of the property with the current value. */
|
||||
|
@ -1278,13 +1120,13 @@
|
|||
|
||||
/* See whether this property type exists yet or not. */
|
||||
/* If not, create it. */
|
||||
hn = hash_lookup( name, &(font->proptbl) );
|
||||
hn = ft_hash_lookup( name, &(font->proptbl) );
|
||||
if ( hn == 0 )
|
||||
{
|
||||
error = bdf_create_property( name, BDF_ATOM, font );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
hn = hash_lookup( name, &(font->proptbl) );
|
||||
hn = ft_hash_lookup( name, &(font->proptbl) );
|
||||
}
|
||||
|
||||
/* Allocate another property if this is overflow. */
|
||||
|
@ -1345,10 +1187,10 @@
|
|||
if ( _bdf_strncmp( name, "COMMENT", 7 ) != 0 )
|
||||
{
|
||||
/* Add the property to the font property table. */
|
||||
error = hash_insert( fp->name,
|
||||
font->props_used,
|
||||
(hashtable *)font->internal,
|
||||
memory );
|
||||
error = ft_hash_insert( fp->name,
|
||||
font->props_used,
|
||||
(FT_Hash)font->internal,
|
||||
memory );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
}
|
||||
|
@ -2099,22 +1941,22 @@
|
|||
bdf_property_t* prop;
|
||||
|
||||
|
||||
error = hash_init( &(font->proptbl), memory );
|
||||
error = ft_hash_init( &(font->proptbl), memory );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
for ( i = 0, prop = (bdf_property_t*)_bdf_properties;
|
||||
i < _num_bdf_properties; i++, prop++ )
|
||||
{
|
||||
error = hash_insert( prop->name, i,
|
||||
&(font->proptbl), memory );
|
||||
error = ft_hash_insert( prop->name, i,
|
||||
&(font->proptbl), memory );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) )
|
||||
if ( FT_ALLOC( p->font->internal, sizeof ( FT_HashRec ) ) )
|
||||
goto Exit;
|
||||
error = hash_init( (hashtable *)p->font->internal,memory );
|
||||
error = ft_hash_init( (FT_Hash)p->font->internal, memory );
|
||||
if ( error )
|
||||
goto Exit;
|
||||
p->font->spacing = p->opts->font_spacing;
|
||||
|
@ -2500,7 +2342,7 @@
|
|||
/* Free up the internal hash table of property names. */
|
||||
if ( font->internal )
|
||||
{
|
||||
hash_free( (hashtable *)font->internal, memory );
|
||||
ft_hash_free( (FT_Hash)font->internal, memory );
|
||||
FT_FREE( font->internal );
|
||||
}
|
||||
|
||||
|
@ -2545,7 +2387,7 @@
|
|||
FT_FREE( font->overflow.glyphs );
|
||||
|
||||
/* bdf_cleanup */
|
||||
hash_free( &(font->proptbl), memory );
|
||||
ft_hash_free( &(font->proptbl), memory );
|
||||
|
||||
/* Free up the user defined properties. */
|
||||
for ( prop = font->user_props, i = 0;
|
||||
|
@ -2566,13 +2408,13 @@
|
|||
bdf_get_font_property( bdf_font_t* font,
|
||||
const char* name )
|
||||
{
|
||||
hashnode hn;
|
||||
FT_Hashnode hn;
|
||||
|
||||
|
||||
if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 )
|
||||
return 0;
|
||||
|
||||
hn = hash_lookup( name, (hashtable *)font->internal );
|
||||
hn = ft_hash_lookup( name, (FT_Hash)font->internal );
|
||||
|
||||
return hn ? ( font->props + hn->data ) : 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue