/* * smap.c -- * Implement String Table, a String Vector with Hashed lookup * which creates a fixed mapping between a string and an integer * * Original: 10-Jan-1996 14:14 * * Author: Maarten Ballintijn * * $Id: smap.c,v 1.10 1996/05/14 12:23:35 maartenb Exp $ * * $Log: smap.c,v $ * Revision 1.10 1996/05/14 12:23:35 maartenb * - Fix prototypes. * * - Fix static bool conversions * * Revision 1.9 1996/04/30 10:06:46 maartenb * - Fix double free of internal buffer for smap_sort() * * Revision 1.8 1996/04/23 18:39:10 maartenb * - Add RCS keywords * * */ #include #include #include "qp_report.h" #include "smap.h" #include "str.h" SMap smap_new( int max ) { SMap sm; sm = (SMap) calloc( sizeof(SMapStruct), 1 ); qp_assert( sm ); sm->fSize = max; sm->fV = svec_new( max ); sm->fT = HashInt_new( max ); return sm; } extern SMap smap_copy( SMap old ) { SMap new; int i, n; new = smap_new( old->fSize ); n = old->fEntries; for ( i=0 ; i < n ; i++ ) { smap_add( new, smap_get( old, i ) ); } return new; } int smap_add( SMap sm, String key ) { int i; String new_key; if ( HashInt_find( sm->fT, key, &i ) ) { return 0; } if ( sm->fEntries == sm->fSize ) { return 1; } sm->fEntries += 1; new_key = str_new( key ); svec_add( sm->fV, new_key ); HashInt_add( sm->fT, new_key, sm->fEntries ); return 0; } int smap_entries( SMap sm ) { return sm->fEntries; } String smap_get( SMap sm, const int i ) { return svec_get( sm->fV, i ); } bool smap_map( SMap sm, String key, int * ip ) { return HashInt_find( sm->fT, key, ip ); } void smap_del( SMap sm ) { HashInt_del( sm->fT ); svec_del( sm->fV ); free( (void *) sm ); } static int *map_table; static SVec sort_vec; static int cmp_fun( void *s1, void *s2 ) { int i1, i2; i1 = *(int *) s1; i2 = *(int *) s2; return strcmp( sort_vec->fV[i1], sort_vec->fV[i2] ); } SMap smap_sort( SMap old_map ) { SMap new_map; int size, i; size = old_map->fEntries; new_map = smap_new( size ); map_table = (int *) malloc( size * sizeof(int) ); qp_assert( map_table != 0 ); for( i=0 ; i < size ; i++ ) { map_table[i] = i; } sort_vec = old_map->fV; qsort( map_table, size, sizeof(int), cmp_fun ); for( i=0 ; i < size ; i++ ) { smap_add( new_map, str_new( smap_get( old_map, map_table[i] ) ) ); } free( map_table ); return new_map; }