X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=datatype%2Fnstring.c;fp=datatype%2Fnstring.c;h=f4f6f3811474ad058438a9600b5526919c0af26b;hp=0000000000000000000000000000000000000000;hb=11572afcaf218cfcbb8e9747f22739f75252c4f4;hpb=f1098084dd54496a61f9a254541190df77edd166 diff --git a/datatype/nstring.c b/datatype/nstring.c new file mode 100644 index 0000000..f4f6f38 --- /dev/null +++ b/datatype/nstring.c @@ -0,0 +1,27 @@ +#include "common.h" +#include "nstring.h" +#include "murmur.h" +#include "mem.h" + +const datatype_t DATATYPE_NSTRING = { (cmp_fun_t)ns_cmp, (hash_fun_t)ns_hash, (clone_fun_t)ns_dup }; + +nstring_t *ns_alloc (uint32_t len) { + nstring_t *ns = nbd_malloc(sizeof(nstring_t) + len); + ns->len = len; + return ns; +} + +int ns_cmp (const nstring_t *ns1, const nstring_t *ns2) { + int d = memcmp(ns1->data, ns2->data, (ns1->len < ns2->len) ? ns1->len : ns1->len); + return (d == 0) ? ns1->len - ns2->len : d; +} + +uint32_t ns_hash (const nstring_t *ns) { + return murmur32(ns->data, ns->len); +} + +nstring_t *ns_dup (const nstring_t *ns1) { + nstring_t *ns2 = ns_alloc(ns1->len); + memcpy(ns2->data, ns1->data, ns1->len); + return ns2; +}