diff options
author | Eugene Tarassov | 2018-01-23 17:53:01 +0000 |
---|---|---|
committer | Eugene Tarassov | 2018-01-23 17:53:01 +0000 |
commit | 29d796586960b9a7c2cac7752a4fc01e0bcb41d4 (patch) | |
tree | 1716380934127ff01be4b86bdf9a14ef1058acaf | |
parent | ae06aed66aeda6b8ac9180cfd60252e08ce9039c (diff) | |
download | org.eclipse.tcf.agent-29d796586960b9a7c2cac7752a4fc01e0bcb41d4.tar.gz org.eclipse.tcf.agent-29d796586960b9a7c2cac7752a4fc01e0bcb41d4.tar.xz org.eclipse.tcf.agent-29d796586960b9a7c2cac7752a4fc01e0bcb41d4.zip |
TCF Core: new framework API function: loc_printf()
it provides safer alternative to snprintf()
-rw-r--r-- | agent/tcf/framework/myalloc.c | 27 | ||||
-rw-r--r-- | agent/tcf/framework/myalloc.h | 1 |
2 files changed, 28 insertions, 0 deletions
diff --git a/agent/tcf/framework/myalloc.c b/agent/tcf/framework/myalloc.c index 97bb5d82..826a9757 100644 --- a/agent/tcf/framework/myalloc.c +++ b/agent/tcf/framework/myalloc.c @@ -265,3 +265,30 @@ char * loc_strndup(const char * s, size_t len) { rval[len] = '\0'; return rval; } + +char * loc_printf(const char * fmt, ...) { + va_list ap; + char arr[0x100]; + void * mem = NULL; + char * buf = arr; + size_t len = sizeof(arr); + int n; + + while (1) { + va_start(ap, fmt); + n = vsnprintf(buf, len, fmt, ap); + va_end(ap); + if (n < 0) { + if (len > 0x1000) break; + len *= 2; + } + else { + if (n < (int)len) break; + len = n + 1; + } + mem = loc_realloc(mem, len); + buf = (char *)mem; + } + if (buf == arr) buf = loc_strdup(arr); + return buf; +} diff --git a/agent/tcf/framework/myalloc.h b/agent/tcf/framework/myalloc.h index 3ae22da4..4952d15e 100644 --- a/agent/tcf/framework/myalloc.h +++ b/agent/tcf/framework/myalloc.h @@ -33,6 +33,7 @@ extern void * loc_realloc(void * ptr, size_t size); extern char * loc_strdup(const char * s); extern char * loc_strdup2(const char * s1, const char * s2); extern char * loc_strndup(const char * s, size_t len); +extern char * loc_printf(const char * fmt, ...) ATTR_PRINTF(1, 2); extern void loc_free(const void * p); |