0x7bf7cabc, 0xf9c18d66, 0x593ade65, 0xd95ddf11,
};
-uint32_t buzhash_update (buzHash *b, const char *s, size_t window) {
+bool buzhash_update (buzHash *b, const char *s, size_t window, uint32_t *output) {
if(b->window == NULL || b->window_size != window) {
if(b->window)
free(b->window);
b->window = calloc(1, window);
+ if (!b->window)
+ return false;
assert(b->window);
b->window_loc = 0;
b->window_fill = 0;
b->window_fill++;
if(b->window_fill < b->window_size) {
b->h ^= rol32 (buzhash_table[(uint8_t) (*s)], window - b->window_fill);
- return 1;
+ *output = 1;
+ return true;
} else {
b->h ^= buzhash_table[(uint8_t) (*s)];
- return b->h;
+ *output = b->h;
+ return true;
}
}
b->h = rol32 (b->h, 1) ^
buzhash_table[(uint8_t) *s];
b->window[b->window_loc++] = *s;
b->window_loc %= b->window_size;
- return b->h;
+ *output = b->h;
+ return true;
}
void buzhash_reset (buzHash *b) {
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
+#include <stdbool.h>
typedef struct buzHash {
uint32_t h;
int window_fill;
} buzHash;
-uint32_t buzhash_update (buzHash *b, const char *s, size_t window);
+bool buzhash_update (buzHash *b, const char *s, size_t window, uint32_t *output);
void buzhash_reset (buzHash *b);
#endif
const char *loc = src;
size_t loc_size = src_size;
size_t loc_written = 0;
+ uint32_t buzhash_res;
if(zck->manual_chunk) {
while(zck->comp.dc_data_size + loc_size > zck->chunk_max_size) {
return src_size;
} else {
for(size_t i=0; i<loc_size; ) {
- if((buzhash_update(&(zck->buzhash), loc+i, zck->buzhash_width) &
- zck->buzhash_bitmask) == 0 ||
+ if (!buzhash_update(&(zck->buzhash), loc+i, zck->buzhash_width, &buzhash_res)) {
+ zck_log(ZCK_LOG_ERROR, "OOM in buzhash_update");
+ return -1;
+ }
+
+ if((buzhash_res & zck->buzhash_bitmask) == 0 ||
zck->comp.dc_data_size + i >= zck->chunk_auto_max) {
if(comp_write(zck, loc, i) != i)
return -1;