sd

Sized-data type and related functions
git clone git://www.tkruger.se/sd.git
Log | Files | Refs | README

sd.c (1091B)


      1 #include "sd.h"
      2 
      3 void sd_init(sd_t *s, const size_t size) {
      4   s->size = size;
      5   s->data = malloc(s->size);
      6 }
      7 
      8 void sd_clear(sd_t *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_t *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_t *x, sd_t *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_t *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_t *s) {
     49   uint64_t r;
     50   memcpy(&r, s->data, sizeof(r));
     51   return r;
     52 }
     53 
     54 void sd_init_str(sd_t *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_t *s) { return (char *)s->data; }