@@ -92,13 +92,18 @@ void hashtable_destroy(hashtable *ht) {
9292}
9393
9494int hashtable_add (hashtable * ht , char * key , void * value ) {
95- int bucket ;
95+ int bucket , key_size , current_key_size ;
9696 entry * current ;
9797
98+ key_size = strlen (key );
9899 bucket = hash_function (key , strlen (key )) % ht -> nbucket ;
99100 current = ht -> buckets [bucket ];
100101 while (current ) {
101- if (!strncasecmp (key , current -> key , strlen (current -> key ))) return 0 ;
102+ current_key_size = strlen (current -> key );
103+ if (key_size == current_key_size
104+ && !strncmp (key , current -> key , key_size )){
105+ return 0 ;
106+ }
102107 current = current -> next ;
103108 }
104109 entry * e = malloc (sizeof (* e ));
@@ -110,39 +115,45 @@ int hashtable_add(hashtable *ht, char *key, void *value) {
110115}
111116
112117void * hashtable_get (hashtable * ht , char * key ) {
113- int bucket ;
118+ int bucket , key_size , current_key_size ;
114119 entry * current ;
115120
116- bucket = hash_function (key , strlen (key )) % ht -> nbucket ;
121+ key_size = strlen (key );
122+ bucket = hash_function (key , key_size ) % ht -> nbucket ;
117123 current = ht -> buckets [bucket ];
118124 while (current ) {
119- if (!strncasecmp (key , current -> key , strlen (current -> key ))) {
120- return current -> value ;
125+ current_key_size = strlen (current -> key );
126+ if (current_key_size == key_size
127+ && !strncmp (key , current -> key , key_size )) {
128+ return current -> value ;
121129 }
122130 current = current -> next ;
123131 }
124132 return NULL ;
125133}
126134
127135int hashtable_del (hashtable * ht , char * key ) {
128- int bucket ;
129- entry * next , * prev ;
136+ int bucket , key_size = strlen ( key ), current_key_size ;
137+ entry * current , * prev ;
130138
131- bucket = hash_function (key , strlen ( key ) ) % ht -> nbucket ;
132- prev = next = ht -> buckets [bucket ];
133- while ( next ) {
134- if (! strncasecmp ( key , next -> key , strlen ( next -> key )) ) {
135- prev -> next = next -> next ;
136- free ( next -> key );
137- ht -> free ? ht -> free ( next -> value ): free ( next -> value );
138- free ( next ) ;
139- if (prev == ht -> buckets [bucket ]) {
139+ bucket = hash_function (key , key_size ) % ht -> nbucket ;
140+ prev = current = ht -> buckets [bucket ];
141+
142+ while ( current ) {
143+ current_key_size = strlen ( current -> key ) ;
144+ if ( key_size == current_key_size
145+ && ! strncmp ( key , current -> key , key_size )) {
146+ prev -> next = current -> next ;
147+ if (current == ht -> buckets [bucket ]) {
140148 ht -> buckets [bucket ] = NULL ;
141149 }
150+ free (current -> key );
151+ ht -> free ? ht -> free (current -> value ):free (current -> value );
152+ free (current );
142153 return 1 ;
143154 }
144- prev = next ;
145- next = next -> next ;
155+ prev = current ;
156+ current = current -> next ;
146157 }
147158 return 0 ;
148159}
0 commit comments