From 228dea2e740b87452f4c70096694b8b94afd5065 Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Sun, 2 Jun 2019 16:53:39 +0200 Subject: [PATCH 1/2] Add sdsnewbin() function --- sds.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/sds.c b/sds.c index 39ad595..447a932 100644 --- a/sds.c +++ b/sds.c @@ -156,6 +156,28 @@ sds sdsnew(const char *init) { return sdsnewlen(init, initlen); } +/* Create a new binary sds from hexadecimal string representation. + * hexstr MUST be NULL terminated, of even length, with lower-case hex + * letters and may begin with '0x' */ +sds sdsnewbin(const char* hexstr) { + size_t sz = strlen(hexstr); + if (sz % 2) return NULL; + sds val = sdsnewlen(SDS_NOINIT, sz / 2); + const char* pos = hexstr; + if (pos[0] == '0' && pos[1] == 'x') { + pos += 2; + sz -= 2; + } + for (size_t i = 0; i < sz / 2; i++) { + if (sscanf(pos, "%2hhx", &val[i]) != 1) { + sdsfree(val); + return NULL; + } + pos += 2; + } + return val; +} + /* Duplicate an sds string. */ sds sdsdup(const sds s) { return sdsnewlen(s, sdslen(s)); From 1f780695aa22b04c36dd986818a6b11914236113 Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Sun, 2 Jun 2019 16:54:39 +0200 Subject: [PATCH 2/2] Update header to add sdsnewbin() --- sds.h | 1 + 1 file changed, 1 insertion(+) diff --git a/sds.h b/sds.h index 1bdb60d..087d5bf 100644 --- a/sds.h +++ b/sds.h @@ -218,6 +218,7 @@ static inline void sdssetalloc(sds s, size_t newlen) { sds sdsnewlen(const void *init, size_t initlen); sds sdsnew(const char *init); sds sdsempty(void); +sds sdsnewbin(const char* hexstr); sds sdsdup(const sds s); void sdsfree(sds s); sds sdsgrowzero(sds s, size_t len);