diff --git a/include/cmp_max_used_bits.h b/include/cmp_max_used_bits.h index ba9db083a6c5d4de814a83f8fabfc2a0f4461656..ac936c757a1dc4b5e8ff99b54e97eb32482a3854 100644 --- a/include/cmp_max_used_bits.h +++ b/include/cmp_max_used_bits.h @@ -22,6 +22,10 @@ #include <stdint.h> +/* Up to this number (not included), the maximum used bits registry versions cannot be used by the user. */ +#define CMP_MAX_USED_BITS_RESERVED_VERSIONS 32 + + /* predefined maximum used bits registry constants */ extern const struct cmp_max_used_bits MAX_USED_BITS_SAFE; extern const struct cmp_max_used_bits MAX_USED_BITS_V1; diff --git a/lib/cmp_max_used_bits_list.c b/lib/cmp_max_used_bits_list.c index f302bb6a056fbf7a3c543640371749aa723b7c20..dfcec17a1856829e03a9a41feecaef150f10f121 100644 --- a/lib/cmp_max_used_bits_list.c +++ b/lib/cmp_max_used_bits_list.c @@ -79,9 +79,10 @@ int cmp_max_used_bits_list_add(struct cmp_max_used_bits const *item) if (!item) return -1; - if (item->version <= 16) + if (item->version < CMP_MAX_USED_BITS_RESERVED_VERSIONS) return -1; + /* check for an existing entry */ list_for_each_entry(item_ptr, &max_used_bits_list, list) { if (item_ptr->data.version == item->version) { item_ptr->data = *item; /* replace existing list entry */ diff --git a/test/cmp_icu/test_decmp.c b/test/cmp_icu/test_decmp.c index 4b12d08ba8f0981319f7e1f1ff52238c73519500..37d31092a4d6b6cfec6edab459e9ff2f18087b0d 100644 --- a/test/cmp_icu/test_decmp.c +++ b/test/cmp_icu/test_decmp.c @@ -1420,7 +1420,7 @@ void test_cmp_ent_write_cmp_pars(void) cfg.cmp_par_mean = 7; cfg.cmp_par_variance = 8; cfg.cmp_par_pixels_error = 9; - cfg.max_used_bits = NULL; /* test without max_used_bits registry */ + cfg.max_used_bits = cmp_max_used_bits_list_get(42); /* create a compression entity */ size = cmp_ent_create(NULL, cfg.data_type, cfg.cmp_mode == CMP_MODE_RAW, 12); @@ -1439,7 +1439,7 @@ void test_cmp_ent_write_cmp_pars(void) TEST_ASSERT_EQUAL_INT(cmp_cal_size_of_data(cfg.samples, cfg.data_type), cmp_ent_get_original_size(ent)); TEST_ASSERT_EQUAL_INT(cfg.cmp_mode, cmp_ent_get_cmp_mode(ent)); TEST_ASSERT_EQUAL_INT(cfg.model_value, cmp_ent_get_model_value(ent)); - TEST_ASSERT_EQUAL_INT(0, cmp_ent_get_max_used_bits_version(ent)); + TEST_ASSERT_EQUAL_INT(max_used_bits.version, cmp_ent_get_max_used_bits_version(ent)); TEST_ASSERT_EQUAL_INT(cfg.round, cmp_ent_get_lossy_cmp_par(ent)); @@ -1460,7 +1460,6 @@ void test_cmp_ent_write_cmp_pars(void) TEST_ASSERT_FALSE(error); cfg.icu_output_buf = cmp_ent_get_data_buf(ent); /* quick fix that both cfg are equal */ cfg.buffer_length = 12; /* quick fix that both cfg are equal */ - cfg.max_used_bits = &MAX_USED_BITS_SAFE; /* quick fix that both cfg are equal */ TEST_ASSERT_EQUAL_MEMORY(&cfg, &cfg_read, sizeof(struct cmp_cfg)); free(ent); diff --git a/test/cmp_max_used_bits/test_cmp_max_used_bits_list.c b/test/cmp_max_used_bits/test_cmp_max_used_bits_list.c index 98d06072b694a6fd1fe2013d585c133fe413cc11..1ffd4e4f4866b06a7521503ae7320988bab2c005 100644 --- a/test/cmp_max_used_bits/test_cmp_max_used_bits_list.c +++ b/test/cmp_max_used_bits/test_cmp_max_used_bits_list.c @@ -18,12 +18,12 @@ #include <string.h> -#include <dlfcn.h> #include <unity.h> #include <cmp_max_used_bits_list.h> +#ifndef __sparc__ /* if set the mock malloc will fail (return NULL) */ static int malloc_fail; @@ -32,6 +32,7 @@ static int malloc_fail; * mock of the malloc function; can controlled with the global malloc_fail variable * see:https://jayconrod.com/posts/23/tutorial--function-interposition-in-linux */ +#include <dlfcn.h> void* malloc(size_t size) { @@ -49,6 +50,7 @@ void* malloc(size_t size) fprintf(stderr, "malloc(%zu)\n", size); return real_malloc(size); } +#endif /** @@ -60,31 +62,31 @@ void* malloc(size_t size) void test_cmp_max_used_bits_list(void) { - struct cmp_max_used_bits i_17, i_21, i_22, i_23, i_255, i_0; + struct cmp_max_used_bits i_32, i_34, i_35, i_36, i_255, i_0; struct cmp_max_used_bits *p; int return_val; /* set up max_used_bits item */ - memset(&i_17, 17, sizeof(struct cmp_max_used_bits)); - i_17.version = 17; - memset(&i_21, 21, sizeof(struct cmp_max_used_bits)); - i_21.version = 21; - memset(&i_22, 22, sizeof(struct cmp_max_used_bits)); - i_22.version = 22; - memset(&i_23, 23, sizeof(struct cmp_max_used_bits)); - i_23.version = 23; + memset(&i_32, 32, sizeof(struct cmp_max_used_bits)); + i_32.version = 32; + memset(&i_34, 34, sizeof(struct cmp_max_used_bits)); + i_34.version = 34; + memset(&i_35, 35, sizeof(struct cmp_max_used_bits)); + i_35.version = 35; + memset(&i_36, 36, sizeof(struct cmp_max_used_bits)); + i_36.version = 36; memset(&i_255, 0xFF, sizeof(struct cmp_max_used_bits)); i_255.version = 255; memset(&i_0, 0, sizeof(struct cmp_max_used_bits)); i_0.version = 0; - return_val = cmp_max_used_bits_list_add(&i_17); + return_val = cmp_max_used_bits_list_add(&i_32); TEST_ASSERT_EQUAL_INT(return_val, 0); - return_val = cmp_max_used_bits_list_add(&i_21); + return_val = cmp_max_used_bits_list_add(&i_34); TEST_ASSERT_EQUAL_INT(return_val, 0); - return_val = cmp_max_used_bits_list_add(&i_22); + return_val = cmp_max_used_bits_list_add(&i_35); TEST_ASSERT_EQUAL_INT(return_val, 0); - return_val = cmp_max_used_bits_list_add(&i_23); + return_val = cmp_max_used_bits_list_add(&i_36); TEST_ASSERT_EQUAL_INT(return_val, 0); return_val = cmp_max_used_bits_list_add(&i_255); TEST_ASSERT_EQUAL_INT(return_val, 0); @@ -94,29 +96,29 @@ void test_cmp_max_used_bits_list(void) TEST_ASSERT_EQUAL_INT(return_val, -1); return_val = cmp_max_used_bits_list_add(&i_0); TEST_ASSERT_EQUAL_INT(return_val, -1); - i_0.version = 16; + i_0.version = CMP_MAX_USED_BITS_RESERVED_VERSIONS-1; return_val = cmp_max_used_bits_list_add(&i_0); TEST_ASSERT_EQUAL_INT(return_val, -1); - p = cmp_max_used_bits_list_get(17); - TEST_ASSERT_EQUAL_INT(p->version, 17); - TEST_ASSERT(!memcmp(p, &i_17, sizeof(struct cmp_max_used_bits))); + p = cmp_max_used_bits_list_get(32); + TEST_ASSERT_EQUAL_INT(p->version, 32); + TEST_ASSERT(!memcmp(p, &i_32, sizeof(struct cmp_max_used_bits))); - p = cmp_max_used_bits_list_get(23); - TEST_ASSERT_EQUAL_INT(p->version, 23); - TEST_ASSERT(!memcmp(p, &i_23, sizeof(struct cmp_max_used_bits))); + p = cmp_max_used_bits_list_get(36); + TEST_ASSERT_EQUAL_INT(p->version, 36); + TEST_ASSERT(!memcmp(p, &i_36, sizeof(struct cmp_max_used_bits))); - p = cmp_max_used_bits_list_get(22); - TEST_ASSERT_EQUAL_INT(p->version, 22); - TEST_ASSERT(!memcmp(p, &i_22, sizeof(struct cmp_max_used_bits))); + p = cmp_max_used_bits_list_get(35); + TEST_ASSERT_EQUAL_INT(p->version, 35); + TEST_ASSERT(!memcmp(p, &i_35, sizeof(struct cmp_max_used_bits))); p = cmp_max_used_bits_list_get(255); TEST_ASSERT_EQUAL_INT(p->version, 255); TEST_ASSERT(!memcmp(p, &i_255, sizeof(struct cmp_max_used_bits))); - p = cmp_max_used_bits_list_get(21); - TEST_ASSERT_EQUAL_INT(p->version, 21); - TEST_ASSERT(!memcmp(p, &i_21, sizeof(struct cmp_max_used_bits))); + p = cmp_max_used_bits_list_get(34); + TEST_ASSERT_EQUAL_INT(p->version, 34); + TEST_ASSERT(!memcmp(p, &i_34, sizeof(struct cmp_max_used_bits))); p = cmp_max_used_bits_list_get(0); TEST_ASSERT_EQUAL_INT(p->version, 0); @@ -135,30 +137,30 @@ void test_cmp_max_used_bits_list(void) /* overwrite a list item */ - memset(&i_22, 0x42, sizeof(struct cmp_max_used_bits)); - i_22.version = 22; - return_val = cmp_max_used_bits_list_add(&i_22); + memset(&i_35, 0x42, sizeof(struct cmp_max_used_bits)); + i_35.version = 35; + return_val = cmp_max_used_bits_list_add(&i_35); TEST_ASSERT_EQUAL_INT(return_val, 1); - p = cmp_max_used_bits_list_get(22); - TEST_ASSERT_EQUAL_INT(p->version, 22); - TEST_ASSERT(!memcmp(p, &i_22, sizeof(struct cmp_max_used_bits))); + p = cmp_max_used_bits_list_get(35); + TEST_ASSERT_EQUAL_INT(p->version, 35); + TEST_ASSERT(!memcmp(p, &i_35, sizeof(struct cmp_max_used_bits))); /* delete item */ - cmp_max_used_bits_list_delet(22); - p = cmp_max_used_bits_list_get(22); + cmp_max_used_bits_list_delet(35); + p = cmp_max_used_bits_list_get(35); TEST_ASSERT_NULL(p); - cmp_max_used_bits_list_delet(21); - p = cmp_max_used_bits_list_get(21); + cmp_max_used_bits_list_delet(34); + p = cmp_max_used_bits_list_get(34); TEST_ASSERT_NULL(p); /* empty item */ cmp_max_used_bits_list_empty(); - p = cmp_max_used_bits_list_get(23); + p = cmp_max_used_bits_list_get(36); TEST_ASSERT_NULL(p); cmp_max_used_bits_list_empty(); - p = cmp_max_used_bits_list_get(21); + p = cmp_max_used_bits_list_get(34); TEST_ASSERT_NULL(p); p = cmp_max_used_bits_list_get(0); @@ -169,18 +171,20 @@ void test_cmp_max_used_bits_list(void) TEST_ASSERT_EQUAL_INT(p->version, 1); TEST_ASSERT(!memcmp(p, &MAX_USED_BITS_V1, sizeof(struct cmp_max_used_bits))); - return_val = cmp_max_used_bits_list_add(&i_23); + return_val = cmp_max_used_bits_list_add(&i_36); TEST_ASSERT_EQUAL_INT(return_val, 0); - p = cmp_max_used_bits_list_get(23); - TEST_ASSERT_EQUAL_INT(p->version, 23); - TEST_ASSERT(!memcmp(p, &i_23, sizeof(struct cmp_max_used_bits))); + p = cmp_max_used_bits_list_get(36); + TEST_ASSERT_EQUAL_INT(p->version, 36); + TEST_ASSERT(!memcmp(p, &i_36, sizeof(struct cmp_max_used_bits))); cmp_max_used_bits_list_empty(); /* error case */ +#ifndef __sparc__ malloc_fail = 1; - return_val = cmp_max_used_bits_list_add(&i_23); + return_val = cmp_max_used_bits_list_add(&i_36); TEST_ASSERT_EQUAL_INT(return_val, -1); malloc_fail = 0; +#endif }