Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2018-01-23 17:53:01 +0000
committerEugene Tarassov2018-01-23 17:53:01 +0000
commit29d796586960b9a7c2cac7752a4fc01e0bcb41d4 (patch)
tree1716380934127ff01be4b86bdf9a14ef1058acaf
parentae06aed66aeda6b8ac9180cfd60252e08ce9039c (diff)
downloadorg.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.c27
-rw-r--r--agent/tcf/framework/myalloc.h1
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);

Back to the top