#ifndef _CHECKSUM_H_
# define _CHECKSUM_H_
# include <assert.h>
# include "librsync.h"
# include "rollsum.h"
# include "rabinkarp.h"
# include "hashtable.h"
typedef enum {
RS_ROLLSUM,
RS_RABINKARP,
} weaksum_kind_t;
typedef enum {
RS_MD4,
RS_BLAKE2,
} strongsum_kind_t;
typedef struct weaksum {
weaksum_kind_t kind;
union {
Rollsum rs;
rabinkarp_t rk;
} sum;
} weaksum_t;
static inline void weaksum_reset(weaksum_t *sum)
{
if (sum->kind == RS_ROLLSUM)
RollsumInit(&sum->sum.rs);
else
rabinkarp_init(&sum->sum.rk);
}
static inline void weaksum_init(weaksum_t *sum, weaksum_kind_t kind)
{
assert(kind == RS_ROLLSUM || kind == RS_RABINKARP);
sum->kind = kind;
weaksum_reset(sum);
}
static inline size_t weaksum_count(weaksum_t *sum)
{
return sum->sum.rs.count;
}
static inline void weaksum_update(weaksum_t *sum, const unsigned char *buf,
size_t len)
{
if (sum->kind == RS_ROLLSUM)
RollsumUpdate(&sum->sum.rs, buf, len);
else
rabinkarp_update(&sum->sum.rk, buf, len);
}
static inline void weaksum_rotate(weaksum_t *sum, unsigned char out,
unsigned char in)
{
if (sum->kind == RS_ROLLSUM)
RollsumRotate(&sum->sum.rs, out, in);
else
rabinkarp_rotate(&sum->sum.rk, out, in);
}
static inline void weaksum_rollin(weaksum_t *sum, unsigned char in)
{
if (sum->kind == RS_ROLLSUM)
RollsumRollin(&sum->sum.rs, in);
else
rabinkarp_rollin(&sum->sum.rk, in);
}
static inline void weaksum_rollout(weaksum_t *sum, unsigned char out)
{
if (sum->kind == RS_ROLLSUM)
RollsumRollout(&sum->sum.rs, out);
else
rabinkarp_rollout(&sum->sum.rk, out);
}
static inline rs_weak_sum_t weaksum_digest(weaksum_t *sum)
{
if (sum->kind == RS_ROLLSUM)
return mix32(RollsumDigest(&sum->sum.rs));
else
return rabinkarp_digest(&sum->sum.rk);
}
rs_weak_sum_t rs_calc_weak_sum(weaksum_kind_t kind, void const *buf,
size_t len);
void rs_calc_strong_sum(strongsum_kind_t kind, void const *buf, size_t len,
rs_strong_sum_t *sum);
#endif