Example #1
0
/*
 * 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);
}
Example #2
0
/*
 * 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;
}
Example #3
0
/* 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;
}
Example #4
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;
}