Mercurial > repo
view src/ploki/variable.c @ 7638:25b838ae35f6
<boily> le/rn wat/\xe1\x8a\xa2\xe1\x89\xb5\xe1\x8b\xae\xe1\x8c\xb5\xe1\x8b\xab \xe1\x8b\x8d\xe1\x88\xb5\xe1\x8c\xa5 \xe1\x8b\xa8\xe1\x88\x9a\xe1\x88\xb0\xe1\x88\xab \xe1\x8b\xa8\xe1\x88\x9d\xe1\x8c\x8d\xe1\x89\xa5 \xe1\x8a\xa0\xe1\x8b\xad\xe1\x8a\x90\xe1\x89\xb5 \xe1\x88\xb2\xe1\x88\x86\xe1\x8a\x95\xe1\x8d\xa3 \xe1\x8b\xa8\xe1\x88\x9a\xe1\x88\xb0\xe1\x88\xab\xe1\x8b\x8d\xe1\x88\x9d \xe1\x8a\xa8\xe1\x8c\xa4\xe1\x8d\x8d \xe1\x8a\x90\xe1\x8b\x8d\xe1\x8d\xa2
author | HackBot |
---|---|
date | Sun, 01 May 2016 22:44:03 +0000 |
parents | ac0403686959 |
children |
line wrap: on
line source
#include "config.h" #include "Str.h" #include "strhash.h" #include "variable.h" #include "xmalloc.h" #include <assert.h> enum {MAGIC = 23}; static void delcookie(void *c) { xfree(c); } t_vr_container *vr_new(void (*del)(void *)) { t_vr_container *v = xmalloc(1, sizeof *v); v->data = xmalloc(v->size = MAGIC, sizeof *v->data); v->length = 0; v->del = del; v->hash = sh_new(delcookie); return v; } void vr_delete(t_vr_container *v) { assert(v != NULL); if (v->hash) { vr_freeze(v); } while (v->length) { --v->length; if (v->del) { v->del(v->data[v->length]); } } xfree(v->data); xfree(v); } t_vr_cookie vr_exists(const t_vr_container *v, const char *key, size_t len) { t_vr_cookie *c; assert(v->hash != NULL); return (c = sh_get(v->hash, key, len)) ? *c : VR_NO_COOKIE; } t_vr_cookie vr_register(t_vr_container *v, const char *key, size_t len, void *val) { t_vr_cookie *cookie; assert(v->hash != NULL); assert(sh_get(v->hash, key, len) == NULL); if (v->length >= v->size) { v->data = xrealloc(v->data, v->size *= 2); } cookie = xmalloc(1, sizeof *cookie); v->data[*cookie = v->length++] = val; sh_put(v->hash, key, len, cookie); return *cookie; } void vr_freeze(t_vr_container *v) { assert(v->hash != NULL); sh_delete(v->hash); v->hash = NULL; } void *(vr_data)(const t_vr_container *v, t_vr_cookie c) { assert(v->hash == NULL); assert(c < v->length); return v->data[c]; }