LCOV - code coverage report
Current view: top level - home/branden/src/GIT/groff/lib - vfzprintf.c (source / functions) Hit Total Coverage
Test: GNU roff Lines: 8 19 42.1 %
Date: 2026-01-16 17:51:41 Functions: 0 0 -
Legend: Lines: hit not hit

          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             : }

Generated by: LCOV version 1.14