From 6e88d486157364329ca58a7f013c606235102c0c Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 3 Sep 2016 13:25:19 -0500 Subject: [PATCH] Added epicsStrnDup() and dbmfStrndup() routines The JSON parser passes string arguments with a length instead or nil-terminating them. These routines make it simple to copy such strings into either permanent or temporary storage. --- src/libCom/dbmf/dbmf.c | 16 ++++++++++++---- src/libCom/dbmf/dbmf.h | 1 + src/libCom/misc/epicsString.c | 9 +++++++++ src/libCom/misc/epicsString.h | 1 + 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/libCom/dbmf/dbmf.c b/src/libCom/dbmf/dbmf.c index 03be8ea32..423027b11 100644 --- a/src/libCom/dbmf/dbmf.c +++ b/src/libCom/dbmf/dbmf.c @@ -158,10 +158,18 @@ void* dbmfMalloc(size_t size) char * dbmfStrdup(const char *str) { - size_t len = strlen(str); - char *buf = dbmfMalloc(len + 1); - strcpy(buf, str); - return buf; + size_t len = strlen(str); + char *buf = dbmfMalloc(len + 1); /* FIXME Can return NULL */ + + return strcpy(buf, str); +} + +char * dbmfStrndup(const char *str, size_t len) +{ + char *buf = dbmfMalloc(len + 1); /* FIXME Can return NULL */ + + buf[len] = '\0'; + return strncpy(buf, str, len); } void dbmfFree(void* mem) diff --git a/src/libCom/dbmf/dbmf.h b/src/libCom/dbmf/dbmf.h index a641d66c7..2c8a28f2c 100644 --- a/src/libCom/dbmf/dbmf.h +++ b/src/libCom/dbmf/dbmf.h @@ -26,6 +26,7 @@ extern "C" { epicsShareFunc int dbmfInit(size_t size, int chunkItems); epicsShareFunc void * dbmfMalloc(size_t bytes); epicsShareFunc char * dbmfStrdup(const char *str); +epicsShareFunc char * dbmfStrndup(const char *str, size_t len); epicsShareFunc char * dbmfStrcat3(const char *lhs, const char *mid, const char *rhs); epicsShareFunc void dbmfFree(void *bytes); diff --git a/src/libCom/misc/epicsString.c b/src/libCom/misc/epicsString.c index 7a63580a2..996c669aa 100644 --- a/src/libCom/misc/epicsString.c +++ b/src/libCom/misc/epicsString.c @@ -223,6 +223,15 @@ int epicsStrnCaseCmp(const char *s1, const char *s2, size_t len) return 0; } +char * epicsStrnDup(const char *s, size_t len) +{ + char *buf = mallocMustSucceed(len + 1, "epicsStrnDup"); + + strncpy(buf, s, len); + buf[len] = '\0'; + return buf; +} + char * epicsStrDup(const char *s) { return strcpy(mallocMustSucceed(strlen(s)+1, "epicsStrDup"), s); diff --git a/src/libCom/misc/epicsString.h b/src/libCom/misc/epicsString.h index c264ebb27..e4bc3804f 100644 --- a/src/libCom/misc/epicsString.h +++ b/src/libCom/misc/epicsString.h @@ -32,6 +32,7 @@ epicsShareFunc size_t epicsStrnEscapedFromRawSize(const char *buf, size_t len); epicsShareFunc int epicsStrCaseCmp(const char *s1, const char *s2); epicsShareFunc int epicsStrnCaseCmp(const char *s1, const char *s2, size_t len); epicsShareFunc char * epicsStrDup(const char *s); +epicsShareFunc char * epicsStrnDup(const char *s, size_t len); epicsShareFunc int epicsStrPrintEscaped(FILE *fp, const char *s, size_t n); #define epicsStrSnPrintEscaped epicsStrnEscapedFromRaw epicsShareFunc int epicsStrGlobMatch(const char *str, const char *pattern);