// Python Wrapper object
static PyObject *Produce_Xor_From_Bitstring(PyObject *module, PyObject *args) {
  datastore_descriptor ds;
  int bitstringlength;
  char *bitstringbuffer;
  char *raw_resultbuffer;
  uint64_t *resultbuffer;

  if (!PyArg_ParseTuple(args, "is#", &ds, &bitstringbuffer, &bitstringlength)) {
    // Incorrect args...
    return NULL;
  }

  // Is the ds valid?
  if (!is_table_entry_used(ds)) {
    PyErr_SetString(PyExc_ValueError, "Bad index for Produce_Xor_From_Bitstring");
    return NULL;
  }

  // Let's prepare a place to put this...
  raw_resultbuffer = malloc(xordatastoretable[ds].sizeofablock+sizeof(uint64_t));
  // ...and zero it out...
  bzero(raw_resultbuffer, xordatastoretable[ds].sizeofablock+sizeof(uint64_t));

  // ... now let's get a DWORD aligned offset
  resultbuffer = (uint64_t *) dword_align(raw_resultbuffer);

  // Let's actually calculate this!
  bitstring_xor_worker(ds, bitstringbuffer, bitstringlength, resultbuffer);



  // okay, let's put it in a buffer
  PyObject *return_str_obj = Py_BuildValue("s#",(char *)resultbuffer,xordatastoretable[ds].sizeofablock);

  // clear the buffer
  free(raw_resultbuffer);

  return return_str_obj;
} 
// Python Wrapper object
static PyObject *Produce_Xor_From_Bitstring(PyObject *module, PyObject *args) {
	datastore_descriptor ds;
	int bitstringlength;
	char *bitstringbuffer;
	char *raw_resultbuffer;
	__m128i *resultbuffer;

	if (!PyArg_ParseTuple(args, "iy#", &ds, &bitstringbuffer, &bitstringlength)) {
		// Incorrect args...
		return NULL;
	}

	printf("ds %i  .  ", ds);

	// Is the ds valid?
	if (!is_table_entry_used(ds)) {
		PyErr_SetString(PyExc_ValueError, "Bad index for Produce_Xor_From_Bitstring");
		return NULL;
	}

	// Let's prepare a place to put the answer (1 block + alignment)
	raw_resultbuffer = (char*) calloc(1, xordatastoretable[ds].sizeofablock + sizeof(__m128i));

	// align it
	resultbuffer = (__m128i *) dword_align(raw_resultbuffer);

	// Let's actually calculate this!
	bitstring_xor_worker(ds, bitstringbuffer, bitstringlength, resultbuffer);

	// okay, let's put it in a buffer
	PyObject *return_str_obj = Py_BuildValue("y#",(char *)resultbuffer, xordatastoretable[ds].sizeofablock);

	// clear the buffer
	free(raw_resultbuffer);

	return return_str_obj;
}