#include "Python.h"

/* snprintf() wrappers.  If the platform has vsnprintf, we use it, else we
   emulate it in a half-hearted way.  Even if the platform has it, we wrap
   it because platforms differ in what vsnprintf does in case the buffer
   is too small:  C99 behavior is to return the number of characters that
   would have been written had the buffer not been too small, and to set
   the last byte of the buffer to \0.  At least MS _vsnprintf returns a
   negative value instead, and fills the entire buffer with non-\0 data.

   The wrappers ensure that str[size-1] is always \0 upon return.

   PyOS_snprintf and PyOS_vsnprintf never write more than size bytes
   (including the trailing '\0') into str.

   If the platform doesn't have vsnprintf, and the buffer size needed to
   avoid truncation exceeds size by more than 512, Python aborts with a
   Py_FatalError.

   Return value (rv):

	When 0 <= rv < size, the output conversion was unexceptional, and
	rv characters were written to str (excluding a trailing \0 byte at
	str[rv]).

	When rv >= size, output conversion was truncated, and a buffer of
	size rv+1 would have been needed to avoid truncation.  str[size-1]
	is \0 in this case.

	When rv < 0, "something bad happened".  str[size-1] is \0 in this
	case too, but the rest of str is unreliable.  It could be that
	an error in format codes was detected by libc, or on platforms
	with a non-C99 vsnprintf simply that the buffer wasn't big enough
	to avoid truncation, or on platforms without any vsnprintf that
	PyMem_Malloc couldn't obtain space for a temp buffer.

   CAUTION:  Unlike C99, str != NULL and size > 0 are required.
*/

int
PyOS_snprintf(char *str, size_t size, const  char  *format, ...)
{
	int rc;
	va_list va;

	va_start(va, format);
	rc = PyOS_vsnprintf(str, size, format, va);
	va_end(va);
	return rc;
}

int
PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
{
	int len;  /* # bytes written, excluding \0 */
#ifdef HAVE_SNPRINTF
#define _PyOS_vsnprintf_EXTRA_SPACE 1
#else
#define _PyOS_vsnprintf_EXTRA_SPACE 512
	char *buffer;
#endif
	assert(str != NULL);
	assert(size > 0);
	assert(format != NULL);
	/* We take a size_t as input but return an int.  Sanity check
	 * our input so that it won't cause an overflow in the
         * vsnprintf return value or the buffer malloc size.  */
	if (size > INT_MAX - _PyOS_vsnprintf_EXTRA_SPACE) {
		len = -666;
		goto Done;
	}

#ifdef HAVE_SNPRINTF
	len = vsnprintf(str, size, format, va);
#else
	/* Emulate it. */
	buffer = PyMem_MALLOC(size + _PyOS_vsnprintf_EXTRA_SPACE);
	if (buffer == NULL) {
		len = -666;
		goto Done;
	}

	len = vsprintf(buffer, format, va);
	if (len < 0)
		/* ignore the error */;

	else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE)
		Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf");

	else {
		const size_t to_copy = (size_t)len < size ?
					(size_t)len : size - 1;
		assert(to_copy < size);
		memcpy(str, buffer, to_copy);
		str[to_copy] = '\0';
	}
	PyMem_FREE(buffer);
#endif
Done:
	if (size > 0)
		str[size-1] = '\0';
	return len;
#undef _PyOS_vsnprintf_EXTRA_SPACE
}
