#include "lichen.h" #include #include void li_xorshift32_seed(struct li_xorshift32_t *xor, uint32_t seed) { xor->state = seed ? seed : 1; xor->generator.rand = li_xorshift32; xor->generator.state = &(xor->state); } uint32_t li_xorshift32(void *s) { uint64_t x = *((uint64_t*)s); x ^= x >> 12; x ^= x << 25; x ^= x >> 27; x *= 0x2545F4914F6CDD1DULL; *((uint64_t*)s) = x; // return just top 32 bits return x >> 32; } li_llnode_t * li_alloc_llnode() { li_llnode_t *n = malloc(sizeof(li_llnode_t)); if (n == NULL) { fprintf(stderr, "failed to allocate linked-list node\n"); return NULL; } else { n->tag = 0; n->data = 0; n->next = NULL; return n; } } li_llnode_t * li_copy_llnode(li_llnode_t *n) { li_llnode_t *m = li_alloc_llnode(); if (m == NULL) { return NULL; } memcpy(m, n, sizeof(li_llnode_t)); return m; } void li_free_llnode(li_llnode_t *n, void (*free_data)(void*)) { if (n != NULL) { free_data(n->data); } free(n); }