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); }
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 }