summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Fleischer <calcurse@cryptocrack.de>2014-07-21 22:44:14 +0200
committerLukas Fleischer <calcurse@cryptocrack.de>2014-07-22 11:06:54 +0200
commit6203966fbf1f8886ff59cc9d6350b034ee5374c9 (patch)
treeac0232bad6af82425a5009788c1349237a25e813
parent9d8d0c18b0329f11990b8e0f2d65424967b6293f (diff)
downloadcalcurse-6203966fbf1f8886ff59cc9d6350b034ee5374c9.tar.gz
calcurse-6203966fbf1f8886ff59cc9d6350b034ee5374c9.zip
Add vasprintf() and asprintf()
The new utils.c functions vasprintf() and asprintf() are analogs to sprintf() and vsprintf(). However, instead of requiring a buffer that is large enough to hold the output data, the functions allocate a string and return a pointer to it. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
-rw-r--r--src/calcurse.h2
-rw-r--r--src/utils.c38
2 files changed, 40 insertions, 0 deletions
diff --git a/src/calcurse.h b/src/calcurse.h
index e593ff0..887e224 100644
--- a/src/calcurse.h
+++ b/src/calcurse.h
@@ -1051,6 +1051,8 @@ void print_recur_apoint(const char *, long, unsigned,
struct recur_apoint *);
void print_recur_event(const char *, long, struct recur_event *);
void print_todo(const char *, struct todo *);
+int vasprintf(char **, const char *, va_list);
+int asprintf(char **, const char *, ...);
/* vars.c */
extern int col, row;
diff --git a/src/utils.c b/src/utils.c
index 02839c3..c675518 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1473,3 +1473,41 @@ void print_todo(const char *format, struct todo *todo)
}
}
}
+
+#define VASPRINTF_INITIAL_BUFSIZE 128
+
+int
+vasprintf(char **str, const char *format, va_list ap)
+{
+ va_list ap2;
+ int n;
+
+ va_copy(ap2, ap);
+
+ *str = mem_malloc(VASPRINTF_INITIAL_BUFSIZE);
+ n = vsnprintf(*str, VASPRINTF_INITIAL_BUFSIZE, format, ap);
+ if (n >= VASPRINTF_INITIAL_BUFSIZE) {
+ *str = mem_realloc(*str, 1, n + 1);
+ n = vsnprintf(*str, n + 1, format, ap2);
+ }
+
+ if (n < 0) {
+ mem_free(*str);
+ *str = NULL;
+ }
+
+ return n;
+}
+
+int
+asprintf(char **str, const char *format, ...)
+{
+ va_list ap;
+ int n;
+
+ va_start(ap, format);
+ n = vasprintf(str, format, ap);
+ va_end(ap);
+
+ return n;
+}