aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gfx/sbtree.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gfx/sbtree.cpp')
-rw-r--r--engines/sci/gfx/sbtree.cpp126
1 files changed, 53 insertions, 73 deletions
diff --git a/engines/sci/gfx/sbtree.cpp b/engines/sci/gfx/sbtree.cpp
index 3e0f7883ee..712fa3311d 100644
--- a/engines/sci/gfx/sbtree.cpp
+++ b/engines/sci/gfx/sbtree.cpp
@@ -40,15 +40,13 @@ typedef struct {
} sbcell_t;
int
-int_compar(const void *a, const void *b)
-{
- return (*((int *)a))-(*((int *)b));
+int_compar(const void *a, const void *b) {
+ return (*((int *)a)) - (*((int *)b));
}
void
-insert_interval(sbcell_t *data, int start, int stop, int *keys, int plus)
-{
+insert_interval(sbcell_t *data, int start, int stop, int *keys, int plus) {
int center = start + ((stop - start) >> 1);
data->key = keys[center];
@@ -64,8 +62,7 @@ insert_interval(sbcell_t *data, int start, int stop, int *keys, int plus)
}
sbtree_t *
-sbtree_new(int size, int *keys)
-{
+sbtree_new(int size, int *keys) {
int table_size = 2;
int levels = 0;
sbcell_t *table;
@@ -88,26 +85,26 @@ sbtree_new(int size, int *keys)
table[i].key = NOT_A_KEY;
if (!table) {
- fprintf(stderr,"SBTree: Out of memory: Could not allocate %d cells\n", table_size);
+ fprintf(stderr, "SBTree: Out of memory: Could not allocate %d cells\n", table_size);
return NULL;
}
tree = (sbtree_t*)sci_malloc(sizeof(sbtree_t));
if (!tree) {
- fprintf(stderr,"SBTree: Could not allocate tree structure\n");
+ fprintf(stderr, "SBTree: Could not allocate tree structure\n");
free(table);
return NULL;
}
qsort(keys, size, sizeof(int), int_compar);
- insert_interval(table, 0, size-1, keys, 1);
+ insert_interval(table, 0, size - 1, keys, 1);
tree->levels = levels;
tree->entries_nr = size;
if ((tree->min_entry = keys[0]) < 0) {
- fprintf(stderr,"SBTree: Error: Using negative keys\n");
+ fprintf(stderr, "SBTree: Error: Using negative keys\n");
free(table);
free(tree);
return NULL;
@@ -120,10 +117,9 @@ sbtree_new(int size, int *keys)
void
-sbtree_free(sbtree_t *tree)
-{
+sbtree_free(sbtree_t *tree) {
if (!tree) {
- fprintf(stderr,"SBTree: Attempt to free NULL sbtree\n");
+ fprintf(stderr, "SBTree: Attempt to free NULL sbtree\n");
return;
}
@@ -134,8 +130,7 @@ sbtree_free(sbtree_t *tree)
void
sbtree_foreach(sbtree_t *tree, void *args, void *(*operation)(sbtree_t *, const int,
- const void *, void *))
-{
+ const void *, void *)) {
int i;
sbcell_t *cell = (sbcell_t *) tree->data;
@@ -147,8 +142,7 @@ sbtree_foreach(sbtree_t *tree, void *args, void *(*operation)(sbtree_t *, const
}
sbcell_t *
-locate(sbcell_t *start, int key, int level, int levels, int plus)
-{
+locate(sbcell_t *start, int key, int level, int levels, int plus) {
int comparison;
if (level >= levels && (level != levels || start->key == NOT_A_KEY))
@@ -167,8 +161,7 @@ locate(sbcell_t *start, int key, int level, int levels, int plus)
int
-sbtree_set(sbtree_t *tree, int key, void *value)
-{
+sbtree_set(sbtree_t *tree, int key, void *value) {
sbcell_t *cell = locate((sbcell_t *) tree->data, key, 0, tree->levels, 1);
if (cell)
@@ -181,8 +174,7 @@ sbtree_set(sbtree_t *tree, int key, void *value)
void *
-sbtree_get(sbtree_t *tree, int key)
-{
+sbtree_get(sbtree_t *tree, int key) {
sbcell_t *cell = locate((sbcell_t *) tree->data, key, 0, tree->levels, 1);
if (cell)
@@ -193,29 +185,28 @@ sbtree_get(sbtree_t *tree, int key)
#if 0
static void
-sbtree_print(sbtree_t *tree)
-{
+sbtree_print(sbtree_t *tree) {
int l, i;
sbcell_t *cells = (sbcell_t *) tree->data;
- fprintf(stderr,"\tTree:\n");
+ fprintf(stderr, "\tTree:\n");
for (l = 0; l <= tree->levels; l++) {
- fprintf(stderr,"\t ");
+ fprintf(stderr, "\t ");
for (i = 0; i < (1 << l); i++) {
if (cells->key == NOT_A_KEY)
- fprintf(stderr,"-- ");
+ fprintf(stderr, "-- ");
else {
if (cells->value)
- fprintf(stderr,"%d+ ", cells->key);
+ fprintf(stderr, "%d+ ", cells->key);
else
- fprintf(stderr,"%d ", cells->key);
+ fprintf(stderr, "%d ", cells->key);
}
cells = cells + 1;
}
- fprintf(stderr,"\n");
+ fprintf(stderr, "\n");
}
- fprintf(stderr,"\n");
+ fprintf(stderr, "\n");
}
#endif
@@ -229,20 +220,18 @@ static int any_error;
void *
-foreach_double_func(sbtree_t *tree, const int key, const void *value, void *args)
-{
+foreach_double_func(sbtree_t *tree, const int key, const void *value, void *args) {
int *real_value = (int *) value;
if (!real_value)
- fprintf(stderr,"foreach_double_func(): key %d mapped to non-value!\n", key);
+ fprintf(stderr, "foreach_double_func(): key %d mapped to non-value!\n", key);
else *real_value *= 2;
return real_value;
}
int *
-generate_linear_forward(int numbers)
-{
+generate_linear_forward(int numbers) {
int i;
int *data = sci_malloc(sizeof(int) * numbers);
for (i = 0; i < numbers; i++)
@@ -252,8 +241,7 @@ generate_linear_forward(int numbers)
}
int *
-generate_linear_backward(int numbers)
-{
+generate_linear_backward(int numbers) {
int i;
int *data = sci_malloc(sizeof(int) * numbers);
for (i = 0; i < numbers; i++)
@@ -263,21 +251,19 @@ generate_linear_backward(int numbers)
}
int *
-generate_random(int numbers, int max)
-{
+generate_random(int numbers, int max) {
int i;
int *data = sci_malloc(sizeof(int) * numbers);
for (i = 0; i < numbers; i++)
- data[i] = 1 + (int) ((rand() * 1.0 * max) / (RAND_MAX + 1.0));
+ data[i] = 1 + (int)((rand() * 1.0 * max) / (RAND_MAX + 1.0));
return data;
}
void
-insert_values(sbtree_t *tree, int nr, int *data)
-{
+insert_values(sbtree_t *tree, int nr, int *data) {
int i;
for (i = 0; i < nr; i++)
@@ -294,16 +280,15 @@ insert_values(sbtree_t *tree, int nr, int *data)
#define MODE_LINEAR_DOUBLE 3
void
-test_value(sbtree_t *tree, int times, int max, int numbers, int *data, int mode)
-{
+test_value(sbtree_t *tree, int times, int max, int numbers, int *data, int mode) {
int i;
int failed = 0;
for (i = 0; i < times; i++) {
- int key = (mode == MODE_LINEAR || mode == MODE_LINEAR_DOUBLE)? i :
- (mode == MODE_LINEAR_MAP)? data[i % numbers] :
- (int) ((rand() * 1.0 * max) / (RAND_MAX + 1.0));
- int *value = (int *) sbtree_get(tree, (mode == MODE_LINEAR_DOUBLE)? key >> 1 : key);
+ int key = (mode == MODE_LINEAR || mode == MODE_LINEAR_DOUBLE) ? i :
+ (mode == MODE_LINEAR_MAP) ? data[i % numbers] :
+ (int)((rand() * 1.0 * max) / (RAND_MAX + 1.0));
+ int *value = (int *) sbtree_get(tree, (mode == MODE_LINEAR_DOUBLE) ? key >> 1 : key);
int found = 0;
int j;
@@ -314,8 +299,7 @@ test_value(sbtree_t *tree, int times, int max, int numbers, int *data, int mode)
if (found && !value) {
fprintf(stderr, "!%d ", key);
++failed;
- }
- else if (!found && found) {
+ } else if (!found && found) {
fprintf(stderr, "?[%d]=%d ", key, *value);
++failed;
}
@@ -329,8 +313,7 @@ test_value(sbtree_t *tree, int times, int max, int numbers, int *data, int mode)
void
-test_boundary(sbtree_t *tree, int max, int random)
-{
+test_boundary(sbtree_t *tree, int max, int random) {
int *value_too_low = sbtree_get(tree, 0);
int *value_too_high = sbtree_get(tree, max + 1);
int *value_low = sbtree_get(tree, 1);
@@ -360,13 +343,12 @@ test_boundary(sbtree_t *tree, int max, int random)
void
-test_empty(sbtree_t *tree, int count, int max)
-{
+test_empty(sbtree_t *tree, int count, int max) {
int i;
int errors = 0;
for (i = 0; i < count; i++) {
- int key = 1 + (int) ((rand() * 1.0 * max) / (RAND_MAX + 1.0));
+ int key = 1 + (int)((rand() * 1.0 * max) / (RAND_MAX + 1.0));
int *value;
if ((value = (int *) sbtree_get(tree, key))) {
@@ -376,14 +358,13 @@ test_empty(sbtree_t *tree, int count, int max)
}
if (errors)
- fprintf(stderr," (%d/%d errors)\n", any_error = errors, count);
+ fprintf(stderr, " (%d/%d errors)\n", any_error = errors, count);
else
- fprintf(stderr,"OK\n");
+ fprintf(stderr, "OK\n");
}
void
-run_test(sbtree_t *tree, int entries, int *data, int random, int max_value)
-{
+run_test(sbtree_t *tree, int entries, int *data, int random, int max_value) {
char *tests[] = {"\tLinear reference test: \t\t", "\tKey map reference test: \t", "\tRandom access test: \t\t"};
int i;
@@ -405,7 +386,7 @@ run_test(sbtree_t *tree, int entries, int *data, int random, int max_value)
sbtree_foreach(tree, NULL, foreach_double_func);
fprintf(stderr, "\tForeach test: \t\t\t");
if (i * 2 != data[0]) {
- fprintf(stderr,"Error: No effect: %d * 2 != %d\n", i, data[0]);
+ fprintf(stderr, "Error: No effect: %d * 2 != %d\n", i, data[0]);
any_error = 1;
} else
test_value(tree, entries * 2, entries * 2, entries, data, MODE_LINEAR_DOUBLE);
@@ -422,51 +403,50 @@ run_test(sbtree_t *tree, int entries, int *data, int random, int max_value)
#define TESTS_NR 11
int
-main(int argc, char **argv)
-{
+main(int argc, char **argv) {
int tests_nr = TESTS_NR;
int test_sizes[TESTS_NR] = {1, 2, 3, 7, 8, 9, 1000, 16383, 16384, 16385, 1000000};
int i;
fprintf(stderr, "sbtree.c Copyright (C) 2000 Christoph Reichenbach <jameson@linuxgames.com>\n"
- "This program is provided WITHOUT WARRANTY of any kind\n"
- "Please refer to the file COPYING that should have come with this program\n");
+ "This program is provided WITHOUT WARRANTY of any kind\n"
+ "Please refer to the file COPYING that should have come with this program\n");
fprintf(stderr, "Static Binary Tree testing facility\n");
free(malloc(42)); /* Make sure libefence's Copyright message is print here if we're using it */
- fprintf(stderr,"\nsbtree.c: Running %d tests.\n", tests_nr);
+ fprintf(stderr, "\nsbtree.c: Running %d tests.\n", tests_nr);
for (i = 0; i < tests_nr; i++) {
int entries = test_sizes[i];
sbtree_t *tree;
int *data;
- fprintf(stderr,"Test #%d: %d entries\n", i+1, entries);
+ fprintf(stderr, "Test #%d: %d entries\n", i + 1, entries);
- fprintf(stderr,"\t%da: Linear values\n", i+1);
+ fprintf(stderr, "\t%da: Linear values\n", i + 1);
data = generate_linear_forward(entries);
tree = sbtree_new(entries, data);
run_test(tree, entries, data, 0, entries);
- fprintf(stderr,"\t%db: Reverse linear values\n", i+1);
+ fprintf(stderr, "\t%db: Reverse linear values\n", i + 1);
data = generate_linear_backward(entries);
tree = sbtree_new(entries, data);
run_test(tree, entries, data, 0, entries);
- fprintf(stderr,"\t%dc: Dense random values\n", i+1);
+ fprintf(stderr, "\t%dc: Dense random values\n", i + 1);
data = generate_random(entries, 1 + (entries >> 2));
tree = sbtree_new(entries, data);
run_test(tree, entries, data, 1, 1 + (entries >> 2));
- fprintf(stderr,"\t%dc: Sparse random values\n", i+1);
+ fprintf(stderr, "\t%dc: Sparse random values\n", i + 1);
data = generate_random(entries, (entries << 2));
tree = sbtree_new(entries, data);
run_test(tree, entries, data, 1, entries << 2);
- fprintf(stderr,"Test #%d completed.\n\n", i+1);
+ fprintf(stderr, "Test #%d completed.\n\n", i + 1);
}
- fprintf(stderr,"Test suite completed.\n");
+ fprintf(stderr, "Test suite completed.\n");
return 0;
}