/* * If string is in shared space, decrement usage, if usage then is 0, * free the chunk and attempt to merge with next node. Other * strings are freed with standard free. * Never call free/delete externally on a shared string. */ void _free_string(char *str, const char *caller) { BufEntry *ptr; if (!str || str == &str_empty[0]) return; if (str > string_space && str < top_string) { ptr = (BufEntry *) (str - HEADER_SIZE); if (--ptr->usage > 0) return; else if (ptr->usage < 0) { bugf("SSM: free_string: multiple free/invalid from %s: %20.20s", caller, (char *)&ptr->buf[0]); return; } numFree++; sAllocString -= (ptr->size + HEADER_SIZE); nAllocString--; if (!ssm_buf_free || ssm_buf_free > ptr) ssm_buf_free = ptr; if (fBootDb) { TempHash *ptr; TempHash *walk; int ihash = get_string_hash( str, strlen( str ) ); for (ptr = temp_string_hash[ihash]; ptr; ptr = ptr->next) { if (ptr->str != str) continue; else if (ptr == temp_string_hash[ihash]) temp_string_hash[ihash] = ptr->next; else for (walk = temp_string_hash[ihash]; walk; walk = walk->next) { if (walk->next == ptr) { walk->next = ptr->next; break; } } free(ptr); break; } } return; } sOverFlowString -= strlen(str) + 1; nOverFlowString--; free(str); }
/* * Add a reference in the temporary hash table. * String is still in the linked list structure but * reference is kept here for quick lookup at boot time; */ void temp_hash_add( char *str, int len ) { TempHash *add; int ihash; if( !fBootDb || !*str || ( str <= string_space && str >= top_string )) return; ihash = get_string_hash( str, len ); add = (TempHash *)malloc( sizeof( TempHash ) ); add->next = temp_string_hash[ ihash ]; temp_string_hash[ ihash ] = add; add->str = str; }
/* Lookup the string in the boot-time hash table. */ char *temp_hash_find( const char *str, int len ) { TempHash *ptr; int ihash; if( !fBootDb || !*str ) return 0; ihash = get_string_hash( str, len ); for( ptr = temp_string_hash[ ihash ]; ptr; ptr = ptr->next ) { if( *ptr->str != *str ) continue; else if( strcmp( ptr->str, str ) ) continue; else return ptr->str; } return 0; }
int main(void) { string_tree t; string_hash h; it_string_tree itt; it_string_hash ith; if (!new_string_tree(&t)) { fprintf(stderr, "Error allocating tree.\n"); exit(1); } if (!new_string_hash(&h)) { fprintf(stderr, "Error allocating hash.\n"); exit(1); } insert_string_tree(&t, "cat"); insert_string_tree(&t, "dog"); insert_string_tree(&t, "mouse"); insert_string_hash(&h, "cat"); insert_string_hash(&h, "dog"); insert_string_hash(&h, "mouse"); itt = get_string_tree(&t, "dog"); if (!itt) printf("Dog not found.\n"); else printf("%s barks woof!\n", itt->value); ith = get_string_hash(&h, "cat"); if (!ith) printf("Cat not found.\n"); else printf("%s say meeow!\n", ith->value); free_string_tree(&t); free_string_hash(&h); return 0; }