Blame gnulib/lib/snprintf.c

Packit eba2e2
/* Formatted output to strings.
Packit eba2e2
   Copyright (C) 2004, 2006-2014 Free Software Foundation, Inc.
Packit eba2e2
   Written by Simon Josefsson and Paul Eggert.
Packit eba2e2
Packit eba2e2
   This program is free software; you can redistribute it and/or modify
Packit eba2e2
   it under the terms of the GNU General Public License as published by
Packit eba2e2
   the Free Software Foundation; either version 3, or (at your option)
Packit eba2e2
   any later version.
Packit eba2e2
Packit eba2e2
   This program is distributed in the hope that it will be useful,
Packit eba2e2
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit eba2e2
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit eba2e2
   GNU General Public License for more details.
Packit eba2e2
Packit eba2e2
   You should have received a copy of the GNU General Public License along
Packit eba2e2
   with this program; if not, see <http://www.gnu.org/licenses/>.  */
Packit eba2e2
Packit eba2e2
#include <config.h>
Packit eba2e2
Packit eba2e2
/* Specification.  */
Packit eba2e2
#include <stdio.h>
Packit eba2e2
Packit eba2e2
#include <errno.h>
Packit eba2e2
#include <limits.h>
Packit eba2e2
#include <stdarg.h>
Packit eba2e2
#include <stdlib.h>
Packit eba2e2
#include <string.h>
Packit eba2e2
Packit eba2e2
#include "vasnprintf.h"
Packit eba2e2
Packit eba2e2
/* Print formatted output to string STR.  Similar to sprintf, but
Packit eba2e2
   additional length SIZE limit how much is written into STR.  Returns
Packit eba2e2
   string length of formatted string (which may be larger than SIZE).
Packit eba2e2
   STR may be NULL, in which case nothing will be written.  On error,
Packit eba2e2
   return a negative value.  */
Packit eba2e2
int
Packit eba2e2
snprintf (char *str, size_t size, const char *format, ...)
Packit eba2e2
{
Packit eba2e2
  char *output;
Packit eba2e2
  size_t len;
Packit eba2e2
  size_t lenbuf = size;
Packit eba2e2
  va_list args;
Packit eba2e2
Packit eba2e2
  va_start (args, format);
Packit eba2e2
  output = vasnprintf (str, &lenbuf, format, args);
Packit eba2e2
  len = lenbuf;
Packit eba2e2
  va_end (args);
Packit eba2e2
Packit eba2e2
  if (!output)
Packit eba2e2
    return -1;
Packit eba2e2
Packit eba2e2
  if (output != str)
Packit eba2e2
    {
Packit eba2e2
      if (size)
Packit eba2e2
        {
Packit eba2e2
          size_t pruned_len = (len < size ? len : size - 1);
Packit eba2e2
          memcpy (str, output, pruned_len);
Packit eba2e2
          str[pruned_len] = '\0';
Packit eba2e2
        }
Packit eba2e2
Packit eba2e2
      free (output);
Packit eba2e2
    }
Packit eba2e2
Packit eba2e2
  if (INT_MAX < len)
Packit eba2e2
    {
Packit eba2e2
      errno = EOVERFLOW;
Packit eba2e2
      return -1;
Packit eba2e2
    }
Packit eba2e2
Packit eba2e2
  return len;
Packit eba2e2
}