file_printf(struct magic_set *ms, const char *fmt, ...)
{
va_list ap;
- size_t size;
int len;
char *buf = NULL, *newstr;
file_error_core(struct magic_set *ms, int error, const char *f, va_list va,
uint32_t lineno)
{
+ char *buf = NULL;
+
/* Only the first error is ok */
- if (ms->haderr)
+ if (ms->haderr) {
return;
+ }
+
if (lineno != 0) {
efree(ms->o.buf);
ms->o.buf = NULL;
file_printf(ms, "line %u: ", lineno);
}
- file_printf(ms, f, va);
- if (error > 0)
- file_printf(ms, " (%s)", strerror(error));
+
+ vspprintf(&buf, 0, f, va);
+ va_end(va);
+
+ if (error > 0) {
+ file_printf(ms, "%s (%s)", (*buf ? buf : ""), strerror(error));
+ } else if (*buf) {
+ file_printf(ms, "%s", buf);
+ }
+
+ if (buf) {
+ efree(buf);
+ }
+
ms->haderr++;
ms->error = error;
}