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);