diff PrivateHash.c @ 1:5900d90f5d71

Works -- fixed some minor bugs -- VMSHW_matrix_mult working
author Me
date Wed, 28 Jul 2010 13:14:54 -0700
parents ee3ad252427e
children e6fe47763ee6
line diff
     1.1 --- a/PrivateHash.c	Sat May 22 19:49:28 2010 -0700
     1.2 +++ b/PrivateHash.c	Wed Jul 28 13:14:54 2010 -0700
     1.3 @@ -2,7 +2,6 @@
     1.4   *  Copyright 2009 OpenSourceCodeStewardshipFoundation.org
     1.5   *  Licensed under GNU General Public License version 2
     1.6   *
     1.7 - * NOTE: this version of SRSW correct as of April 25, 2010
     1.8   *
     1.9   * Author: seanhalle@yahoo.com
    1.10   */
    1.11 @@ -23,8 +22,9 @@
    1.12  
    1.13     retTable->freeEntryContentFn = freeFn;
    1.14     
    1.15 -   retTable->entries = malloc( numHashSlots * sizeof(HashEntry *) );
    1.16 -   retTable->tableSz = numHashSlots;
    1.17 +   retTable->entries    = malloc( numHashSlots * sizeof(HashEntry *) );
    1.18 +   retTable->numEntries = 0;
    1.19 +   retTable->tableSz    = numHashSlots;
    1.20  
    1.21     nullOutTablesArray( retTable );
    1.22  
    1.23 @@ -34,7 +34,7 @@
    1.24   void
    1.25  doubleTableSize( HashTable *table )
    1.26   { int i, oldTableSz, newTableSz;
    1.27 -   HashEntry *entry, **oldEntries, **newEntries;
    1.28 +   HashEntry *entry, *nextEntry, **oldEntries, **newEntries;
    1.29  
    1.30     oldTableSz = table->tableSz;
    1.31     oldEntries = table->entries;
    1.32 @@ -51,15 +51,16 @@
    1.33      { if( oldEntries[i] != NULL )
    1.34         { entry = oldEntries[i];
    1.35           while( entry != NULL )
    1.36 -          {
    1.37 -            addEntryToTable( entry, table ); //does not allocate anything
    1.38 -            entry = entry->next;
    1.39 +          { nextEntry = entry->next;
    1.40 +            entry->next = NULL;
    1.41 +            putEntryIntoTable( entry, table ); //does not allocate anything
    1.42 +            entry = nextEntry;
    1.43            }
    1.44         }
    1.45      }
    1.46   }
    1.47  
    1.48 - void
    1.49 +void
    1.50  nullOutTablesArray( HashTable *table )
    1.51   { int i, tableSz;
    1.52     tableSz = table->tableSz;
    1.53 @@ -68,7 +69,7 @@
    1.54        entries[ i ] = NULL;
    1.55   }
    1.56  
    1.57 - unsigned int
    1.58 +unsigned int
    1.59  hashThisKey( char *s, int hashSz )
    1.60   { unsigned int h = 0;
    1.61  
    1.62 @@ -79,10 +80,10 @@
    1.63  
    1.64  /*Need this to be separated out, for use in both getParam and putParam
    1.65   */
    1.66 - HashEntry *
    1.67 +HashEntry *
    1.68  getEntryFromTable( char *key, HashTable * table )
    1.69   {  unsigned int
    1.70 -   hashIndex = hashKey( key, table->tableSz );
    1.71 +   hashIndex = hashThisKey( key, table->tableSz );
    1.72      HashEntry*
    1.73     hashEntry = table->entries[ hashIndex ];
    1.74     for( ; hashEntry != NULL; hashEntry = hashEntry->next )
    1.75 @@ -91,17 +92,20 @@
    1.76     return NULL;
    1.77   }
    1.78  
    1.79 - void *
    1.80 +void *
    1.81  getValueFromTable( char *key, HashTable * table )
    1.82   { HashEntry *entry;
    1.83 -   entry = lookupKeyInHash( key, table );
    1.84 +   entry = getEntryFromTable( key, table );
    1.85     if( entry == NULL ) return NULL;
    1.86  
    1.87     return entry->content;
    1.88   }
    1.89  
    1.90 +
    1.91 +/*If key already has a value, clobber the old one and replace it
    1.92 + */
    1.93   int
    1.94 -addToTable( char* key, void *content, HashTable *table )
    1.95 +addValueIntoTable( char* key, void *content, HashTable *table )
    1.96   { unsigned int hashIdx;
    1.97     HashEntry* hashEntry;
    1.98  
    1.99 @@ -110,7 +114,7 @@
   1.100      { hashIdx = hashThisKey( key, table->tableSz );
   1.101        hashEntry = (HashEntry*) malloc( sizeof( HashEntry ) );
   1.102              if( hashEntry == NULL )  return 0;
   1.103 -      hashEntry->key = strdup_m( key ); //TODO: figure out soln for incr Sz
   1.104 +      hashEntry->key = strdup( key ); //TODO: figure out soln for incr Sz
   1.105              if( hashEntry->key == NULL ) return 0;
   1.106        hashEntry->next = (table->entries)[hashIdx];
   1.107        (table->entries)[hashIdx] = hashEntry;
   1.108 @@ -125,7 +129,7 @@
   1.109   }
   1.110  
   1.111   int
   1.112 -addEntryToTable( HashEntry *entry, HashTable *table )
   1.113 +putEntryIntoTable( HashEntry *entry, HashTable *table )
   1.114   { unsigned int hashIdx;
   1.115     HashEntry* testEntry;
   1.116  
   1.117 @@ -146,22 +150,32 @@
   1.118     return 1;
   1.119   }
   1.120  
   1.121 +
   1.122   bool8
   1.123  deleteEntryFromTable( char *key, HashTable *table )
   1.124 - {
   1.125 -   table->numEntries -= 1;
   1.126 + { HashEntry  *hashEntry;
   1.127 +   HashEntry **addrOfHashEntryPtr;
   1.128 +   unsigned int hashIndex;
   1.129  
   1.130 +   hashIndex = hashThisKey( key, table->tableSz );
   1.131 +   addrOfHashEntryPtr = &( table->entries[ hashIndex ] );
   1.132 +   hashEntry = *addrOfHashEntryPtr;
   1.133 +   while( hashEntry != NULL )
   1.134 +    { if( strcmp( hashEntry->key, key ) == 0 )
   1.135 +       {
   1.136 +         *addrOfHashEntryPtr = hashEntry->next;
   1.137 +         //TODO: Free the contents of entry?
   1.138 +         freeHashEntryButNotContent( hashEntry );
   1.139 +         table->numEntries -= 1;
   1.140 +         return TRUE;
   1.141 +       }
   1.142 +      addrOfHashEntryPtr = &( hashEntry->next );
   1.143 +      hashEntry = *addrOfHashEntryPtr;
   1.144 +    }
   1.145 +   return FALSE;
   1.146   }
   1.147  
   1.148 -
   1.149 - char*
   1.150 -strdup_m( char *o )
   1.151 - { int len = strlen(o)+1;
   1.152 -   char *ns = (char*) malloc( len * sizeof(char) );
   1.153 -   strcpy( ns, o );
   1.154 -   return ns;
   1.155 - }
   1.156 -
   1.157 + 
   1.158  /* debugging function displays the hashtable in (key.value) pairs
   1.159  */
   1.160  /*void hashTableToString( HashTable * table )
   1.161 @@ -194,7 +208,7 @@
   1.162   }
   1.163  */
   1.164  
   1.165 - void
   1.166 +void
   1.167  freeHashTable( HashTable *table )
   1.168   { int i;
   1.169     HashEntry *hashEntry, *temp, **entries;
   1.170 @@ -213,7 +227,7 @@
   1.171      }
   1.172   }
   1.173  
   1.174 - void
   1.175 +void
   1.176  freeHashEntryUsing( HashEntry *entry, HashTable *table )
   1.177   {
   1.178     if( entry->content != NULL )
   1.179 @@ -222,3 +236,10 @@
   1.180     free( entry );
   1.181   }
   1.182  
   1.183 +void
   1.184 +freeHashEntryButNotContent( HashEntry *entry )
   1.185 + {
   1.186 +   free( entry->key ); //was malloc'd above, so free it
   1.187 +   free( entry );
   1.188 + }
   1.189 +