From 23a93d5c5417d071c90e8cb4e29a630ee32a67b4 Mon Sep 17 00:00:00 2001 From: Matt Stancliff Date: Wed, 10 Dec 2014 15:40:34 -0500 Subject: [PATCH] Add sdsnative() Use the existing memory space for an SDS to convert it to a regular character buffer so we don't need to allocate duplicate space just to extract a usable buffer for native operations. --- src/sds.c | 11 +++++++++++ src/sds.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/sds.c b/src/sds.c index 05ee0ad5..3626dd52 100644 --- a/src/sds.c +++ b/src/sds.c @@ -88,6 +88,17 @@ void sdsfree(sds s) { zfree(s-sizeof(struct sdshdr)); } +/* Remove sds header so we can use buffer as malloc'd byte array. + * Returns the contents of 's' usable as a full malloc'd C string. */ +char *sdsnative(sds s) { + if (!s) return NULL; + + size_t len = sdslen(s); + char *base = s-sizeof(struct sdshdr); + memmove(base, s, len); + return zrealloc(base, len); +} + /* Set the sds string length to the length as obtained with strlen(), so * considering as content only up to the first null term character. * diff --git a/src/sds.h b/src/sds.h index 93dd4f28..756ae0b5 100644 --- a/src/sds.h +++ b/src/sds.h @@ -60,6 +60,7 @@ sds sdsempty(void); size_t sdslen(const sds s); sds sdsdup(const sds s); void sdsfree(sds s); +char *sdsnative(sds s); size_t sdsavail(const sds s); sds sdsgrowzero(sds s, size_t len); sds sdscatlen(sds s, const void *t, size_t len);