#include "gnu_msgfmt.h"
#include "gnu_prime.h"
unsigned int
hashpjw(const char *str)
{
const char *p;
unsigned int h = 0, g;
for (p = str; *p; p++) {
h = (h << 4) + *p;
g = h & 0xf0000000;
if (g) {
h = h ^ (g >> 24);
h = h ^ g;
}
}
return (h);
}
static unsigned int
find_prime_big(unsigned int n)
{
int t;
unsigned int max_tbl_prime, prd;
max_tbl_prime = prime[MAX_PRIME_INDEX] + 2;
for (; ; ) {
for (t = 1; t <= MAX_PRIME_INDEX; t++) {
if (n % prime[t] == 0) {
break;
}
}
if (t <= MAX_PRIME_INDEX) {
n += 2;
continue;
}
prd = max_tbl_prime;
while ((prd * prd < n) && (n % prd != 0)) {
prd += 2;
}
if (n % prd == 0) {
n += 2;
continue;
}
return (n);
}
}
unsigned int
find_prime(unsigned int tbl_size)
{
int t, d;
unsigned int n, prd;
if (tbl_size == 1)
return (1);
else if (tbl_size == 2)
return (5);
n = 4 * tbl_size / 3;
n |= 1;
prd = n / 100;
if (prd <= MAX_INDEX_INDEX) {
for (t = index[prd] + 1; t <= MAX_PRIME_INDEX; t++) {
if (prime[t] >= n)
return (prime[t]);
}
error(ERR_PRIME, n);
}
t = START_SEARCH_INDEX;
for (; ; ) {
while (prime[t] * prime[t] < n) {
if (t == MAX_PRIME_INDEX) {
return (find_prime_big(n));
}
t++;
}
for (d = 1; d <= t; d++) {
if (n % prime[d] == 0) {
break;
}
}
if (d > t) {
return (n);
}
n += 2;
}
}
unsigned int
get_hash_index(unsigned int *hash_tbl, unsigned int hash_value,
unsigned int hash_size)
{
unsigned int idx, inc;
idx = hash_value % hash_size;
inc = 1 + (hash_value % (hash_size - 2));
for (; ; ) {
if (!hash_tbl[idx])
return (idx);
idx = (idx + inc) % hash_size;
}
}