(root)/
bison-3.8.2/
lib/
vfprintf.c
       1  /* Formatted output to a stream.
       2     Copyright (C) 2004, 2006-2021 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  #if 1
      18  # include <config.h>
      19  #endif
      20  
      21  /* Specification.  */
      22  #include <stdio.h>
      23  
      24  #include <errno.h>
      25  #include <limits.h>
      26  #include <stdarg.h>
      27  #include <stdlib.h>
      28  
      29  #include "fseterr.h"
      30  #include "vasnprintf.h"
      31  
      32  /* Print formatted output to the stream FP.
      33     Return string length of formatted string.  On error, return a negative
      34     value.  */
      35  int
      36  vfprintf (FILE *fp, const char *format, va_list args)
      37  {
      38    char buf[2000];
      39    char *output;
      40    size_t len;
      41    size_t lenbuf = sizeof (buf);
      42  
      43    output = vasnprintf (buf, &lenbuf, format, args);
      44    len = lenbuf;
      45  
      46    if (!output)
      47      {
      48        fseterr (fp);
      49        return -1;
      50      }
      51  
      52    if (fwrite (output, 1, len, fp) < len)
      53      {
      54        if (output != buf)
      55          free (output);
      56        return -1;
      57      }
      58  
      59    if (output != buf)
      60      free (output);
      61  
      62    if (len > INT_MAX)
      63      {
      64        errno = EOVERFLOW;
      65        fseterr (fp);
      66        return -1;
      67      }
      68  
      69    return len;
      70  }