Line data Source code
1 : /* Formatted output to a stream. 2 : Copyright (C) 2004, 2006-2025 Free Software Foundation, Inc. 3 : 4 : This file is free software: you can redistribute it and/or modify 5 : it under the terms of the GNU Lesser General Public License as 6 : published by the Free Software Foundation, either version 3 of the 7 : License, or (at your option) any later version. 8 : 9 : This file is distributed in the hope that it will be useful, 10 : but WITHOUT ANY WARRANTY; without even the implied warranty of 11 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 : GNU Lesser General Public License for more details. 13 : 14 : You should have received a copy of the GNU Lesser General Public License 15 : along with this program. If not, see <https://www.gnu.org/licenses/>. */ 16 : 17 : #ifdef HAVE_CONFIG_H 18 : # include <config.h> 19 : #endif 20 : 21 : /* Specification. */ 22 : #include <stdio.h> 23 : 24 : #include <errno.h> 25 : #include <stdarg.h> 26 : #include <stdlib.h> 27 : 28 : #include "fseterr.h" 29 : #include "intprops.h" 30 : #include "vasnprintf.h" 31 : 32 : off64_t 33 : vfzprintf (FILE *fp, const char *format, va_list args) 34 : { 35 : char buf[2000]; 36 : char *output; 37 : size_t len; 38 14391 : size_t lenbuf = sizeof (buf); 39 : 40 14391 : output = vasnprintf (buf, &lenbuf, format, args); 41 14391 : len = lenbuf; 42 : 43 14391 : if (!output) 44 : { 45 0 : fseterr (fp); 46 0 : return -1; 47 : } 48 : 49 14391 : if (len > TYPE_MAXIMUM (off64_t)) 50 : { 51 : /* We could write the (huge) output, but then could not return len, as it 52 : would be negative. Treat this case as if vasnprintf had already 53 : encountered an out-of-memory situation. */ 54 0 : if (output != buf) 55 0 : free (output); 56 0 : fseterr (fp); 57 0 : errno = ENOMEM; 58 0 : return -1; 59 : } 60 : 61 14391 : if (fwrite (output, 1, len, fp) < len) 62 : { 63 0 : if (output != buf) 64 0 : free (output); 65 0 : return -1; 66 : } 67 : 68 14391 : if (output != buf) 69 0 : free (output); 70 : 71 14391 : return len; 72 : }