sd.c (1073B)
1 #include "sd.h" 2 3 void sd_init(sd *s, const size_t size) { 4 s->size = size; 5 s->data = malloc(s->size); 6 } 7 8 void sd_clear(sd *s) { 9 s->size = 0; 10 free(s->data); 11 } 12 13 static inline uint64_t murmur_u64(uint64_t h) { 14 h ^= h >> 33; 15 h *= 0xff51afd7ed558ccdL; 16 h ^= h >> 33; 17 h *= 0xc4ceb9fe1a85ec53L; 18 h ^= h >> 33; 19 return h; 20 } 21 22 uint64_t sd_hash(sd *s) { 23 uint64_t tmp = s->size; 24 25 size_t i; 26 for (i = 0; i < s->size; i++) { 27 tmp ^= ((uint64_t)s->data[i]) << (i % 4); 28 } 29 30 return murmur_u64(tmp); 31 } 32 33 int sd_cmp(sd *x, sd *y) { 34 if (x->size < y->size) { 35 return -1; 36 } else if (x->size > y->size) { 37 return 1; 38 } 39 40 return memcmp(x->data, y->data, x->size); 41 } 42 43 void sd_init_u64(sd *s, const uint64_t x) { 44 sd_init(s, sizeof(x)); 45 memcpy(s->data, &x, sizeof(x)); 46 } 47 48 uint64_t sd_conv_u64(sd *s) { 49 uint64_t r; 50 memcpy(&r, s->data, sizeof(r)); 51 return r; 52 } 53 54 void sd_init_str(sd *s, const char *str) { 55 size_t len = strlen(str) + 1; 56 sd_init(s, sizeof(*str) * len); 57 memcpy(s->data, str, len); 58 } 59 60 char *sd_get_str(sd *s) { return (char *)s->data; }