#include "bfstring.h"
#include <string.h>
#include <stdint.h>

uint32_t k = 3U;

uint32_t hash(uint32_t h, char * x) {
  uint32_t offset_basis, prime, n, n1;
  uint32_t hash;
  int32_t n2, i, o, c;
  uint32_t c1;
  offset_basis = 0x811C9DC5U;
  prime = 0x1000193U;
  hash = offset_basis ^ h;
  n = strlen(x);
  if (n > 0x7FFFFFFFU) {
    n1 = 0x7FFFFFFFU;
  } else {
    n1 = n;
  }
  n2 = (int32_t)n1;
  o = n2 - 1;
  if (0 <= o) {
    for (i = 0; ; ++i) {
      c = x[i];
      c1 = c;
      hash = hash ^ c1;
      hash = hash * prime;
      if (i == o) {
        break;
      }
    }
  }
  return hash;
}

uint32_t bit(uint32_t i, char * x, uint32_t m) {
  return hash(i, x) % m;
}
struct filter;


struct filter bloom_filter(uint32_t m) {
  uint32_t * o;
  struct filter filter;
  o = create(m);
  filter.m = m;
  filter.barr = o;
  return filter;
}

void add(char * x, struct filter * s) {
  uint32_t i, o;
  o = k - 1U;
  for (i = 0U; ; ++i) {
    set(s->barr, bit(i, x, s->m));
    if (i == o) {
      break;
    }
  }
}

int mem(char * x, struct filter * s) {
  uint32_t i, o;
  o = k - 1U;
  for (i = 0U; ; ++i) {
    if (!get(s->barr, bit(i, x, s->m))) {
      return 0;
    }
    if (i == o) {
      break;
    }
  }
  return 1;
}