add galois_init_default_field error code

galois_init_default_field returns an errno(3) code in case of error
instead of exiting. This is handy when the caller needs to perform
cleanup or error reporting when an error occurs instead of exit(2).

The exit(2) based error handling is preserved in the static
galois_init() function which is used in galois.c instead and is based on
galois_init_default_field to avoid code duplication.

Signed-off-by: Loic Dachary <loic@dachary.org>
master
Loic Dachary 2014-06-08 18:54:00 +02:00
parent b8221e7d75
commit 1b30a37c9f
2 changed files with 30 additions and 19 deletions

View File

@ -46,7 +46,7 @@
extern "C" {
#endif
extern void galois_init_default_field(int w);
extern int galois_init_default_field(int w);
extern void galois_change_technique(gf_t *gf, int w);
extern int galois_single_multiply(int a, int b, int w);

View File

@ -47,6 +47,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "galois.h"
@ -168,24 +169,34 @@ gf_t* galois_init_composite_field(int w,
return gfp;
}
void galois_init_default_field(int w)
int galois_init_default_field(int w)
{
if (gfp_array[w] == NULL) {
gfp_array[w] = (gf_t*)malloc(sizeof(gf_t));
if(gfp_array[w] == NULL)
return ENOMEM;
if (!gf_init_easy(gfp_array[w], w))
return EINVAL;
}
return 0;
}
static void galois_init(int w)
{
if (w <= 0 || w > 32) {
fprintf(stderr, "ERROR -- cannot init default Galois field for w=%d\n", w);
exit(1);
}
if (gfp_array[w] == NULL) {
gfp_array[w] = (gf_t*)malloc(sizeof(gf_t));
if (gfp_array[w] == NULL) {
fprintf(stderr, "ERROR -- cannot allocate memory for Galois field w=%d\n", w);
exit(1);
}
}
if (!gf_init_easy(gfp_array[w], w)) {
switch (galois_init_default_field(w)) {
case ENOMEM:
fprintf(stderr, "ERROR -- cannot allocate memory for Galois field w=%d\n", w);
exit(1);
break;
case EINVAL:
fprintf(stderr, "ERROR -- cannot init default Galois field for w=%d\n", w);
exit(1);
break;
}
}
@ -243,7 +254,7 @@ int galois_single_multiply(int x, int y, int w)
if (x == 0 || y == 0) return 0;
if (gfp_array[w] == NULL) {
galois_init_default_field(w);
galois_init(w);
}
if (w <= 32) {
@ -260,7 +271,7 @@ int galois_single_divide(int x, int y, int w)
if (y == 0) return -1;
if (gfp_array[w] == NULL) {
galois_init_default_field(w);
galois_init(w);
}
if (w <= 32) {
@ -278,7 +289,7 @@ void galois_w08_region_multiply(char *region, /* Region to multiply */
int add)
{
if (gfp_array[8] == NULL) {
galois_init_default_field(8);
galois_init(8);
}
gfp_array[8]->multiply_region.w32(gfp_array[8], region, r2, multby, nbytes, add);
}
@ -290,7 +301,7 @@ void galois_w16_region_multiply(char *region, /* Region to multiply */
int add)
{
if (gfp_array[16] == NULL) {
galois_init_default_field(16);
galois_init(16);
}
gfp_array[16]->multiply_region.w32(gfp_array[16], region, r2, multby, nbytes, add);
}
@ -303,7 +314,7 @@ void galois_w32_region_multiply(char *region, /* Region to multiply */
int add)
{
if (gfp_array[32] == NULL) {
galois_init_default_field(32);
galois_init(32);
}
gfp_array[32]->multiply_region.w32(gfp_array[32], region, r2, multby, nbytes, add);
}
@ -311,7 +322,7 @@ void galois_w32_region_multiply(char *region, /* Region to multiply */
void galois_w8_region_xor(void *src, void *dest, int nbytes)
{
if (gfp_array[8] == NULL) {
galois_init_default_field(8);
galois_init(8);
}
gfp_array[8]->multiply_region.w32(gfp_array[32], src, dest, 1, nbytes, 1);
}
@ -319,7 +330,7 @@ void galois_w8_region_xor(void *src, void *dest, int nbytes)
void galois_w16_region_xor(void *src, void *dest, int nbytes)
{
if (gfp_array[16] == NULL) {
galois_init_default_field(16);
galois_init(16);
}
gfp_array[16]->multiply_region.w32(gfp_array[16], src, dest, 1, nbytes, 1);
}
@ -327,7 +338,7 @@ void galois_w16_region_xor(void *src, void *dest, int nbytes)
void galois_w32_region_xor(void *src, void *dest, int nbytes)
{
if (gfp_array[32] == NULL) {
galois_init_default_field(32);
galois_init(32);
}
gfp_array[32]->multiply_region.w32(gfp_array[32], src, dest, 1, nbytes, 1);
}