diff src/ploki/strhash.c @ 4223:ac0403686959

<oerjan> rm -rf src/ploki; mv ploki src
author HackBot
date Fri, 20 Dec 2013 22:18:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/ploki/strhash.c	Fri Dec 20 22:18:50 2013 +0000
@@ -0,0 +1,65 @@
+#include "hash.h"
+#include "strhash.h"
+#include "strutil.h"
+#include "xmalloc.h"
+
+#include <string.h>
+
+struct strx {
+	char *ptr;
+	size_t length;
+};
+
+struct strx_const {
+	const char *ptr;
+	size_t length;
+};
+
+struct strhash {
+	Hash hash;
+};
+
+static size_t hash(const void *p, size_t h) {
+	const struct strx *const s = p;
+	return u_hash(s->ptr, s->length, h);
+}
+
+static int compar(const void *ap, const void *bp) {
+	const struct strx *const a = ap, *const b = bp;
+	return u_cmp(a->ptr, a->length, b->ptr, b->length);
+}
+
+static void delk(void *p) {
+	struct strx *const s = p;
+	xfree(s->ptr);
+	xfree(s);
+}
+
+t_strhash *sh_new(void (*delv)(void *)) {
+	t_strhash *sh = xmalloc(1, sizeof *sh);
+	h_init(&sh->hash, hash, compar, delk, delv);
+	return sh;
+}
+
+void sh_delete(t_strhash *sh) {
+	h_end(&sh->hash);
+	xfree(sh);
+}
+
+void sh_put(t_strhash *sh, const char *key, size_t keylen, void *val) {
+	struct strx *dup = xmalloc(1, sizeof *dup);
+	dup->ptr = xmalloc(dup->length = keylen, sizeof *dup->ptr);
+	memcpy(dup->ptr, key, keylen);
+	h_put(&sh->hash, dup, val, 1);
+}
+
+void *sh_get(t_strhash *sh, const char *key, size_t keylen) {
+	void *p;
+	struct strx_const tmp;
+	tmp.ptr = key;
+	tmp.length = keylen;
+	if (h_get(&sh->hash, &tmp, &p) == H_OK) {
+		return p;
+	}
+	return NULL;
+}