chunker.pyx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # -*- coding: utf-8 -*-
  2. API_VERSION = 2
  3. from libc.stdlib cimport free
  4. cdef extern from "_chunker.c":
  5. ctypedef int uint32_t
  6. ctypedef struct _Chunker "Chunker":
  7. pass
  8. _Chunker *chunker_init(int window_size, int chunk_mask, int min_size, uint32_t seed)
  9. void chunker_set_fd(_Chunker *chunker, object fd)
  10. void chunker_free(_Chunker *chunker)
  11. object chunker_process(_Chunker *chunker)
  12. uint32_t *buzhash_init_table(uint32_t seed)
  13. uint32_t c_buzhash "buzhash"(unsigned char *data, size_t len, uint32_t *h)
  14. uint32_t c_buzhash_update "buzhash_update"(uint32_t sum, unsigned char remove, unsigned char add, size_t len, uint32_t *h)
  15. cdef class Chunker:
  16. cdef _Chunker *chunker
  17. def __cinit__(self, window_size, chunk_mask, min_size, seed):
  18. self.chunker = chunker_init(window_size, chunk_mask, min_size, seed & 0xffffffff)
  19. def chunkify(self, fd):
  20. chunker_set_fd(self.chunker, fd)
  21. return self
  22. def __dealloc__(self):
  23. if self.chunker:
  24. chunker_free(self.chunker)
  25. def __iter__(self):
  26. return self
  27. def __next__(self):
  28. return chunker_process(self.chunker)
  29. def buzhash(unsigned char *data, unsigned long seed):
  30. cdef uint32_t *table
  31. cdef uint32_t sum
  32. table = buzhash_init_table(seed & 0xffffffff)
  33. sum = c_buzhash(data, len(data), table)
  34. free(table)
  35. return sum
  36. def buzhash_update(uint32_t sum, unsigned char remove, unsigned char add, size_t len, unsigned long seed):
  37. cdef uint32_t *table
  38. table = buzhash_init_table(seed & 0xffffffff)
  39. sum = c_buzhash_update(sum, remove, add, len, table)
  40. free(table)
  41. return sum