X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Flibpspp%2Fll-test.c;h=86a0c5cb11c7cedacd8148e607f194aa37f2ed9f;hb=a306948c079462223c692225141b92a76801df03;hp=03fc0fd7d8be953061a7b7ed3ad4a6dd860426b8;hpb=480a0746507ce73d26f528b56dc3ed80195096e0;p=pspp diff --git a/tests/libpspp/ll-test.c b/tests/libpspp/ll-test.c index 03fc0fd7d8..86a0c5cb11 100644 --- a/tests/libpspp/ll-test.c +++ b/tests/libpspp/ll-test.c @@ -1,20 +1,18 @@ -/* PSPP - computes sample statistics. - Copyright (C) 2006 Free Software Foundation, Inc. +/* PSPP - a program for statistical analysis. + Copyright (C) 2006, 2010 Free Software Foundation, Inc. - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ /* This is a test program for the ll_* routines defined in ll.c. This test program aims to be as comprehensive as @@ -28,8 +26,11 @@ See llx-test.c for a similar program for the llx_* routines. */ +#ifdef HAVE_CONFIG_H +#include +#endif + #include -#include #include #include #include @@ -41,26 +42,22 @@ #define UNUSED #endif -/* Currently running test. */ -static const char *test_name; - /* Exit with a failure code. (Place a breakpoint on this function while debugging.) */ static void -check_die (void) +check_die (void) { - exit (EXIT_FAILURE); + exit (EXIT_FAILURE); } /* If OK is not true, prints a message about failure on the current source file and the given LINE and terminates. */ static void -check_func (bool ok, int line) +check_func (bool ok, int line) { - if (!ok) + if (!ok) { - printf ("Check failed in %s test at %s, line %d\n", - test_name, __FILE__, line); + fprintf (stderr, "%s:%d: check failed\n", __FILE__, line); check_die (); } } @@ -81,9 +78,9 @@ xalloc_die (void) /* Allocates and returns N bytes of memory. */ static void * -xmalloc (size_t n) +xmalloc (size_t n) { - if (n != 0) + if (n != 0) { void *p = malloc (n); if (p == NULL) @@ -97,7 +94,7 @@ xmalloc (size_t n) /* Allocates and returns N * M bytes of memory. */ static void * -xnmalloc (size_t n, size_t m) +xnmalloc (size_t n, size_t m) { if ((size_t) -1 / m <= n) xalloc_die (); @@ -114,7 +111,7 @@ struct element int y; /* Secondary value. */ }; -int aux_data; +static int aux_data; /* Returns the `struct element' that LL is embedded within. */ static struct element * @@ -130,7 +127,7 @@ print_list (struct ll_list *list) struct ll *x; printf ("list:"); - for (x = ll_head (list); x != ll_null (list); x = ll_next (x)) + for (x = ll_head (list); x != ll_null (list); x = ll_next (x)) { struct element *e = ll_to_element (x); printf (" %d", e->x); @@ -142,24 +139,24 @@ print_list (struct ll_list *list) AUX for each element in LIST. */ static void UNUSED print_pred (struct ll_list *list, - ll_predicate_func *predicate, void *aux UNUSED) + ll_predicate_func *predicate, void *aux UNUSED) { struct ll *x; printf ("pred:"); - for (x = ll_head (list); x != ll_null (list); x = ll_next (x)) + for (x = ll_head (list); x != ll_null (list); x = ll_next (x)) printf (" %d", predicate (x, aux)); printf ("\n"); } -/* Prints the CNT numbers in VALUES. */ +/* Prints the N numbers in VALUES. */ static void UNUSED -print_array (int values[], size_t cnt) +print_array (int values[], size_t n) { size_t i; printf ("arry:"); - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) printf (" %d", values[i]); printf ("\n"); } @@ -167,7 +164,7 @@ print_array (int values[], size_t cnt) /* Compares the `x' values in A and B and returns a strcmp-type return value. Verifies that AUX points to aux_data. */ static int -compare_elements (const struct ll *a_, const struct ll *b_, void *aux) +compare_elements (const struct ll *a_, const struct ll *b_, void *aux) { const struct element *a = ll_to_element (a_); const struct element *b = ll_to_element (b_); @@ -180,7 +177,7 @@ compare_elements (const struct ll *a_, const struct ll *b_, void *aux) strcmp-type return value. Verifies that AUX points to aux_data. */ static int -compare_elements_x_y (const struct ll *a_, const struct ll *b_, void *aux) +compare_elements_x_y (const struct ll *a_, const struct ll *b_, void *aux) { const struct element *a = ll_to_element (a_); const struct element *b = ll_to_element (b_); @@ -209,10 +206,10 @@ compare_elements_y (const struct ll *a_, const struct ll *b_, void *aux) /* Returns true if the bit in *PATTERN indicated by `x in *ELEMENT is set, false otherwise. */ static bool -pattern_pred (const struct ll *element_, void *pattern_) +pattern_pred (const struct ll *element_, void *pattern_) { const struct element *element = ll_to_element (element_); - unsigned *pattern = pattern_; + unsigned int *pattern = pattern_; return (*pattern & (1u << element->x)) != 0; } @@ -229,7 +226,7 @@ allocate_elements (size_t n, struct ll_list *list, struct element ***elems, struct ll ***elemp, - int **values) + int **values) { size_t i; @@ -237,33 +234,33 @@ allocate_elements (size_t n, ll_init (list); *elems = xnmalloc (n, sizeof **elems); - for (i = 0; i < n; i++) + for (i = 0; i < n; i++) { (*elems)[i] = xmalloc (sizeof ***elems); if (list != NULL) ll_push_tail (list, &(*elems)[i]->ll); } - - if (elemp != NULL) + + if (elemp != NULL) { *elemp = xnmalloc (n + 1, sizeof *elemp); for (i = 0; i < n; i++) (*elemp)[i] = &(*elems)[i]->ll; (*elemp)[n] = ll_null (list); } - + if (values != NULL) *values = xnmalloc (n, sizeof *values); } -/* Copies the CNT values of `x' from LIST into VALUES[]. */ +/* Copies the N values of `x' from LIST into VALUES[]. */ static void -extract_values (struct ll_list *list, int values[], size_t cnt) +extract_values (struct ll_list *list, int values[], size_t n) { struct ll *x; - - check (ll_count (list) == cnt); - for (x = ll_head (list); x != ll_null (list); x = ll_next (x)) + + check (ll_count (list) == n); + for (x = ll_head (list); x != ll_null (list); x = ll_next (x)) { struct element *e = ll_to_element (x); *values++ = e->x; @@ -278,16 +275,16 @@ allocate_ascending (size_t n, struct ll_list *list, struct element ***elems, struct ll ***elemp, - int **values) + int **values) { size_t i; allocate_elements (n, list, elems, elemp, values); - for (i = 0; i < n; i++) + for (i = 0; i < n; i++) (*elems)[i]->x = i; if (values != NULL) - extract_values (list, *values, n); + extract_values (list, *values, n); } /* As allocate_elements, but sets binary values extracted from @@ -299,31 +296,31 @@ allocate_pattern (size_t n, struct ll_list *list, struct element ***elems, struct ll ***elemp, - int **values) + int **values) { size_t i; allocate_elements (n, list, elems, elemp, values); - - for (i = 0; i < n; i++) + + for (i = 0; i < n; i++) (*elems)[i]->x = (pattern & (1 << i)) != 0; if (values != NULL) - extract_values (list, *values, n); + extract_values (list, *values, n); } -/* Randomly shuffles the CNT elements in ARRAY, each of which is +/* Randomly shuffles the N elements in ARRAY, each of which is SIZE bytes in size. */ static void -random_shuffle (void *array_, size_t cnt, size_t size) +random_shuffle (void *array_, size_t n, size_t size) { char *array = array_; char *tmp = xmalloc (size); size_t i; - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) { - size_t j = rand () % (cnt - i) + i; - if (i != j) + size_t j = rand () % (n - i) + i; + if (i != j) { memcpy (tmp, array + j * size, size); memcpy (array + j * size, array + i * size, size); @@ -340,17 +337,17 @@ allocate_random (size_t n, struct ll_list *list, struct element ***elems, struct ll ***elemp, - int **values) + int **values) { size_t i; allocate_elements (n, list, elems, elemp, values); - - for (i = 0; i < n; i++) + + for (i = 0; i < n; i++) (*elems)[i]->x = i; random_shuffle (*elems, n, sizeof **elems); if (values != NULL) - extract_values (list, *values, n); + extract_values (list, *values, n); } /* Frees the N elements of ELEMS, ELEMP, and VALUES. */ @@ -358,20 +355,20 @@ static void free_elements (size_t n, struct element **elems, struct ll **elemp, - int *values) + int *values) { size_t i; for (i = 0; i < n; i++) free (elems[i]); - free (elems); + free (elems); free (elemp); free (values); } /* Compares A and B and returns a strcmp-type return value. */ static int -compare_ints (const void *a_, const void *b_, void *aux UNUSED) +compare_ints (const void *a_, const void *b_, void *aux UNUSED) { const int *a = a_; const int *b = b_; @@ -381,7 +378,7 @@ compare_ints (const void *a_, const void *b_, void *aux UNUSED) /* Compares A and B and returns a strcmp-type return value. */ static int -compare_ints_noaux (const void *a_, const void *b_) +compare_ints_noaux (const void *a_, const void *b_) { const int *a = a_; const int *b = b_; @@ -389,17 +386,17 @@ compare_ints_noaux (const void *a_, const void *b_) return *a < *b ? -1 : *a > *b; } -/* Checks that LIST contains the CNT values in ELEMENTS. */ +/* Checks that LIST contains the N values in ELEMENTS. */ static void -check_list_contents (struct ll_list *list, int elements[], size_t cnt) +check_list_contents (struct ll_list *list, int elements[], size_t n) { struct ll *ll; size_t i; - check ((cnt == 0) == ll_is_empty (list)); + check ((n == 0) == ll_is_empty (list)); /* Iterate in forward order. */ - for (ll = ll_head (list), i = 0; i < cnt; ll = ll_next (ll), i++) + for (ll = ll_head (list), i = 0; i < n; ll = ll_next (ll), i++) { struct element *e = ll_to_element (ll); check (elements[i] == e->x); @@ -408,15 +405,15 @@ check_list_contents (struct ll_list *list, int elements[], size_t cnt) check (ll == ll_null (list)); /* Iterate in reverse order. */ - for (ll = ll_tail (list), i = 0; i < cnt; ll = ll_prev (ll), i++) + for (ll = ll_tail (list), i = 0; i < n; ll = ll_prev (ll), i++) { struct element *e = ll_to_element (ll); - check (elements[cnt - i - 1] == e->x); + check (elements[n - i - 1] == e->x); check (ll != ll_null (list)); } check (ll == ll_null (list)); - check (ll_count (list) == cnt); + check (ll_count (list) == n); } /* Lexicographically compares ARRAY1, which contains COUNT1 @@ -430,7 +427,7 @@ lexicographical_compare_3way (const void *array1, size_t count1, size_t size, int (*compare) (const void *, const void *, void *aux), - void *aux) + void *aux) { const char *first1 = array1; const char *first2 = array2; @@ -469,7 +466,7 @@ test_push_pop (void) /* Push on tail. */ ll_init (&list); check_list_contents (&list, NULL, 0); - for (i = 0; i < max_elems; i++) + for (i = 0; i < max_elems; i++) { values[i] = elems[i]->x = i; ll_push_tail (&list, &elems[i]->ll); @@ -477,7 +474,7 @@ test_push_pop (void) } /* Remove from tail. */ - for (i = 0; i < max_elems; i++) + for (i = 0; i < max_elems; i++) { struct element *e = ll_to_element (ll_pop_tail (&list)); check (e->x == max_elems - i - 1); @@ -494,7 +491,7 @@ test_push_pop (void) } /* Remove from start. */ - for (i = 0; i < max_elems; i++) + for (i = 0; i < max_elems; i++) { struct element *e = ll_to_element (ll_pop_head (&list)); check (e->x == (int) i); @@ -506,24 +503,24 @@ test_push_pop (void) /* Tests insertion and removal at arbitrary positions. */ static void -test_insert_remove (void) +test_insert_remove (void) { const int max_elems = 16; - int cnt; + int n; - for (cnt = 0; cnt < max_elems; cnt++) + for (n = 0; n < max_elems; n++) { struct element **elems; struct ll **elemp; - int *values = xnmalloc (cnt + 1, sizeof *values); + int *values = xnmalloc (n + 1, sizeof *values); struct ll_list list; struct element extra; int pos; - allocate_ascending (cnt, &list, &elems, &elemp, NULL); + allocate_ascending (n, &list, &elems, &elemp, NULL); extra.x = -1; - for (pos = 0; pos <= cnt; pos++) + for (pos = 0; pos <= n; pos++) { int i, j; @@ -533,26 +530,26 @@ test_insert_remove (void) for (i = 0; i < pos; i++) values[j++] = i; values[j++] = -1; - for (; i < cnt; i++) + for (; i < n; i++) values[j++] = i; - check_list_contents (&list, values, cnt + 1); + check_list_contents (&list, values, n + 1); ll_remove (&extra.ll); } - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Tests swapping individual elements. */ static void -test_swap (void) +test_swap (void) { const int max_elems = 8; - int cnt; + int n; - for (cnt = 0; cnt <= max_elems; cnt++) + for (n = 0; n <= max_elems; n++) { struct ll_list list; struct element **elems; @@ -560,12 +557,12 @@ test_swap (void) int i, j, k; - allocate_ascending (cnt, &list, &elems, NULL, &values); - check_list_contents (&list, values, cnt); + allocate_ascending (n, &list, &elems, NULL, &values); + check_list_contents (&list, values, n); - for (i = 0; i < cnt; i++) - for (j = 0; j < cnt; j++) - for (k = 0; k < 2; k++) + for (i = 0; i < n; i++) + for (j = 0; j < n; j++) + for (k = 0; k < 2; k++) { int t; @@ -573,25 +570,25 @@ test_swap (void) t = values[i]; values[i] = values[j]; values[j] = t; - check_list_contents (&list, values, cnt); - } - - free_elements (cnt, elems, NULL, values); + check_list_contents (&list, values, n); + } + + free_elements (n, elems, NULL, values); } } /* Tests swapping ranges of list elements. */ static void -test_swap_range (void) +test_swap_range (void) { const int max_elems = 8; - int cnt, a0, a1, b0, b1, r; + int n, a0, a1, b0, b1, r; - for (cnt = 0; cnt <= max_elems; cnt++) - for (a0 = 0; a0 <= cnt; a0++) - for (a1 = a0; a1 <= cnt; a1++) - for (b0 = a1; b0 <= cnt; b0++) - for (b1 = b0; b1 <= cnt; b1++) + for (n = 0; n <= max_elems; n++) + for (a0 = 0; a0 <= n; a0++) + for (a1 = a0; a1 <= n; a1++) + for (b0 = a1; b0 <= n; b0++) + for (b1 = b0; b1 <= n; b1++) for (r = 0; r < 2; r++) { struct ll_list list; @@ -601,8 +598,8 @@ test_swap_range (void) int i, j; - allocate_ascending (cnt, &list, &elems, &elemp, &values); - check_list_contents (&list, values, cnt); + allocate_ascending (n, &list, &elems, &elemp, &values); + check_list_contents (&list, values, n); j = 0; for (i = 0; i < a0; i++) @@ -613,31 +610,31 @@ test_swap_range (void) values[j++] = i; for (i = a0; i < a1; i++) values[j++] = i; - for (i = b1; i < cnt; i++) + for (i = b1; i < n; i++) values[j++] = i; - check (j == cnt); + check (j == n); if (r == 0) ll_swap_range (elemp[a0], elemp[a1], elemp[b0], elemp[b1]); else ll_swap_range (elemp[b0], elemp[b1], elemp[a0], elemp[a1]); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Tests removing ranges of list elements. */ static void -test_remove_range (void) +test_remove_range (void) { const int max_elems = 8; - int cnt, r0, r1; + int n, r0, r1; - for (cnt = 0; cnt <= max_elems; cnt++) - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (n = 0; n <= max_elems; n++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) { struct ll_list list; struct element **elems; @@ -646,34 +643,34 @@ test_remove_range (void) int i, j; - allocate_ascending (cnt, &list, &elems, &elemp, &values); - check_list_contents (&list, values, cnt); + allocate_ascending (n, &list, &elems, &elemp, &values); + check_list_contents (&list, values, n); j = 0; for (i = 0; i < r0; i++) values[j++] = i; - for (i = r1; i < cnt; i++) + for (i = r1; i < n; i++) values[j++] = i; ll_remove_range (elemp[r0], elemp[r1]); check_list_contents (&list, values, j); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Tests ll_remove_equal. */ static void -test_remove_equal (void) +test_remove_equal (void) { const int max_elems = 8; - int cnt, r0, r1, eq_pat; + int n, r0, r1, eq_pat; - for (cnt = 0; cnt <= max_elems; cnt++) - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) - for (eq_pat = 0; eq_pat <= 1 << cnt; eq_pat++) + for (n = 0; n <= max_elems; n++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) + for (eq_pat = 0; eq_pat <= 1 << n; eq_pat++) { struct ll_list list; struct element **elems; @@ -684,40 +681,40 @@ test_remove_equal (void) int remaining; int i; - allocate_elements (cnt, &list, &elems, &elemp, &values); + allocate_elements (n, &list, &elems, &elemp, &values); remaining = 0; - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) { int x = eq_pat & (1 << i) ? -1 : i; bool delete = x == -1 && r0 <= i && i < r1; elems[i]->x = x; if (!delete) - values[remaining++] = x; + values[remaining++] = x; } to_remove.x = -1; check ((int) ll_remove_equal (elemp[r0], elemp[r1], &to_remove.ll, compare_elements, &aux_data) - == cnt - remaining); + == n - remaining); check_list_contents (&list, values, remaining); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Tests ll_remove_if. */ static void -test_remove_if (void) +test_remove_if (void) { const int max_elems = 8; - int cnt, r0, r1, pattern; + int n, r0, r1, pattern; - for (cnt = 0; cnt <= max_elems; cnt++) - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) - for (pattern = 0; pattern <= 1 << cnt; pattern++) + for (n = 0; n <= max_elems; n++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) + for (pattern = 0; pattern <= 1 << n; pattern++) { struct ll_list list; struct element **elems; @@ -727,35 +724,35 @@ test_remove_if (void) int remaining; int i; - allocate_elements (cnt, &list, &elems, &elemp, &values); + allocate_elements (n, &list, &elems, &elemp, &values); remaining = 0; - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) { bool delete = (pattern & (1 << i)) && r0 <= i && i < r1; elems[i]->x = i; if (!delete) - values[remaining++] = i; + values[remaining++] = i; } - check ((int) ll_remove_if (elemp[r0], elemp[r1], + check ((int) ll_remove_if (elemp[r0], elemp[r1], pattern_pred, &pattern) - == cnt - remaining); + == n - remaining); check_list_contents (&list, values, remaining); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Tests ll_moved. */ static void -test_moved (void) +test_moved (void) { const int max_elems = 8; - int cnt; + int n; - for (cnt = 0; cnt <= max_elems; cnt++) + for (n = 0; n <= max_elems; n++) { struct ll_list list; struct element **elems; @@ -764,19 +761,19 @@ test_moved (void) int i; - allocate_ascending (cnt, &list, &elems, NULL, &values); - allocate_elements (cnt, NULL, &new_elems, NULL, NULL); - check_list_contents (&list, values, cnt); + allocate_ascending (n, &list, &elems, NULL, &values); + allocate_elements (n, NULL, &new_elems, NULL, NULL); + check_list_contents (&list, values, n); - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) { *new_elems[i] = *elems[i]; ll_moved (&new_elems[i]->ll); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); } - free_elements (cnt, elems, NULL, values); - free_elements (cnt, new_elems, NULL, NULL); + free_elements (n, elems, NULL, values); + free_elements (n, new_elems, NULL, NULL); } } @@ -789,10 +786,10 @@ test_examine_equal_range (void (*helper) (int r0, int r1, int eq_pat, { const int max_elems = 8; - int cnt, r0, r1, eq_pat; + int n, r0, r1, eq_pat; - for (cnt = 0; cnt <= max_elems; cnt++) - for (eq_pat = 0; eq_pat <= 1 << cnt; eq_pat++) + for (n = 0; n <= max_elems; n++) + for (eq_pat = 0; eq_pat <= 1 << n; eq_pat++) { struct ll_list list; struct element **elems; @@ -803,20 +800,20 @@ test_examine_equal_range (void (*helper) (int r0, int r1, int eq_pat, int i; - allocate_ascending (cnt, &list, &elems, &elemp, &values); + allocate_ascending (n, &list, &elems, &elemp, &values); - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) if (eq_pat & (1 << i)) values[i] = elems[i]->x = -1; to_find.x = -1; - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) helper (r0, r1, eq_pat, &to_find.ll, elemp); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } @@ -828,25 +825,25 @@ test_examine_if_range (void (*helper) (int r0, int r1, int eq_pat, { const int max_elems = 8; - int cnt, r0, r1, eq_pat; + int n, r0, r1, eq_pat; - for (cnt = 0; cnt <= max_elems; cnt++) - for (eq_pat = 0; eq_pat <= 1 << cnt; eq_pat++) + for (n = 0; n <= max_elems; n++) + for (eq_pat = 0; eq_pat <= 1 << n; eq_pat++) { struct ll_list list; struct element **elems; struct ll **elemp; int *values; - allocate_ascending (cnt, &list, &elems, &elemp, &values); + allocate_ascending (n, &list, &elems, &elemp, &values); - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) helper (r0, r1, eq_pat, elemp); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } @@ -864,12 +861,12 @@ test_find_equal_helper (int r0, int r1, int eq_pat, if (eq_pat & (1 << i)) break; - check (match == elemp[i]); + check (match == elemp[i]); } /* Tests ll_find_equal. */ static void -test_find_equal (void) +test_find_equal (void) { test_examine_equal_range (test_find_equal_helper); } @@ -886,26 +883,26 @@ test_find_if_helper (int r0, int r1, int eq_pat, struct ll **elemp) if (eq_pat & (1 << i)) break; - check (match == elemp[i]); + check (match == elemp[i]); } /* Tests ll_find_if. */ static void -test_find_if (void) +test_find_if (void) { test_examine_if_range (test_find_if_helper); } /* Tests ll_find_adjacent_equal. */ static void -test_find_adjacent_equal (void) +test_find_adjacent_equal (void) { const int max_elems = 8; - int cnt, eq_pat; + int n, eq_pat; - for (cnt = 0; cnt <= max_elems; cnt++) - for (eq_pat = 0; eq_pat <= 1 << cnt; eq_pat++) + for (n = 0; n <= max_elems; n++) + for (eq_pat = 0; eq_pat <= 1 << n; eq_pat++) { struct ll_list list; struct element **elems; @@ -915,13 +912,13 @@ test_find_adjacent_equal (void) int i; - allocate_ascending (cnt, &list, &elems, &elemp, &values); + allocate_ascending (n, &list, &elems, &elemp, &values); match = -1; - for (i = 0; i < cnt - 1; i++) + for (i = 0; i < n - 1; i++) { elems[i]->y = i; - if (eq_pat & (1 << i)) + if (eq_pat & (1 << i)) { values[i] = elems[i]->x = match; values[i + 1] = elems[i + 1]->x = match; @@ -929,8 +926,8 @@ test_find_adjacent_equal (void) else match--; } - - for (i = 0; i <= cnt; i++) + + for (i = 0; i <= n; i++) { struct ll *ll1 = ll_find_adjacent_equal (elemp[i], ll_null (&list), compare_elements, @@ -939,17 +936,17 @@ test_find_adjacent_equal (void) int j; ll2 = ll_null (&list); - for (j = i; j < cnt - 1; j++) - if (eq_pat & (1 << j)) + for (j = i; j < n - 1; j++) + if (eq_pat & (1 << j)) { ll2 = elemp[j]; break; } check (ll1 == ll2); } - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } @@ -962,7 +959,7 @@ test_count_range_helper (int r0, int r1, int eq_pat UNUSED, struct ll **elemp) /* Tests ll_count_range. */ static void -test_count_range (void) +test_count_range (void) { test_examine_if_range (test_count_range_helper); } @@ -981,20 +978,20 @@ test_count_equal_helper (int r0, int r1, int eq_pat, for (i = r0; i < r1; i++) if (eq_pat & (1 << i)) count2++; - - check (count1 == count2); + + check (count1 == count2); } /* Tests ll_count_equal. */ static void -test_count_equal (void) +test_count_equal (void) { test_examine_equal_range (test_count_equal_helper); } /* Helper function for testing ll_count_if. */ static void -test_count_if_helper (int r0, int r1, int eq_pat, struct ll **elemp) +test_count_if_helper (int r0, int r1, int eq_pat, struct ll **elemp) { int count1; int count2; @@ -1007,93 +1004,93 @@ test_count_if_helper (int r0, int r1, int eq_pat, struct ll **elemp) if (eq_pat & (1 << i)) count2++; - check (count1 == count2); + check (count1 == count2); } /* Tests ll_count_if. */ static void -test_count_if (void) +test_count_if (void) { test_examine_if_range (test_count_if_helper); } /* Returns N!. */ -static unsigned -factorial (unsigned n) +static unsigned int +factorial (unsigned int n) { - unsigned value = 1; + unsigned int value = 1; while (n > 1) value *= n--; return value; } -/* Returns the number of permutations of the CNT values in +/* Returns the number of permutations of the N values in VALUES. If VALUES contains duplicates, they must be adjacent. */ -static unsigned -expected_perms (int *values, size_t cnt) +static unsigned int +expected_perms (int *values, size_t n) { size_t i, j; - unsigned perm_cnt; - - perm_cnt = factorial (cnt); - for (i = 0; i < cnt; i = j) + unsigned int n_perms; + + n_perms = factorial (n); + for (i = 0; i < n; i = j) { - for (j = i + 1; j < cnt; j++) + for (j = i + 1; j < n; j++) if (values[i] != values[j]) break; - perm_cnt /= factorial (j - i); + n_perms /= factorial (j - i); } - return perm_cnt; + return n_perms; } /* Tests ll_min and ll_max. */ static void -test_min_max (void) +test_min_max (void) { const int max_elems = 6; - int cnt; + int n; - for (cnt = 0; cnt <= max_elems; cnt++) + for (n = 0; n <= max_elems; n++) { struct ll_list list; struct element **elems; struct ll **elemp; int *values; - int *new_values = xnmalloc (cnt, sizeof *values); + int *new_values = xnmalloc (n, sizeof *values); - size_t perm_cnt; + size_t n_perms; - allocate_ascending (cnt, &list, &elems, &elemp, &values); + allocate_ascending (n, &list, &elems, &elemp, &values); - perm_cnt = 1; + n_perms = 1; while (ll_next_permutation (ll_head (&list), ll_null (&list), - compare_elements, &aux_data)) + compare_elements, &aux_data)) { int r0, r1; struct ll *x; int i; - + for (i = 0, x = ll_head (&list); x != ll_null (&list); - x = ll_next (x), i++) + x = ll_next (x), i++) { struct element *e = ll_to_element (x); elemp[i] = x; new_values[i] = e->x; } - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) { struct ll *min = ll_min (elemp[r0], elemp[r1], compare_elements, &aux_data); struct ll *max = ll_max (elemp[r0], elemp[r1], compare_elements, &aux_data); - if (r0 == r1) + if (r0 == r1) { check (min == elemp[r1]); - check (max == elemp[r1]); + check (max == elemp[r1]); } - else + else { int min_int, max_int; int i; @@ -1110,31 +1107,31 @@ test_min_max (void) check (min != elemp[r1] && ll_to_element (min)->x == min_int); check (max != elemp[r1] - && ll_to_element (max)->x == max_int); + && ll_to_element (max)->x == max_int); } } - perm_cnt++; + n_perms++; } - check (perm_cnt == factorial (cnt)); - check_list_contents (&list, values, cnt); + check (n_perms == factorial (n)); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); free (new_values); } } /* Tests ll_lexicographical_compare_3way. */ static void -test_lexicographical_compare_3way (void) +test_lexicographical_compare_3way (void) { const int max_elems = 4; - int cnt_a, pat_a, cnt_b, pat_b; + int n_a, pat_a, n_b, pat_b; - for (cnt_a = 0; cnt_a <= max_elems; cnt_a++) - for (pat_a = 0; pat_a <= 1 << cnt_a; pat_a++) - for (cnt_b = 0; cnt_b <= max_elems; cnt_b++) - for (pat_b = 0; pat_b <= 1 << cnt_b; pat_b++) + for (n_a = 0; n_a <= max_elems; n_a++) + for (pat_a = 0; pat_a <= 1 << n_a; pat_a++) + for (n_b = 0; n_b <= max_elems; n_b++) + for (pat_b = 0; pat_b <= 1 << n_b; pat_b++) { struct ll_list list_a, list_b; struct element **elems_a, **elems_b; @@ -1143,15 +1140,15 @@ test_lexicographical_compare_3way (void) int a0, a1, b0, b1; - allocate_pattern (cnt_a, pat_a, + allocate_pattern (n_a, pat_a, &list_a, &elems_a, &elemp_a, &values_a); - allocate_pattern (cnt_b, pat_b, + allocate_pattern (n_b, pat_b, &list_b, &elems_b, &elemp_b, &values_b); - for (a0 = 0; a0 <= cnt_a; a0++) - for (a1 = a0; a1 <= cnt_a; a1++) - for (b0 = 0; b0 <= cnt_b; b0++) - for (b1 = b0; b1 <= cnt_b; b1++) + for (a0 = 0; a0 <= n_a; a0++) + for (a1 = a0; a1 <= n_a; a1++) + for (b0 = 0; b0 <= n_b; b0++) + for (b1 = b0; b1 <= n_b; b1++) { int a_ordering = lexicographical_compare_3way ( values_a + a0, a1 - a0, @@ -1165,35 +1162,35 @@ test_lexicographical_compare_3way (void) compare_elements, &aux_data); check (a_ordering == b_ordering); - } + } - free_elements (cnt_a, elems_a, elemp_a, values_a); - free_elements (cnt_b, elems_b, elemp_b, values_b); + free_elements (n_a, elems_a, elemp_a, values_a); + free_elements (n_b, elems_b, elemp_b, values_b); } } /* Appends the `x' value in element E to the array pointed to by NEXT_OUTPUT, and advances NEXT_OUTPUT to the next position. */ static void -apply_func (struct ll *e_, void *next_output_) +apply_func (struct ll *e_, void *next_output_) { struct element *e = ll_to_element (e_); int **next_output = next_output_; - + *(*next_output)++ = e->x; } /* Tests ll_apply. */ static void -test_apply (void) +test_apply (void) { const int max_elems = 8; - int cnt, r0, r1; + int n, r0, r1; - for (cnt = 0; cnt <= max_elems; cnt++) - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (n = 0; n <= max_elems; n++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) { struct ll_list list; struct element **elems; @@ -1205,33 +1202,33 @@ test_apply (void) int i; - allocate_ascending (cnt, &list, &elems, &elemp, &values); - check_list_contents (&list, values, cnt); + allocate_ascending (n, &list, &elems, &elemp, &values); + check_list_contents (&list, values, n); - output = next_output = xnmalloc (cnt, sizeof *output); + output = next_output = xnmalloc (n, sizeof *output); ll_apply (elemp[r0], elemp[r1], apply_func, &next_output); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); check (r1 - r0 == next_output - output); for (i = 0; i < r1 - r0; i++) check (output[i] == r0 + i); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); free (output); } } /* Tests ll_reverse. */ static void -test_reverse (void) +test_reverse (void) { const int max_elems = 8; - int cnt, r0, r1; + int n, r0, r1; - for (cnt = 0; cnt <= max_elems; cnt++) - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (n = 0; n <= max_elems; n++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) { struct ll_list list; struct element **elems; @@ -1240,79 +1237,79 @@ test_reverse (void) int i, j; - allocate_ascending (cnt, &list, &elems, &elemp, &values); - check_list_contents (&list, values, cnt); + allocate_ascending (n, &list, &elems, &elemp, &values); + check_list_contents (&list, values, n); j = 0; for (i = 0; i < r0; i++) values[j++] = i; for (i = r1 - 1; i >= r0; i--) values[j++] = i; - for (i = r1; i < cnt; i++) + for (i = r1; i < n; i++) values[j++] = i; ll_reverse (elemp[r0], elemp[r1]); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Tests ll_next_permutation and ll_prev_permutation when the permuted values have no duplicates. */ static void -test_permutations_no_dups (void) +test_permutations_no_dups (void) { const int max_elems = 8; - int cnt; + int n; - for (cnt = 0; cnt <= max_elems; cnt++) + for (n = 0; n <= max_elems; n++) { struct ll_list list; struct element **elems; int *values; - int *old_values = xnmalloc (cnt, sizeof *values); - int *new_values = xnmalloc (cnt, sizeof *values); + int *old_values = xnmalloc (n, sizeof *values); + int *new_values = xnmalloc (n, sizeof *values); - size_t perm_cnt; + size_t n_perms; - allocate_ascending (cnt, &list, &elems, NULL, &values); + allocate_ascending (n, &list, &elems, NULL, &values); - perm_cnt = 1; - extract_values (&list, old_values, cnt); + n_perms = 1; + extract_values (&list, old_values, n); while (ll_next_permutation (ll_head (&list), ll_null (&list), - compare_elements, &aux_data)) + compare_elements, &aux_data)) { - extract_values (&list, new_values, cnt); - check (lexicographical_compare_3way (new_values, cnt, - old_values, cnt, + extract_values (&list, new_values, n); + check (lexicographical_compare_3way (new_values, n, + old_values, n, sizeof *new_values, compare_ints, NULL) > 0); - memcpy (old_values, new_values, (cnt) * sizeof *old_values); - perm_cnt++; + memcpy (old_values, new_values, (n) * sizeof *old_values); + n_perms++; } - check (perm_cnt == factorial (cnt)); - check_list_contents (&list, values, cnt); + check (n_perms == factorial (n)); + check_list_contents (&list, values, n); - perm_cnt = 1; + n_perms = 1; ll_reverse (ll_head (&list), ll_null (&list)); - extract_values (&list, old_values, cnt); + extract_values (&list, old_values, n); while (ll_prev_permutation (ll_head (&list), ll_null (&list), - compare_elements, &aux_data)) + compare_elements, &aux_data)) { - extract_values (&list, new_values, cnt); - check (lexicographical_compare_3way (new_values, cnt, - old_values, cnt, + extract_values (&list, new_values, n); + check (lexicographical_compare_3way (new_values, n, + old_values, n, sizeof *new_values, compare_ints, NULL) < 0); - memcpy (old_values, new_values, (cnt) * sizeof *old_values); - perm_cnt++; + memcpy (old_values, new_values, (n) * sizeof *old_values); + n_perms++; } - check (perm_cnt == factorial (cnt)); + check (n_perms == factorial (n)); ll_reverse (ll_head (&list), ll_null (&list)); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, NULL, values); + free_elements (n, elems, NULL, values); free (old_values); free (new_values); } @@ -1321,16 +1318,14 @@ test_permutations_no_dups (void) /* Tests ll_next_permutation and ll_prev_permutation when the permuted values contain duplicates. */ static void -test_permutations_with_dups (void) +test_permutations_with_dups (void) { const int max_elems = 8; const int max_dup = 3; const int repetitions = 1024; - int cnt, repeat; - - for (repeat = 0; repeat < repetitions; repeat++) - for (cnt = 0; cnt < max_elems; cnt++) + for (int repeat = 0; repeat < repetitions; repeat++) + for (int n_elems = 0; n_elems < max_elems; n_elems++) { struct ll_list list; struct element **elems; @@ -1338,11 +1333,11 @@ test_permutations_with_dups (void) int *old_values = xnmalloc (max_elems, sizeof *values); int *new_values = xnmalloc (max_elems, sizeof *values); - unsigned permutation_cnt; - int left = cnt; + unsigned int n_permutations; + int left = n_elems; int value = 0; - - allocate_elements (cnt, &list, &elems, NULL, &values); + + allocate_elements (n_elems, &list, &elems, NULL, &values); value = 0; while (left > 0) @@ -1351,46 +1346,46 @@ test_permutations_with_dups (void) int n = rand () % max + 1; while (n-- > 0) { - int idx = cnt - left--; + int idx = n_elems - left--; values[idx] = elems[idx]->x = value; } value++; } - permutation_cnt = 1; - extract_values (&list, old_values, cnt); + n_permutations = 1; + extract_values (&list, old_values, n_elems); while (ll_next_permutation (ll_head (&list), ll_null (&list), - compare_elements, &aux_data)) + compare_elements, &aux_data)) { - extract_values (&list, new_values, cnt); - check (lexicographical_compare_3way (new_values, cnt, - old_values, cnt, + extract_values (&list, new_values, n_elems); + check (lexicographical_compare_3way (new_values, n_elems, + old_values, n_elems, sizeof *new_values, compare_ints, NULL) > 0); - memcpy (old_values, new_values, cnt * sizeof *old_values); - permutation_cnt++; + memcpy (old_values, new_values, n_elems * sizeof *old_values); + n_permutations++; } - check (permutation_cnt == expected_perms (values, cnt)); - check_list_contents (&list, values, cnt); + check (n_permutations == expected_perms (values, n_elems)); + check_list_contents (&list, values, n_elems); - permutation_cnt = 1; + n_permutations = 1; ll_reverse (ll_head (&list), ll_null (&list)); - extract_values (&list, old_values, cnt); + extract_values (&list, old_values, n_elems); while (ll_prev_permutation (ll_head (&list), ll_null (&list), - compare_elements, &aux_data)) + compare_elements, &aux_data)) { - extract_values (&list, new_values, cnt); - check (lexicographical_compare_3way (new_values, cnt, - old_values, cnt, + extract_values (&list, new_values, n_elems); + check (lexicographical_compare_3way (new_values, n_elems, + old_values, n_elems, sizeof *new_values, compare_ints, NULL) < 0); - permutation_cnt++; + n_permutations++; } ll_reverse (ll_head (&list), ll_null (&list)); - check (permutation_cnt == expected_perms (values, cnt)); - check_list_contents (&list, values, cnt); + check (n_permutations == expected_perms (values, n_elems)); + check_list_contents (&list, values, n_elems); - free_elements (cnt, elems, NULL, values); + free_elements (n_elems, elems, NULL, values); free (old_values); free (new_values); } @@ -1398,15 +1393,15 @@ test_permutations_with_dups (void) /* Tests ll_merge when no equal values are to be merged. */ static void -test_merge_no_dups (void) +test_merge_no_dups (void) { const int max_elems = 8; const int max_filler = 3; - int merge_cnt, pattern, pfx, gap, sfx, order; - - for (merge_cnt = 0; merge_cnt < max_elems; merge_cnt++) - for (pattern = 0; pattern <= (1 << merge_cnt); pattern++) + int n_merges, pattern, pfx, gap, sfx, order; + + for (n_merges = 0; n_merges < max_elems; n_merges++) + for (pattern = 0; pattern <= (1 << n_merges); pattern++) for (pfx = 0; pfx < max_filler; pfx++) for (gap = 0; gap < max_filler; gap++) for (sfx = 0; sfx < max_filler; sfx++) @@ -1417,46 +1412,46 @@ test_merge_no_dups (void) struct ll **elemp; int *values; - int list_cnt = pfx + merge_cnt + gap + sfx; + int n_lists = pfx + n_merges + gap + sfx; int a0, a1, b0, b1; int i, j; - allocate_elements (list_cnt, &list, + allocate_elements (n_lists, &list, &elems, &elemp, &values); j = 0; for (i = 0; i < pfx; i++) elems[j++]->x = 100 + i; a0 = j; - for (i = 0; i < merge_cnt; i++) + for (i = 0; i < n_merges; i++) if (pattern & (1u << i)) elems[j++]->x = i; a1 = j; for (i = 0; i < gap; i++) elems[j++]->x = 200 + i; b0 = j; - for (i = 0; i < merge_cnt; i++) + for (i = 0; i < n_merges; i++) if (!(pattern & (1u << i))) elems[j++]->x = i; b1 = j; for (i = 0; i < sfx; i++) elems[j++]->x = 300 + i; - check (list_cnt == j); + check (n_lists == j); j = 0; for (i = 0; i < pfx; i++) values[j++] = 100 + i; if (order == 0) - for (i = 0; i < merge_cnt; i++) + for (i = 0; i < n_merges; i++) values[j++] = i; for (i = 0; i < gap; i++) values[j++] = 200 + i; if (order == 1) - for (i = 0; i < merge_cnt; i++) + for (i = 0; i < n_merges; i++) values[j++] = i; for (i = 0; i < sfx; i++) values[j++] = 300 + i; - check (list_cnt == j); + check (n_lists == j); if (order == 0) ll_merge (elemp[a0], elemp[a1], elemp[b0], elemp[b1], @@ -1465,23 +1460,23 @@ test_merge_no_dups (void) ll_merge (elemp[b0], elemp[b1], elemp[a0], elemp[a1], compare_elements, &aux_data); - check_list_contents (&list, values, list_cnt); + check_list_contents (&list, values, n_lists); - free_elements (list_cnt, elems, elemp, values); + free_elements (n_lists, elems, elemp, values); } } /* Tests ll_merge when equal values are to be merged. */ static void -test_merge_with_dups (void) +test_merge_with_dups (void) { const int max_elems = 8; - int cnt, merge_pat, inc_pat, order; - - for (cnt = 0; cnt <= max_elems; cnt++) - for (merge_pat = 0; merge_pat <= (1 << cnt); merge_pat++) - for (inc_pat = 0; inc_pat <= (1 << cnt); inc_pat++) + int n, merge_pat, inc_pat, order; + + for (n = 0; n <= max_elems; n++) + for (merge_pat = 0; merge_pat <= (1 << n); merge_pat++) + for (inc_pat = 0; inc_pat <= (1 << n); inc_pat++) for (order = 0; order < 2; order++) { struct ll_list list; @@ -1492,72 +1487,72 @@ test_merge_with_dups (void) int mid; int i, j, k; - allocate_elements (cnt, &list, &elems, &elemp, &values); + allocate_elements (n, &list, &elems, &elemp, &values); j = 0; - for (i = k = 0; i < cnt; i++) + for (i = k = 0; i < n; i++) { - if (merge_pat & (1u << i)) + if (merge_pat & (1u << i)) elems[j++]->x = k; if (inc_pat & (1u << i)) k++; } mid = j; - for (i = k = 0; i < cnt; i++) + for (i = k = 0; i < n; i++) { - if (!(merge_pat & (1u << i))) + if (!(merge_pat & (1u << i))) elems[j++]->x = k; if (inc_pat & (1u << i)) k++; } - check (cnt == j); + check (n == j); - if (order == 0) + if (order == 0) { - for (i = 0; i < cnt; i++) - elems[i]->y = i; + for (i = 0; i < n; i++) + elems[i]->y = i; } - else + else { for (i = 0; i < mid; i++) elems[i]->y = 100 + i; - for (i = mid; i < cnt; i++) + for (i = mid; i < n; i++) elems[i]->y = i; } j = 0; - for (i = k = 0; i < cnt; i++) + for (i = k = 0; i < n; i++) { values[j++] = k; if (inc_pat & (1u << i)) - k++; + k++; } - check (cnt == j); + check (n == j); if (order == 0) - ll_merge (elemp[0], elemp[mid], elemp[mid], elemp[cnt], + ll_merge (elemp[0], elemp[mid], elemp[mid], elemp[n], compare_elements, &aux_data); else - ll_merge (elemp[mid], elemp[cnt], elemp[0], elemp[mid], + ll_merge (elemp[mid], elemp[n], elemp[0], elemp[mid], compare_elements, &aux_data); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); check (ll_is_sorted (ll_head (&list), ll_null (&list), compare_elements_x_y, &aux_data)); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Tests ll_sort on all permutations up to a maximum number of elements. */ static void -test_sort_exhaustive (void) +test_sort_exhaustive (void) { const int max_elems = 8; - int cnt; + int n; - for (cnt = 0; cnt <= max_elems; cnt++) + for (n = 0; n <= max_elems; n++) { struct ll_list list; struct element **elems; @@ -1566,49 +1561,49 @@ test_sort_exhaustive (void) struct element **perm_elems; int *perm_values; - size_t perm_cnt; + size_t n_perms; - allocate_ascending (cnt, &list, &elems, NULL, &values); - allocate_elements (cnt, NULL, &perm_elems, NULL, &perm_values); + allocate_ascending (n, &list, &elems, NULL, &values); + allocate_elements (n, NULL, &perm_elems, NULL, &perm_values); - perm_cnt = 1; + n_perms = 1; while (ll_next_permutation (ll_head (&list), ll_null (&list), - compare_elements, &aux_data)) + compare_elements, &aux_data)) { struct ll_list perm_list; int j; - extract_values (&list, perm_values, cnt); + extract_values (&list, perm_values, n); ll_init (&perm_list); - for (j = 0; j < cnt; j++) - { + for (j = 0; j < n; j++) + { perm_elems[j]->x = perm_values[j]; ll_push_tail (&perm_list, &perm_elems[j]->ll); } ll_sort (ll_head (&perm_list), ll_null (&perm_list), compare_elements, &aux_data); - check_list_contents (&perm_list, values, cnt); + check_list_contents (&perm_list, values, n); check (ll_is_sorted (ll_head (&perm_list), ll_null (&perm_list), compare_elements, &aux_data)); - perm_cnt++; + n_perms++; } - check (perm_cnt == factorial (cnt)); + check (n_perms == factorial (n)); - free_elements (cnt, elems, NULL, values); - free_elements (cnt, perm_elems, NULL, perm_values); + free_elements (n, elems, NULL, values); + free_elements (n, perm_elems, NULL, perm_values); } } /* Tests that ll_sort is stable in the presence of equal values. */ static void -test_sort_stable (void) +test_sort_stable (void) { const int max_elems = 6; - int cnt, inc_pat; + int n, inc_pat; - for (cnt = 0; cnt <= max_elems; cnt++) - for (inc_pat = 0; inc_pat <= 1 << cnt; inc_pat++) + for (n = 0; n <= max_elems; n++) + for (inc_pat = 0; inc_pat <= 1 << n; inc_pat++) { struct ll_list list; struct element **elems; @@ -1617,14 +1612,14 @@ test_sort_stable (void) struct element **perm_elems; int *perm_values; - size_t perm_cnt; + size_t n_perms; int i, j; - allocate_elements (cnt, &list, &elems, NULL, &values); - allocate_elements (cnt, NULL, &perm_elems, NULL, &perm_values); + allocate_elements (n, &list, &elems, NULL, &values); + allocate_elements (n, NULL, &perm_elems, NULL, &perm_values); j = 0; - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) { elems[i]->x = values[i] = j; if (inc_pat & (1 << i)) @@ -1632,31 +1627,31 @@ test_sort_stable (void) elems[i]->y = i; } - perm_cnt = 1; + n_perms = 1; while (ll_next_permutation (ll_head (&list), ll_null (&list), - compare_elements_y, &aux_data)) + compare_elements_y, &aux_data)) { struct ll_list perm_list; - extract_values (&list, perm_values, cnt); + extract_values (&list, perm_values, n); ll_init (&perm_list); - for (i = 0; i < cnt; i++) - { + for (i = 0; i < n; i++) + { perm_elems[i]->x = perm_values[i]; perm_elems[i]->y = i; ll_push_tail (&perm_list, &perm_elems[i]->ll); } ll_sort (ll_head (&perm_list), ll_null (&perm_list), compare_elements, &aux_data); - check_list_contents (&perm_list, values, cnt); + check_list_contents (&perm_list, values, n); check (ll_is_sorted (ll_head (&perm_list), ll_null (&perm_list), compare_elements_x_y, &aux_data)); - perm_cnt++; + n_perms++; } - check (perm_cnt == factorial (cnt)); + check (n_perms == factorial (n)); - free_elements (cnt, elems, NULL, values); - free_elements (cnt, perm_elems, NULL, perm_values); + free_elements (n, elems, NULL, values); + free_elements (n, perm_elems, NULL, perm_values); } } @@ -1667,25 +1662,25 @@ test_sort_subset (void) { const int max_elems = 8; - int cnt, r0, r1, repeat; + int n, r0, r1, repeat; - for (cnt = 0; cnt <= max_elems; cnt++) + for (n = 0; n <= max_elems; n++) for (repeat = 0; repeat < 100; repeat++) - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) { struct ll_list list; struct element **elems; struct ll **elemp; int *values; - allocate_random (cnt, &list, &elems, &elemp, &values); + allocate_random (n, &list, &elems, &elemp, &values); qsort (&values[r0], r1 - r0, sizeof *values, compare_ints_noaux); ll_sort (elemp[r0], elemp[r1], compare_elements, &aux_data); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } @@ -1695,55 +1690,55 @@ test_sort_big (void) { const int max_elems = 1024; - int cnt; + int n; - for (cnt = 0; cnt < max_elems; cnt++) + for (n = 0; n < max_elems; n++) { struct ll_list list; struct element **elems; int *values; - allocate_random (cnt, &list, &elems, NULL, &values); + allocate_random (n, &list, &elems, NULL, &values); - qsort (values, cnt, sizeof *values, compare_ints_noaux); + qsort (values, n, sizeof *values, compare_ints_noaux); ll_sort (ll_head (&list), ll_null (&list), compare_elements, &aux_data); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, NULL, values); + free_elements (n, elems, NULL, values); } } /* Tests ll_unique. */ static void -test_unique (void) +test_unique (void) { const int max_elems = 10; int *ascending = xnmalloc (max_elems, sizeof *ascending); - int cnt, inc_pat, i, j, unique_values; + int n, inc_pat, i, j, unique_values; for (i = 0; i < max_elems; i++) ascending[i] = i; - for (cnt = 0; cnt < max_elems; cnt++) - for (inc_pat = 0; inc_pat < (1 << cnt); inc_pat++) + for (n = 0; n < max_elems; n++) + for (inc_pat = 0; inc_pat < (1 << n); inc_pat++) { struct ll_list list, dups; struct element **elems; int *values; - allocate_elements (cnt, &list, &elems, NULL, &values); + allocate_elements (n, &list, &elems, NULL, &values); j = unique_values = 0; - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) { unique_values = j + 1; elems[i]->x = values[i] = j; if (inc_pat & (1 << i)) j++; } - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); ll_init (&dups); check (ll_unique (ll_head (&list), ll_null (&list), ll_null (&dups), @@ -1753,9 +1748,9 @@ test_unique (void) ll_splice (ll_null (&list), ll_head (&dups), ll_null (&dups)); ll_sort (ll_head (&list), ll_null (&list), compare_elements, &aux_data); - check_list_contents (&list, values, cnt); + check_list_contents (&list, values, n); - free_elements (cnt, elems, NULL, values); + free_elements (n, elems, NULL, values); } free (ascending); @@ -1763,13 +1758,13 @@ test_unique (void) /* Tests ll_sort_unique. */ static void -test_sort_unique (void) +test_sort_unique (void) { const int max_elems = 7; - int cnt, inc_pat; + int n, inc_pat; - for (cnt = 0; cnt <= max_elems; cnt++) - for (inc_pat = 0; inc_pat <= 1 << cnt; inc_pat++) + for (n = 0; n <= max_elems; n++) + for (inc_pat = 0; inc_pat <= 1 << n; inc_pat++) { struct ll_list list; struct element **elems; @@ -1778,66 +1773,66 @@ test_sort_unique (void) struct element **perm_elems; int *perm_values; - int unique_cnt; + int n_uniques; int *unique_values; - size_t perm_cnt; + size_t n_perms; int i, j; - allocate_elements (cnt, &list, &elems, NULL, &values); - allocate_elements (cnt, NULL, &perm_elems, NULL, &perm_values); + allocate_elements (n, &list, &elems, NULL, &values); + allocate_elements (n, NULL, &perm_elems, NULL, &perm_values); - j = unique_cnt = 0; - for (i = 0; i < cnt; i++) + j = n_uniques = 0; + for (i = 0; i < n; i++) { elems[i]->x = values[i] = j; - unique_cnt = j + 1; + n_uniques = j + 1; if (inc_pat & (1 << i)) j++; } - unique_values = xnmalloc (unique_cnt, sizeof *unique_values); - for (i = 0; i < unique_cnt; i++) + unique_values = xnmalloc (n_uniques, sizeof *unique_values); + for (i = 0; i < n_uniques; i++) unique_values[i] = i; - perm_cnt = 1; + n_perms = 1; while (ll_next_permutation (ll_head (&list), ll_null (&list), - compare_elements, &aux_data)) + compare_elements, &aux_data)) { struct ll_list perm_list; - extract_values (&list, perm_values, cnt); + extract_values (&list, perm_values, n); ll_init (&perm_list); - for (i = 0; i < cnt; i++) - { + for (i = 0; i < n; i++) + { perm_elems[i]->x = perm_values[i]; perm_elems[i]->y = i; ll_push_tail (&perm_list, &perm_elems[i]->ll); } ll_sort_unique (ll_head (&perm_list), ll_null (&perm_list), NULL, compare_elements, &aux_data); - check_list_contents (&perm_list, unique_values, unique_cnt); + check_list_contents (&perm_list, unique_values, n_uniques); check (ll_is_sorted (ll_head (&perm_list), ll_null (&perm_list), compare_elements_x_y, &aux_data)); - perm_cnt++; + n_perms++; } - check (perm_cnt == expected_perms (values, cnt)); + check (n_perms == expected_perms (values, n)); - free_elements (cnt, elems, NULL, values); - free_elements (cnt, perm_elems, NULL, perm_values); + free_elements (n, elems, NULL, values); + free_elements (n, perm_elems, NULL, perm_values); free (unique_values); } } /* Tests ll_insert_ordered. */ static void -test_insert_ordered (void) +test_insert_ordered (void) { const int max_elems = 6; - int cnt, inc_pat; + int n, inc_pat; - for (cnt = 0; cnt <= max_elems; cnt++) - for (inc_pat = 0; inc_pat <= 1 << cnt; inc_pat++) + for (n = 0; n <= max_elems; n++) + for (inc_pat = 0; inc_pat <= 1 << n; inc_pat++) { struct ll_list list; struct element **elems; @@ -1846,14 +1841,14 @@ test_insert_ordered (void) struct element **perm_elems; int *perm_values; - size_t perm_cnt; + size_t n_perms; int i, j; - allocate_elements (cnt, &list, &elems, NULL, &values); - allocate_elements (cnt, NULL, &perm_elems, NULL, &perm_values); + allocate_elements (n, &list, &elems, NULL, &values); + allocate_elements (n, NULL, &perm_elems, NULL, &perm_values); j = 0; - for (i = 0; i < cnt; i++) + for (i = 0; i < n; i++) { elems[i]->x = values[i] = j; if (inc_pat & (1 << i)) @@ -1861,16 +1856,16 @@ test_insert_ordered (void) elems[i]->y = i; } - perm_cnt = 1; + n_perms = 1; while (ll_next_permutation (ll_head (&list), ll_null (&list), - compare_elements_y, &aux_data)) + compare_elements_y, &aux_data)) { struct ll_list perm_list; - extract_values (&list, perm_values, cnt); + extract_values (&list, perm_values, n); ll_init (&perm_list); - for (i = 0; i < cnt; i++) - { + for (i = 0; i < n; i++) + { perm_elems[i]->x = perm_values[i]; perm_elems[i]->y = i; ll_insert_ordered (ll_head (&perm_list), ll_null (&perm_list), @@ -1879,12 +1874,12 @@ test_insert_ordered (void) } check (ll_is_sorted (ll_head (&perm_list), ll_null (&perm_list), compare_elements_x_y, &aux_data)); - perm_cnt++; + n_perms++; } - check (perm_cnt == factorial (cnt)); + check (n_perms == factorial (n)); - free_elements (cnt, elems, NULL, values); - free_elements (cnt, perm_elems, NULL, perm_values); + free_elements (n, elems, NULL, values); + free_elements (n, perm_elems, NULL, perm_values); } } @@ -1893,14 +1888,14 @@ static void test_partition (void) { const int max_elems = 10; - - int cnt; - unsigned pbase; + + int n; + unsigned int pbase; int r0, r1; - for (cnt = 0; cnt < max_elems; cnt++) - for (r0 = 0; r0 <= cnt; r0++) - for (r1 = r0; r1 <= cnt; r1++) + for (n = 0; n < max_elems; n++) + for (r0 = 0; r0 <= n; r0++) + for (r1 = r0; r1 <= n; r1++) for (pbase = 0; pbase <= (1u << (r1 - r0)); pbase++) { struct ll_list list; @@ -1908,12 +1903,12 @@ test_partition (void) struct ll **elemp; int *values; - unsigned pattern = pbase << r0; + unsigned int pattern = pbase << r0; int i, j; int first_false; struct ll *part_ll; - - allocate_ascending (cnt, &list, &elems, &elemp, &values); + + allocate_ascending (n, &list, &elems, &elemp, &values); /* Check that ll_find_partition works okay in every case. We use it after partitioning, too, but that @@ -1923,12 +1918,12 @@ test_partition (void) break; j = i; for (; i < r1; i++) - if (pattern & (1u << i)) + if (pattern & (1u << i)) break; part_ll = ll_find_partition (elemp[r0], elemp[r1], pattern_pred, &pattern); - if (i == r1) + if (i == r1) check (part_ll == elemp[j]); else check (part_ll == NULL); @@ -1946,13 +1941,13 @@ test_partition (void) { if (first_false == -1) first_false = i; - values[j++] = i; + values[j++] = i; } if (first_false == -1) first_false = r1; - for (i = r1; i < cnt; i++) + for (i = r1; i < n; i++) values[j++] = i; - check (j == cnt); + check (j == n); /* Partition and check for expected results. */ check (ll_partition (elemp[r0], elemp[r1], @@ -1961,65 +1956,208 @@ test_partition (void) check (ll_find_partition (elemp[r0], elemp[r1], pattern_pred, &pattern) == elemp[first_false]); - check_list_contents (&list, values, cnt); - check ((int) ll_count (&list) == cnt); + check_list_contents (&list, values, n); + check ((int) ll_count (&list) == n); - free_elements (cnt, elems, elemp, values); + free_elements (n, elems, elemp, values); } } /* Main program. */ -/* Runs TEST_FUNCTION and prints a message about NAME. */ -static void -run_test (void (*test_function) (void), const char *name) -{ - test_name = name; - putchar ('.'); - fflush (stdout); - test_function (); -} +struct test + { + const char *name; + const char *description; + void (*function) (void); + }; + +static const struct test tests[] = + { + { + "push-pop", + "push/pop", + test_push_pop + }, + { + "insert-remove", + "insert/remove", + test_insert_remove + }, + { + "swap", + "swap", + test_swap + }, + { + "swap-range", + "swap_range", + test_swap_range + }, + { + "remove-range", + "remove_range", + test_remove_range + }, + { + "remove-equal", + "remove_equal", + test_remove_equal + }, + { + "remove-if", + "remove_if", + test_remove_if + }, + { + "moved", + "moved", + test_moved + }, + { + "find-equal", + "find_equal", + test_find_equal + }, + { + "find-if", + "find_if", + test_find_if + }, + { + "find-adjacent-equal", + "find_adjacent_equal", + test_find_adjacent_equal + }, + { + "count-range", + "count_range", + test_count_range + }, + { + "count-equal", + "count_equal", + test_count_equal + }, + { + "count-if", + "count_if", + test_count_if + }, + { + "min-max", + "min/max", + test_min_max + }, + { + "lexicographical-compare-3way", + "lexicographical_compare_3way", + test_lexicographical_compare_3way + }, + { + "apply", + "apply", + test_apply + }, + { + "reverse", + "reverse", + test_reverse + }, + { + "permutations-no-dups", + "permutations (no dups)", + test_permutations_no_dups + }, + { + "permutations-with-dups", + "permutations (with dups)", + test_permutations_with_dups + }, + { + "merge-no-dups", + "merge (no dups)", + test_merge_no_dups + }, + { + "merge-with-dups", + "merge (with dups)", + test_merge_with_dups + }, + { + "sort-exhaustive", + "sort (exhaustive)", + test_sort_exhaustive + }, + { + "sort-stable", + "sort (stability)", + test_sort_stable + }, + { + "sort-subset", + "sort (subset)", + test_sort_subset + }, + { + "sort-big", + "sort (big)", + test_sort_big + }, + { + "unique", + "unique", + test_unique + }, + { + "sort-unique", + "sort_unique", + test_sort_unique + }, + { + "insert-ordered", + "insert_ordered", + test_insert_ordered + }, + { + "partition", + "partition", + test_partition + }, + }; + +enum { N_TESTS = sizeof tests / sizeof *tests }; int -main (void) -{ - run_test (test_push_pop, "push/pop"); - run_test (test_insert_remove, "insert/remove"); - run_test (test_swap, "swap"); - run_test (test_swap_range, "swap_range"); - run_test (test_remove_range, "remove_range"); - run_test (test_remove_equal, "remove_equal"); - run_test (test_remove_if, "remove_if"); - run_test (test_moved, "moved"); - run_test (test_find_equal, "find_equal"); - run_test (test_find_if, "find_if"); - run_test (test_find_adjacent_equal, "find_adjacent_equal"); - run_test (test_count_range, "count_range"); - run_test (test_count_equal, "count_equal"); - run_test (test_count_if, "count_if"); - run_test (test_min_max, "min/max"); - run_test (test_lexicographical_compare_3way, "lexicographical_compare_3way"); - run_test (test_apply, "apply"); - run_test (test_reverse, "reverse"); - run_test (test_permutations_no_dups, "permutations (no dups)"); - run_test (test_permutations_with_dups, "permutations (with dups)"); - run_test (test_merge_no_dups, "merge (no dups)"); - run_test (test_merge_with_dups, "merge (with dups)"); - run_test (test_sort_exhaustive, "sort (exhaustive)"); - run_test (test_sort_stable, "sort (stability)"); - run_test (test_sort_subset, "sort (subset)"); - run_test (test_sort_big, "sort (big)"); - run_test (test_unique, "unique"); - run_test (test_sort_unique, "sort_unique"); - run_test (test_insert_ordered, "insert_ordered"); - run_test (test_partition, "partition"); - putchar ('\n'); - - return 0; -} - -/* - Local Variables: - compile-command: "gcc -Wall -Wstrict-prototypes -Wmissing-prototypes ll.c ll-test.c -o ll-test -g" - End: - */ +main (int argc, char *argv[]) +{ + int i; + + if (argc != 2) + { + fprintf (stderr, "exactly one argument required; use --help for help\n"); + return EXIT_FAILURE; + } + else if (!strcmp (argv[1], "--help")) + { + printf ("%s: test doubly linked list (ll) library\n" + "usage: %s TEST-NAME\n" + "where TEST-NAME is one of the following:\n", + argv[0], argv[0]); + for (i = 0; i < N_TESTS; i++) + printf (" %s\n %s\n", tests[i].name, tests[i].description); + return 0; + } + else + { + for (i = 0; i < N_TESTS; i++) + if (!strcmp (argv[1], tests[i].name)) + { + tests[i].function (); + return 0; + } + + fprintf (stderr, "unknown test %s; use --help for help\n", argv[1]); + return EXIT_FAILURE; + } +}