diff options
Diffstat (limited to 'util.c')
| -rw-r--r-- | util.c | 77 |
1 files changed, 60 insertions, 17 deletions
@@ -47,6 +47,52 @@ assert(int cond, const char *file, int line, const char *condstr) } char * +aprintf(const char *fmtstr, ...) +{ + va_list ap, cpy; + size_t size; + char *str; + + va_copy(cpy, ap); + + va_start(ap, fmtstr); + size = vsnprintf(NULL, 0, fmtstr, ap); + va_end(ap); + + str = malloc(size + 1); + ASSERT(str != NULL); + + va_start(cpy, fmtstr); + vsnprintf(str, size + 1, fmtstr, cpy); + va_end(cpy); + + return str; +} + +char * +appendstrf(char *alloc, const char *fmtstr, ...) +{ + va_list ap, cpy; + size_t size, prevlen; + + va_copy(cpy, ap); + + va_start(ap, fmtstr); + size = vsnprintf(NULL, 0, fmtstr, ap); + va_end(ap); + + prevlen = alloc ? strlen(alloc) : 0; + alloc = realloc(alloc, prevlen + size + 1); + ASSERT(alloc != NULL); + + va_start(cpy, fmtstr); + vsnprintf(alloc + prevlen, size + 1, fmtstr, cpy); + va_end(cpy); + + return alloc; +} + +char * sanitized(const char *instr) { const char *p; @@ -65,25 +111,22 @@ sanitized(const char *instr) return clean; } -char * -aprintf(const char *fmtstr, ...) +const char * +timestr(unsigned int secs) { - va_list ap, cpy; - size_t size; - char *str; + static char buf[16]; + unsigned int mins, hours; - va_copy(cpy, ap); - - va_start(ap, fmtstr); - size = vsnprintf(NULL, 0, fmtstr, ap); - va_end(ap); - - str = malloc(size + 1); - ASSERT(str != NULL); + hours = secs / 3600; + mins = secs / 60 % 60; + secs = secs % 60; - va_start(cpy, fmtstr); - vsnprintf(str, size + 1, fmtstr, cpy); - va_end(cpy); + if (hours) { + snprintf(buf, sizeof(buf), "%02u:%02u:%02u", hours, mins, secs); + } else { + snprintf(buf, sizeof(buf), "%02u:%02u", mins, secs); + } - return str; + return buf; } + |
