static char * my_asnprintf (char *resultbuf, size_t *lengthp, const char *format, ...) { va_list args; char *ret; va_start (args, format); ret = ulc_vasnprintf (resultbuf, lengthp, format, args); va_end (args); return ret; }
static char * my_xasprintf (const char *format, ...) { va_list args; size_t length; char *ret; va_start (args, format); ret = ulc_vasnprintf (NULL, &length, format, args); va_end (args); if (ret != NULL) ASSERT (length == strlen (ret)); return ret; }
/* Print formatted output to the stream FP. Return string length of formatted string. On error, return a negative value. */ int ulc_fprintf (FILE *fp, const char *format, ...) { char buf[2000]; char *output; size_t len; size_t lenbuf = sizeof (buf); va_list args; va_start (args, format); output = ulc_vasnprintf (buf, &lenbuf, format, args); len = lenbuf; va_end (args); if (!output) { fseterr (fp); return -1; } if (fwrite (output, 1, len, fp) < len) { if (output != buf) { int saved_errno = errno; free (output); errno = saved_errno; } return -1; } if (len > INT_MAX) { errno = EOVERFLOW; fseterr (fp); return -1; } return len; }