|  | // Copyright 2021 Joe Drago. All rights reserved. | 
|  | // SPDX-License-Identifier: BSD-2-Clause | 
|  |  | 
|  | #include "avif/internal.h" | 
|  |  | 
|  | #include <stdarg.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  |  | 
|  | void avifDiagnosticsClearError(avifDiagnostics * diag) | 
|  | { | 
|  | *diag->error = '\0'; | 
|  | } | 
|  |  | 
|  | #ifdef __clang__ | 
|  | __attribute__((__format__(__printf__, 2, 3))) | 
|  | #endif | 
|  | void avifDiagnosticsPrintf(avifDiagnostics * diag, const char * format, ...) | 
|  | { | 
|  | if (!diag) { | 
|  | // It is possible this is NULL (e.g. calls to avifPeekCompatibleFileType()) | 
|  | return; | 
|  | } | 
|  | if (*diag->error) { | 
|  | // There is already a detailed error set. | 
|  | return; | 
|  | } | 
|  |  | 
|  | va_list args; | 
|  | va_start(args, format); | 
|  | vsnprintf(diag->error, AVIF_DIAGNOSTICS_ERROR_BUFFER_SIZE, format, args); | 
|  | diag->error[AVIF_DIAGNOSTICS_ERROR_BUFFER_SIZE - 1] = '\0'; | 
|  | va_end(args); | 
|  | } |