Esempio n. 1
0
void remove_user_from_channel(aClient *sptr, aChannel *chptr)
{
	Member **curr; Membership **curr2;
	Member *tmp; Membership *tmp2;
	Member *lp = chptr->members;

	/* find 1st entry in list that is not user */
	for (; lp && (lp->cptr == sptr); lp = lp->next);
	for (;;)
	{
		for (curr = &chptr->members; (tmp = *curr); curr = &tmp->next)
			if (tmp->cptr == sptr)
			{
				*curr = tmp->next;
				free_member(tmp);
				break;
			}
		for (curr2 = &sptr->user->channel; (tmp2 = *curr2); curr2 = &tmp2->next)
			if (tmp2->chptr == chptr)
			{
				*curr2 = tmp2->next;
				free_membership(tmp2, MyClient(sptr));
				break;
			}
		sptr->user->joined--;
		if (lp)
			break;
		if (chptr->members)
			sptr = chptr->members->cptr;
		else
			break;
		sub1_from_channel(chptr);
	}
	sub1_from_channel(chptr);
}
Esempio n. 2
0
void do_statistical_tests()
{
    #ifndef TRACK_STATISTICS
        printf("Enable TRACK_STATISTICS to do statistical tests...\n");
        return ;
    #else
    /* some sizes test to see how the bitfield or rather hashing function behaves depending on its size. */
    unsigned int
            sizes_to_test[]     = {10000,   /* 10 thousands bits, about 1.25 kilobytes. */
                                   100000,  /* 12.5 kilobytes. */
                                   1000000, /* 125 kilobytes   */
                                   10000000 /* 1.25 megabytes. */},
             number_of_sizes    = 4,
             index_0, index_1,
             number_of_strings  = 10000;

    /* create two set of strings both of which are completely disjoint (if the empty string is excluded),
        in principles their shouldn't be any collisions.
    */
    char **inserted_strings     = get_combinations(number_of_strings, "abcdefghi"),
         **non_inserted_strings = get_combinations(number_of_strings, "jklmnopqr");

    printf("Testing with combinations.\n");
    membership_type *membership;
    for (index_0 = 0; index_0 < number_of_sizes; index_0++)
    {
        membership = create_membership(sizes_to_test[index_0]); /* create a new membership. */
        for (index_1 = 1; index_1 <= number_of_strings; index_1++) /* skip over the empty string */
            insert_string(membership, inserted_strings[index_1]);
        for (index_1 = 1; index_1 <= number_of_strings; index_1++) /* skip over the empty string */
            if (!is_member(membership, inserted_strings[index_1], 1))
                error("Failed to insert value!");
        for (index_1 = 1; index_1 <= number_of_strings; index_1++)
            is_member(membership, non_inserted_strings[index_1], 0);

        printf("Bitfield size %u number_of_strings %u\n", sizes_to_test[index_0], number_of_strings);

        printf("%u, %f%% collisions while inserting.\n",
                (unsigned int)(number_of_strings - membership->number_of_set_bits),
                (((unsigned int)(number_of_strings - membership->number_of_set_bits)/(double)(number_of_strings)) * 100));

        printf("%u, %f%% collisions while searching.\n",
                (unsigned int)(membership->number_of_false_positives),
                (((unsigned int)(membership->number_of_false_positives)/(double)(number_of_strings)) * 100) );
        printf("\n");

        free_membership(membership);
    }

    for (index_0 = 0; index_0 < number_of_strings + 1; index_0++)
    {
        free(inserted_strings[index_0]);
        free(non_inserted_strings[index_0]);
    }

    printf("Testing with permutations.\n");
    inserted_strings = permute_string("abcdefghi", number_of_strings);
    non_inserted_strings = permute_string("jklmnopqr", number_of_strings);
    for (index_0 = 0; index_0 < number_of_sizes; index_0++)
    {
        membership = create_membership(sizes_to_test[index_0]); /* create a new membership. */
        for (index_1 = 0; index_1 < number_of_strings; index_1++)
                insert_string(membership, inserted_strings[index_1]);
        for (index_1 = 0; index_1 < number_of_strings; index_1++)
                if (!is_member(membership, inserted_strings[index_1], 1))
                    error("Failed to insert value!");
        for (index_1 = 0; index_1 < number_of_strings; index_1++)
            is_member(membership, non_inserted_strings[index_1], 0);

        printf("Bitfield size %u number_of_strings %u\n", sizes_to_test[index_0], number_of_strings);

        printf("%u, %f%% collisions while inserting.\n",
                (unsigned int)(number_of_strings - membership->number_of_set_bits),
                (((unsigned int)(number_of_strings - membership->number_of_set_bits)/(double)(number_of_strings)) * 100));

        printf("%u, %f%% collisions while searching.\n",
                (unsigned int)(membership->number_of_false_positives),
                (((unsigned int)(membership->number_of_false_positives)/(double)(number_of_strings)) * 100) );
        printf("\n");

        free_membership(membership);
    }

    for (index_0 = 0; index_0 < number_of_strings; index_0++)
    {
        free(inserted_strings[index_0]);
        free(non_inserted_strings[index_0]);
    }
    #endif
}