Skip to content

Commit

Permalink
add galois_init_default_field error code
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Loic Dachary committed Jun 8, 2014
1 parent b8221e7 commit 1b30a37
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 19 deletions.
2 changes: 1 addition & 1 deletion include/galois.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
47 changes: 29 additions & 18 deletions src/galois.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include "galois.h"

Expand Down Expand Up @@ -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;
}
}

Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -303,31 +314,31 @@ 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);
}

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

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

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

0 comments on commit 1b30a37

Please sign in to comment.