#ifndef _GF16_H_
#define _GF16_H_

#ifdef __cplusplus
extern "C" {
#endif


extern unsigned short *galois_log_table;
extern unsigned int cpu_flag;

int galois_create_table(void);	// Returns 0 on success, -1 on failure

unsigned short galois_multiply(int x, int y);
unsigned short galois_multiply_fix(int x, int log_y);
unsigned short galois_divide(int x, int y);

unsigned short galois_power(int x, int y);	// 乗数計算用に追加
unsigned short galois_reciprocal(int x);	// 逆数計算用に追加
void galois_free_table(void);	// 解放用に追加

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

extern int sse_unit;

void galois_region_multiply(
	unsigned short *r1,	// Region to multiply
	unsigned short *r2,	// Products go here
	unsigned int count,	// Count of number in short
	int factor);		// Number to multiply by

void galois_region_divide(
	unsigned short *r1,	// Region to divide. products go here
	unsigned int count,	// Count of number in short
	int factor);		// Number to divide by

void galois_align_xor(
	unsigned char *r1,	// Region to multiply
	unsigned char *r2,	// Products go here
	unsigned int len);	// Byte length

// 領域掛け算用の関数定義
typedef void (* REGION_MULTIPLY) (
	unsigned char *r1,	// Region to multiply
	unsigned char *r2,	// Products go here
	unsigned int len,	// Byte length
	int factor);		// Number to multiply by
REGION_MULTIPLY galois_align_multiply;

// 領域並び替え用の関数定義
typedef void (* REGION_ALTMAP) (unsigned char *data, unsigned int bsize);
REGION_ALTMAP galois_altmap_change;
REGION_ALTMAP galois_altmap_return;

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#define HASH_SIZE 16
#define HASH_RANGE 128

void checksum16(unsigned char *data, unsigned char *hash, int byte_size);

// 領域並び替えとチェックサム計算の関数定義
typedef void (* region_checksum) (unsigned char *data, unsigned char *hash, int byte_size);
region_checksum checksum16_altmap;
region_checksum checksum16_return;


#ifdef __cplusplus
}
#endif

#endif
